@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/UiTabs.vue
CHANGED
|
@@ -1,269 +1,310 @@
|
|
|
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 {
|
|
4
|
-
|
|
3
|
+
import {
|
|
4
|
+
computed,
|
|
5
|
+
onBeforeUnmount,
|
|
6
|
+
onMounted,
|
|
7
|
+
ref,
|
|
8
|
+
shallowRef,
|
|
9
|
+
useTemplateRef,
|
|
10
|
+
watchEffect,
|
|
11
|
+
} from 'vue'
|
|
12
|
+
import * as controllerModule from '../components/ui-tabs/ui-tabs.js'
|
|
5
13
|
|
|
6
|
-
defineOptions({ inheritAttrs: false })
|
|
14
|
+
defineOptions({ inheritAttrs: false })
|
|
7
15
|
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
if (n.some((value) => value === undefined)) return undefined;
|
|
21
|
-
const v = n as number[];
|
|
22
|
-
switch (fn) {
|
|
23
|
-
case "abs": return v.length === 1 ? Math.abs(v[0]!) : undefined;
|
|
24
|
-
case "round": return v.length === 1 ? Math.round(v[0]!) : undefined;
|
|
25
|
-
case "min": return v.length > 0 ? Math.min(...v) : undefined;
|
|
26
|
-
case "max": return v.length > 0 ? Math.max(...v) : undefined;
|
|
27
|
-
case "clamp": return v.length === 3 ? Math.min(Math.max(v[0]!, v[1]!), v[2]!) : undefined;
|
|
28
|
-
}
|
|
29
|
-
return undefined;
|
|
30
|
-
},
|
|
31
|
-
shape: (items: unknown, where: ((item: any) => unknown) | undefined, sort: readonly string[], limit: unknown): any[] => {
|
|
32
|
-
let list = Array.isArray(items) ? items.slice() : [];
|
|
33
|
-
if (where !== undefined) list = list.filter((item) => hn.t(where(item)));
|
|
34
|
-
if (sort.length > 0) {
|
|
35
|
-
const field = (item: unknown, path: string): unknown => item !== null && typeof item === "object" && !Array.isArray(item)
|
|
36
|
-
? path.split(".").reduce<unknown>((value, key) => (value as Record<string, unknown> | undefined)?.[key], item)
|
|
37
|
-
: item;
|
|
38
|
-
const compare = (a: unknown, b: unknown): number => typeof a === "number" && typeof b === "number" ? a - b : hn.text(a).localeCompare(hn.text(b));
|
|
39
|
-
list.sort((a, b) => {
|
|
40
|
-
for (const key of sort) {
|
|
41
|
-
const descending = key.startsWith("-");
|
|
42
|
-
const order = compare(field(a, descending ? key.slice(1) : key), field(b, descending ? key.slice(1) : key));
|
|
43
|
-
if (order !== 0) return descending ? -order : order;
|
|
44
|
-
}
|
|
45
|
-
return 0;
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
return typeof limit === "number" ? list.slice(0, Math.max(0, Math.trunc(limit))) : list;
|
|
16
|
+
const props = withDefaults(
|
|
17
|
+
defineProps<{
|
|
18
|
+
label?: string
|
|
19
|
+
orientation?: 'horizontal' | 'vertical'
|
|
20
|
+
stretch?: boolean
|
|
21
|
+
value?: string
|
|
22
|
+
}>(),
|
|
23
|
+
{
|
|
24
|
+
label: 'Tabs',
|
|
25
|
+
orientation: 'horizontal',
|
|
26
|
+
stretch: false,
|
|
27
|
+
value: '',
|
|
49
28
|
},
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
const props = withDefaults(defineProps<{
|
|
53
|
-
label?: string | null;
|
|
54
|
-
orientation?: "horizontal" | "vertical" | null;
|
|
55
|
-
stretch?: boolean | null;
|
|
56
|
-
value?: string | null;
|
|
57
|
-
}>(), {
|
|
58
|
-
label: "Tabs",
|
|
59
|
-
orientation: "horizontal",
|
|
60
|
-
stretch: false,
|
|
61
|
-
value: "",
|
|
62
|
-
});
|
|
29
|
+
)
|
|
63
30
|
const emit = defineEmits<{
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
31
|
+
'update:value': [value: string]
|
|
32
|
+
select: [
|
|
33
|
+
detail: {
|
|
34
|
+
readonly value: string
|
|
35
|
+
readonly previousValue: string
|
|
36
|
+
readonly trigger: 'keyboard' | 'pointer' | 'programmatic'
|
|
37
|
+
},
|
|
38
|
+
]
|
|
39
|
+
}>()
|
|
40
|
+
|
|
41
|
+
const root = ref<HTMLElement | null>(null)
|
|
42
|
+
const listElement = useTemplateRef<HTMLElement>('list')
|
|
43
|
+
const panelsElement = useTemplateRef<HTMLElement>('panels')
|
|
44
|
+
const internalValue = ref('')
|
|
45
|
+
const tabs = ref<{ id: string; label: string }[]>([])
|
|
46
|
+
|
|
47
|
+
/** The values the styles' :host-state() rules test. */
|
|
48
|
+
const hostState = computed(() =>
|
|
49
|
+
[
|
|
50
|
+
props.stretch && 'stretch',
|
|
51
|
+
props.orientation && `orientation orientation=${props.orientation}`,
|
|
52
|
+
].filter(Boolean).join(' ')
|
|
53
|
+
)
|
|
70
54
|
|
|
71
55
|
/** Dispatches a component event to Vue listeners and, for controllers and page code, on the root. */
|
|
72
|
-
|
|
73
|
-
const declared
|
|
56
|
+
function dispatch(name: string, detail?: unknown): boolean {
|
|
57
|
+
const declared: Record<string, EventInit | undefined> = {
|
|
58
|
+
select: { bubbles: true, composed: true, cancelable: false },
|
|
59
|
+
}
|
|
74
60
|
const checks: Record<string, (detail: unknown) => boolean> = {
|
|
75
|
-
|
|
76
|
-
|
|
61
|
+
select: (detail) =>
|
|
62
|
+
detail !== null && typeof detail === 'object' && !Array.isArray(detail)
|
|
63
|
+
&& typeof (detail as Record<string, unknown>)['value'] === 'string'
|
|
64
|
+
&& typeof (detail as Record<string, unknown>)['previousValue'] === 'string'
|
|
65
|
+
&& ((detail as Record<string, unknown>)['trigger'] === 'keyboard'
|
|
66
|
+
|| (detail as Record<string, unknown>)['trigger'] === 'pointer'
|
|
67
|
+
|| (detail as Record<string, unknown>)['trigger'] === 'programmatic')
|
|
68
|
+
&& Object.keys(detail as object).every((key) =>
|
|
69
|
+
['value', 'previousValue', 'trigger'].includes(key)
|
|
70
|
+
),
|
|
71
|
+
}
|
|
77
72
|
if (detail !== undefined && checks[name] !== undefined && !checks[name]!(detail)) {
|
|
78
|
-
throw new TypeError(`HR002: Event \`${name}\` detail does not satisfy its declared type.`)
|
|
73
|
+
throw new TypeError(`HR002: Event \`${name}\` detail does not satisfy its declared type.`)
|
|
79
74
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
return tokens;
|
|
90
|
-
}).join(" "));
|
|
75
|
+
const emitEvent = emit as (name: string, detail: unknown) => void
|
|
76
|
+
emitEvent(name, detail)
|
|
77
|
+
if (detail !== null && typeof detail === 'object' && 'value' in detail) {
|
|
78
|
+
emitEvent('update:value', (detail as Record<string, unknown>)['value'])
|
|
79
|
+
}
|
|
80
|
+
return root.value?.dispatchEvent(
|
|
81
|
+
new CustomEvent(name, { bubbles: true, composed: true, ...declared[name], detail }),
|
|
82
|
+
) ?? true
|
|
83
|
+
}
|
|
91
84
|
|
|
92
85
|
function read(name: string): unknown {
|
|
93
|
-
if (name ===
|
|
94
|
-
if (name ===
|
|
95
|
-
return (props as Record<string, unknown>)[name]
|
|
86
|
+
if (name === 'internalValue') return internalValue.value
|
|
87
|
+
if (name === 'tabs') return tabs.value
|
|
88
|
+
return (props as Record<string, unknown>)[name]
|
|
96
89
|
}
|
|
97
90
|
|
|
98
91
|
function write(name: string, value: unknown): boolean {
|
|
99
|
-
if (name ===
|
|
100
|
-
|
|
101
|
-
|
|
92
|
+
if (name === 'internalValue') {
|
|
93
|
+
internalValue.value = value as never
|
|
94
|
+
return true
|
|
95
|
+
}
|
|
96
|
+
if (name === 'tabs') {
|
|
97
|
+
tabs.value = value as never
|
|
98
|
+
return true
|
|
99
|
+
}
|
|
100
|
+
throw new TypeError(`Only declared state is writable; \`${name}\` is not.`)
|
|
102
101
|
}
|
|
103
102
|
|
|
104
|
-
const stops: Array<() => void> = []
|
|
103
|
+
const stops: Array<() => void> = []
|
|
105
104
|
const host = {
|
|
106
|
-
get element(): Element {
|
|
105
|
+
get element(): Element {
|
|
106
|
+
return root.value as Element
|
|
107
|
+
},
|
|
107
108
|
state: new Proxy({} as Record<string, unknown>, {
|
|
108
|
-
get: (_target, name) => typeof name ===
|
|
109
|
-
set: (_target, name, value) => typeof name ===
|
|
109
|
+
get: (_target, name) => typeof name === 'string' ? read(name) : undefined,
|
|
110
|
+
set: (_target, name, value) => typeof name === 'string' && write(name, value),
|
|
110
111
|
}),
|
|
111
|
-
refs:
|
|
112
|
+
refs: {
|
|
113
|
+
get list(): Element {
|
|
114
|
+
return listElement.value as Element
|
|
115
|
+
},
|
|
116
|
+
get panels(): Element {
|
|
117
|
+
return panelsElement.value as Element
|
|
118
|
+
},
|
|
119
|
+
} as Readonly<Record<string, Element>>,
|
|
112
120
|
elements: new Proxy({} as Record<string, Element | RadioNodeList | undefined>, {
|
|
113
121
|
get: (_target, name) => {
|
|
114
|
-
if (typeof name !==
|
|
115
|
-
const form = root.value instanceof HTMLFormElement
|
|
116
|
-
|
|
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
|
|
117
128
|
},
|
|
118
129
|
}),
|
|
119
130
|
signal<T>(initialValue: T) {
|
|
120
|
-
const value = shallowRef(initialValue)
|
|
131
|
+
const value = shallowRef(initialValue)
|
|
121
132
|
return {
|
|
122
133
|
get: (): T => value.value,
|
|
123
|
-
set: (next: T): void => {
|
|
124
|
-
|
|
125
|
-
|
|
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
|
+
}
|
|
126
142
|
},
|
|
127
143
|
computed<T>(compute: () => T) {
|
|
128
|
-
const value = computed(compute)
|
|
129
|
-
return { get: (): T => value.value }
|
|
144
|
+
const value = computed(compute)
|
|
145
|
+
return { get: (): T => value.value }
|
|
130
146
|
},
|
|
131
147
|
effect(run: () => void | (() => void)): () => void {
|
|
132
148
|
const stop = watchEffect((onCleanup) => {
|
|
133
|
-
const cleanup = run()
|
|
134
|
-
if (typeof cleanup ===
|
|
135
|
-
}, { flush:
|
|
136
|
-
stops.push(stop)
|
|
137
|
-
return stop
|
|
149
|
+
const cleanup = run()
|
|
150
|
+
if (typeof cleanup === 'function') onCleanup(cleanup)
|
|
151
|
+
}, { flush: 'post' })
|
|
152
|
+
stops.push(stop)
|
|
153
|
+
return stop
|
|
138
154
|
},
|
|
139
155
|
on(event: string, listener: EventListener): () => void {
|
|
140
|
-
const element = root.value
|
|
141
|
-
element?.addEventListener(event, listener)
|
|
142
|
-
const off = (): void => element?.removeEventListener(event, listener)
|
|
143
|
-
stops.push(off)
|
|
144
|
-
return off
|
|
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
|
|
145
161
|
},
|
|
146
162
|
dispatch,
|
|
147
|
-
}
|
|
163
|
+
}
|
|
148
164
|
|
|
149
|
-
let cleanup: void | (() => void)
|
|
150
|
-
let ready: Promise<void> | undefined
|
|
165
|
+
let cleanup: void | (() => void)
|
|
166
|
+
let ready: Promise<void> | undefined
|
|
151
167
|
onMounted(() => {
|
|
152
|
-
ready = Promise.resolve(controllerModule.default(host as never)).then((result) => {
|
|
153
|
-
|
|
168
|
+
ready = Promise.resolve(controllerModule.default(host as never)).then((result) => {
|
|
169
|
+
cleanup = result
|
|
170
|
+
})
|
|
171
|
+
})
|
|
154
172
|
onBeforeUnmount(() => {
|
|
155
|
-
for (const stop of stops.splice(0)) stop()
|
|
156
|
-
if (typeof cleanup ===
|
|
157
|
-
})
|
|
173
|
+
for (const stop of stops.splice(0)) stop()
|
|
174
|
+
if (typeof cleanup === 'function') cleanup()
|
|
175
|
+
})
|
|
158
176
|
</script>
|
|
159
177
|
|
|
160
178
|
<template>
|
|
161
|
-
<div
|
|
179
|
+
<div
|
|
180
|
+
data-component="ui-tabs"
|
|
181
|
+
v-bind="$attrs"
|
|
182
|
+
:data-ui-tabs-state="hostState || undefined"
|
|
183
|
+
ref="root"
|
|
184
|
+
>
|
|
185
|
+
<div class="list" role="tablist" :aria-label="label" :aria-orientation="orientation" ref="list">
|
|
186
|
+
<button
|
|
187
|
+
v-for="tab in tabs"
|
|
188
|
+
:key="tab.id"
|
|
189
|
+
type="button"
|
|
190
|
+
role="tab"
|
|
191
|
+
:id="`${tab.id}-tab`"
|
|
192
|
+
:value="tab.id"
|
|
193
|
+
:aria-controls="tab.id"
|
|
194
|
+
:aria-selected="tab.id === internalValue"
|
|
195
|
+
>
|
|
196
|
+
{{ tab.label }}
|
|
197
|
+
</button>
|
|
198
|
+
</div>
|
|
199
|
+
<div class="panels" ref="panels"><slot /></div>
|
|
200
|
+
</div>
|
|
162
201
|
</template>
|
|
163
202
|
|
|
164
203
|
<style scoped>
|
|
165
204
|
[data-component~="ui-tabs"] {
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
205
|
+
display: grid;
|
|
206
|
+
inline-size: 100%;
|
|
207
|
+
min-inline-size: 0;
|
|
208
|
+
}
|
|
170
209
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
210
|
+
.list {
|
|
211
|
+
display: grid;
|
|
212
|
+
grid-auto-flow: column;
|
|
213
|
+
grid-auto-columns: max-content;
|
|
214
|
+
justify-content: start;
|
|
215
|
+
inline-size: 100%;
|
|
216
|
+
max-inline-size: 100%;
|
|
217
|
+
/* Tabs that do not fit scroll sideways rather than wrapping or squeezing. */
|
|
218
|
+
overflow-x: auto;
|
|
219
|
+
/* overflow-x: auto would make the block axis scrollable too; a sideways swipe must not scroll the
|
|
220
|
+
strip or the page vertically. */
|
|
221
|
+
overflow-y: hidden;
|
|
222
|
+
overscroll-behavior: contain;
|
|
223
|
+
scrollbar-width: thin;
|
|
224
|
+
border-block-end: 1px solid var(--ui-border-default);
|
|
225
|
+
}
|
|
187
226
|
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
227
|
+
.list button {
|
|
228
|
+
min-block-size: 2.5rem;
|
|
229
|
+
margin: 0 0 -1px;
|
|
230
|
+
padding: var(--ui-space-2) var(--ui-space-3);
|
|
231
|
+
border: 0;
|
|
232
|
+
border-block-end: 2px solid transparent;
|
|
233
|
+
background: transparent;
|
|
234
|
+
color: var(--ui-text-secondary);
|
|
235
|
+
font: inherit;
|
|
236
|
+
font-size: var(--ui-font-size-sm);
|
|
237
|
+
font-weight: var(--ui-font-medium, 500);
|
|
238
|
+
cursor: pointer;
|
|
239
|
+
transition:
|
|
240
|
+
color var(--ui-motion-fast) var(--ui-motion-ease),
|
|
241
|
+
background-color var(--ui-motion-fast) var(--ui-motion-ease),
|
|
242
|
+
border-color var(--ui-motion-fast) var(--ui-motion-ease);
|
|
243
|
+
}
|
|
205
244
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
245
|
+
[data-component~="ui-tabs"][data-ui-tabs-state~="stretch"] .list {
|
|
246
|
+
grid-auto-columns: minmax(max-content, 1fr);
|
|
247
|
+
}
|
|
209
248
|
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
249
|
+
.list button {
|
|
250
|
+
white-space: nowrap;
|
|
251
|
+
}
|
|
213
252
|
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
253
|
+
.list button:hover {
|
|
254
|
+
color: var(--ui-text-primary);
|
|
255
|
+
background: var(--ui-surface-muted);
|
|
256
|
+
}
|
|
257
|
+
.list button[aria-selected="true"] {
|
|
258
|
+
color: var(--ui-accent-solid);
|
|
259
|
+
border-block-end-color: var(--ui-accent-solid);
|
|
260
|
+
}
|
|
261
|
+
.list button:focus-visible {
|
|
262
|
+
position: relative;
|
|
263
|
+
outline: none;
|
|
264
|
+
box-shadow: inset 0 0 0 2px color-mix(in srgb, var(--ui-focus-ring) 45%, transparent);
|
|
265
|
+
border-radius: var(--ui-radius-1);
|
|
266
|
+
}
|
|
228
267
|
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
268
|
+
.panels {
|
|
269
|
+
min-inline-size: 0;
|
|
270
|
+
}
|
|
271
|
+
:slotted(*) {
|
|
272
|
+
padding: var(--ui-space-4);
|
|
273
|
+
}
|
|
235
274
|
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
275
|
+
[data-component~="ui-tabs"][data-ui-tabs-state~="orientation=vertical"] {
|
|
276
|
+
grid-template-columns: max-content minmax(0, 1fr);
|
|
277
|
+
align-items: start;
|
|
278
|
+
}
|
|
240
279
|
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
280
|
+
[data-component~="ui-tabs"][data-ui-tabs-state~="orientation=vertical"] .list {
|
|
281
|
+
grid-auto-flow: row;
|
|
282
|
+
grid-auto-columns: auto;
|
|
283
|
+
border-block-end: 0;
|
|
284
|
+
border-inline-end: 1px solid var(--ui-border-default);
|
|
285
|
+
}
|
|
247
286
|
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
287
|
+
[data-component~="ui-tabs"][data-ui-tabs-state~="orientation=vertical"] .list button {
|
|
288
|
+
margin: 0 -1px 0 0;
|
|
289
|
+
border-block-end: 0;
|
|
290
|
+
border-inline-end: 2px solid transparent;
|
|
291
|
+
text-align: start;
|
|
292
|
+
}
|
|
254
293
|
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
294
|
+
[data-component~="ui-tabs"][data-ui-tabs-state~="orientation=vertical"]
|
|
295
|
+
.list
|
|
296
|
+
button[aria-selected="true"] {
|
|
297
|
+
border-inline-end-color: var(--ui-accent-solid);
|
|
298
|
+
}
|
|
258
299
|
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
300
|
+
@media (prefers-reduced-motion: reduce) {
|
|
301
|
+
.list button {
|
|
302
|
+
transition: none;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
264
305
|
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
306
|
+
/* A component that sets its display still honours the hidden attribute on its root. */
|
|
307
|
+
[data-component~="ui-tabs"][hidden] {
|
|
308
|
+
display: none;
|
|
309
|
+
}
|
|
269
310
|
</style>
|
package/vue/UiTextarea.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
type __VLS_Props = {
|
|
2
|
-
disabled?: boolean
|
|
3
|
-
invalid?: boolean
|
|
4
|
-
readonly?: boolean
|
|
5
|
-
required?: boolean
|
|
6
|
-
rows?: number
|
|
7
|
-
value?: string
|
|
2
|
+
disabled?: boolean;
|
|
3
|
+
invalid?: boolean;
|
|
4
|
+
readonly?: boolean;
|
|
5
|
+
required?: boolean;
|
|
6
|
+
rows?: number;
|
|
7
|
+
value?: string;
|
|
8
8
|
modelValue?: string | null;
|
|
9
9
|
};
|
|
10
10
|
declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
@@ -12,11 +12,11 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {
|
|
|
12
12
|
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
13
13
|
"onUpdate:modelValue"?: ((value: string) => any) | undefined;
|
|
14
14
|
}>, {
|
|
15
|
-
invalid: boolean
|
|
16
|
-
disabled: boolean
|
|
17
|
-
required: boolean
|
|
18
|
-
readonly: boolean
|
|
19
|
-
rows: number
|
|
15
|
+
invalid: boolean;
|
|
16
|
+
disabled: boolean;
|
|
17
|
+
required: boolean;
|
|
18
|
+
readonly: boolean;
|
|
19
|
+
rows: number;
|
|
20
20
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
21
21
|
declare const _default: typeof __VLS_export;
|
|
22
22
|
export default _default;
|