@threadlabs/looma 0.25.0 → 0.25.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.
@@ -5202,7 +5202,7 @@ svg[data-v-521a280a-s] {
5202
5202
  whole value is. The action slot takes one button at the end, inside the border, for the one
5203
5203
  thing the field is for ("Continue" after a site's address), so it reads as the field's action
5204
5204
  and not the form's. */
5205
- [data-component~="ui-input-group"][data-v-45a11c70] {
5205
+ [data-component~="ui-input-group"][data-v-875c0c72] {
5206
5206
  /* The group's own border and height stand for the input's, so the group is a lone Input's height.
5207
5207
  Hooks do not inherit, so these are defaults for the input; its own hooks still win. */
5208
5208
  --_ui-default-input-border-width: 0;
@@ -5217,6 +5217,17 @@ svg[data-v-521a280a-s] {
5217
5217
  --_ui-default-input-focus-outline: none;
5218
5218
  --_ui-default-input-radius: 0;
5219
5219
  --_ui-default-input-surface: transparent;
5220
+ --_ui-default-textarea-border-width: 0;
5221
+ --_ui-default-textarea-border: transparent;
5222
+ --_ui-default-textarea-border-hover: transparent;
5223
+ --_ui-default-textarea-focus-border: transparent;
5224
+ --_ui-default-textarea-invalid-border: transparent;
5225
+ --_ui-default-textarea-invalid-focus-shadow: none;
5226
+ --_ui-default-textarea-shadow: none;
5227
+ --_ui-default-textarea-focus-shadow: none;
5228
+ --_ui-default-textarea-focus-outline: none;
5229
+ --_ui-default-textarea-radius: 0;
5230
+ --_ui-default-textarea-surface: transparent;
5220
5231
 
5221
5232
  display: flex;
5222
5233
  align-items: stretch;
@@ -5238,36 +5249,36 @@ svg[data-v-521a280a-s] {
5238
5249
  }
5239
5250
 
5240
5251
  /* The frame takes its input's size, so a small group lines up with small buttons and fields. */
5241
- [data-component~="ui-input-group"][data-v-45a11c70]:has(.field [data-ui-input-state~="size=sm"]) {
5252
+ [data-component~="ui-input-group"][data-v-875c0c72]:has(.field [data-ui-input-state~="size=sm"]) {
5242
5253
  min-block-size: var(--ui-control-size-sm);
5243
5254
  }
5244
- [data-component~="ui-input-group"][data-v-45a11c70]:has(.field [data-ui-input-state~="size=lg"]) {
5255
+ [data-component~="ui-input-group"][data-v-875c0c72]:has(.field [data-ui-input-state~="size=lg"]) {
5245
5256
  min-block-size: var(--ui-control-size-lg);
5246
5257
  }
5247
5258
  @media (pointer: coarse) {
5248
- [data-component~="ui-input-group"][data-v-45a11c70]:has(.field [data-ui-input-state~="size=sm"]) {
5259
+ [data-component~="ui-input-group"][data-v-875c0c72]:has(.field [data-ui-input-state~="size=sm"]) {
5249
5260
  min-block-size: var(--ui-control-min-block-size);
5250
5261
  }
5251
5262
  }
5252
- [data-component~="ui-input-group"][data-v-45a11c70]:hover:not(:has(input:focus, input:disabled, input:read-only, [aria-invalid="true"], :is(:user-invalid, [data-user-invalid]))) {
5263
+ [data-component~="ui-input-group"][data-v-875c0c72]:hover:not(:has(:is(input, textarea):focus, :is(input, textarea):disabled, :is(input, textarea):read-only, [aria-invalid="true"], :is(:user-invalid, [data-user-invalid]))) {
5253
5264
  border-color: var(--ui-control-border-hover, var(--ui-text-secondary));
5254
5265
  }
5255
5266
 
5256
5267
  /* The ring shows when the field's input would show its own: when it is focus-visible, which a
5257
5268
  text input is for a pointer as well as a keyboard. A focused action button draws its own. */
5258
- [data-component~="ui-input-group"][data-v-45a11c70]:has(.field input:focus-visible) {
5269
+ [data-component~="ui-input-group"][data-v-875c0c72]:has(.field :is(input, textarea):focus-visible) {
5259
5270
  border-color: var(--ui-control-focus, var(--ui-accent-solid));
5260
5271
  box-shadow:
5261
5272
  var(--ui-control-inset),
5262
5273
  var(--ui-control-focus-halo-shadow);
5263
5274
  }
5264
- [data-component~="ui-input-group"][data-v-45a11c70]:has([aria-invalid="true"], :is(:user-invalid, [data-user-invalid])) {
5275
+ [data-component~="ui-input-group"][data-v-875c0c72]:has([aria-invalid="true"], :is(:user-invalid, [data-user-invalid])) {
5265
5276
  border-color: var(
5266
5277
  --ui-input-group-invalid-border,
5267
5278
  var(--ui-field-danger, var(--ui-danger-solid))
5268
5279
  );
5269
5280
  }
5270
- [data-component~="ui-input-group"][data-v-45a11c70]:has(input:is([aria-invalid="true"], :is(:user-invalid, [data-user-invalid])):focus-visible) {
5281
+ [data-component~="ui-input-group"][data-v-875c0c72]:has(:is(input, textarea):is([aria-invalid="true"], :is(:user-invalid, [data-user-invalid])):focus-visible) {
5271
5282
  box-shadow: var(
5272
5283
  --ui-input-group-invalid-focus-shadow,
5273
5284
  var(--ui-control-inset),
@@ -5281,23 +5292,23 @@ svg[data-v-521a280a-s] {
5281
5292
 
5282
5293
  /* Forced colors drop box shadows, so the focus ring becomes an outline. */
5283
5294
  @media (forced-colors: active) {
5284
- [data-component~="ui-input-group"][data-v-45a11c70]:has(input:focus-visible) {
5295
+ [data-component~="ui-input-group"][data-v-875c0c72]:has(:is(input, textarea):focus-visible) {
5285
5296
  outline: var(--ui-focus-width) solid Highlight;
5286
5297
  outline-offset: var(--ui-border-width);
5287
5298
  }
5288
5299
  }
5289
- [data-component~="ui-input-group"][data-ui-input-group-state~="disabled"][data-v-45a11c70],
5290
- [data-component~="ui-input-group"][data-v-45a11c70]:has(input:disabled) {
5300
+ [data-component~="ui-input-group"][data-ui-input-group-state~="disabled"][data-v-875c0c72],
5301
+ [data-component~="ui-input-group"][data-v-875c0c72]:has(:is(input, textarea):disabled) {
5291
5302
  background: var(--ui-control-surface-disabled, var(--ui-surface-muted));
5292
5303
  box-shadow: none;
5293
5304
  cursor: not-allowed;
5294
5305
  }
5295
- .field[data-v-45a11c70] {
5306
+ .field[data-v-875c0c72] {
5296
5307
  display: flex;
5297
5308
  flex: 1;
5298
5309
  min-inline-size: 0;
5299
5310
  }
5300
- .affix[data-v-45a11c70] {
5311
+ .affix[data-v-875c0c72] {
5301
5312
  display: inline-flex;
5302
5313
  flex: none;
5303
5314
  align-items: center;
@@ -5309,21 +5320,21 @@ svg[data-v-521a280a-s] {
5309
5320
  }
5310
5321
 
5311
5322
  /* Fixed text is part of the value, but should not look editable. */
5312
- .affix[data-v-45a11c70]:has([slot="prefix"]),
5313
- .affix[data-v-45a11c70]:has([slot="suffix"]) {
5323
+ .affix[data-v-875c0c72]:has([slot="prefix"]),
5324
+ .affix[data-v-875c0c72]:has([slot="suffix"]) {
5314
5325
  background: var(--ui-surface-muted);
5315
5326
  }
5316
- .affix[data-v-45a11c70]:has([slot="prefix"]) {
5327
+ .affix[data-v-875c0c72]:has([slot="prefix"]) {
5317
5328
  border-inline-end: var(--ui-border-width) solid var(--ui-border-divider);
5318
5329
  }
5319
- .affix[data-v-45a11c70]:has([slot="suffix"]) {
5330
+ .affix[data-v-875c0c72]:has([slot="suffix"]) {
5320
5331
  border-inline-start: var(--ui-border-width) solid var(--ui-border-divider);
5321
5332
  }
5322
- [data-component~="ui-input-group"][data-ui-input-group-state~="prefixKind=icon"][data-v-45a11c70] {
5333
+ [data-component~="ui-input-group"][data-ui-input-group-state~="prefixKind=icon"][data-v-875c0c72] {
5323
5334
  --_ui-default-input-padding-inline-start: var(--ui-space-2);
5324
5335
  }
5325
5336
  [data-component~="ui-input-group"][data-ui-input-group-state~="prefixKind=icon"]
5326
- .affix[data-v-45a11c70]:first-child {
5337
+ .affix[data-v-875c0c72]:first-child {
5327
5338
  padding-inline-end: 0;
5328
5339
  border-inline-end: 0;
5329
5340
  background: transparent;
@@ -5331,19 +5342,34 @@ svg[data-v-521a280a-s] {
5331
5342
 
5332
5343
  /* Centred rather than padded above and below: the group is exactly a lone Input's height, so a
5333
5344
  small button sits inside it with the difference split evenly, and the field keeps its height. */
5334
- .action[data-v-45a11c70] {
5345
+ .action[data-v-875c0c72] {
5335
5346
  display: flex;
5336
5347
  flex: none;
5337
5348
  align-items: center;
5338
5349
  padding-inline: var(--ui-space-1);
5339
5350
  }
5340
- .affix[data-v-45a11c70]:empty,
5341
- .action[data-v-45a11c70]:empty {
5351
+
5352
+ /* Multiline text owns the first row; its action remains inside the same frame below it. */
5353
+ [data-component~="ui-input-group"][data-ui-input-group-state~="multiline"][data-v-875c0c72] {
5354
+ display: grid;
5355
+ grid-template-columns: auto minmax(0, 1fr) auto;
5356
+ }
5357
+ [data-component~="ui-input-group"][data-ui-input-group-state~="multiline"] .field[data-v-875c0c72] {
5358
+ grid-column: 2;
5359
+ }
5360
+ [data-component~="ui-input-group"][data-ui-input-group-state~="multiline"] .action[data-v-875c0c72] {
5361
+ grid-column: 1 / -1;
5362
+ justify-content: end;
5363
+ padding: var(--ui-space-2);
5364
+ padding-block-start: 0;
5365
+ }
5366
+ .affix[data-v-875c0c72]:empty,
5367
+ .action[data-v-875c0c72]:empty {
5342
5368
  display: none;
5343
5369
  }
5344
5370
 
5345
5371
  /* A component that sets its display still honours the hidden attribute on its root. */
5346
- [data-component~="ui-input-group"][hidden][data-v-45a11c70] {
5372
+ [data-component~="ui-input-group"][hidden][data-v-875c0c72] {
5347
5373
  display: none;
5348
5374
  }
5349
5375
 
@@ -8166,6 +8192,30 @@ tbody tr[data-v-93c9ac9c-s]:last-child > * {
8166
8192
  }
8167
8193
 
8168
8194
  /* This component's hooks style the element they are set on, and never a nested one. */
8195
+ @property --ui-textarea-border-width {
8196
+ syntax: "*";
8197
+ inherits: false;
8198
+ }
8199
+ @property --ui-textarea-border {
8200
+ syntax: "*";
8201
+ inherits: false;
8202
+ }
8203
+ @property --ui-textarea-border-hover {
8204
+ syntax: "*";
8205
+ inherits: false;
8206
+ }
8207
+ @property --ui-textarea-focus-border {
8208
+ syntax: "*";
8209
+ inherits: false;
8210
+ }
8211
+ @property --ui-textarea-focus-outline {
8212
+ syntax: "*";
8213
+ inherits: false;
8214
+ }
8215
+ @property --ui-textarea-surface {
8216
+ syntax: "*";
8217
+ inherits: false;
8218
+ }
8169
8219
  @property --ui-textarea-focus-shadow {
8170
8220
  syntax: "*";
8171
8221
  inherits: false;
@@ -8186,7 +8236,7 @@ tbody tr[data-v-93c9ac9c-s]:last-child > * {
8186
8236
  syntax: "*";
8187
8237
  inherits: false;
8188
8238
  }
8189
- [data-component~="ui-textarea"][data-v-ce29cce2] {
8239
+ [data-component~="ui-textarea"][data-v-cb05f253] {
8190
8240
  box-sizing: border-box;
8191
8241
  display: inline-block;
8192
8242
  inline-size: 100%;
@@ -8197,13 +8247,29 @@ tbody tr[data-v-93c9ac9c-s]:last-child > * {
8197
8247
  padding: var(--ui-space-2) var(--ui-space-3);
8198
8248
  appearance: none;
8199
8249
  resize: vertical;
8200
- border: var(--ui-border-width) solid var(--ui-control-border, var(--ui-border-strong));
8201
- border-radius: var(--ui-textarea-radius, var(--ui-field-radius, var(--ui-radius-md)));
8202
- background: var(--ui-control-surface, var(--ui-surface-elevated));
8250
+ border: var(
8251
+ --ui-textarea-border-width,
8252
+ var(--_ui-default-textarea-border-width, var(--ui-border-width))
8253
+ ) solid
8254
+ var(
8255
+ --ui-textarea-border,
8256
+ var(--_ui-default-textarea-border, var(--ui-control-border, var(--ui-border-strong)))
8257
+ );
8258
+ border-radius: var(
8259
+ --ui-textarea-radius,
8260
+ var(--_ui-default-textarea-radius, var(--ui-field-radius, var(--ui-radius-md)))
8261
+ );
8262
+ background: var(
8263
+ --ui-textarea-surface,
8264
+ var(--_ui-default-textarea-surface, var(--ui-control-surface, var(--ui-surface-elevated)))
8265
+ );
8203
8266
  color: var(--ui-text-primary);
8204
8267
  font: inherit;
8205
8268
  line-height: var(--ui-line-height-md);
8206
- box-shadow: var(--ui-textarea-shadow, var(--ui-control-inset));
8269
+ box-shadow: var(
8270
+ --ui-textarea-shadow,
8271
+ var(--_ui-default-textarea-shadow, var(--ui-control-inset))
8272
+ );
8207
8273
  transition:
8208
8274
  border-color var(--ui-motion-fast) var(--ui-motion-ease),
8209
8275
  box-shadow var(--ui-motion-fast) var(--ui-motion-ease),
@@ -8211,61 +8277,82 @@ tbody tr[data-v-93c9ac9c-s]:last-child > * {
8211
8277
  }
8212
8278
 
8213
8279
  /* Tabbing into a field selects its text; tint that selection softly instead of the page highlight. */
8214
- [data-component~="ui-textarea"][data-v-ce29cce2]::selection {
8280
+ [data-component~="ui-textarea"][data-v-cb05f253]::selection {
8215
8281
  background: color-mix(in srgb, var(--ui-accent-solid) 20%, transparent);
8216
8282
  color: inherit;
8217
8283
  }
8218
- [data-component~="ui-textarea"][data-v-ce29cce2]::placeholder {
8284
+ [data-component~="ui-textarea"][data-v-cb05f253]::placeholder {
8219
8285
  color: var(--ui-control-placeholder, var(--ui-text-secondary));
8220
8286
  opacity: 1;
8221
8287
  }
8222
- [data-component~="ui-textarea"][data-v-ce29cce2]:hover:not(:focus):not(:disabled):not(:read-only):not([aria-invalid="true"]):not(:is(:user-invalid, [data-user-invalid])) {
8223
- border-color: var(--ui-control-border-hover, var(--ui-text-secondary));
8288
+ [data-component~="ui-textarea"][data-v-cb05f253]:hover:not(:focus):not(:disabled):not(:read-only):not([aria-invalid="true"]):not(:is(:user-invalid, [data-user-invalid])) {
8289
+ border-color: var(
8290
+ --ui-textarea-border-hover,
8291
+ var(
8292
+ --_ui-default-textarea-border-hover,
8293
+ var(--ui-control-border-hover, var(--ui-text-secondary))
8294
+ )
8295
+ );
8224
8296
  }
8225
- [data-component~="ui-textarea"][data-v-ce29cce2]:focus-visible {
8226
- border-color: var(--ui-control-focus, var(--ui-accent-solid));
8227
- outline: none;
8297
+ [data-component~="ui-textarea"][data-v-cb05f253]:focus-visible {
8298
+ border-color: var(
8299
+ --ui-textarea-focus-border,
8300
+ var(--_ui-default-textarea-focus-border, var(--ui-control-focus, var(--ui-accent-solid)))
8301
+ );
8302
+ outline: var(--ui-textarea-focus-outline, var(--_ui-default-textarea-focus-outline, none));
8228
8303
  box-shadow: var(
8229
8304
  --ui-textarea-focus-shadow,
8230
- var(--ui-control-inset),
8231
- var(--ui-control-focus-halo-shadow)
8305
+ var(
8306
+ --_ui-default-textarea-focus-shadow,
8307
+ var(--ui-control-inset),
8308
+ var(--ui-control-focus-halo-shadow)
8309
+ )
8232
8310
  );
8233
8311
  }
8234
8312
 
8235
8313
  /* The app's invalid flag, or the browser's own verdict once the user has left an invalid field. */
8236
- [data-component~="ui-textarea"][aria-invalid="true"][data-v-ce29cce2],
8237
- [data-component~="ui-textarea"][data-v-ce29cce2]:is(:user-invalid, [data-user-invalid]) {
8238
- border-color: var(--ui-textarea-invalid-border, var(--ui-field-danger, var(--ui-danger-solid)));
8314
+ [data-component~="ui-textarea"][aria-invalid="true"][data-v-cb05f253],
8315
+ [data-component~="ui-textarea"][data-v-cb05f253]:is(:user-invalid, [data-user-invalid]) {
8316
+ border-color: var(
8317
+ --ui-textarea-invalid-border,
8318
+ var(--_ui-default-textarea-invalid-border, var(--ui-field-danger, var(--ui-danger-solid)))
8319
+ );
8239
8320
  }
8240
- [data-component~="ui-textarea"][data-v-ce29cce2]:is([aria-invalid="true"], :is(:user-invalid, [data-user-invalid])):focus-visible {
8321
+ [data-component~="ui-textarea"][data-v-cb05f253]:is([aria-invalid="true"], :is(:user-invalid, [data-user-invalid])):focus-visible {
8241
8322
  box-shadow: var(
8242
8323
  --ui-textarea-invalid-focus-shadow,
8243
- var(--ui-control-inset),
8244
- 0 0 0 calc(var(--ui-focus-width) * 1.5) color-mix(
8245
- in srgb,
8246
- var(--ui-textarea-invalid-border, var(--ui-field-danger, var(--ui-danger-solid))) 22%,
8247
- transparent
8324
+ var(
8325
+ --_ui-default-textarea-invalid-focus-shadow,
8326
+ var(--ui-control-inset),
8327
+ 0 0 0 calc(var(--ui-focus-width) * 1.5) color-mix(
8328
+ in srgb,
8329
+ var(
8330
+ --ui-textarea-invalid-border,
8331
+ var(--_ui-default-textarea-invalid-border, var(--ui-field-danger, var(--ui-danger-solid)))
8332
+ ) 22%,
8333
+ transparent
8334
+ )
8248
8335
  )
8249
8336
  );
8250
8337
  }
8251
- [data-component~="ui-textarea"][data-v-ce29cce2]:disabled {
8338
+ [data-component~="ui-textarea"][data-v-cb05f253]:disabled {
8252
8339
  background: var(--ui-control-surface-disabled, var(--ui-surface-muted));
8253
8340
  color: var(--ui-disabled-text);
8254
8341
  box-shadow: none;
8255
8342
  cursor: not-allowed;
8256
8343
  }
8257
- [data-component~="ui-textarea"][data-ui-textarea-state~="size=sm"][data-v-ce29cce2] {
8344
+ [data-component~="ui-textarea"][data-ui-textarea-state~="size=sm"][data-v-cb05f253] {
8258
8345
  --_padding-block: var(--ui-space-1);
8259
8346
  padding: var(--ui-space-1) var(--ui-space-2);
8260
8347
  font-size: var(--ui-font-size-sm);
8261
8348
  }
8262
- [data-component~="ui-textarea"][data-ui-textarea-state~="size=lg"][data-v-ce29cce2] {
8349
+ [data-component~="ui-textarea"][data-ui-textarea-state~="size=lg"][data-v-cb05f253] {
8263
8350
  --_padding-block: var(--ui-space-3);
8264
8351
  padding: var(--ui-space-3) var(--ui-space-4);
8265
8352
  font-size: var(--ui-font-size-md);
8266
8353
  }
8267
8354
  @supports (field-sizing: content) {
8268
- [data-component~="ui-textarea"][data-ui-textarea-state~="autosize"][data-v-ce29cce2] {
8355
+ [data-component~="ui-textarea"][data-ui-textarea-state~="autosize"][data-v-cb05f253] {
8269
8356
  field-sizing: content;
8270
8357
  min-block-size: calc(var(--_rows) * 1lh + var(--_padding-block) + var(--_padding-block) + 2px);
8271
8358
  }
@@ -8273,13 +8360,13 @@ tbody tr[data-v-93c9ac9c-s]:last-child > * {
8273
8360
 
8274
8361
  /* Below 16px, iOS zooms the page into the focused field, so touch keeps body-size text. */
8275
8362
  @media (pointer: coarse) {
8276
- [data-component~="ui-textarea"][data-ui-textarea-state~="size=sm"][data-v-ce29cce2] {
8363
+ [data-component~="ui-textarea"][data-ui-textarea-state~="size=sm"][data-v-cb05f253] {
8277
8364
  font-size: inherit;
8278
8365
  }
8279
8366
  }
8280
8367
 
8281
8368
  /* A component that sets its display still honours the hidden attribute on its root. */
8282
- [data-component~="ui-textarea"][hidden][data-v-ce29cce2] {
8369
+ [data-component~="ui-textarea"][hidden][data-v-cb05f253] {
8283
8370
  display: none;
8284
8371
  }
8285
8372