@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.
Files changed (247) hide show
  1. package/components/ui-editor-toolbar/ui-editor-toolbar.html +70 -20
  2. package/components/ui-editor-toolbar/ui-editor-toolbar.js +24 -0
  3. package/dist/index.js +20 -19
  4. package/package.json +2 -2
  5. package/styles/ui-affordance-scope.css +1 -1
  6. package/styles/ui-avatar-group.css +1 -1
  7. package/styles/ui-avatar.css +1 -1
  8. package/styles/ui-badge.css +1 -1
  9. package/styles/ui-button.css +1 -1
  10. package/styles/ui-callout.css +1 -1
  11. package/styles/ui-checkbox.css +1 -1
  12. package/styles/ui-cluster.css +1 -1
  13. package/styles/ui-combobox.css +1 -1
  14. package/styles/ui-container.css +1 -1
  15. package/styles/ui-context-menu.css +1 -1
  16. package/styles/ui-dialog.css +1 -1
  17. package/styles/ui-disclosure.css +1 -1
  18. package/styles/ui-editable.css +1 -1
  19. package/styles/ui-editor-insert-table-grid.css +1 -1
  20. package/styles/ui-editor-mention-menu.css +1 -1
  21. package/styles/ui-editor-slash-menu.css +1 -1
  22. package/styles/ui-editor-table-context-menu.css +1 -1
  23. package/styles/ui-editor-table-overlay.css +1 -1
  24. package/styles/ui-editor-table-toolbar.css +1 -1
  25. package/styles/ui-editor-toolbar.css +73 -19
  26. package/styles/ui-floating-action-button.css +1 -1
  27. package/styles/ui-form-field.css +1 -1
  28. package/styles/ui-grid.css +1 -1
  29. package/styles/ui-icon-button.css +1 -1
  30. package/styles/ui-icon.css +1 -1
  31. package/styles/ui-input.css +1 -1
  32. package/styles/ui-menu-item.css +1 -1
  33. package/styles/ui-menu.css +1 -1
  34. package/styles/ui-popover.css +1 -1
  35. package/styles/ui-radio-group.css +1 -1
  36. package/styles/ui-radio.css +1 -1
  37. package/styles/ui-reel.css +1 -1
  38. package/styles/ui-search-result-row.css +1 -1
  39. package/styles/ui-search-shell.css +1 -1
  40. package/styles/ui-select.css +1 -1
  41. package/styles/ui-separator.css +1 -1
  42. package/styles/ui-sidebar.css +1 -1
  43. package/styles/ui-stack.css +1 -1
  44. package/styles/ui-switch.css +1 -1
  45. package/styles/ui-switcher.css +1 -1
  46. package/styles/ui-tabs.css +1 -1
  47. package/styles/ui-textarea.css +1 -1
  48. package/styles/ui-toast-region.css +1 -1
  49. package/styles/ui-tooltip.css +1 -1
  50. package/styles/ui-top-bar.css +1 -1
  51. package/styles/ui-tree-item.css +1 -1
  52. package/styles/ui-tree.css +1 -1
  53. package/vanilla/UiAffordanceScope.d.ts +1 -1
  54. package/vanilla/UiAffordanceScope.js +1 -1
  55. package/vanilla/UiAvatar.d.ts +1 -1
  56. package/vanilla/UiAvatar.js +1 -1
  57. package/vanilla/UiAvatarGroup.d.ts +1 -1
  58. package/vanilla/UiAvatarGroup.js +1 -1
  59. package/vanilla/UiBadge.d.ts +1 -1
  60. package/vanilla/UiBadge.js +1 -1
  61. package/vanilla/UiButton.d.ts +1 -1
  62. package/vanilla/UiButton.js +1 -1
  63. package/vanilla/UiCallout.d.ts +1 -1
  64. package/vanilla/UiCallout.js +1 -1
  65. package/vanilla/UiCheckbox.d.ts +1 -1
  66. package/vanilla/UiCheckbox.js +1 -1
  67. package/vanilla/UiCluster.d.ts +1 -1
  68. package/vanilla/UiCluster.js +1 -1
  69. package/vanilla/UiCombobox.d.ts +1 -1
  70. package/vanilla/UiCombobox.js +1 -1
  71. package/vanilla/UiContainer.d.ts +1 -1
  72. package/vanilla/UiContainer.js +1 -1
  73. package/vanilla/UiContextMenu.d.ts +1 -1
  74. package/vanilla/UiContextMenu.js +1 -1
  75. package/vanilla/UiDialog.d.ts +1 -1
  76. package/vanilla/UiDialog.js +1 -1
  77. package/vanilla/UiDisclosure.d.ts +1 -1
  78. package/vanilla/UiDisclosure.js +1 -1
  79. package/vanilla/UiEditable.d.ts +1 -1
  80. package/vanilla/UiEditable.js +1 -1
  81. package/vanilla/UiEditorInsertTableGrid.d.ts +1 -1
  82. package/vanilla/UiEditorInsertTableGrid.js +1 -1
  83. package/vanilla/UiEditorMentionMenu.d.ts +1 -1
  84. package/vanilla/UiEditorMentionMenu.js +1 -1
  85. package/vanilla/UiEditorSlashMenu.d.ts +1 -1
  86. package/vanilla/UiEditorSlashMenu.js +1 -1
  87. package/vanilla/UiEditorTableContextMenu.d.ts +1 -1
  88. package/vanilla/UiEditorTableContextMenu.js +1 -1
  89. package/vanilla/UiEditorTableOverlay.d.ts +1 -1
  90. package/vanilla/UiEditorTableOverlay.js +1 -1
  91. package/vanilla/UiEditorTableToolbar.d.ts +1 -1
  92. package/vanilla/UiEditorTableToolbar.js +1 -1
  93. package/vanilla/UiEditorToolbar.d.ts +1 -1
  94. package/vanilla/UiEditorToolbar.js +12 -7
  95. package/vanilla/UiFloatingActionButton.d.ts +1 -1
  96. package/vanilla/UiFloatingActionButton.js +1 -1
  97. package/vanilla/UiFormField.d.ts +1 -1
  98. package/vanilla/UiFormField.js +1 -1
  99. package/vanilla/UiGrid.d.ts +1 -1
  100. package/vanilla/UiGrid.js +1 -1
  101. package/vanilla/UiIcon.d.ts +1 -1
  102. package/vanilla/UiIcon.js +1 -1
  103. package/vanilla/UiIconButton.d.ts +1 -1
  104. package/vanilla/UiIconButton.js +1 -1
  105. package/vanilla/UiInput.d.ts +1 -1
  106. package/vanilla/UiInput.js +1 -1
  107. package/vanilla/UiMenu.d.ts +1 -1
  108. package/vanilla/UiMenu.js +1 -1
  109. package/vanilla/UiMenuItem.d.ts +1 -1
  110. package/vanilla/UiMenuItem.js +1 -1
  111. package/vanilla/UiPopover.d.ts +1 -1
  112. package/vanilla/UiPopover.js +1 -1
  113. package/vanilla/UiRadio.d.ts +1 -1
  114. package/vanilla/UiRadio.js +1 -1
  115. package/vanilla/UiRadioGroup.d.ts +1 -1
  116. package/vanilla/UiRadioGroup.js +1 -1
  117. package/vanilla/UiReel.d.ts +1 -1
  118. package/vanilla/UiReel.js +1 -1
  119. package/vanilla/UiSearchResultRow.d.ts +1 -1
  120. package/vanilla/UiSearchResultRow.js +1 -1
  121. package/vanilla/UiSearchShell.d.ts +1 -1
  122. package/vanilla/UiSearchShell.js +1 -1
  123. package/vanilla/UiSelect.d.ts +1 -1
  124. package/vanilla/UiSelect.js +1 -1
  125. package/vanilla/UiSeparator.d.ts +1 -1
  126. package/vanilla/UiSeparator.js +1 -1
  127. package/vanilla/UiSidebar.d.ts +1 -1
  128. package/vanilla/UiSidebar.js +1 -1
  129. package/vanilla/UiStack.d.ts +1 -1
  130. package/vanilla/UiStack.js +1 -1
  131. package/vanilla/UiSwitch.d.ts +1 -1
  132. package/vanilla/UiSwitch.js +1 -1
  133. package/vanilla/UiSwitcher.d.ts +1 -1
  134. package/vanilla/UiSwitcher.js +1 -1
  135. package/vanilla/UiTabs.d.ts +1 -1
  136. package/vanilla/UiTabs.js +1 -1
  137. package/vanilla/UiTextarea.d.ts +1 -1
  138. package/vanilla/UiTextarea.js +1 -1
  139. package/vanilla/UiToastRegion.d.ts +1 -1
  140. package/vanilla/UiToastRegion.js +1 -1
  141. package/vanilla/UiTooltip.d.ts +1 -1
  142. package/vanilla/UiTooltip.js +1 -1
  143. package/vanilla/UiTopBar.d.ts +1 -1
  144. package/vanilla/UiTopBar.js +1 -1
  145. package/vanilla/UiTree.d.ts +1 -1
  146. package/vanilla/UiTree.js +1 -1
  147. package/vanilla/UiTreeItem.d.ts +1 -1
  148. package/vanilla/UiTreeItem.js +1 -1
  149. package/vue/UiAffordanceScope.vue +1 -1
  150. package/vue/UiAvatar.vue +1 -1
  151. package/vue/UiAvatarGroup.vue +1 -1
  152. package/vue/UiBadge.vue +1 -1
  153. package/vue/UiButton.vue +1 -1
  154. package/vue/UiCallout.vue +1 -1
  155. package/vue/UiCheckbox.vue +1 -1
  156. package/vue/UiCluster.vue +1 -1
  157. package/vue/UiCombobox.vue +1 -1
  158. package/vue/UiContainer.vue +1 -1
  159. package/vue/UiContextMenu.vue +1 -1
  160. package/vue/UiDialog.vue +1 -1
  161. package/vue/UiDisclosure.vue +1 -1
  162. package/vue/UiEditable.vue +1 -1
  163. package/vue/UiEditorInsertTableGrid.vue +1 -1
  164. package/vue/UiEditorMentionMenu.vue +1 -1
  165. package/vue/UiEditorSlashMenu.vue +1 -1
  166. package/vue/UiEditorTableContextMenu.vue +1 -1
  167. package/vue/UiEditorTableOverlay.vue +1 -1
  168. package/vue/UiEditorTableToolbar.vue +1 -1
  169. package/vue/UiEditorToolbar.vue +91 -21
  170. package/vue/UiFloatingActionButton.vue +1 -1
  171. package/vue/UiFormField.vue +1 -1
  172. package/vue/UiGrid.vue +1 -1
  173. package/vue/UiIcon.vue +1 -1
  174. package/vue/UiIconButton.vue +1 -1
  175. package/vue/UiInput.vue +1 -1
  176. package/vue/UiMenu.vue +1 -1
  177. package/vue/UiMenuItem.vue +1 -1
  178. package/vue/UiPopover.vue +1 -1
  179. package/vue/UiRadio.vue +1 -1
  180. package/vue/UiRadioGroup.vue +1 -1
  181. package/vue/UiReel.vue +1 -1
  182. package/vue/UiSearchResultRow.vue +1 -1
  183. package/vue/UiSearchShell.vue +1 -1
  184. package/vue/UiSelect.vue +1 -1
  185. package/vue/UiSeparator.vue +1 -1
  186. package/vue/UiSidebar.vue +1 -1
  187. package/vue/UiStack.vue +1 -1
  188. package/vue/UiSwitch.vue +1 -1
  189. package/vue/UiSwitcher.vue +1 -1
  190. package/vue/UiTabs.vue +1 -1
  191. package/vue/UiTextarea.vue +1 -1
  192. package/vue/UiToastRegion.vue +1 -1
  193. package/vue/UiTooltip.vue +1 -1
  194. package/vue/UiTopBar.vue +1 -1
  195. package/vue/UiTree.vue +1 -1
  196. package/vue/UiTreeItem.vue +1 -1
  197. package/vue/chunks/UiAffordanceScope.js +1 -1
  198. package/vue/chunks/UiAvatar.js +1 -1
  199. package/vue/chunks/UiAvatarGroup.js +1 -1
  200. package/vue/chunks/UiBadge.js +1 -1
  201. package/vue/chunks/UiButton.js +1 -1
  202. package/vue/chunks/UiCallout.js +1 -1
  203. package/vue/chunks/UiCheckbox.js +1 -1
  204. package/vue/chunks/UiCluster.js +1 -1
  205. package/vue/chunks/UiCombobox.js +1 -1
  206. package/vue/chunks/UiContainer.js +1 -1
  207. package/vue/chunks/UiContextMenu.js +1 -1
  208. package/vue/chunks/UiDialog.js +1 -1
  209. package/vue/chunks/UiDisclosure.js +1 -1
  210. package/vue/chunks/UiEditable.js +1 -1
  211. package/vue/chunks/UiEditorInsertTableGrid.js +1 -1
  212. package/vue/chunks/UiEditorMentionMenu.js +1 -1
  213. package/vue/chunks/UiEditorSlashMenu.js +1 -1
  214. package/vue/chunks/UiEditorTableContextMenu.js +1 -1
  215. package/vue/chunks/UiEditorTableOverlay.js +1 -1
  216. package/vue/chunks/UiEditorTableToolbar.js +1 -1
  217. package/vue/chunks/UiEditorToolbar.js +33 -4
  218. package/vue/chunks/UiFloatingActionButton.js +1 -1
  219. package/vue/chunks/UiFormField.js +1 -1
  220. package/vue/chunks/UiGrid.js +1 -1
  221. package/vue/chunks/UiIcon.js +1 -1
  222. package/vue/chunks/UiIconButton.js +1 -1
  223. package/vue/chunks/UiInput.js +1 -1
  224. package/vue/chunks/UiMenu.js +1 -1
  225. package/vue/chunks/UiMenuItem.js +1 -1
  226. package/vue/chunks/UiPopover.js +1 -1
  227. package/vue/chunks/UiRadio.js +1 -1
  228. package/vue/chunks/UiRadioGroup.js +1 -1
  229. package/vue/chunks/UiReel.js +1 -1
  230. package/vue/chunks/UiSearchResultRow.js +1 -1
  231. package/vue/chunks/UiSearchShell.js +1 -1
  232. package/vue/chunks/UiSelect.js +1 -1
  233. package/vue/chunks/UiSeparator.js +1 -1
  234. package/vue/chunks/UiSidebar.js +1 -1
  235. package/vue/chunks/UiStack.js +1 -1
  236. package/vue/chunks/UiSwitch.js +1 -1
  237. package/vue/chunks/UiSwitcher.js +1 -1
  238. package/vue/chunks/UiTabs.js +1 -1
  239. package/vue/chunks/UiTextarea.js +1 -1
  240. package/vue/chunks/UiToastRegion.js +1 -1
  241. package/vue/chunks/UiTooltip.js +1 -1
  242. package/vue/chunks/UiTopBar.js +1 -1
  243. package/vue/chunks/UiTree.js +1 -1
  244. package/vue/chunks/UiTreeItem.js +1 -1
  245. package/vue/chunks/host.js +8 -2
  246. package/vue/components.css +769 -725
  247. 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
- :host::-webkit-scrollbar {
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
- :host > :slotted(*) {
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
- flex-wrap: nowrap;
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: static;
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
- position: static;
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
+ }