@threadlabs/looma 0.10.0 → 0.10.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/components/ui-editor-toolbar/ui-editor-toolbar.html +70 -20
- package/components/ui-editor-toolbar/ui-editor-toolbar.js +24 -0
- package/dist/index.js +20 -19
- package/package.json +2 -2
- package/styles/ui-affordance-scope.css +1 -1
- package/styles/ui-avatar-group.css +1 -1
- package/styles/ui-avatar.css +1 -1
- package/styles/ui-badge.css +1 -1
- package/styles/ui-button.css +1 -1
- package/styles/ui-callout.css +1 -1
- package/styles/ui-checkbox.css +1 -1
- package/styles/ui-cluster.css +1 -1
- package/styles/ui-combobox.css +1 -1
- package/styles/ui-container.css +1 -1
- package/styles/ui-context-menu.css +1 -1
- package/styles/ui-dialog.css +1 -1
- package/styles/ui-disclosure.css +1 -1
- package/styles/ui-editable.css +1 -1
- package/styles/ui-editor-insert-table-grid.css +1 -1
- package/styles/ui-editor-mention-menu.css +1 -1
- package/styles/ui-editor-slash-menu.css +1 -1
- package/styles/ui-editor-table-context-menu.css +1 -1
- package/styles/ui-editor-table-overlay.css +1 -1
- package/styles/ui-editor-table-toolbar.css +1 -1
- package/styles/ui-editor-toolbar.css +73 -19
- package/styles/ui-floating-action-button.css +1 -1
- package/styles/ui-form-field.css +1 -1
- package/styles/ui-grid.css +1 -1
- package/styles/ui-icon-button.css +1 -1
- package/styles/ui-icon.css +1 -1
- package/styles/ui-input.css +1 -1
- package/styles/ui-menu-item.css +1 -1
- package/styles/ui-menu.css +1 -1
- package/styles/ui-popover.css +1 -1
- package/styles/ui-radio-group.css +1 -1
- package/styles/ui-radio.css +1 -1
- package/styles/ui-reel.css +1 -1
- package/styles/ui-search-result-row.css +1 -1
- package/styles/ui-search-shell.css +1 -1
- package/styles/ui-select.css +1 -1
- package/styles/ui-separator.css +1 -1
- package/styles/ui-sidebar.css +1 -1
- package/styles/ui-stack.css +1 -1
- package/styles/ui-switch.css +1 -1
- package/styles/ui-switcher.css +1 -1
- package/styles/ui-tabs.css +1 -1
- package/styles/ui-textarea.css +1 -1
- package/styles/ui-toast-region.css +1 -1
- package/styles/ui-tooltip.css +1 -1
- package/styles/ui-top-bar.css +1 -1
- package/styles/ui-tree-item.css +1 -1
- package/styles/ui-tree.css +1 -1
- package/vanilla/UiAffordanceScope.d.ts +1 -1
- package/vanilla/UiAffordanceScope.js +1 -1
- package/vanilla/UiAvatar.d.ts +1 -1
- package/vanilla/UiAvatar.js +1 -1
- package/vanilla/UiAvatarGroup.d.ts +1 -1
- package/vanilla/UiAvatarGroup.js +1 -1
- package/vanilla/UiBadge.d.ts +1 -1
- package/vanilla/UiBadge.js +1 -1
- package/vanilla/UiButton.d.ts +1 -1
- package/vanilla/UiButton.js +1 -1
- package/vanilla/UiCallout.d.ts +1 -1
- package/vanilla/UiCallout.js +1 -1
- package/vanilla/UiCheckbox.d.ts +1 -1
- package/vanilla/UiCheckbox.js +1 -1
- package/vanilla/UiCluster.d.ts +1 -1
- package/vanilla/UiCluster.js +1 -1
- package/vanilla/UiCombobox.d.ts +1 -1
- package/vanilla/UiCombobox.js +1 -1
- package/vanilla/UiContainer.d.ts +1 -1
- package/vanilla/UiContainer.js +1 -1
- package/vanilla/UiContextMenu.d.ts +1 -1
- package/vanilla/UiContextMenu.js +1 -1
- package/vanilla/UiDialog.d.ts +1 -1
- package/vanilla/UiDialog.js +1 -1
- package/vanilla/UiDisclosure.d.ts +1 -1
- package/vanilla/UiDisclosure.js +1 -1
- package/vanilla/UiEditable.d.ts +1 -1
- package/vanilla/UiEditable.js +1 -1
- package/vanilla/UiEditorInsertTableGrid.d.ts +1 -1
- package/vanilla/UiEditorInsertTableGrid.js +1 -1
- package/vanilla/UiEditorMentionMenu.d.ts +1 -1
- package/vanilla/UiEditorMentionMenu.js +1 -1
- package/vanilla/UiEditorSlashMenu.d.ts +1 -1
- package/vanilla/UiEditorSlashMenu.js +1 -1
- package/vanilla/UiEditorTableContextMenu.d.ts +1 -1
- package/vanilla/UiEditorTableContextMenu.js +1 -1
- package/vanilla/UiEditorTableOverlay.d.ts +1 -1
- package/vanilla/UiEditorTableOverlay.js +1 -1
- package/vanilla/UiEditorTableToolbar.d.ts +1 -1
- package/vanilla/UiEditorTableToolbar.js +1 -1
- package/vanilla/UiEditorToolbar.d.ts +1 -1
- package/vanilla/UiEditorToolbar.js +12 -7
- package/vanilla/UiFloatingActionButton.d.ts +1 -1
- package/vanilla/UiFloatingActionButton.js +1 -1
- package/vanilla/UiFormField.d.ts +1 -1
- package/vanilla/UiFormField.js +1 -1
- package/vanilla/UiGrid.d.ts +1 -1
- package/vanilla/UiGrid.js +1 -1
- package/vanilla/UiIcon.d.ts +1 -1
- package/vanilla/UiIcon.js +1 -1
- package/vanilla/UiIconButton.d.ts +1 -1
- package/vanilla/UiIconButton.js +1 -1
- package/vanilla/UiInput.d.ts +1 -1
- package/vanilla/UiInput.js +1 -1
- package/vanilla/UiMenu.d.ts +1 -1
- package/vanilla/UiMenu.js +1 -1
- package/vanilla/UiMenuItem.d.ts +1 -1
- package/vanilla/UiMenuItem.js +1 -1
- package/vanilla/UiPopover.d.ts +1 -1
- package/vanilla/UiPopover.js +1 -1
- package/vanilla/UiRadio.d.ts +1 -1
- package/vanilla/UiRadio.js +1 -1
- package/vanilla/UiRadioGroup.d.ts +1 -1
- package/vanilla/UiRadioGroup.js +1 -1
- package/vanilla/UiReel.d.ts +1 -1
- package/vanilla/UiReel.js +1 -1
- package/vanilla/UiSearchResultRow.d.ts +1 -1
- package/vanilla/UiSearchResultRow.js +1 -1
- package/vanilla/UiSearchShell.d.ts +1 -1
- package/vanilla/UiSearchShell.js +1 -1
- package/vanilla/UiSelect.d.ts +1 -1
- package/vanilla/UiSelect.js +1 -1
- package/vanilla/UiSeparator.d.ts +1 -1
- package/vanilla/UiSeparator.js +1 -1
- package/vanilla/UiSidebar.d.ts +1 -1
- package/vanilla/UiSidebar.js +1 -1
- package/vanilla/UiStack.d.ts +1 -1
- package/vanilla/UiStack.js +1 -1
- package/vanilla/UiSwitch.d.ts +1 -1
- package/vanilla/UiSwitch.js +1 -1
- package/vanilla/UiSwitcher.d.ts +1 -1
- package/vanilla/UiSwitcher.js +1 -1
- package/vanilla/UiTabs.d.ts +1 -1
- package/vanilla/UiTabs.js +1 -1
- package/vanilla/UiTextarea.d.ts +1 -1
- package/vanilla/UiTextarea.js +1 -1
- package/vanilla/UiToastRegion.d.ts +1 -1
- package/vanilla/UiToastRegion.js +1 -1
- package/vanilla/UiTooltip.d.ts +1 -1
- package/vanilla/UiTooltip.js +1 -1
- package/vanilla/UiTopBar.d.ts +1 -1
- package/vanilla/UiTopBar.js +1 -1
- package/vanilla/UiTree.d.ts +1 -1
- package/vanilla/UiTree.js +1 -1
- package/vanilla/UiTreeItem.d.ts +1 -1
- package/vanilla/UiTreeItem.js +1 -1
- package/vue/UiAffordanceScope.vue +1 -1
- package/vue/UiAvatar.vue +1 -1
- package/vue/UiAvatarGroup.vue +1 -1
- package/vue/UiBadge.vue +1 -1
- package/vue/UiButton.vue +1 -1
- package/vue/UiCallout.vue +1 -1
- package/vue/UiCheckbox.vue +1 -1
- package/vue/UiCluster.vue +1 -1
- package/vue/UiCombobox.vue +1 -1
- package/vue/UiContainer.vue +1 -1
- package/vue/UiContextMenu.vue +1 -1
- package/vue/UiDialog.vue +1 -1
- package/vue/UiDisclosure.vue +1 -1
- package/vue/UiEditable.vue +1 -1
- package/vue/UiEditorInsertTableGrid.vue +1 -1
- package/vue/UiEditorMentionMenu.vue +1 -1
- package/vue/UiEditorSlashMenu.vue +1 -1
- package/vue/UiEditorTableContextMenu.vue +1 -1
- package/vue/UiEditorTableOverlay.vue +1 -1
- package/vue/UiEditorTableToolbar.vue +1 -1
- package/vue/UiEditorToolbar.vue +91 -21
- package/vue/UiFloatingActionButton.vue +1 -1
- package/vue/UiFormField.vue +1 -1
- package/vue/UiGrid.vue +1 -1
- package/vue/UiIcon.vue +1 -1
- package/vue/UiIconButton.vue +1 -1
- package/vue/UiInput.vue +1 -1
- package/vue/UiMenu.vue +1 -1
- package/vue/UiMenuItem.vue +1 -1
- package/vue/UiPopover.vue +1 -1
- package/vue/UiRadio.vue +1 -1
- package/vue/UiRadioGroup.vue +1 -1
- package/vue/UiReel.vue +1 -1
- package/vue/UiSearchResultRow.vue +1 -1
- package/vue/UiSearchShell.vue +1 -1
- package/vue/UiSelect.vue +1 -1
- package/vue/UiSeparator.vue +1 -1
- package/vue/UiSidebar.vue +1 -1
- package/vue/UiStack.vue +1 -1
- package/vue/UiSwitch.vue +1 -1
- package/vue/UiSwitcher.vue +1 -1
- package/vue/UiTabs.vue +1 -1
- package/vue/UiTextarea.vue +1 -1
- package/vue/UiToastRegion.vue +1 -1
- package/vue/UiTooltip.vue +1 -1
- package/vue/UiTopBar.vue +1 -1
- package/vue/UiTree.vue +1 -1
- package/vue/UiTreeItem.vue +1 -1
- package/vue/chunks/UiAffordanceScope.js +1 -1
- package/vue/chunks/UiAvatar.js +1 -1
- package/vue/chunks/UiAvatarGroup.js +1 -1
- package/vue/chunks/UiBadge.js +1 -1
- package/vue/chunks/UiButton.js +1 -1
- package/vue/chunks/UiCallout.js +1 -1
- package/vue/chunks/UiCheckbox.js +1 -1
- package/vue/chunks/UiCluster.js +1 -1
- package/vue/chunks/UiCombobox.js +1 -1
- package/vue/chunks/UiContainer.js +1 -1
- package/vue/chunks/UiContextMenu.js +1 -1
- package/vue/chunks/UiDialog.js +1 -1
- package/vue/chunks/UiDisclosure.js +1 -1
- package/vue/chunks/UiEditable.js +1 -1
- package/vue/chunks/UiEditorInsertTableGrid.js +1 -1
- package/vue/chunks/UiEditorMentionMenu.js +1 -1
- package/vue/chunks/UiEditorSlashMenu.js +1 -1
- package/vue/chunks/UiEditorTableContextMenu.js +1 -1
- package/vue/chunks/UiEditorTableOverlay.js +1 -1
- package/vue/chunks/UiEditorTableToolbar.js +1 -1
- package/vue/chunks/UiEditorToolbar.js +33 -4
- package/vue/chunks/UiFloatingActionButton.js +1 -1
- package/vue/chunks/UiFormField.js +1 -1
- package/vue/chunks/UiGrid.js +1 -1
- package/vue/chunks/UiIcon.js +1 -1
- package/vue/chunks/UiIconButton.js +1 -1
- package/vue/chunks/UiInput.js +1 -1
- package/vue/chunks/UiMenu.js +1 -1
- package/vue/chunks/UiMenuItem.js +1 -1
- package/vue/chunks/UiPopover.js +1 -1
- package/vue/chunks/UiRadio.js +1 -1
- package/vue/chunks/UiRadioGroup.js +1 -1
- package/vue/chunks/UiReel.js +1 -1
- package/vue/chunks/UiSearchResultRow.js +1 -1
- package/vue/chunks/UiSearchShell.js +1 -1
- package/vue/chunks/UiSelect.js +1 -1
- package/vue/chunks/UiSeparator.js +1 -1
- package/vue/chunks/UiSidebar.js +1 -1
- package/vue/chunks/UiStack.js +1 -1
- package/vue/chunks/UiSwitch.js +1 -1
- package/vue/chunks/UiSwitcher.js +1 -1
- package/vue/chunks/UiTabs.js +1 -1
- package/vue/chunks/UiTextarea.js +1 -1
- package/vue/chunks/UiToastRegion.js +1 -1
- package/vue/chunks/UiTooltip.js +1 -1
- package/vue/chunks/UiTopBar.js +1 -1
- package/vue/chunks/UiTree.js +1 -1
- package/vue/chunks/UiTreeItem.js +1 -1
- package/vue/chunks/host.js +8 -2
- package/vue/components.css +769 -725
- package/vue/host.ts +11 -2
|
@@ -1,35 +1,86 @@
|
|
|
1
|
-
<template component="ui-editor-toolbar">
|
|
1
|
+
<template component="ui-editor-toolbar" controller="./ui-editor-toolbar.js">
|
|
2
2
|
<defs>
|
|
3
3
|
<prop name="floating" type="boolean" default="false">Shows the toolbar as a floating bar beside the selection rather than pinned to the editor.</prop>
|
|
4
|
+
<state name="overflowStart" :value="false"></state>
|
|
5
|
+
<state name="overflowEnd" :value="false"></state>
|
|
4
6
|
</defs>
|
|
5
|
-
<div role="toolbar" aria-label="Editor toolbar"><slot></slot></div>
|
|
7
|
+
<div role="toolbar" aria-label="Editor toolbar"><div class="strip" $ref="strip"><slot></slot></div></div>
|
|
6
8
|
<style>
|
|
7
9
|
:host {
|
|
10
|
+
/* The colour the edge fades blend into: whatever the toolbar is painted with. */
|
|
11
|
+
--_matte: var(--ui-editor-toolbar-surface, var(--ui-surface));
|
|
12
|
+
|
|
8
13
|
position: sticky;
|
|
9
14
|
top: 0;
|
|
10
15
|
z-index: var(--ui-editor-toolbar-z-index, 10);
|
|
11
16
|
display: flex;
|
|
12
17
|
align-items: center;
|
|
13
|
-
justify-content: flex-start;
|
|
14
|
-
gap: var(--ui-editor-toolbar-gap, 2px);
|
|
15
18
|
padding: var(--ui-editor-toolbar-padding-block, 6px) var(--ui-editor-toolbar-padding-inline, 12px);
|
|
16
19
|
min-height: var(--ui-editor-toolbar-min-height, 48px);
|
|
17
|
-
/* More controls than the column is wide is normal at a readable measure, so the row wraps.
|
|
18
|
-
Scrolling hid the tail behind an invisible scrollbar. */
|
|
19
|
-
flex-wrap: wrap;
|
|
20
|
-
row-gap: var(--ui-editor-toolbar-row-gap, var(--ui-editor-toolbar-gap, 2px));
|
|
21
20
|
background: var(--ui-editor-toolbar-surface, var(--ui-surface));
|
|
22
21
|
border-bottom: 1px solid var(--ui-editor-toolbar-border, var(--ui-border));
|
|
23
22
|
}
|
|
24
23
|
|
|
25
|
-
|
|
24
|
+
/* One row, always. When the controls outgrow the space, the row scrolls sideways rather than
|
|
25
|
+
wrapping into several lines, and a fade at each edge that has more to show says so. */
|
|
26
|
+
.strip {
|
|
27
|
+
display: flex;
|
|
28
|
+
flex: 1 1 auto;
|
|
29
|
+
align-items: center;
|
|
30
|
+
justify-content: flex-start;
|
|
31
|
+
gap: var(--ui-editor-toolbar-gap, 2px);
|
|
32
|
+
min-width: 0;
|
|
33
|
+
overflow-x: auto;
|
|
34
|
+
overflow-y: hidden;
|
|
35
|
+
overscroll-behavior-inline: contain;
|
|
36
|
+
scrollbar-width: none;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.strip::-webkit-scrollbar {
|
|
26
40
|
display: none;
|
|
27
41
|
}
|
|
28
42
|
|
|
29
|
-
|
|
43
|
+
.strip > :slotted(*) {
|
|
30
44
|
flex: 0 0 auto;
|
|
31
45
|
}
|
|
32
46
|
|
|
47
|
+
/* The fades are mattes laid over the strip in the toolbar's own colour, not a mask, so a floating
|
|
48
|
+
toolbar's border and shadow stay whole. Each appears only while that edge hides controls. */
|
|
49
|
+
:host::before,
|
|
50
|
+
:host::after {
|
|
51
|
+
position: absolute;
|
|
52
|
+
z-index: 1;
|
|
53
|
+
inset-block: 0;
|
|
54
|
+
inline-size: var(--ui-editor-toolbar-fade-size, 32px);
|
|
55
|
+
content: "";
|
|
56
|
+
opacity: 0;
|
|
57
|
+
pointer-events: none;
|
|
58
|
+
transition: opacity var(--ui-motion-fast, 120ms) var(--ui-motion-ease, ease);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
:host::before {
|
|
62
|
+
inset-inline-start: 0;
|
|
63
|
+
background: linear-gradient(to right, var(--_matte), transparent);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
:host::after {
|
|
67
|
+
inset-inline-end: 0;
|
|
68
|
+
background: linear-gradient(to left, var(--_matte), transparent);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
:host:dir(rtl)::before {
|
|
72
|
+
background: linear-gradient(to left, var(--_matte), transparent);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
:host:dir(rtl)::after {
|
|
76
|
+
background: linear-gradient(to right, var(--_matte), transparent);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
:host-state([overflowStart])::before,
|
|
80
|
+
:host-state([overflowEnd])::after {
|
|
81
|
+
opacity: 1;
|
|
82
|
+
}
|
|
83
|
+
|
|
33
84
|
:slotted(.divider) {
|
|
34
85
|
width: 1px;
|
|
35
86
|
height: 20px;
|
|
@@ -39,14 +90,12 @@
|
|
|
39
90
|
}
|
|
40
91
|
|
|
41
92
|
:host-state([floating]) {
|
|
42
|
-
|
|
43
|
-
position: static;
|
|
93
|
+
position: relative;
|
|
44
94
|
top: auto;
|
|
45
95
|
width: max-content;
|
|
46
96
|
max-width: min(calc(100vw - 24px), 100%);
|
|
47
97
|
min-height: auto;
|
|
48
98
|
padding: var(--ui-editor-toolbar-floating-padding, 4px);
|
|
49
|
-
overflow-x: visible;
|
|
50
99
|
background: color-mix(in srgb, var(--ui-editor-toolbar-surface, var(--ui-surface)) 96%, transparent);
|
|
51
100
|
border: 1px solid var(--ui-editor-toolbar-border, var(--ui-border));
|
|
52
101
|
border-radius: var(--ui-editor-toolbar-floating-radius, var(--ui-radius-lg));
|
|
@@ -68,7 +117,7 @@
|
|
|
68
117
|
}
|
|
69
118
|
|
|
70
119
|
:host-state([floating]) {
|
|
71
|
-
position:
|
|
120
|
+
position: relative;
|
|
72
121
|
inset: auto;
|
|
73
122
|
min-height: auto;
|
|
74
123
|
border: 1px solid var(--ui-editor-toolbar-border, var(--ui-border));
|
|
@@ -79,9 +128,10 @@
|
|
|
79
128
|
|
|
80
129
|
/* Inside LoomaEditor's sticky shell, the shell is the sticky surface. */
|
|
81
130
|
.looma-editor__sticky-toolbar-shell :host {
|
|
82
|
-
|
|
131
|
+
--_matte: var(--ui-editor-toolbar-surface, var(--ui-surface));
|
|
132
|
+
|
|
133
|
+
position: relative;
|
|
83
134
|
min-height: var(--ui-editor-toolbar-min-height, 48px);
|
|
84
|
-
overscroll-behavior-inline: contain;
|
|
85
135
|
background: transparent;
|
|
86
136
|
border: 0;
|
|
87
137
|
box-shadow: none;
|
|
@@ -93,10 +143,6 @@
|
|
|
93
143
|
max-width: none;
|
|
94
144
|
min-height: 100%;
|
|
95
145
|
padding: 0;
|
|
96
|
-
overflow-x: auto;
|
|
97
|
-
overflow-y: hidden;
|
|
98
|
-
overscroll-behavior-inline: contain;
|
|
99
|
-
scroll-snap-type: x mandatory;
|
|
100
146
|
background: transparent;
|
|
101
147
|
border: 0;
|
|
102
148
|
border-radius: 0;
|
|
@@ -104,6 +150,10 @@
|
|
|
104
150
|
backdrop-filter: none;
|
|
105
151
|
}
|
|
106
152
|
|
|
153
|
+
.looma-editor__mobile-toolbar-shell :host-state([floating]) .strip {
|
|
154
|
+
scroll-snap-type: x mandatory;
|
|
155
|
+
}
|
|
156
|
+
|
|
107
157
|
/* A component that sets its display still honours the hidden attribute on its root. */
|
|
108
158
|
:host[hidden] {
|
|
109
159
|
display: none;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// Tracks whether the toolbar's row hides controls past either edge, so the stylesheet can fade that
|
|
2
|
+
// edge and only that edge. A row that fits shows no fade at all.
|
|
3
|
+
export default function controller(host) {
|
|
4
|
+
const strip = host.refs.strip;
|
|
5
|
+
const update = () => {
|
|
6
|
+
const hidden = strip.scrollWidth - strip.clientWidth;
|
|
7
|
+
// Right-to-left rows scroll from 0 into negative values; measure from the start either way.
|
|
8
|
+
const scrolled = Math.abs(strip.scrollLeft);
|
|
9
|
+
host.state.overflowStart = hidden > 1 && scrolled > 1;
|
|
10
|
+
host.state.overflowEnd = hidden > 1 && scrolled < hidden - 1;
|
|
11
|
+
};
|
|
12
|
+
strip.addEventListener("scroll", update, { passive: true });
|
|
13
|
+
const resize = new ResizeObserver(update);
|
|
14
|
+
resize.observe(strip);
|
|
15
|
+
// Controls arriving, leaving, or changing size change the row's width without resizing the strip.
|
|
16
|
+
const content = new MutationObserver(update);
|
|
17
|
+
content.observe(strip, { childList: true, subtree: true, attributes: true });
|
|
18
|
+
update();
|
|
19
|
+
return () => {
|
|
20
|
+
strip.removeEventListener("scroll", update);
|
|
21
|
+
resize.disconnect();
|
|
22
|
+
content.disconnect();
|
|
23
|
+
};
|
|
24
|
+
}
|