@threadlabs/looma 0.39.2 → 0.39.3
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-combobox/ui-combobox.html +8 -3
- package/components/ui-combobox/ui-combobox.js +3 -2
- package/components/ui-dialog/ui-dialog.html +6 -52
- package/components/ui-input/ui-input.html +21 -3
- package/components/ui-input-group/ui-input-group.html +1 -0
- package/components/ui-select/ui-select.html +10 -3
- package/dist/index.js +1 -1
- package/docs/README.md +1 -1
- package/docs/catalog.json +1 -25
- package/docs/site.mjs +9 -5
- package/docs/theme.mjs +8 -2
- package/package.json +1 -1
- package/styles/ui-combobox.css +16 -6
- package/styles/ui-dialog.css +6 -107
- package/styles/ui-input-group.css +1 -0
- package/styles/ui-input.css +24 -3
- package/styles/ui-select.css +10 -3
- package/theme-system.css +4 -1
- package/vanilla/UiDialog.js +2 -2
- package/vue/UiCombobox.vue +22 -6
- package/vue/UiDialog.d.ts +3 -3
- package/vue/UiDialog.vue +18 -111
- package/vue/UiInput.vue +30 -3
- package/vue/UiInputGroup.vue +1 -0
- package/vue/UiSelect.vue +16 -3
- package/vue/chunks/UiCombobox.js +1 -1
- package/vue/chunks/UiDialog.js +22 -14
- package/vue/chunks/UiInput.js +1 -1
- package/vue/chunks/UiInputGroup.js +1 -1
- package/vue/chunks/UiSelect.js +1 -1
- package/vue/components.css +105 -118
|
@@ -762,10 +762,12 @@
|
|
|
762
762
|
color: inherit;
|
|
763
763
|
}
|
|
764
764
|
input {
|
|
765
|
+
--_ui-combobox-inset-block: var(--ui-control-inset-block-md, var(--ui-space-2));
|
|
765
766
|
appearance: none;
|
|
766
767
|
width: 100%;
|
|
767
768
|
min-inline-size: 0;
|
|
768
769
|
min-block-size: calc(var(--_row) - 2 * var(--ui-border-width));
|
|
770
|
+
max-block-size: max(calc(var(--_row) - 2 * var(--ui-border-width)), calc(1em * var(--ui-line-height-tight) + 2 * var(--_ui-combobox-inset-block)));
|
|
769
771
|
box-sizing: border-box !important;
|
|
770
772
|
border: 0;
|
|
771
773
|
border-radius: inherit;
|
|
@@ -773,7 +775,7 @@
|
|
|
773
775
|
color: inherit;
|
|
774
776
|
font: inherit;
|
|
775
777
|
line-height: var(--ui-line-height-tight);
|
|
776
|
-
padding: var(--
|
|
778
|
+
padding: var(--_ui-combobox-inset-block) var(--ui-space-3) !important;
|
|
777
779
|
margin: 0 !important;
|
|
778
780
|
outline: none;
|
|
779
781
|
}
|
|
@@ -781,14 +783,16 @@
|
|
|
781
783
|
--_row: var(--ui-control-size-sm);
|
|
782
784
|
}
|
|
783
785
|
:host([size="sm"]) input {
|
|
784
|
-
|
|
786
|
+
--_ui-combobox-inset-block: var(--ui-control-inset-block-sm, var(--ui-space-1));
|
|
787
|
+
padding: var(--_ui-combobox-inset-block) var(--ui-space-2) !important;
|
|
785
788
|
font-size: var(--ui-font-size-sm);
|
|
786
789
|
}
|
|
787
790
|
:host([size="lg"]) {
|
|
788
791
|
--_row: var(--ui-control-size-lg);
|
|
789
792
|
}
|
|
790
793
|
:host([size="lg"]) input {
|
|
791
|
-
|
|
794
|
+
--_ui-combobox-inset-block: var(--ui-control-inset-block-lg, var(--ui-space-3));
|
|
795
|
+
padding: var(--_ui-combobox-inset-block) var(--ui-space-4) !important;
|
|
792
796
|
font-size: var(--ui-font-size-md);
|
|
793
797
|
}
|
|
794
798
|
button {
|
|
@@ -923,6 +927,7 @@
|
|
|
923
927
|
display: none !important;
|
|
924
928
|
}
|
|
925
929
|
:host([multiple]) input {
|
|
930
|
+
max-block-size: none;
|
|
926
931
|
flex: 1 0 var(--_ui-combobox-item-input-min-inline-size, 5rem);
|
|
927
932
|
width: auto;
|
|
928
933
|
min-block-size: 1.75rem;
|
|
@@ -485,7 +485,8 @@ export function connect(host) {
|
|
|
485
485
|
input.focus();
|
|
486
486
|
}
|
|
487
487
|
};
|
|
488
|
-
|
|
488
|
+
// Keep input focus through selection without cancelling Safari's touch-generated click.
|
|
489
|
+
const onMousedown = (event) => { if (event.target.closest?.('[role="option"]')) event.preventDefault(); };
|
|
489
490
|
const onFocusout = (event) => {
|
|
490
491
|
if (event.relatedTarget instanceof Node && element.contains(event.relatedTarget)) return;
|
|
491
492
|
close();
|
|
@@ -529,7 +530,7 @@ export function connect(host) {
|
|
|
529
530
|
const onValidate = (event) => {
|
|
530
531
|
if (event.target === element) void validateCurrent();
|
|
531
532
|
};
|
|
532
|
-
const listeners = { input: onInput, keydown: onKeydown, click: onClick,
|
|
533
|
+
const listeners = { input: onInput, keydown: onKeydown, click: onClick, mousedown: onMousedown, focusin: onFocusin, focusout: onFocusout, compositionstart: onCompositionstart, compositionend: onCompositionend, open: onTooltipOpen, close: onTooltipClose, command: onCommand, validate: onValidate };
|
|
533
534
|
for (const [name, listener] of Object.entries(listeners)) element.addEventListener(name, listener);
|
|
534
535
|
// Authored options can change after mount (renamed, replaced, or arriving late). A selected value
|
|
535
536
|
// then shows its current label, unless the user is editing the text.
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
<link rel="component" href="../ui-scroll-area/ui-scroll-area.html">
|
|
2
|
+
<link rel="component" href="../ui-icon-button/ui-icon-button.html">
|
|
3
|
+
<link rel="component" href="../ui-icon/ui-icon.html">
|
|
2
4
|
<template component="ui-dialog" module="./ui-dialog.js">
|
|
3
5
|
<defs>
|
|
4
6
|
<prop name="open" type="boolean" default="false">Whether the dialog is open initially or when set externally.</prop>
|
|
@@ -39,7 +41,7 @@
|
|
|
39
41
|
<dialog from:aria-label="$accessibleLabel">
|
|
40
42
|
<header $ref="header">
|
|
41
43
|
<h2 class="title" $if="$label">{$label}</h2>
|
|
42
|
-
<
|
|
44
|
+
<div class="close"><ui-icon-button $ref="close" size="sm" round label="Close"><ui-icon name="x"></ui-icon></ui-icon-button></div>
|
|
43
45
|
</header>
|
|
44
46
|
<div class="body" $ref="body"><ui-scroll-area from:trim="true"><slot></slot></ui-scroll-area></div>
|
|
45
47
|
<footer $ref="footer"><slot name="actions"></slot></footer>
|
|
@@ -231,58 +233,10 @@
|
|
|
231
233
|
}
|
|
232
234
|
|
|
233
235
|
.close {
|
|
234
|
-
display:
|
|
235
|
-
|
|
236
|
-
flex: none;
|
|
236
|
+
display: flex !important;
|
|
237
|
+
align-items: center !important;
|
|
238
|
+
flex: none !important;
|
|
237
239
|
margin-inline-start: auto !important;
|
|
238
|
-
inline-size: var(--ui-control-size-sm);
|
|
239
|
-
block-size: var(--ui-control-size-sm);
|
|
240
|
-
padding: 0 !important;
|
|
241
|
-
border: 0;
|
|
242
|
-
border-radius: var(--ui-radius-round);
|
|
243
|
-
background: transparent;
|
|
244
|
-
color: var(--ui-text-secondary);
|
|
245
|
-
cursor: pointer;
|
|
246
|
-
transition: background-color var(--ui-motion-fast) var(--ui-motion-ease), color var(--ui-motion-fast) var(--ui-motion-ease);
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
/* A CSS-drawn X. */
|
|
250
|
-
.close::before,
|
|
251
|
-
.close::after {
|
|
252
|
-
content: "";
|
|
253
|
-
grid-area: 1 / 1;
|
|
254
|
-
inline-size: 0.875rem;
|
|
255
|
-
block-size: 1.5px;
|
|
256
|
-
border-radius: 1px;
|
|
257
|
-
background: currentColor;
|
|
258
|
-
transform: rotate(45deg);
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
.close::after {
|
|
262
|
-
transform: rotate(-45deg);
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
.close:hover {
|
|
266
|
-
background: var(--ui-surface-muted);
|
|
267
|
-
color: var(--ui-text-primary);
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
.close:focus-visible {
|
|
271
|
-
outline: var(--ui-focus-width) solid var(--ui-focus-ring);
|
|
272
|
-
outline-offset: var(--ui-focus-width);
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
/* A touch target, like Button on coarse pointers. */
|
|
276
|
-
@media (pointer: coarse) {
|
|
277
|
-
.close {
|
|
278
|
-
inline-size: var(--ui-control-min-block-size);
|
|
279
|
-
block-size: var(--ui-control-min-block-size);
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
html[data-ui-input-modality="touch"] :host .close {
|
|
284
|
-
inline-size: var(--ui-control-min-block-size);
|
|
285
|
-
block-size: var(--ui-control-min-block-size);
|
|
286
240
|
}
|
|
287
241
|
|
|
288
242
|
.body {
|
|
@@ -94,15 +94,24 @@
|
|
|
94
94
|
syntax: "*";
|
|
95
95
|
inherits: false;
|
|
96
96
|
}
|
|
97
|
+
/* Normalize a unitless zero border to a length before the box calculation. */
|
|
98
|
+
@property --_ui-input-stroke {
|
|
99
|
+
syntax: "<length>";
|
|
100
|
+
inherits: false;
|
|
101
|
+
initial-value: 1px;
|
|
102
|
+
}
|
|
97
103
|
|
|
98
104
|
:host {
|
|
105
|
+
--_ui-input-size: var(--ui-control-size-md);
|
|
106
|
+
--_ui-input-inset-block: var(--ui-control-inset-block-md, var(--ui-space-2));
|
|
107
|
+
--_ui-input-stroke: var(--ui-input-border-width, var(--_ui-default-input-border-width, var(--ui-border-width)));
|
|
99
108
|
box-sizing: border-box !important;
|
|
100
109
|
display: inline-block !important;
|
|
101
110
|
inline-size: var(--ui-input-inline-size, 100%);
|
|
102
111
|
min-inline-size: 0;
|
|
103
112
|
min-block-size: var(--ui-input-min-block-size, var(--_ui-default-input-min-block-size, var(--ui-control-size-md)));
|
|
104
113
|
margin: 0 !important;
|
|
105
|
-
padding: var(--
|
|
114
|
+
padding: var(--_ui-input-inset-block) var(--ui-space-3) !important;
|
|
106
115
|
appearance: none;
|
|
107
116
|
padding-inline-start: var(--_ui-default-input-padding-inline-start, var(--ui-space-3)) !important;
|
|
108
117
|
border: var(--ui-input-border-width, var(--_ui-default-input-border-width, var(--ui-border-width))) solid
|
|
@@ -120,16 +129,25 @@
|
|
|
120
129
|
background-color var(--ui-motion-fast) var(--ui-motion-ease);
|
|
121
130
|
}
|
|
122
131
|
|
|
132
|
+
/* Cap Safari's excess text metrics without changing native date, file, color or range widgets. */
|
|
133
|
+
:host:is([type="text"], [type="search"], [type="tel"], [type="url"], [type="email"], [type="password"], [type="number"]) {
|
|
134
|
+
max-block-size: max(calc(var(--_ui-input-size) - var(--_ui-default-input-frame-width, 0px)), calc(1em * var(--ui-line-height-tight) + 2 * var(--_ui-input-inset-block) + 2 * var(--_ui-input-stroke)));
|
|
135
|
+
}
|
|
136
|
+
|
|
123
137
|
/* Each size reads the hook and then an Input Group's default first, so a group, which draws the frame, can zero it. */
|
|
124
138
|
:host([size="sm"]) {
|
|
139
|
+
--_ui-input-size: var(--ui-control-size-sm);
|
|
140
|
+
--_ui-input-inset-block: var(--ui-control-inset-block-sm, var(--ui-space-1));
|
|
125
141
|
min-block-size: var(--ui-input-min-block-size, var(--_ui-default-input-min-block-size, var(--ui-control-size-sm)));
|
|
126
|
-
padding: var(--
|
|
142
|
+
padding: var(--_ui-input-inset-block) var(--ui-space-2) !important;
|
|
127
143
|
font-size: var(--ui-font-size-sm);
|
|
128
144
|
}
|
|
129
145
|
|
|
130
146
|
:host([size="lg"]) {
|
|
147
|
+
--_ui-input-size: var(--ui-control-size-lg);
|
|
148
|
+
--_ui-input-inset-block: var(--ui-control-inset-block-lg, var(--ui-space-3));
|
|
131
149
|
min-block-size: var(--ui-input-min-block-size, var(--_ui-default-input-min-block-size, var(--ui-control-size-lg)));
|
|
132
|
-
padding: var(--
|
|
150
|
+
padding: var(--_ui-input-inset-block) var(--ui-space-4) !important;
|
|
133
151
|
font-size: var(--ui-font-size-md);
|
|
134
152
|
}
|
|
135
153
|
|
|
@@ -43,6 +43,7 @@
|
|
|
43
43
|
Hooks do not inherit, so these are defaults for the input; its own hooks still win. */
|
|
44
44
|
--_ui-default-input-border-width: 0;
|
|
45
45
|
--_ui-default-input-min-block-size: 0;
|
|
46
|
+
--_ui-default-input-frame-width: calc(2 * var(--ui-border-width));
|
|
46
47
|
--_ui-default-input-border: transparent;
|
|
47
48
|
--_ui-default-input-border-hover: transparent;
|
|
48
49
|
--_ui-default-input-focus-border: transparent;
|
|
@@ -60,13 +60,16 @@
|
|
|
60
60
|
}
|
|
61
61
|
|
|
62
62
|
:host {
|
|
63
|
+
--_ui-select-size: var(--ui-control-size-md);
|
|
64
|
+
--_ui-select-inset-block: var(--ui-control-inset-block-md, var(--ui-space-2));
|
|
63
65
|
box-sizing: border-box !important;
|
|
64
66
|
display: inline-block !important;
|
|
65
67
|
inline-size: var(--ui-select-inline-size, 100%);
|
|
66
68
|
min-inline-size: 0;
|
|
69
|
+
max-block-size: max(var(--_ui-select-size), calc(1em * var(--ui-line-height-tight) + 2 * var(--_ui-select-inset-block) + 2 * var(--ui-border-width)));
|
|
67
70
|
min-block-size: var(--ui-control-size-md);
|
|
68
71
|
margin: 0 !important;
|
|
69
|
-
padding: var(--
|
|
72
|
+
padding: var(--_ui-select-inset-block) var(--ui-space-3) !important;
|
|
70
73
|
border: var(--ui-border-width) solid var(--ui-select-border, var(--ui-control-border, var(--ui-border-strong)));
|
|
71
74
|
border-radius: var(--ui-select-radius, var(--ui-field-radius, var(--ui-radius-md)));
|
|
72
75
|
background-color: var(--ui-select-surface, var(--ui-control-surface, var(--ui-surface-elevated)));
|
|
@@ -144,8 +147,10 @@
|
|
|
144
147
|
}
|
|
145
148
|
|
|
146
149
|
:host([size="sm"]) {
|
|
150
|
+
--_ui-select-size: var(--ui-control-size-sm);
|
|
151
|
+
--_ui-select-inset-block: var(--ui-control-inset-block-sm, var(--ui-space-1));
|
|
147
152
|
min-block-size: var(--ui-control-size-sm);
|
|
148
|
-
padding: var(--
|
|
153
|
+
padding: var(--_ui-select-inset-block) var(--ui-space-2) !important;
|
|
149
154
|
padding-inline-end: calc(var(--ui-space-2) + var(--ui-icon-size-sm) + var(--ui-space-1)) !important;
|
|
150
155
|
background-position: right var(--ui-space-2) center, center;
|
|
151
156
|
background-size:
|
|
@@ -155,8 +160,10 @@
|
|
|
155
160
|
}
|
|
156
161
|
|
|
157
162
|
:host([size="lg"]) {
|
|
163
|
+
--_ui-select-size: var(--ui-control-size-lg);
|
|
164
|
+
--_ui-select-inset-block: var(--ui-control-inset-block-lg, var(--ui-space-3));
|
|
158
165
|
min-block-size: var(--ui-control-size-lg);
|
|
159
|
-
padding: var(--
|
|
166
|
+
padding: var(--_ui-select-inset-block) var(--ui-space-4) !important;
|
|
160
167
|
padding-inline-end: calc(var(--ui-space-4) + 1.5rem) !important;
|
|
161
168
|
background-position: right var(--ui-space-4) center, center;
|
|
162
169
|
font-size: var(--ui-font-size-md);
|