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