@threadlabs/looma 0.6.3 → 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/components/ui-tree-item/ui-tree-item.html +68 -12
- package/components/ui-tree-item/ui-tree-item.js +9 -1
- 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 +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 +75 -12
- 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 +2 -2
- 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 +97 -153
- 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 +35 -118
- package/vue/chunks/host.js +101 -0
- package/vue/components.css +759 -707
- package/vue/host.ts +154 -0
package/vue/host.ts
ADDED
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
// Generated by HTML Next 1.0.0-alpha.3 for Vue 3.5. Do not edit.
|
|
2
|
+
import { computed, onBeforeUnmount, onMounted, shallowRef, watchEffect } from 'vue'
|
|
3
|
+
|
|
4
|
+
/** A reactive value the host reads: Vue's ref, shallowRef, computed, and useTemplateRef all match. */
|
|
5
|
+
export interface Readable<T> {
|
|
6
|
+
readonly value: T
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export interface ComponentHostOptions {
|
|
10
|
+
/** The component's root element. */
|
|
11
|
+
readonly root: Readable<HTMLElement | null>
|
|
12
|
+
/** Dispatches a declared component event. */
|
|
13
|
+
readonly dispatch: (name: string, detail?: unknown) => boolean
|
|
14
|
+
/** The component's props, which a controller reads through `host.state`. */
|
|
15
|
+
readonly props?: Readonly<Record<string, unknown>>
|
|
16
|
+
/** Template refs, by the ref name the component declared. */
|
|
17
|
+
readonly refs?: Readonly<Record<string, Readable<HTMLElement | null>>>
|
|
18
|
+
/** Declared state, which a controller reads and writes. */
|
|
19
|
+
readonly state?: Readonly<Record<string, { value: any }>>
|
|
20
|
+
/** Declared computed values, which a controller reads. */
|
|
21
|
+
readonly computed?: Readonly<Record<string, Readable<unknown>>>
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* The controller host, built from Vue refs, effects, and lifecycle. Reads and writes reach the
|
|
26
|
+
* component's own refs, so a controller's change renders as any other Vue change does, and the
|
|
27
|
+
* effects and listeners it opens close when the component unmounts.
|
|
28
|
+
*/
|
|
29
|
+
export function useComponentHost(
|
|
30
|
+
controller: ((host: never) => unknown) | undefined,
|
|
31
|
+
options: ComponentHostOptions,
|
|
32
|
+
) {
|
|
33
|
+
const { root, dispatch, props, refs = {}, state = {}, computed: computedValues = {} } = options
|
|
34
|
+
const stops: Array<() => void> = []
|
|
35
|
+
const read = (name: string): unknown =>
|
|
36
|
+
Object.hasOwn(state, name)
|
|
37
|
+
? state[name]!.value
|
|
38
|
+
: Object.hasOwn(computedValues, name)
|
|
39
|
+
? computedValues[name]!.value
|
|
40
|
+
: props?.[name]
|
|
41
|
+
const host = {
|
|
42
|
+
get element(): Element {
|
|
43
|
+
return root.value as Element
|
|
44
|
+
},
|
|
45
|
+
state: new Proxy({} as Record<string, unknown>, {
|
|
46
|
+
get: (_target, name) => typeof name === 'string' ? read(name) : undefined,
|
|
47
|
+
set: (_target, name, value) => {
|
|
48
|
+
if (typeof name !== 'string' || !Object.hasOwn(state, name)) {
|
|
49
|
+
throw new TypeError(`Only declared state is writable; \`${String(name)}\` is not.`)
|
|
50
|
+
}
|
|
51
|
+
state[name]!.value = value
|
|
52
|
+
return true
|
|
53
|
+
},
|
|
54
|
+
}),
|
|
55
|
+
refs: Object.defineProperties(
|
|
56
|
+
{},
|
|
57
|
+
Object.fromEntries(
|
|
58
|
+
Object.entries(refs).map((
|
|
59
|
+
[name, ref],
|
|
60
|
+
) => [name, { enumerable: true, get: () => ref.value as Element }]),
|
|
61
|
+
),
|
|
62
|
+
) as Readonly<Record<string, Element>>,
|
|
63
|
+
elements: new Proxy({} as Record<string, Element | RadioNodeList | undefined>, {
|
|
64
|
+
get: (_target, name) => {
|
|
65
|
+
if (typeof name !== 'string' || root.value === null) return undefined
|
|
66
|
+
const form = root.value instanceof HTMLFormElement
|
|
67
|
+
? root.value
|
|
68
|
+
: root.value.querySelector('form')
|
|
69
|
+
return form?.elements.namedItem(name)
|
|
70
|
+
?? root.value.querySelector(`[name="${CSS.escape(name)}"]`) ?? undefined
|
|
71
|
+
},
|
|
72
|
+
}),
|
|
73
|
+
signal<T>(initialValue: T) {
|
|
74
|
+
// shallowRef holds the controller's own value and notifies only when it changes.
|
|
75
|
+
const value = shallowRef(initialValue)
|
|
76
|
+
return {
|
|
77
|
+
get: (): T => value.value,
|
|
78
|
+
set: (next: T): void => {
|
|
79
|
+
value.value = next
|
|
80
|
+
},
|
|
81
|
+
update: (next: (current: T) => T): void => {
|
|
82
|
+
value.value = next(value.value)
|
|
83
|
+
},
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
computed<T>(compute: () => T) {
|
|
87
|
+
const value = computed(compute)
|
|
88
|
+
return { get: (): T => value.value }
|
|
89
|
+
},
|
|
90
|
+
effect(run: () => void | (() => void)): () => void {
|
|
91
|
+
const stop = watchEffect((onCleanup) => {
|
|
92
|
+
const cleanup = run()
|
|
93
|
+
if (typeof cleanup === 'function') onCleanup(cleanup)
|
|
94
|
+
}, { flush: 'post' })
|
|
95
|
+
stops.push(stop)
|
|
96
|
+
return stop
|
|
97
|
+
},
|
|
98
|
+
on(event: string, listener: EventListener): () => void {
|
|
99
|
+
const element = root.value
|
|
100
|
+
element?.addEventListener(event, listener)
|
|
101
|
+
const off = (): void => element?.removeEventListener(event, listener)
|
|
102
|
+
stops.push(off)
|
|
103
|
+
return off
|
|
104
|
+
},
|
|
105
|
+
dispatch,
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
let cleanup: void | (() => void)
|
|
109
|
+
let started: Promise<void> | undefined
|
|
110
|
+
onMounted(() => {
|
|
111
|
+
started = Promise.resolve(controller?.(host as never)).then((result) => {
|
|
112
|
+
if (typeof result === 'function') cleanup = result as () => void
|
|
113
|
+
})
|
|
114
|
+
})
|
|
115
|
+
onBeforeUnmount(() => {
|
|
116
|
+
for (const stop of stops.splice(0)) stop()
|
|
117
|
+
if (typeof cleanup === 'function') cleanup()
|
|
118
|
+
})
|
|
119
|
+
/** `ready` settles once the controller has started; a method exposed by the component awaits it. */
|
|
120
|
+
return { host, ready: (): Promise<void> | undefined => started }
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export interface DispatchOptions {
|
|
124
|
+
/** Each declared event's bubbles, composed, and cancelable. */
|
|
125
|
+
readonly declared?: Readonly<Record<string, EventInit>>
|
|
126
|
+
/** Each declared event's detail check, from its declared type. */
|
|
127
|
+
readonly checks?: Readonly<Record<string, (detail: unknown) => boolean>>
|
|
128
|
+
/** Props an event's detail reports, which also emit `update:<prop>` for `v-model:<prop>`. */
|
|
129
|
+
readonly modeled?: readonly string[]
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/** Dispatches a component event to Vue listeners and, for controllers and page code, on the root. */
|
|
133
|
+
export function createDispatch(
|
|
134
|
+
root: Readable<HTMLElement | null>,
|
|
135
|
+
emit?: (name: string, detail: unknown) => void,
|
|
136
|
+
options: DispatchOptions = {},
|
|
137
|
+
): (name: string, detail?: unknown) => boolean {
|
|
138
|
+
const { declared = {}, checks = {}, modeled = [] } = options
|
|
139
|
+
return (name, detail) => {
|
|
140
|
+
const check = checks[name]
|
|
141
|
+
if (detail !== undefined && check !== undefined && !check(detail)) {
|
|
142
|
+
throw new TypeError(`HR002: Event \`${name}\` detail does not satisfy its declared type.`)
|
|
143
|
+
}
|
|
144
|
+
emit?.(name, detail)
|
|
145
|
+
if (detail !== null && typeof detail === 'object') {
|
|
146
|
+
for (const prop of modeled) {
|
|
147
|
+
if (prop in detail) emit?.(`update:${prop}`, (detail as Record<string, unknown>)[prop])
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return root.value?.dispatchEvent(
|
|
151
|
+
new CustomEvent(name, { bubbles: true, composed: true, ...declared[name], detail }),
|
|
152
|
+
) ?? true
|
|
153
|
+
}
|
|
154
|
+
}
|