@threadlabs/looma 0.5.1 → 0.5.2
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/README.md +1 -1
- package/components/ui-button/ui-button.html +13 -0
- package/components/ui-combobox/ui-combobox.html +12 -4
- package/components/ui-dialog/ui-dialog.html +13 -0
- package/components/ui-editor-insert-table-grid/ui-editor-insert-table-grid.html +1 -1
- package/components/ui-editor-mention-menu/ui-editor-mention-menu.html +1 -1
- package/components/ui-editor-table-context-menu/ui-editor-table-context-menu.html +6 -2
- package/components/ui-editor-table-overlay/ui-editor-table-overlay.html +20 -4
- package/components/ui-editor-table-toolbar/ui-editor-table-toolbar.html +8 -4
- package/components/ui-form-field/ui-form-field.html +18 -7
- package/components/ui-icon/ui-icon.html +5 -1
- package/components/ui-icon-button/ui-icon-button.html +30 -0
- package/components/ui-popover/ui-popover.js +10 -2
- package/components/ui-search-shell/ui-search-shell.html +7 -0
- package/components/ui-search-shell/ui-search-shell.js +9 -0
- package/components/ui-tabs/ui-tabs.html +1 -1
- package/components/ui-toast-region/ui-toast-region.html +1 -1
- package/components/ui-tree-item/ui-tree-item.html +6 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -2
- 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 +11 -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 +18 -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 +24 -10
- package/styles/ui-grid.css +1 -1
- package/styles/ui-icon-button.css +36 -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 +11 -2
- 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 +10 -2
- package/styles/ui-tree.css +1 -1
- package/vanilla/UiAffordanceScope.d.ts +1 -1
- package/vanilla/UiAffordanceScope.js +2 -2
- package/vanilla/UiAvatar.d.ts +1 -1
- package/vanilla/UiAvatar.js +2 -2
- package/vanilla/UiAvatarGroup.d.ts +1 -1
- package/vanilla/UiAvatarGroup.js +2 -2
- package/vanilla/UiBadge.d.ts +1 -1
- package/vanilla/UiBadge.js +2 -2
- package/vanilla/UiButton.d.ts +3 -1
- package/vanilla/UiButton.js +3 -3
- package/vanilla/UiCallout.d.ts +1 -1
- package/vanilla/UiCallout.js +2 -2
- package/vanilla/UiCheckbox.d.ts +1 -1
- package/vanilla/UiCheckbox.js +2 -2
- package/vanilla/UiCluster.d.ts +1 -1
- package/vanilla/UiCluster.js +2 -2
- package/vanilla/UiCombobox.d.ts +1 -1
- package/vanilla/UiCombobox.js +3 -3
- package/vanilla/UiContainer.d.ts +1 -1
- package/vanilla/UiContainer.js +2 -2
- package/vanilla/UiContextMenu.d.ts +1 -1
- package/vanilla/UiContextMenu.js +2 -2
- package/vanilla/UiDialog.d.ts +1 -1
- package/vanilla/UiDialog.js +2 -2
- package/vanilla/UiDisclosure.d.ts +1 -1
- package/vanilla/UiDisclosure.js +2 -2
- package/vanilla/UiEditable.d.ts +1 -1
- package/vanilla/UiEditable.js +2 -2
- package/vanilla/UiEditorInsertTableGrid.d.ts +1 -1
- package/vanilla/UiEditorInsertTableGrid.js +3 -3
- package/vanilla/UiEditorMentionMenu.d.ts +1 -1
- package/vanilla/UiEditorMentionMenu.js +3 -3
- package/vanilla/UiEditorSlashMenu.d.ts +1 -1
- package/vanilla/UiEditorSlashMenu.js +2 -2
- package/vanilla/UiEditorTableContextMenu.d.ts +1 -1
- package/vanilla/UiEditorTableContextMenu.js +3 -3
- package/vanilla/UiEditorTableOverlay.d.ts +1 -1
- package/vanilla/UiEditorTableOverlay.js +3 -3
- package/vanilla/UiEditorTableToolbar.d.ts +1 -1
- package/vanilla/UiEditorTableToolbar.js +3 -3
- package/vanilla/UiEditorToolbar.d.ts +1 -1
- package/vanilla/UiEditorToolbar.js +2 -2
- package/vanilla/UiFloatingActionButton.d.ts +1 -1
- package/vanilla/UiFloatingActionButton.js +2 -2
- package/vanilla/UiFormField.d.ts +1 -1
- package/vanilla/UiFormField.js +15 -6
- package/vanilla/UiGrid.d.ts +1 -1
- package/vanilla/UiGrid.js +2 -2
- package/vanilla/UiIcon.d.ts +1 -1
- package/vanilla/UiIcon.js +3 -3
- package/vanilla/UiIconButton.d.ts +1 -1
- package/vanilla/UiIconButton.js +2 -2
- package/vanilla/UiInput.d.ts +1 -1
- package/vanilla/UiInput.js +2 -2
- package/vanilla/UiMenu.d.ts +1 -1
- package/vanilla/UiMenu.js +2 -2
- package/vanilla/UiMenuItem.d.ts +1 -1
- package/vanilla/UiMenuItem.js +2 -2
- package/vanilla/UiPopover.d.ts +1 -1
- package/vanilla/UiPopover.js +2 -2
- package/vanilla/UiRadio.d.ts +1 -1
- package/vanilla/UiRadio.js +2 -2
- package/vanilla/UiRadioGroup.d.ts +1 -1
- package/vanilla/UiRadioGroup.js +2 -2
- package/vanilla/UiReel.d.ts +1 -1
- package/vanilla/UiReel.js +2 -2
- package/vanilla/UiSearchResultRow.d.ts +1 -1
- package/vanilla/UiSearchResultRow.js +2 -2
- package/vanilla/UiSearchShell.d.ts +1 -1
- package/vanilla/UiSearchShell.js +2 -2
- package/vanilla/UiSelect.d.ts +1 -1
- package/vanilla/UiSelect.js +2 -2
- package/vanilla/UiSeparator.d.ts +1 -1
- package/vanilla/UiSeparator.js +2 -2
- package/vanilla/UiSidebar.d.ts +1 -1
- package/vanilla/UiSidebar.js +2 -2
- package/vanilla/UiStack.d.ts +1 -1
- package/vanilla/UiStack.js +2 -2
- package/vanilla/UiSwitch.d.ts +1 -1
- package/vanilla/UiSwitch.js +2 -2
- package/vanilla/UiSwitcher.d.ts +1 -1
- package/vanilla/UiSwitcher.js +2 -2
- package/vanilla/UiTabs.d.ts +1 -1
- package/vanilla/UiTabs.js +3 -3
- package/vanilla/UiTextarea.d.ts +1 -1
- package/vanilla/UiTextarea.js +2 -2
- package/vanilla/UiToastRegion.d.ts +1 -1
- package/vanilla/UiToastRegion.js +3 -3
- package/vanilla/UiTooltip.d.ts +1 -1
- package/vanilla/UiTooltip.js +2 -2
- package/vanilla/UiTopBar.d.ts +1 -1
- package/vanilla/UiTopBar.js +1 -1
- package/vanilla/UiTree.d.ts +1 -1
- package/vanilla/UiTree.js +2 -2
- package/vanilla/UiTreeItem.d.ts +1 -1
- package/vanilla/UiTreeItem.js +2 -2
- package/vue/UiAffordanceScope.d.ts +2 -2
- package/vue/UiAffordanceScope.vue +92 -73
- package/vue/UiAvatar.d.ts +7 -7
- package/vue/UiAvatar.vue +145 -105
- package/vue/UiAvatarGroup.d.ts +4 -4
- package/vue/UiAvatarGroup.vue +134 -118
- package/vue/UiBadge.d.ts +4 -4
- package/vue/UiBadge.vue +113 -114
- package/vue/UiButton.d.ts +10 -6
- package/vue/UiButton.vue +289 -248
- package/vue/UiCallout.d.ts +2 -2
- package/vue/UiCallout.vue +154 -87
- package/vue/UiCheckbox.d.ts +14 -10
- package/vue/UiCheckbox.vue +228 -162
- package/vue/UiCluster.d.ts +2 -2
- package/vue/UiCluster.vue +53 -60
- package/vue/UiCombobox.d.ts +36 -32
- package/vue/UiCombobox.vue +1005 -416
- package/vue/UiContainer.d.ts +2 -2
- package/vue/UiContainer.vue +48 -51
- package/vue/UiContextMenu.d.ts +6 -4
- package/vue/UiContextMenu.vue +205 -116
- package/vue/UiDialog.d.ts +11 -9
- package/vue/UiDialog.vue +287 -212
- package/vue/UiDisclosure.d.ts +8 -6
- package/vue/UiDisclosure.vue +248 -159
- package/vue/UiEditable.d.ts +16 -12
- package/vue/UiEditable.vue +325 -205
- package/vue/UiEditorInsertTableGrid.d.ts +8 -8
- package/vue/UiEditorInsertTableGrid.vue +216 -157
- package/vue/UiEditorMentionMenu.d.ts +9 -9
- package/vue/UiEditorMentionMenu.vue +265 -222
- package/vue/UiEditorSlashMenu.d.ts +7 -7
- package/vue/UiEditorSlashMenu.vue +286 -240
- package/vue/UiEditorTableContextMenu.d.ts +5 -5
- package/vue/UiEditorTableContextMenu.vue +306 -193
- package/vue/UiEditorTableOverlay.d.ts +2 -2
- package/vue/UiEditorTableOverlay.vue +609 -369
- package/vue/UiEditorTableToolbar.d.ts +7 -7
- package/vue/UiEditorTableToolbar.vue +443 -268
- package/vue/UiEditorToolbar.d.ts +2 -2
- package/vue/UiEditorToolbar.vue +134 -121
- package/vue/UiFloatingActionButton.d.ts +6 -6
- package/vue/UiFloatingActionButton.vue +100 -99
- package/vue/UiFormField.d.ts +6 -6
- package/vue/UiFormField.vue +112 -80
- package/vue/UiGrid.d.ts +2 -2
- package/vue/UiGrid.vue +51 -57
- package/vue/UiIcon.d.ts +2 -2
- package/vue/UiIcon.vue +118 -89
- package/vue/UiIconButton.d.ts +11 -11
- package/vue/UiIconButton.vue +283 -217
- package/vue/UiInput.d.ts +9 -9
- package/vue/UiInput.vue +153 -127
- package/vue/UiMenu.d.ts +8 -6
- package/vue/UiMenu.vue +217 -143
- package/vue/UiMenuItem.d.ts +4 -4
- package/vue/UiMenuItem.vue +52 -46
- package/vue/UiPopover.d.ts +8 -6
- package/vue/UiPopover.vue +197 -137
- package/vue/UiRadio.d.ts +14 -10
- package/vue/UiRadio.vue +183 -117
- package/vue/UiRadioGroup.d.ts +14 -12
- package/vue/UiRadioGroup.vue +172 -111
- package/vue/UiReel.d.ts +3 -3
- package/vue/UiReel.vue +77 -77
- package/vue/UiSearchResultRow.d.ts +4 -4
- package/vue/UiSearchResultRow.vue +124 -115
- package/vue/UiSearchShell.d.ts +10 -8
- package/vue/UiSearchShell.vue +245 -176
- package/vue/UiSelect.d.ts +9 -9
- package/vue/UiSelect.vue +162 -134
- package/vue/UiSeparator.d.ts +2 -2
- package/vue/UiSeparator.vue +22 -27
- package/vue/UiSidebar.d.ts +20 -18
- package/vue/UiSidebar.vue +312 -224
- package/vue/UiStack.d.ts +3 -3
- package/vue/UiStack.vue +64 -70
- package/vue/UiSwitch.d.ts +12 -8
- package/vue/UiSwitch.vue +218 -150
- package/vue/UiSwitcher.d.ts +3 -3
- package/vue/UiSwitcher.vue +73 -75
- package/vue/UiTabs.d.ts +10 -8
- package/vue/UiTabs.vue +251 -210
- package/vue/UiTextarea.d.ts +11 -11
- package/vue/UiTextarea.vue +155 -128
- package/vue/UiToastRegion.d.ts +10 -8
- package/vue/UiToastRegion.vue +261 -198
- package/vue/UiTooltip.d.ts +14 -12
- package/vue/UiTooltip.vue +241 -177
- package/vue/UiTopBar.vue +51 -42
- package/vue/UiTree.d.ts +8 -6
- package/vue/UiTree.vue +157 -70
- package/vue/UiTreeItem.d.ts +24 -22
- package/vue/UiTreeItem.vue +456 -339
- package/vue/chunks/UiAffordanceScope.js +9 -16
- package/vue/chunks/UiAvatar.js +23 -29
- package/vue/chunks/UiAvatarGroup.js +16 -39
- package/vue/chunks/UiBadge.js +3 -12
- package/vue/chunks/UiButton.js +15 -18
- package/vue/chunks/UiCallout.js +8 -17
- package/vue/chunks/UiCheckbox.js +37 -40
- package/vue/chunks/UiCluster.js +3 -12
- package/vue/chunks/UiCombobox.js +224 -266
- package/vue/chunks/UiContainer.js +3 -12
- package/vue/chunks/UiContextMenu.js +39 -34
- package/vue/chunks/UiDialog.js +36 -39
- package/vue/chunks/UiDisclosure.js +43 -48
- package/vue/chunks/UiEditable.js +55 -57
- package/vue/chunks/UiEditorInsertTableGrid.js +55 -73
- package/vue/chunks/UiEditorMentionMenu.js +40 -81
- package/vue/chunks/UiEditorSlashMenu.js +28 -52
- package/vue/chunks/UiEditorTableContextMenu.js +32 -56
- package/vue/chunks/UiEditorTableOverlay.js +58 -82
- package/vue/chunks/UiEditorTableToolbar.js +61 -85
- package/vue/chunks/UiEditorToolbar.js +4 -13
- package/vue/chunks/UiFloatingActionButton.js +7 -21
- package/vue/chunks/UiFormField.js +15 -12
- package/vue/chunks/UiGrid.js +3 -12
- package/vue/chunks/UiIcon.js +20 -43
- package/vue/chunks/UiIconButton.js +16 -28
- package/vue/chunks/UiInput.js +20 -25
- package/vue/chunks/UiMenu.js +29 -33
- package/vue/chunks/UiMenuItem.js +4 -10
- package/vue/chunks/UiPopover.js +28 -29
- package/vue/chunks/UiRadio.js +36 -39
- package/vue/chunks/UiRadioGroup.js +30 -34
- package/vue/chunks/UiReel.js +6 -15
- package/vue/chunks/UiSearchResultRow.js +6 -19
- package/vue/chunks/UiSearchShell.js +25 -28
- package/vue/chunks/UiSelect.js +20 -23
- package/vue/chunks/UiSeparator.js +2 -8
- package/vue/chunks/UiSidebar.js +39 -44
- package/vue/chunks/UiStack.js +6 -15
- package/vue/chunks/UiSwitch.js +35 -38
- package/vue/chunks/UiSwitcher.js +6 -15
- package/vue/chunks/UiTabs.js +47 -85
- package/vue/chunks/UiTextarea.js +21 -26
- package/vue/chunks/UiToastRegion.js +38 -72
- package/vue/chunks/UiTooltip.js +34 -35
- package/vue/chunks/UiTopBar.js +1 -1
- package/vue/chunks/UiTree.js +20 -15
- package/vue/chunks/UiTreeItem.js +85 -102
- package/vue/components.css +3994 -3801
package/vue/UiFormField.vue
CHANGED
|
@@ -1,124 +1,156 @@
|
|
|
1
|
-
<!-- Generated by HTML Next 1.0.0-alpha.
|
|
1
|
+
<!-- Generated by HTML Next 1.0.0-alpha.2 for Vue 3.5. Do not edit. -->
|
|
2
2
|
<script setup lang="ts">
|
|
3
|
-
import { computed, onBeforeUnmount, onMounted, ref, shallowRef, watchEffect } from
|
|
4
|
-
import * as controllerModule from
|
|
5
|
-
|
|
6
|
-
defineOptions({ inheritAttrs: false })
|
|
7
|
-
|
|
8
|
-
const props = withDefaults(
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
3
|
+
import { computed, onBeforeUnmount, onMounted, ref, shallowRef, watchEffect } from 'vue'
|
|
4
|
+
import * as controllerModule from '../components/ui-form-field/ui-form-field.js'
|
|
5
|
+
|
|
6
|
+
defineOptions({ inheritAttrs: false })
|
|
7
|
+
|
|
8
|
+
const props = withDefaults(
|
|
9
|
+
defineProps<{
|
|
10
|
+
disabled?: boolean
|
|
11
|
+
invalid?: boolean
|
|
12
|
+
required?: boolean
|
|
13
|
+
}>(),
|
|
14
|
+
{
|
|
15
|
+
disabled: false,
|
|
16
|
+
invalid: false,
|
|
17
|
+
required: false,
|
|
18
|
+
},
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
const root = ref<HTMLElement | null>(null)
|
|
19
22
|
|
|
20
23
|
/** Dispatches a component event to Vue listeners and, for controllers and page code, on the root. */
|
|
21
|
-
|
|
22
|
-
return root.value?.dispatchEvent(new CustomEvent(name, { bubbles: true, composed: true, detail }))
|
|
23
|
-
|
|
24
|
+
function dispatch(name: string, detail?: unknown): boolean {
|
|
25
|
+
return root.value?.dispatchEvent(new CustomEvent(name, { bubbles: true, composed: true, detail }))
|
|
26
|
+
?? true
|
|
27
|
+
}
|
|
24
28
|
|
|
25
29
|
function read(name: string): unknown {
|
|
26
|
-
return (props as Record<string, unknown>)[name]
|
|
30
|
+
return (props as Record<string, unknown>)[name]
|
|
27
31
|
}
|
|
28
32
|
|
|
29
33
|
function write(name: string, value: unknown): boolean {
|
|
30
|
-
throw new TypeError(`Only declared state is writable; \`${name}\` is not.`)
|
|
34
|
+
throw new TypeError(`Only declared state is writable; \`${name}\` is not.`)
|
|
31
35
|
}
|
|
32
36
|
|
|
33
|
-
const stops: Array<() => void> = []
|
|
37
|
+
const stops: Array<() => void> = []
|
|
34
38
|
const host = {
|
|
35
|
-
get element(): Element {
|
|
39
|
+
get element(): Element {
|
|
40
|
+
return root.value as Element
|
|
41
|
+
},
|
|
36
42
|
state: new Proxy({} as Record<string, unknown>, {
|
|
37
|
-
get: (_target, name) => typeof name ===
|
|
38
|
-
set: (_target, name, value) => typeof name ===
|
|
43
|
+
get: (_target, name) => typeof name === 'string' ? read(name) : undefined,
|
|
44
|
+
set: (_target, name, value) => typeof name === 'string' && write(name, value),
|
|
39
45
|
}),
|
|
40
|
-
refs:
|
|
46
|
+
refs: {} as Readonly<Record<string, Element>>,
|
|
41
47
|
elements: new Proxy({} as Record<string, Element | RadioNodeList | undefined>, {
|
|
42
48
|
get: (_target, name) => {
|
|
43
|
-
if (typeof name !==
|
|
44
|
-
const form = root.value instanceof HTMLFormElement
|
|
45
|
-
|
|
49
|
+
if (typeof name !== 'string' || root.value === null) return undefined
|
|
50
|
+
const form = root.value instanceof HTMLFormElement
|
|
51
|
+
? root.value
|
|
52
|
+
: root.value.querySelector('form')
|
|
53
|
+
return form?.elements.namedItem(name)
|
|
54
|
+
?? root.value.querySelector(`[name="${CSS.escape(name)}"]`) ?? undefined
|
|
46
55
|
},
|
|
47
56
|
}),
|
|
48
57
|
signal<T>(initialValue: T) {
|
|
49
|
-
const value = shallowRef(initialValue)
|
|
58
|
+
const value = shallowRef(initialValue)
|
|
50
59
|
return {
|
|
51
60
|
get: (): T => value.value,
|
|
52
|
-
set: (next: T): void => {
|
|
53
|
-
|
|
54
|
-
|
|
61
|
+
set: (next: T): void => {
|
|
62
|
+
if (!Object.is(value.value, next)) value.value = next
|
|
63
|
+
},
|
|
64
|
+
update: (next: (current: T) => T): void => {
|
|
65
|
+
const updated = next(value.value)
|
|
66
|
+
if (!Object.is(value.value, updated)) value.value = updated
|
|
67
|
+
},
|
|
68
|
+
}
|
|
55
69
|
},
|
|
56
70
|
computed<T>(compute: () => T) {
|
|
57
|
-
const value = computed(compute)
|
|
58
|
-
return { get: (): T => value.value }
|
|
71
|
+
const value = computed(compute)
|
|
72
|
+
return { get: (): T => value.value }
|
|
59
73
|
},
|
|
60
74
|
effect(run: () => void | (() => void)): () => void {
|
|
61
75
|
const stop = watchEffect((onCleanup) => {
|
|
62
|
-
const cleanup = run()
|
|
63
|
-
if (typeof cleanup ===
|
|
64
|
-
}, { flush:
|
|
65
|
-
stops.push(stop)
|
|
66
|
-
return stop
|
|
76
|
+
const cleanup = run()
|
|
77
|
+
if (typeof cleanup === 'function') onCleanup(cleanup)
|
|
78
|
+
}, { flush: 'post' })
|
|
79
|
+
stops.push(stop)
|
|
80
|
+
return stop
|
|
67
81
|
},
|
|
68
82
|
on(event: string, listener: EventListener): () => void {
|
|
69
|
-
const element = root.value
|
|
70
|
-
element?.addEventListener(event, listener)
|
|
71
|
-
const off = (): void => element?.removeEventListener(event, listener)
|
|
72
|
-
stops.push(off)
|
|
73
|
-
return off
|
|
83
|
+
const element = root.value
|
|
84
|
+
element?.addEventListener(event, listener)
|
|
85
|
+
const off = (): void => element?.removeEventListener(event, listener)
|
|
86
|
+
stops.push(off)
|
|
87
|
+
return off
|
|
74
88
|
},
|
|
75
89
|
dispatch,
|
|
76
|
-
}
|
|
90
|
+
}
|
|
77
91
|
|
|
78
|
-
let cleanup: void | (() => void)
|
|
79
|
-
let ready: Promise<void> | undefined
|
|
92
|
+
let cleanup: void | (() => void)
|
|
93
|
+
let ready: Promise<void> | undefined
|
|
80
94
|
onMounted(() => {
|
|
81
|
-
ready = Promise.resolve(controllerModule.default(host as never)).then((result) => {
|
|
82
|
-
|
|
95
|
+
ready = Promise.resolve(controllerModule.default(host as never)).then((result) => {
|
|
96
|
+
cleanup = result
|
|
97
|
+
})
|
|
98
|
+
})
|
|
83
99
|
onBeforeUnmount(() => {
|
|
84
|
-
for (const stop of stops.splice(0)) stop()
|
|
85
|
-
if (typeof cleanup ===
|
|
86
|
-
})
|
|
100
|
+
for (const stop of stops.splice(0)) stop()
|
|
101
|
+
if (typeof cleanup === 'function') cleanup()
|
|
102
|
+
})
|
|
87
103
|
</script>
|
|
88
104
|
|
|
89
105
|
<template>
|
|
90
|
-
<div data-component="ui-form-field" v-bind="$attrs" ref="root"
|
|
106
|
+
<div data-component="ui-form-field" v-bind="$attrs" ref="root">
|
|
107
|
+
<div class="label"><slot name="label" /></div>
|
|
108
|
+
<slot />
|
|
109
|
+
<div class="help"><slot name="help" /></div>
|
|
110
|
+
<div class="error"><slot name="error" /></div>
|
|
111
|
+
</div>
|
|
91
112
|
</template>
|
|
92
113
|
|
|
93
114
|
<style scoped>
|
|
94
115
|
[data-component~="ui-form-field"] {
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
116
|
+
display: grid;
|
|
117
|
+
gap: var(--ui-space-2);
|
|
118
|
+
min-inline-size: 0;
|
|
119
|
+
align-content: start;
|
|
120
|
+
color: var(--ui-text-primary);
|
|
121
|
+
}
|
|
101
122
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
123
|
+
/* Each named region styles whatever fills it, however it was slotted (slot="…" in HTML, #label
|
|
124
|
+
in Vue), and generates no box of its own, so an empty region adds no gap. */
|
|
125
|
+
.label,
|
|
126
|
+
.help,
|
|
127
|
+
.error {
|
|
128
|
+
display: contents;
|
|
129
|
+
}
|
|
106
130
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
line-height: var(--ui-line-height-md);
|
|
112
|
-
}
|
|
131
|
+
.label {
|
|
132
|
+
color: var(--ui-text-secondary);
|
|
133
|
+
font-size: 0.95rem;
|
|
134
|
+
}
|
|
113
135
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
136
|
+
.help {
|
|
137
|
+
color: var(--ui-text-muted);
|
|
138
|
+
font-size: 0.875rem;
|
|
139
|
+
line-height: var(--ui-line-height-md);
|
|
140
|
+
}
|
|
119
141
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
142
|
+
.help > :slotted(*) {
|
|
143
|
+
min-block-size: var(--ui-form-field-help-min-block-size, 0);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
.error,
|
|
147
|
+
:slotted([role="alert"]) {
|
|
148
|
+
color: var(--ui-accent-active);
|
|
149
|
+
font-size: 0.875rem;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/* A component that sets its display still honours the hidden attribute on its root. */
|
|
153
|
+
[data-component~="ui-form-field"][hidden] {
|
|
154
|
+
display: none;
|
|
155
|
+
}
|
|
124
156
|
</style>
|
package/vue/UiGrid.d.ts
CHANGED
package/vue/UiGrid.vue
CHANGED
|
@@ -1,72 +1,66 @@
|
|
|
1
|
-
<!-- Generated by HTML Next 1.0.0-alpha.
|
|
1
|
+
<!-- Generated by HTML Next 1.0.0-alpha.2 for Vue 3.5. Do not edit. -->
|
|
2
2
|
<script setup lang="ts">
|
|
3
|
-
import { computed } from
|
|
3
|
+
import { computed } from 'vue'
|
|
4
4
|
|
|
5
|
-
defineOptions({ inheritAttrs: false })
|
|
6
|
-
|
|
7
|
-
const hn = {
|
|
8
|
-
t: (v: unknown): boolean => v === true || (typeof v === "string" ? v.length > 0 : typeof v === "number" ? v !== 0 && v === v : Array.isArray(v) ? v.length > 0 : v !== null && typeof v === "object" ? Object.keys(v).length > 0 : false),
|
|
9
|
-
};
|
|
5
|
+
defineOptions({ inheritAttrs: false })
|
|
10
6
|
|
|
11
7
|
const props = defineProps<{
|
|
12
|
-
gap?:
|
|
13
|
-
min?:
|
|
14
|
-
}>()
|
|
15
|
-
|
|
16
|
-
/** The resolved values the styles' :host-state() rules test. */
|
|
17
|
-
const hostState = computed(() => (["gap","min"] as const).flatMap((name) => {
|
|
18
|
-
const value = read(name);
|
|
19
|
-
const tokens: string[] = hn.t(value) ? [name] : [];
|
|
20
|
-
if (typeof value === "string" || typeof value === "number") tokens.push(`${name}=${encodeURIComponent(String(value))}`);
|
|
21
|
-
return tokens;
|
|
22
|
-
}).join(" "));
|
|
23
|
-
|
|
24
|
-
function read(name: string): unknown {
|
|
25
|
-
return (props as Record<string, unknown>)[name];
|
|
26
|
-
}
|
|
8
|
+
gap?: 'xs' | 's' | 'm' | 'l' | 'xl'
|
|
9
|
+
min?: 'sm' | 'md' | 'lg'
|
|
10
|
+
}>()
|
|
27
11
|
|
|
12
|
+
/** The values the styles' :host-state() rules test. */
|
|
13
|
+
const hostState = computed(() =>
|
|
14
|
+
[
|
|
15
|
+
props.gap && `gap gap=${props.gap}`,
|
|
16
|
+
props.min && `min min=${props.min}`,
|
|
17
|
+
].filter(Boolean).join(' ')
|
|
18
|
+
)
|
|
28
19
|
</script>
|
|
29
20
|
|
|
30
21
|
<template>
|
|
31
|
-
<div data-component="ui-grid" v-bind="$attrs" :data-ui-grid-state="hostState || undefined"
|
|
22
|
+
<div data-component="ui-grid" v-bind="$attrs" :data-ui-grid-state="hostState || undefined">
|
|
23
|
+
<slot />
|
|
24
|
+
</div>
|
|
32
25
|
</template>
|
|
33
26
|
|
|
34
27
|
<style scoped>
|
|
35
28
|
[data-component~="ui-grid"] {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
29
|
+
--_grid-gap: var(--ui-space-4, 1rem);
|
|
30
|
+
--_grid-min: 12rem;
|
|
31
|
+
display: grid;
|
|
32
|
+
gap: var(--ui-grid-gap, var(--_grid-gap));
|
|
33
|
+
grid-template-columns:
|
|
34
|
+
repeat(auto-fit, minmax(min(var(--ui-grid-min, var(--_grid-min)), 100%), 1fr));
|
|
35
|
+
min-inline-size: 0;
|
|
36
|
+
max-inline-size: 100%;
|
|
37
|
+
margin: 0;
|
|
38
|
+
}
|
|
45
39
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
40
|
+
[data-component~="ui-grid"][data-ui-grid-state~="gap=xs"] {
|
|
41
|
+
--_grid-gap: var(--ui-space-2, 0.5rem);
|
|
42
|
+
}
|
|
43
|
+
[data-component~="ui-grid"][data-ui-grid-state~="gap=s"] {
|
|
44
|
+
--_grid-gap: var(--ui-space-3, 0.75rem);
|
|
45
|
+
}
|
|
46
|
+
[data-component~="ui-grid"][data-ui-grid-state~="gap=m"] {
|
|
47
|
+
--_grid-gap: var(--ui-space-4, 1rem);
|
|
48
|
+
}
|
|
49
|
+
[data-component~="ui-grid"][data-ui-grid-state~="gap=l"] {
|
|
50
|
+
--_grid-gap: var(--ui-space-5, 1.5rem);
|
|
51
|
+
}
|
|
52
|
+
[data-component~="ui-grid"][data-ui-grid-state~="gap=xl"] {
|
|
53
|
+
--_grid-gap: var(--ui-space-6, 2rem);
|
|
54
|
+
}
|
|
55
|
+
[data-component~="ui-grid"][data-ui-grid-state~="min=md"] {
|
|
56
|
+
--_grid-min: 16rem;
|
|
57
|
+
}
|
|
58
|
+
[data-component~="ui-grid"][data-ui-grid-state~="min=lg"] {
|
|
59
|
+
--_grid-min: 20rem;
|
|
60
|
+
}
|
|
67
61
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
62
|
+
/* A component that sets its display still honours the hidden attribute on its root. */
|
|
63
|
+
[data-component~="ui-grid"][hidden] {
|
|
64
|
+
display: none;
|
|
65
|
+
}
|
|
72
66
|
</style>
|
package/vue/UiIcon.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
type __VLS_Props = {
|
|
2
|
-
name?: string
|
|
2
|
+
name?: string;
|
|
3
3
|
};
|
|
4
4
|
declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
|
|
5
|
-
name: string
|
|
5
|
+
name: string;
|
|
6
6
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
7
7
|
declare const _default: typeof __VLS_export;
|
|
8
8
|
export default _default;
|
package/vue/UiIcon.vue
CHANGED
|
@@ -1,135 +1,164 @@
|
|
|
1
|
-
<!-- Generated by HTML Next 1.0.0-alpha.
|
|
1
|
+
<!-- Generated by HTML Next 1.0.0-alpha.2 for Vue 3.5. Do not edit. -->
|
|
2
2
|
<script setup lang="ts">
|
|
3
|
-
import { computed, onBeforeUnmount, onMounted, ref, shallowRef, watchEffect } from
|
|
4
|
-
import * as controllerModule from
|
|
3
|
+
import { computed, onBeforeUnmount, onMounted, ref, shallowRef, watchEffect } from 'vue'
|
|
4
|
+
import * as controllerModule from '../components/ui-icon/ui-icon.js'
|
|
5
5
|
|
|
6
|
-
defineOptions({ inheritAttrs: false })
|
|
6
|
+
defineOptions({ inheritAttrs: false })
|
|
7
7
|
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
if (where !== undefined) list = list.filter((item) => hn.t(where(item)));
|
|
15
|
-
if (sort.length > 0) {
|
|
16
|
-
const field = (item: unknown, path: string): unknown => item !== null && typeof item === "object" && !Array.isArray(item)
|
|
17
|
-
? path.split(".").reduce<unknown>((value, key) => (value as Record<string, unknown> | undefined)?.[key], item)
|
|
18
|
-
: item;
|
|
19
|
-
const compare = (a: unknown, b: unknown): number => typeof a === "number" && typeof b === "number" ? a - b : hn.text(a).localeCompare(hn.text(b));
|
|
20
|
-
list.sort((a, b) => {
|
|
21
|
-
for (const key of sort) {
|
|
22
|
-
const descending = key.startsWith("-");
|
|
23
|
-
const order = compare(field(a, descending ? key.slice(1) : key), field(b, descending ? key.slice(1) : key));
|
|
24
|
-
if (order !== 0) return descending ? -order : order;
|
|
25
|
-
}
|
|
26
|
-
return 0;
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
return typeof limit === "number" ? list.slice(0, Math.max(0, Math.trunc(limit))) : list;
|
|
8
|
+
const props = withDefaults(
|
|
9
|
+
defineProps<{
|
|
10
|
+
name?: string
|
|
11
|
+
}>(),
|
|
12
|
+
{
|
|
13
|
+
name: '',
|
|
30
14
|
},
|
|
31
|
-
|
|
15
|
+
)
|
|
32
16
|
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
17
|
+
const root = ref<HTMLElement | null>(null)
|
|
18
|
+
const shapes = ref<
|
|
19
|
+
{
|
|
20
|
+
tag: 'path' | 'circle' | 'rect'
|
|
21
|
+
d?: string
|
|
22
|
+
cx?: string
|
|
23
|
+
cy?: string
|
|
24
|
+
r?: string
|
|
25
|
+
x?: string
|
|
26
|
+
y?: string
|
|
27
|
+
width?: string
|
|
28
|
+
height?: string
|
|
29
|
+
rx?: string
|
|
30
|
+
}[]
|
|
31
|
+
>([])
|
|
41
32
|
|
|
42
33
|
/** Dispatches a component event to Vue listeners and, for controllers and page code, on the root. */
|
|
43
|
-
|
|
44
|
-
return root.value?.dispatchEvent(new CustomEvent(name, { bubbles: true, composed: true, detail }))
|
|
45
|
-
|
|
34
|
+
function dispatch(name: string, detail?: unknown): boolean {
|
|
35
|
+
return root.value?.dispatchEvent(new CustomEvent(name, { bubbles: true, composed: true, detail }))
|
|
36
|
+
?? true
|
|
37
|
+
}
|
|
46
38
|
|
|
47
39
|
function read(name: string): unknown {
|
|
48
|
-
if (name ===
|
|
49
|
-
return (props as Record<string, unknown>)[name]
|
|
40
|
+
if (name === 'shapes') return shapes.value
|
|
41
|
+
return (props as Record<string, unknown>)[name]
|
|
50
42
|
}
|
|
51
43
|
|
|
52
44
|
function write(name: string, value: unknown): boolean {
|
|
53
|
-
if (name ===
|
|
54
|
-
|
|
45
|
+
if (name === 'shapes') {
|
|
46
|
+
shapes.value = value as never
|
|
47
|
+
return true
|
|
48
|
+
}
|
|
49
|
+
throw new TypeError(`Only declared state is writable; \`${name}\` is not.`)
|
|
55
50
|
}
|
|
56
51
|
|
|
57
|
-
const stops: Array<() => void> = []
|
|
52
|
+
const stops: Array<() => void> = []
|
|
58
53
|
const host = {
|
|
59
|
-
get element(): Element {
|
|
54
|
+
get element(): Element {
|
|
55
|
+
return root.value as Element
|
|
56
|
+
},
|
|
60
57
|
state: new Proxy({} as Record<string, unknown>, {
|
|
61
|
-
get: (_target, name) => typeof name ===
|
|
62
|
-
set: (_target, name, value) => typeof name ===
|
|
58
|
+
get: (_target, name) => typeof name === 'string' ? read(name) : undefined,
|
|
59
|
+
set: (_target, name, value) => typeof name === 'string' && write(name, value),
|
|
63
60
|
}),
|
|
64
|
-
refs:
|
|
61
|
+
refs: {} as Readonly<Record<string, Element>>,
|
|
65
62
|
elements: new Proxy({} as Record<string, Element | RadioNodeList | undefined>, {
|
|
66
63
|
get: (_target, name) => {
|
|
67
|
-
if (typeof name !==
|
|
68
|
-
const form = root.value instanceof HTMLFormElement
|
|
69
|
-
|
|
64
|
+
if (typeof name !== 'string' || root.value === null) return undefined
|
|
65
|
+
const form = root.value instanceof HTMLFormElement
|
|
66
|
+
? root.value
|
|
67
|
+
: root.value.querySelector('form')
|
|
68
|
+
return form?.elements.namedItem(name)
|
|
69
|
+
?? root.value.querySelector(`[name="${CSS.escape(name)}"]`) ?? undefined
|
|
70
70
|
},
|
|
71
71
|
}),
|
|
72
72
|
signal<T>(initialValue: T) {
|
|
73
|
-
const value = shallowRef(initialValue)
|
|
73
|
+
const value = shallowRef(initialValue)
|
|
74
74
|
return {
|
|
75
75
|
get: (): T => value.value,
|
|
76
|
-
set: (next: T): void => {
|
|
77
|
-
|
|
78
|
-
|
|
76
|
+
set: (next: T): void => {
|
|
77
|
+
if (!Object.is(value.value, next)) value.value = next
|
|
78
|
+
},
|
|
79
|
+
update: (next: (current: T) => T): void => {
|
|
80
|
+
const updated = next(value.value)
|
|
81
|
+
if (!Object.is(value.value, updated)) value.value = updated
|
|
82
|
+
},
|
|
83
|
+
}
|
|
79
84
|
},
|
|
80
85
|
computed<T>(compute: () => T) {
|
|
81
|
-
const value = computed(compute)
|
|
82
|
-
return { get: (): T => value.value }
|
|
86
|
+
const value = computed(compute)
|
|
87
|
+
return { get: (): T => value.value }
|
|
83
88
|
},
|
|
84
89
|
effect(run: () => void | (() => void)): () => void {
|
|
85
90
|
const stop = watchEffect((onCleanup) => {
|
|
86
|
-
const cleanup = run()
|
|
87
|
-
if (typeof cleanup ===
|
|
88
|
-
}, { flush:
|
|
89
|
-
stops.push(stop)
|
|
90
|
-
return stop
|
|
91
|
+
const cleanup = run()
|
|
92
|
+
if (typeof cleanup === 'function') onCleanup(cleanup)
|
|
93
|
+
}, { flush: 'post' })
|
|
94
|
+
stops.push(stop)
|
|
95
|
+
return stop
|
|
91
96
|
},
|
|
92
97
|
on(event: string, listener: EventListener): () => void {
|
|
93
|
-
const element = root.value
|
|
94
|
-
element?.addEventListener(event, listener)
|
|
95
|
-
const off = (): void => element?.removeEventListener(event, listener)
|
|
96
|
-
stops.push(off)
|
|
97
|
-
return off
|
|
98
|
+
const element = root.value
|
|
99
|
+
element?.addEventListener(event, listener)
|
|
100
|
+
const off = (): void => element?.removeEventListener(event, listener)
|
|
101
|
+
stops.push(off)
|
|
102
|
+
return off
|
|
98
103
|
},
|
|
99
104
|
dispatch,
|
|
100
|
-
}
|
|
105
|
+
}
|
|
101
106
|
|
|
102
|
-
let cleanup: void | (() => void)
|
|
103
|
-
let ready: Promise<void> | undefined
|
|
107
|
+
let cleanup: void | (() => void)
|
|
108
|
+
let ready: Promise<void> | undefined
|
|
104
109
|
onMounted(() => {
|
|
105
|
-
ready = Promise.resolve(controllerModule.default(host as never)).then((result) => {
|
|
106
|
-
|
|
110
|
+
ready = Promise.resolve(controllerModule.default(host as never)).then((result) => {
|
|
111
|
+
cleanup = result
|
|
112
|
+
})
|
|
113
|
+
})
|
|
107
114
|
onBeforeUnmount(() => {
|
|
108
|
-
for (const stop of stops.splice(0)) stop()
|
|
109
|
-
if (typeof cleanup ===
|
|
110
|
-
})
|
|
115
|
+
for (const stop of stops.splice(0)) stop()
|
|
116
|
+
if (typeof cleanup === 'function') cleanup()
|
|
117
|
+
})
|
|
111
118
|
</script>
|
|
112
119
|
|
|
113
120
|
<template>
|
|
114
|
-
<span data-component="ui-icon" aria-hidden="true" v-bind="$attrs" ref="root"><svg
|
|
121
|
+
<span data-component="ui-icon" aria-hidden="true" v-bind="$attrs" ref="root"><svg
|
|
122
|
+
viewBox="0 0 24 24"
|
|
123
|
+
fill="none"
|
|
124
|
+
stroke="currentColor"
|
|
125
|
+
stroke-width="2"
|
|
126
|
+
stroke-linecap="round"
|
|
127
|
+
stroke-linejoin="round"
|
|
128
|
+
focusable="false"
|
|
129
|
+
>
|
|
130
|
+
<g v-for="(shape, index) in shapes" :key="index">
|
|
131
|
+
<path v-if="shape.tag === 'path'" :d="shape.d"></path>
|
|
132
|
+
<circle v-if="shape.tag === 'circle'" :cx="shape.cx" :cy="shape.cy" :r="shape.r"></circle>
|
|
133
|
+
<rect
|
|
134
|
+
v-if="shape.tag === 'rect'"
|
|
135
|
+
:x="shape.x"
|
|
136
|
+
:y="shape.y"
|
|
137
|
+
:width="shape.width"
|
|
138
|
+
:height="shape.height"
|
|
139
|
+
:rx="shape.rx"
|
|
140
|
+
>
|
|
141
|
+
</rect>
|
|
142
|
+
</g>
|
|
143
|
+
</svg></span>
|
|
115
144
|
</template>
|
|
116
145
|
|
|
117
146
|
<style scoped>
|
|
118
147
|
[data-component~="ui-icon"] {
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
148
|
+
display: inline-flex;
|
|
149
|
+
flex: none;
|
|
150
|
+
inline-size: var(--ui-icon-size, 1em);
|
|
151
|
+
block-size: var(--ui-icon-size, 1em);
|
|
152
|
+
}
|
|
124
153
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
154
|
+
svg {
|
|
155
|
+
inline-size: 100%;
|
|
156
|
+
block-size: 100%;
|
|
157
|
+
stroke-width: var(--ui-icon-stroke-width, 2);
|
|
158
|
+
}
|
|
130
159
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
160
|
+
/* A component that sets its display still honours the hidden attribute on its root. */
|
|
161
|
+
[data-component~="ui-icon"][hidden] {
|
|
162
|
+
display: none;
|
|
163
|
+
}
|
|
135
164
|
</style>
|