@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.
- 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 +1 -1
- package/styles/ui-callout.css +1 -1
- package/styles/ui-checkbox.css +1 -1
- package/styles/ui-cluster.css +1 -1
- package/styles/ui-combobox.css +1 -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 +1 -1
- 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/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 +1 -1
- package/vanilla/UiButton.js +1 -1
- 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 +1 -1
- 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 -1
- package/vanilla/UiSelect.js +1 -1
- 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.vue +1 -1
- package/vue/UiCallout.vue +1 -1
- package/vue/UiCheckbox.vue +22 -123
- package/vue/UiCluster.vue +1 -1
- package/vue/UiCombobox.d.ts +1 -1
- package/vue/UiCombobox.vue +224 -475
- 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.vue +7 -79
- 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 +1 -1
- 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 +114 -325
- 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 -73
- 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 +706 -706
- package/vue/host.ts +154 -0
package/vue/UiEditable.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-editable/ui-editable.js'
|
|
5
|
+
import { createDispatch, useComponentHost } from './host'
|
|
13
6
|
|
|
14
7
|
defineOptions({ inheritAttrs: false })
|
|
15
8
|
|
|
@@ -74,156 +67,51 @@ const hostState = computed(() =>
|
|
|
74
67
|
].filter(Boolean).join(' ')
|
|
75
68
|
)
|
|
76
69
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|| (detail as Record<string, unknown>)['trigger'] === 'pointer'
|
|
113
|
-
|| (detail as Record<string, unknown>)['trigger'] === 'programmatic')
|
|
114
|
-
&& Object.keys(detail as object).every((key) => ['edit', 'reason', 'trigger'].includes(key)),
|
|
115
|
-
}
|
|
116
|
-
if (detail !== undefined && checks[name] !== undefined && !checks[name]!(detail)) {
|
|
117
|
-
throw new TypeError(`HR002: Event \`${name}\` detail does not satisfy its declared type.`)
|
|
118
|
-
}
|
|
119
|
-
const emitEvent = emit as (name: string, detail: unknown) => void
|
|
120
|
-
emitEvent(name, detail)
|
|
121
|
-
if (detail !== null && typeof detail === 'object' && 'edit' in detail) {
|
|
122
|
-
emitEvent('update:edit', (detail as Record<string, unknown>)['edit'])
|
|
123
|
-
}
|
|
124
|
-
if (detail !== null && typeof detail === 'object' && 'value' in detail) {
|
|
125
|
-
emitEvent('update:value', (detail as Record<string, unknown>)['value'])
|
|
126
|
-
}
|
|
127
|
-
return root.value?.dispatchEvent(
|
|
128
|
-
new CustomEvent(name, { bubbles: true, composed: true, ...declared[name], detail }),
|
|
129
|
-
) ?? true
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
function read(name: string): unknown {
|
|
133
|
-
if (name === 'internalEdit') return internalEdit.value
|
|
134
|
-
if (name === 'internalValue') return internalValue.value
|
|
135
|
-
if (name === 'draft') return draft.value
|
|
136
|
-
return (props as Record<string, unknown>)[name]
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
function write(name: string, value: unknown): boolean {
|
|
140
|
-
if (name === 'internalEdit') {
|
|
141
|
-
internalEdit.value = value as never
|
|
142
|
-
return true
|
|
143
|
-
}
|
|
144
|
-
if (name === 'internalValue') {
|
|
145
|
-
internalValue.value = value as never
|
|
146
|
-
return true
|
|
147
|
-
}
|
|
148
|
-
if (name === 'draft') {
|
|
149
|
-
draft.value = value as never
|
|
150
|
-
return true
|
|
151
|
-
}
|
|
152
|
-
throw new TypeError(`Only declared state is writable; \`${name}\` is not.`)
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
const stops: Array<() => void> = []
|
|
156
|
-
const host = {
|
|
157
|
-
get element(): Element {
|
|
158
|
-
return root.value as Element
|
|
159
|
-
},
|
|
160
|
-
state: new Proxy({} as Record<string, unknown>, {
|
|
161
|
-
get: (_target, name) => typeof name === 'string' ? read(name) : undefined,
|
|
162
|
-
set: (_target, name, value) => typeof name === 'string' && write(name, value),
|
|
163
|
-
}),
|
|
164
|
-
refs: {
|
|
165
|
-
get preview(): Element {
|
|
166
|
-
return previewElement.value as Element
|
|
167
|
-
},
|
|
168
|
-
get input(): Element {
|
|
169
|
-
return inputElement.value as Element
|
|
170
|
-
},
|
|
171
|
-
} as Readonly<Record<string, Element>>,
|
|
172
|
-
elements: new Proxy({} as Record<string, Element | RadioNodeList | undefined>, {
|
|
173
|
-
get: (_target, name) => {
|
|
174
|
-
if (typeof name !== 'string' || root.value === null) return undefined
|
|
175
|
-
const form = root.value instanceof HTMLFormElement
|
|
176
|
-
? root.value
|
|
177
|
-
: root.value.querySelector('form')
|
|
178
|
-
return form?.elements.namedItem(name)
|
|
179
|
-
?? root.value.querySelector(`[name="${CSS.escape(name)}"]`) ?? undefined
|
|
180
|
-
},
|
|
181
|
-
}),
|
|
182
|
-
signal<T>(initialValue: T) {
|
|
183
|
-
const value = shallowRef(initialValue)
|
|
184
|
-
return {
|
|
185
|
-
get: (): T => value.value,
|
|
186
|
-
set: (next: T): void => {
|
|
187
|
-
if (!Object.is(value.value, next)) value.value = next
|
|
188
|
-
},
|
|
189
|
-
update: (next: (current: T) => T): void => {
|
|
190
|
-
const updated = next(value.value)
|
|
191
|
-
if (!Object.is(value.value, updated)) value.value = updated
|
|
192
|
-
},
|
|
193
|
-
}
|
|
194
|
-
},
|
|
195
|
-
computed<T>(compute: () => T) {
|
|
196
|
-
const value = computed(compute)
|
|
197
|
-
return { get: (): T => value.value }
|
|
198
|
-
},
|
|
199
|
-
effect(run: () => void | (() => void)): () => void {
|
|
200
|
-
const stop = watchEffect((onCleanup) => {
|
|
201
|
-
const cleanup = run()
|
|
202
|
-
if (typeof cleanup === 'function') onCleanup(cleanup)
|
|
203
|
-
}, { flush: 'post' })
|
|
204
|
-
stops.push(stop)
|
|
205
|
-
return stop
|
|
70
|
+
const isInputDetail = (detail: unknown): boolean =>
|
|
71
|
+
detail !== null && typeof detail === 'object' && !Array.isArray(detail)
|
|
72
|
+
&& typeof (detail as Record<string, unknown>)['value'] === 'string'
|
|
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) => ['value', 'trigger'].includes(key))
|
|
77
|
+
const isChangeDetail = (detail: unknown): boolean =>
|
|
78
|
+
detail !== null && typeof detail === 'object' && !Array.isArray(detail)
|
|
79
|
+
&& typeof (detail as Record<string, unknown>)['value'] === 'string'
|
|
80
|
+
&& typeof (detail as Record<string, unknown>)['previousValue'] === 'string'
|
|
81
|
+
&& ((detail as Record<string, unknown>)['trigger'] === 'keyboard'
|
|
82
|
+
|| (detail as Record<string, unknown>)['trigger'] === 'pointer'
|
|
83
|
+
|| (detail as Record<string, unknown>)['trigger'] === 'programmatic')
|
|
84
|
+
&& Object.keys(detail as object).every((key) =>
|
|
85
|
+
['value', 'previousValue', 'trigger'].includes(key)
|
|
86
|
+
)
|
|
87
|
+
const isEditChangeDetail = (detail: unknown): boolean =>
|
|
88
|
+
detail !== null && typeof detail === 'object' && !Array.isArray(detail)
|
|
89
|
+
&& typeof (detail as Record<string, unknown>)['edit'] === 'boolean'
|
|
90
|
+
&& ((detail as Record<string, unknown>)['reason'] === 'activate'
|
|
91
|
+
|| (detail as Record<string, unknown>)['reason'] === 'commit'
|
|
92
|
+
|| (detail as Record<string, unknown>)['reason'] === 'cancel'
|
|
93
|
+
|| (detail as Record<string, unknown>)['reason'] === 'light-dismiss'
|
|
94
|
+
|| (detail as Record<string, unknown>)['reason'] === 'escape'
|
|
95
|
+
|| (detail as Record<string, unknown>)['reason'] === 'programmatic')
|
|
96
|
+
&& ((detail as Record<string, unknown>)['trigger'] === 'keyboard'
|
|
97
|
+
|| (detail as Record<string, unknown>)['trigger'] === 'pointer'
|
|
98
|
+
|| (detail as Record<string, unknown>)['trigger'] === 'programmatic')
|
|
99
|
+
&& Object.keys(detail as object).every((key) => ['edit', 'reason', 'trigger'].includes(key))
|
|
100
|
+
const dispatch = createDispatch(root, emit as (name: string, detail: unknown) => void, {
|
|
101
|
+
checks: {
|
|
102
|
+
input: isInputDetail,
|
|
103
|
+
change: isChangeDetail,
|
|
104
|
+
'edit-change': isEditChangeDetail,
|
|
206
105
|
},
|
|
207
|
-
|
|
208
|
-
const element = root.value
|
|
209
|
-
element?.addEventListener(event, listener)
|
|
210
|
-
const off = (): void => element?.removeEventListener(event, listener)
|
|
211
|
-
stops.push(off)
|
|
212
|
-
return off
|
|
213
|
-
},
|
|
214
|
-
dispatch,
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
let cleanup: void | (() => void)
|
|
218
|
-
let ready: Promise<void> | undefined
|
|
219
|
-
onMounted(() => {
|
|
220
|
-
ready = Promise.resolve(controllerModule.default(host as never)).then((result) => {
|
|
221
|
-
cleanup = result
|
|
222
|
-
})
|
|
106
|
+
modeled: ['edit', 'value'],
|
|
223
107
|
})
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
108
|
+
|
|
109
|
+
useComponentHost(controllerModule.default, {
|
|
110
|
+
root,
|
|
111
|
+
dispatch,
|
|
112
|
+
props,
|
|
113
|
+
refs: { preview: previewElement, input: inputElement },
|
|
114
|
+
state: { internalEdit, internalValue, draft },
|
|
227
115
|
})
|
|
228
116
|
</script>
|
|
229
117
|
|
|
@@ -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 { ref, useTemplateRef } from 'vue'
|
|
12
4
|
import * as controllerModule from '../components/ui-editor-insert-table-grid/ui-editor-insert-table-grid.js'
|
|
5
|
+
import { createDispatch, useComponentHost } from './host'
|
|
13
6
|
|
|
14
7
|
defineOptions({ inheritAttrs: false })
|
|
15
8
|
|
|
@@ -42,136 +35,24 @@ const cols = ref(8)
|
|
|
42
35
|
const hint = ref('')
|
|
43
36
|
const withHeaderRow = ref(false)
|
|
44
37
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
&& Number.isInteger((detail as Record<string, unknown>)['cols'])
|
|
55
|
-
&& typeof (detail as Record<string, unknown>)['withHeaderRow'] === 'boolean'
|
|
56
|
-
&& Object.keys(detail as object).every((key) =>
|
|
57
|
-
['rows', 'cols', 'withHeaderRow'].includes(key)
|
|
58
|
-
),
|
|
59
|
-
}
|
|
60
|
-
if (detail !== undefined && checks[name] !== undefined && !checks[name]!(detail)) {
|
|
61
|
-
throw new TypeError(`HR002: Event \`${name}\` detail does not satisfy its declared type.`)
|
|
62
|
-
}
|
|
63
|
-
const emitEvent = emit as (name: string, detail: unknown) => void
|
|
64
|
-
emitEvent(name, detail)
|
|
65
|
-
return root.value?.dispatchEvent(
|
|
66
|
-
new CustomEvent(name, { bubbles: true, composed: true, ...declared[name], detail }),
|
|
67
|
-
) ?? true
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
function read(name: string): unknown {
|
|
71
|
-
if (name === 'cells') return cells.value
|
|
72
|
-
if (name === 'rows') return rows.value
|
|
73
|
-
if (name === 'cols') return cols.value
|
|
74
|
-
if (name === 'hint') return hint.value
|
|
75
|
-
if (name === 'withHeaderRow') return withHeaderRow.value
|
|
76
|
-
return (props as Record<string, unknown>)[name]
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
function write(name: string, value: unknown): boolean {
|
|
80
|
-
if (name === 'cells') {
|
|
81
|
-
cells.value = value as never
|
|
82
|
-
return true
|
|
83
|
-
}
|
|
84
|
-
if (name === 'rows') {
|
|
85
|
-
rows.value = value as never
|
|
86
|
-
return true
|
|
87
|
-
}
|
|
88
|
-
if (name === 'cols') {
|
|
89
|
-
cols.value = value as never
|
|
90
|
-
return true
|
|
91
|
-
}
|
|
92
|
-
if (name === 'hint') {
|
|
93
|
-
hint.value = value as never
|
|
94
|
-
return true
|
|
95
|
-
}
|
|
96
|
-
if (name === 'withHeaderRow') {
|
|
97
|
-
withHeaderRow.value = value as never
|
|
98
|
-
return true
|
|
99
|
-
}
|
|
100
|
-
throw new TypeError(`Only declared state is writable; \`${name}\` is not.`)
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
const stops: Array<() => void> = []
|
|
104
|
-
const host = {
|
|
105
|
-
get element(): Element {
|
|
106
|
-
return root.value as Element
|
|
107
|
-
},
|
|
108
|
-
state: new Proxy({} as Record<string, unknown>, {
|
|
109
|
-
get: (_target, name) => typeof name === 'string' ? read(name) : undefined,
|
|
110
|
-
set: (_target, name, value) => typeof name === 'string' && write(name, value),
|
|
111
|
-
}),
|
|
112
|
-
refs: {
|
|
113
|
-
get header(): Element {
|
|
114
|
-
return headerElement.value as Element
|
|
115
|
-
},
|
|
116
|
-
get insert(): Element {
|
|
117
|
-
return insertElement.value as Element
|
|
118
|
-
},
|
|
119
|
-
} as Readonly<Record<string, Element>>,
|
|
120
|
-
elements: new Proxy({} as Record<string, Element | RadioNodeList | undefined>, {
|
|
121
|
-
get: (_target, name) => {
|
|
122
|
-
if (typeof name !== 'string' || root.value === null) return undefined
|
|
123
|
-
const form = root.value instanceof HTMLFormElement
|
|
124
|
-
? root.value
|
|
125
|
-
: root.value.querySelector('form')
|
|
126
|
-
return form?.elements.namedItem(name)
|
|
127
|
-
?? root.value.querySelector(`[name="${CSS.escape(name)}"]`) ?? undefined
|
|
128
|
-
},
|
|
129
|
-
}),
|
|
130
|
-
signal<T>(initialValue: T) {
|
|
131
|
-
const value = shallowRef(initialValue)
|
|
132
|
-
return {
|
|
133
|
-
get: (): T => value.value,
|
|
134
|
-
set: (next: T): void => {
|
|
135
|
-
if (!Object.is(value.value, next)) value.value = next
|
|
136
|
-
},
|
|
137
|
-
update: (next: (current: T) => T): void => {
|
|
138
|
-
const updated = next(value.value)
|
|
139
|
-
if (!Object.is(value.value, updated)) value.value = updated
|
|
140
|
-
},
|
|
141
|
-
}
|
|
142
|
-
},
|
|
143
|
-
computed<T>(compute: () => T) {
|
|
144
|
-
const value = computed(compute)
|
|
145
|
-
return { get: (): T => value.value }
|
|
38
|
+
const isInsertDetail = (detail: unknown): boolean =>
|
|
39
|
+
detail !== null && typeof detail === 'object' && !Array.isArray(detail)
|
|
40
|
+
&& Number.isInteger((detail as Record<string, unknown>)['rows'])
|
|
41
|
+
&& Number.isInteger((detail as Record<string, unknown>)['cols'])
|
|
42
|
+
&& typeof (detail as Record<string, unknown>)['withHeaderRow'] === 'boolean'
|
|
43
|
+
&& Object.keys(detail as object).every((key) => ['rows', 'cols', 'withHeaderRow'].includes(key))
|
|
44
|
+
const dispatch = createDispatch(root, emit as (name: string, detail: unknown) => void, {
|
|
45
|
+
checks: {
|
|
46
|
+
insert: isInsertDetail,
|
|
146
47
|
},
|
|
147
|
-
effect(run: () => void | (() => void)): () => void {
|
|
148
|
-
const stop = watchEffect((onCleanup) => {
|
|
149
|
-
const cleanup = run()
|
|
150
|
-
if (typeof cleanup === 'function') onCleanup(cleanup)
|
|
151
|
-
}, { flush: 'post' })
|
|
152
|
-
stops.push(stop)
|
|
153
|
-
return stop
|
|
154
|
-
},
|
|
155
|
-
on(event: string, listener: EventListener): () => void {
|
|
156
|
-
const element = root.value
|
|
157
|
-
element?.addEventListener(event, listener)
|
|
158
|
-
const off = (): void => element?.removeEventListener(event, listener)
|
|
159
|
-
stops.push(off)
|
|
160
|
-
return off
|
|
161
|
-
},
|
|
162
|
-
dispatch,
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
let cleanup: void | (() => void)
|
|
166
|
-
let ready: Promise<void> | undefined
|
|
167
|
-
onMounted(() => {
|
|
168
|
-
ready = Promise.resolve(controllerModule.default(host as never)).then((result) => {
|
|
169
|
-
cleanup = result
|
|
170
|
-
})
|
|
171
48
|
})
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
49
|
+
|
|
50
|
+
useComponentHost(controllerModule.default, {
|
|
51
|
+
root,
|
|
52
|
+
dispatch,
|
|
53
|
+
props,
|
|
54
|
+
refs: { header: headerElement, insert: insertElement },
|
|
55
|
+
state: { cells, rows, cols, hint, withHeaderRow },
|
|
175
56
|
})
|
|
176
57
|
</script>
|
|
177
58
|
|
|
@@ -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 {
|
|
3
|
+
import { ref } from 'vue'
|
|
4
4
|
import * as controllerModule from '../components/ui-editor-mention-menu/ui-editor-mention-menu.js'
|
|
5
|
+
import { createDispatch, useComponentHost } from './host'
|
|
5
6
|
|
|
6
7
|
defineOptions({ inheritAttrs: false })
|
|
7
8
|
|
|
@@ -48,130 +49,22 @@ const searching = ref(false)
|
|
|
48
49
|
const active = ref(0)
|
|
49
50
|
const prefix = ref('ui-editor-mention-menu')
|
|
50
51
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
detail !== null && typeof detail === 'object' && !Array.isArray(detail)
|
|
60
|
-
&& Number.isInteger((detail as Record<string, unknown>)['index'])
|
|
61
|
-
&& Object.keys(detail as object).every((key) => ['index'].includes(key)),
|
|
62
|
-
select: (detail) =>
|
|
63
|
-
detail !== null && typeof detail === 'object' && !Array.isArray(detail)
|
|
64
|
-
&& Number.isInteger((detail as Record<string, unknown>)['index'])
|
|
65
|
-
&& Object.keys(detail as object).every((key) => ['index'].includes(key)),
|
|
66
|
-
}
|
|
67
|
-
if (detail !== undefined && checks[name] !== undefined && !checks[name]!(detail)) {
|
|
68
|
-
throw new TypeError(`HR002: Event \`${name}\` detail does not satisfy its declared type.`)
|
|
69
|
-
}
|
|
70
|
-
const emitEvent = emit as (name: string, detail: unknown) => void
|
|
71
|
-
emitEvent(name, detail)
|
|
72
|
-
return root.value?.dispatchEvent(
|
|
73
|
-
new CustomEvent(name, { bubbles: true, composed: true, ...declared[name], detail }),
|
|
74
|
-
) ?? true
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
function read(name: string): unknown {
|
|
78
|
-
if (name === 'visible') return visible.value
|
|
79
|
-
if (name === 'rows') return rows.value
|
|
80
|
-
if (name === 'searching') return searching.value
|
|
81
|
-
if (name === 'active') return active.value
|
|
82
|
-
if (name === 'prefix') return prefix.value
|
|
83
|
-
return (props as Record<string, unknown>)[name]
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
function write(name: string, value: unknown): boolean {
|
|
87
|
-
if (name === 'visible') {
|
|
88
|
-
visible.value = value as never
|
|
89
|
-
return true
|
|
90
|
-
}
|
|
91
|
-
if (name === 'rows') {
|
|
92
|
-
rows.value = value as never
|
|
93
|
-
return true
|
|
94
|
-
}
|
|
95
|
-
if (name === 'searching') {
|
|
96
|
-
searching.value = value as never
|
|
97
|
-
return true
|
|
98
|
-
}
|
|
99
|
-
if (name === 'active') {
|
|
100
|
-
active.value = value as never
|
|
101
|
-
return true
|
|
102
|
-
}
|
|
103
|
-
if (name === 'prefix') {
|
|
104
|
-
prefix.value = value as never
|
|
105
|
-
return true
|
|
106
|
-
}
|
|
107
|
-
throw new TypeError(`Only declared state is writable; \`${name}\` is not.`)
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
const stops: Array<() => void> = []
|
|
111
|
-
const host = {
|
|
112
|
-
get element(): Element {
|
|
113
|
-
return root.value as Element
|
|
114
|
-
},
|
|
115
|
-
state: new Proxy({} as Record<string, unknown>, {
|
|
116
|
-
get: (_target, name) => typeof name === 'string' ? read(name) : undefined,
|
|
117
|
-
set: (_target, name, value) => typeof name === 'string' && write(name, value),
|
|
118
|
-
}),
|
|
119
|
-
refs: {} as Readonly<Record<string, Element>>,
|
|
120
|
-
elements: new Proxy({} as Record<string, Element | RadioNodeList | undefined>, {
|
|
121
|
-
get: (_target, name) => {
|
|
122
|
-
if (typeof name !== 'string' || root.value === null) return undefined
|
|
123
|
-
const form = root.value instanceof HTMLFormElement
|
|
124
|
-
? root.value
|
|
125
|
-
: root.value.querySelector('form')
|
|
126
|
-
return form?.elements.namedItem(name)
|
|
127
|
-
?? root.value.querySelector(`[name="${CSS.escape(name)}"]`) ?? undefined
|
|
128
|
-
},
|
|
129
|
-
}),
|
|
130
|
-
signal<T>(initialValue: T) {
|
|
131
|
-
const value = shallowRef(initialValue)
|
|
132
|
-
return {
|
|
133
|
-
get: (): T => value.value,
|
|
134
|
-
set: (next: T): void => {
|
|
135
|
-
if (!Object.is(value.value, next)) value.value = next
|
|
136
|
-
},
|
|
137
|
-
update: (next: (current: T) => T): void => {
|
|
138
|
-
const updated = next(value.value)
|
|
139
|
-
if (!Object.is(value.value, updated)) value.value = updated
|
|
140
|
-
},
|
|
141
|
-
}
|
|
142
|
-
},
|
|
143
|
-
computed<T>(compute: () => T) {
|
|
144
|
-
const value = computed(compute)
|
|
145
|
-
return { get: (): T => value.value }
|
|
146
|
-
},
|
|
147
|
-
effect(run: () => void | (() => void)): () => void {
|
|
148
|
-
const stop = watchEffect((onCleanup) => {
|
|
149
|
-
const cleanup = run()
|
|
150
|
-
if (typeof cleanup === 'function') onCleanup(cleanup)
|
|
151
|
-
}, { flush: 'post' })
|
|
152
|
-
stops.push(stop)
|
|
153
|
-
return stop
|
|
154
|
-
},
|
|
155
|
-
on(event: string, listener: EventListener): () => void {
|
|
156
|
-
const element = root.value
|
|
157
|
-
element?.addEventListener(event, listener)
|
|
158
|
-
const off = (): void => element?.removeEventListener(event, listener)
|
|
159
|
-
stops.push(off)
|
|
160
|
-
return off
|
|
52
|
+
const isHighlightDetail = (detail: unknown): boolean =>
|
|
53
|
+
detail !== null && typeof detail === 'object' && !Array.isArray(detail)
|
|
54
|
+
&& Number.isInteger((detail as Record<string, unknown>)['index'])
|
|
55
|
+
&& Object.keys(detail as object).every((key) => ['index'].includes(key))
|
|
56
|
+
const dispatch = createDispatch(root, emit as (name: string, detail: unknown) => void, {
|
|
57
|
+
checks: {
|
|
58
|
+
highlight: isHighlightDetail,
|
|
59
|
+
select: isHighlightDetail,
|
|
161
60
|
},
|
|
162
|
-
dispatch,
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
let cleanup: void | (() => void)
|
|
166
|
-
let ready: Promise<void> | undefined
|
|
167
|
-
onMounted(() => {
|
|
168
|
-
ready = Promise.resolve(controllerModule.default(host as never)).then((result) => {
|
|
169
|
-
cleanup = result
|
|
170
|
-
})
|
|
171
61
|
})
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
62
|
+
|
|
63
|
+
useComponentHost(controllerModule.default, {
|
|
64
|
+
root,
|
|
65
|
+
dispatch,
|
|
66
|
+
props,
|
|
67
|
+
state: { visible, rows, searching, active, prefix },
|
|
175
68
|
})
|
|
176
69
|
</script>
|
|
177
70
|
|