@threadlabs/looma 0.39.2 → 0.39.4

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.
@@ -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(--ui-control-inset-block-md, var(--ui-space-2)) var(--ui-space-3) !important;
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
- padding: var(--ui-control-inset-block-sm, var(--ui-space-1)) var(--ui-space-2) !important;
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
- padding: var(--ui-control-inset-block-lg, var(--ui-space-3)) var(--ui-space-4) !important;
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
- const onPointerdown = (event) => { if (event.target.closest?.('[role="option"]')) event.preventDefault(); };
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, pointerdown: onPointerdown, focusin: onFocusin, focusout: onFocusout, compositionstart: onCompositionstart, compositionend: onCompositionend, open: onTooltipOpen, close: onTooltipClose, command: onCommand, validate: onValidate };
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
- <button class="close" $ref="close" type="button" aria-label="Close"></button>
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: inline-grid !important;
235
- place-items: center;
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(--ui-control-inset-block-md, var(--ui-space-2)) var(--ui-space-3) !important;
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(--ui-control-inset-block-sm, var(--ui-space-1)) var(--ui-space-2) !important;
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(--ui-control-inset-block-lg, var(--ui-space-3)) var(--ui-space-4) !important;
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(--ui-control-inset-block-md, var(--ui-space-2)) var(--ui-space-3) !important;
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(--ui-control-inset-block-sm, var(--ui-space-1)) var(--ui-space-2) !important;
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(--ui-control-inset-block-lg, var(--ui-space-3)) var(--ui-space-4) !important;
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);