@threadlabs/looma 0.25.1 → 0.25.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-input-group/ui-input-group.html +21 -0
- package/components/ui-input-group/ui-input-group.js +17 -0
- package/components/ui-textarea/ui-textarea.html +7 -0
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/styles/ui-input-group.css +21 -0
- package/styles/ui-textarea.css +7 -0
- package/vanilla/UiInputGroup.d.ts +1 -0
- package/vanilla/UiInputGroup.js +1 -1
- package/vue/UiInputGroup.d.ts +9 -0
- package/vue/UiInputGroup.vue +48 -1
- package/vue/UiTextarea.vue +16 -0
- package/vue/chunks/UiInputGroup.js +27 -2
- package/vue/chunks/UiTextarea.js +1 -1
- package/vue/components.css +76 -40
package/vue/components.css
CHANGED
|
@@ -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-
|
|
5205
|
+
[data-component~="ui-input-group"][data-v-57e02424] {
|
|
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;
|
|
@@ -5249,36 +5249,36 @@ svg[data-v-521a280a-s] {
|
|
|
5249
5249
|
}
|
|
5250
5250
|
|
|
5251
5251
|
/* The frame takes its input's size, so a small group lines up with small buttons and fields. */
|
|
5252
|
-
[data-component~="ui-input-group"][data-v-
|
|
5252
|
+
[data-component~="ui-input-group"][data-v-57e02424]:has(.field [data-ui-input-state~="size=sm"]) {
|
|
5253
5253
|
min-block-size: var(--ui-control-size-sm);
|
|
5254
5254
|
}
|
|
5255
|
-
[data-component~="ui-input-group"][data-v-
|
|
5255
|
+
[data-component~="ui-input-group"][data-v-57e02424]:has(.field [data-ui-input-state~="size=lg"]) {
|
|
5256
5256
|
min-block-size: var(--ui-control-size-lg);
|
|
5257
5257
|
}
|
|
5258
5258
|
@media (pointer: coarse) {
|
|
5259
|
-
[data-component~="ui-input-group"][data-v-
|
|
5259
|
+
[data-component~="ui-input-group"][data-v-57e02424]:has(.field [data-ui-input-state~="size=sm"]) {
|
|
5260
5260
|
min-block-size: var(--ui-control-min-block-size);
|
|
5261
5261
|
}
|
|
5262
5262
|
}
|
|
5263
|
-
[data-component~="ui-input-group"][data-v-
|
|
5263
|
+
[data-component~="ui-input-group"][data-v-57e02424]: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]))) {
|
|
5264
5264
|
border-color: var(--ui-control-border-hover, var(--ui-text-secondary));
|
|
5265
5265
|
}
|
|
5266
5266
|
|
|
5267
5267
|
/* The ring shows when the field's input would show its own: when it is focus-visible, which a
|
|
5268
5268
|
text input is for a pointer as well as a keyboard. A focused action button draws its own. */
|
|
5269
|
-
[data-component~="ui-input-group"][data-v-
|
|
5269
|
+
[data-component~="ui-input-group"][data-v-57e02424]:has(.field :is(input, textarea):focus-visible) {
|
|
5270
5270
|
border-color: var(--ui-control-focus, var(--ui-accent-solid));
|
|
5271
5271
|
box-shadow:
|
|
5272
5272
|
var(--ui-control-inset),
|
|
5273
5273
|
var(--ui-control-focus-halo-shadow);
|
|
5274
5274
|
}
|
|
5275
|
-
[data-component~="ui-input-group"][data-v-
|
|
5275
|
+
[data-component~="ui-input-group"][data-v-57e02424]:has([aria-invalid="true"], :is(:user-invalid, [data-user-invalid])) {
|
|
5276
5276
|
border-color: var(
|
|
5277
5277
|
--ui-input-group-invalid-border,
|
|
5278
5278
|
var(--ui-field-danger, var(--ui-danger-solid))
|
|
5279
5279
|
);
|
|
5280
5280
|
}
|
|
5281
|
-
[data-component~="ui-input-group"][data-v-
|
|
5281
|
+
[data-component~="ui-input-group"][data-v-57e02424]:has(:is(input, textarea):is([aria-invalid="true"], :is(:user-invalid, [data-user-invalid])):focus-visible) {
|
|
5282
5282
|
box-shadow: var(
|
|
5283
5283
|
--ui-input-group-invalid-focus-shadow,
|
|
5284
5284
|
var(--ui-control-inset),
|
|
@@ -5292,23 +5292,23 @@ svg[data-v-521a280a-s] {
|
|
|
5292
5292
|
|
|
5293
5293
|
/* Forced colors drop box shadows, so the focus ring becomes an outline. */
|
|
5294
5294
|
@media (forced-colors: active) {
|
|
5295
|
-
[data-component~="ui-input-group"][data-v-
|
|
5295
|
+
[data-component~="ui-input-group"][data-v-57e02424]:has(:is(input, textarea):focus-visible) {
|
|
5296
5296
|
outline: var(--ui-focus-width) solid Highlight;
|
|
5297
5297
|
outline-offset: var(--ui-border-width);
|
|
5298
5298
|
}
|
|
5299
5299
|
}
|
|
5300
|
-
[data-component~="ui-input-group"][data-ui-input-group-state~="disabled"][data-v-
|
|
5301
|
-
[data-component~="ui-input-group"][data-v-
|
|
5300
|
+
[data-component~="ui-input-group"][data-ui-input-group-state~="disabled"][data-v-57e02424],
|
|
5301
|
+
[data-component~="ui-input-group"][data-v-57e02424]:has(:is(input, textarea):disabled) {
|
|
5302
5302
|
background: var(--ui-control-surface-disabled, var(--ui-surface-muted));
|
|
5303
5303
|
box-shadow: none;
|
|
5304
5304
|
cursor: not-allowed;
|
|
5305
5305
|
}
|
|
5306
|
-
.field[data-v-
|
|
5306
|
+
.field[data-v-57e02424] {
|
|
5307
5307
|
display: flex;
|
|
5308
5308
|
flex: 1;
|
|
5309
5309
|
min-inline-size: 0;
|
|
5310
5310
|
}
|
|
5311
|
-
.affix[data-v-
|
|
5311
|
+
.affix[data-v-57e02424] {
|
|
5312
5312
|
display: inline-flex;
|
|
5313
5313
|
flex: none;
|
|
5314
5314
|
align-items: center;
|
|
@@ -5320,21 +5320,21 @@ svg[data-v-521a280a-s] {
|
|
|
5320
5320
|
}
|
|
5321
5321
|
|
|
5322
5322
|
/* Fixed text is part of the value, but should not look editable. */
|
|
5323
|
-
.affix[data-v-
|
|
5324
|
-
.affix[data-v-
|
|
5323
|
+
.affix[data-v-57e02424]:has([slot="prefix"]),
|
|
5324
|
+
.affix[data-v-57e02424]:has([slot="suffix"]) {
|
|
5325
5325
|
background: var(--ui-surface-muted);
|
|
5326
5326
|
}
|
|
5327
|
-
.affix[data-v-
|
|
5327
|
+
.affix[data-v-57e02424]:has([slot="prefix"]) {
|
|
5328
5328
|
border-inline-end: var(--ui-border-width) solid var(--ui-border-divider);
|
|
5329
5329
|
}
|
|
5330
|
-
.affix[data-v-
|
|
5330
|
+
.affix[data-v-57e02424]:has([slot="suffix"]) {
|
|
5331
5331
|
border-inline-start: var(--ui-border-width) solid var(--ui-border-divider);
|
|
5332
5332
|
}
|
|
5333
|
-
[data-component~="ui-input-group"][data-ui-input-group-state~="prefixKind=icon"][data-v-
|
|
5333
|
+
[data-component~="ui-input-group"][data-ui-input-group-state~="prefixKind=icon"][data-v-57e02424] {
|
|
5334
5334
|
--_ui-default-input-padding-inline-start: var(--ui-space-2);
|
|
5335
5335
|
}
|
|
5336
5336
|
[data-component~="ui-input-group"][data-ui-input-group-state~="prefixKind=icon"]
|
|
5337
|
-
.affix[data-v-
|
|
5337
|
+
.affix[data-v-57e02424]:first-child {
|
|
5338
5338
|
padding-inline-end: 0;
|
|
5339
5339
|
border-inline-end: 0;
|
|
5340
5340
|
background: transparent;
|
|
@@ -5342,7 +5342,7 @@ svg[data-v-521a280a-s] {
|
|
|
5342
5342
|
|
|
5343
5343
|
/* Centred rather than padded above and below: the group is exactly a lone Input's height, so a
|
|
5344
5344
|
small button sits inside it with the difference split evenly, and the field keeps its height. */
|
|
5345
|
-
.action[data-v-
|
|
5345
|
+
.action[data-v-57e02424] {
|
|
5346
5346
|
display: flex;
|
|
5347
5347
|
flex: none;
|
|
5348
5348
|
align-items: center;
|
|
@@ -5350,26 +5350,46 @@ svg[data-v-521a280a-s] {
|
|
|
5350
5350
|
}
|
|
5351
5351
|
|
|
5352
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-
|
|
5353
|
+
[data-component~="ui-input-group"][data-ui-input-group-state~="multiline"][data-v-57e02424] {
|
|
5354
5354
|
display: grid;
|
|
5355
5355
|
grid-template-columns: auto minmax(0, 1fr) auto;
|
|
5356
5356
|
}
|
|
5357
|
-
[data-component~="ui-input-group"][data-ui-input-group-state~="multiline"] .field[data-v-
|
|
5357
|
+
[data-component~="ui-input-group"][data-ui-input-group-state~="multiline"] .field[data-v-57e02424] {
|
|
5358
5358
|
grid-column: 2;
|
|
5359
5359
|
}
|
|
5360
|
-
[data-component~="ui-input-group"][data-ui-input-group-state~="multiline"] .action[data-v-
|
|
5360
|
+
[data-component~="ui-input-group"][data-ui-input-group-state~="multiline"] .action[data-v-57e02424] {
|
|
5361
5361
|
grid-column: 1 / -1;
|
|
5362
5362
|
justify-content: end;
|
|
5363
5363
|
padding: var(--ui-space-2);
|
|
5364
5364
|
padding-block-start: 0;
|
|
5365
5365
|
}
|
|
5366
|
-
|
|
5367
|
-
.action
|
|
5366
|
+
|
|
5367
|
+
/* The same textarea keeps its full resizeable box. Its text reserves the action's live width,
|
|
5368
|
+
so a translated label or pending indicator cannot cover what the person types. */
|
|
5369
|
+
[data-component~="ui-input-group"][data-ui-input-group-state~="multiline"][data-ui-input-group-state~="actionPosition=top-end"][data-v-57e02424] {
|
|
5370
|
+
--_ui-default-textarea-padding-inline-end: calc(
|
|
5371
|
+
var(--_ui-input-group-action-inline-size, 7rem) + var(--ui-space-3)
|
|
5372
|
+
);
|
|
5373
|
+
}
|
|
5374
|
+
[data-component~="ui-input-group"][data-ui-input-group-state~="multiline"][data-ui-input-group-state~="actionPosition=top-end"]
|
|
5375
|
+
.field[data-v-57e02424] {
|
|
5376
|
+
grid-row: 1;
|
|
5377
|
+
}
|
|
5378
|
+
[data-component~="ui-input-group"][data-ui-input-group-state~="multiline"][data-ui-input-group-state~="actionPosition=top-end"]
|
|
5379
|
+
.action[data-v-57e02424] {
|
|
5380
|
+
grid-column: 2;
|
|
5381
|
+
grid-row: 1;
|
|
5382
|
+
align-self: start;
|
|
5383
|
+
justify-self: end;
|
|
5384
|
+
padding: var(--ui-space-2);
|
|
5385
|
+
}
|
|
5386
|
+
.affix[data-v-57e02424]:empty,
|
|
5387
|
+
.action[data-v-57e02424]:empty {
|
|
5368
5388
|
display: none;
|
|
5369
5389
|
}
|
|
5370
5390
|
|
|
5371
5391
|
/* A component that sets its display still honours the hidden attribute on its root. */
|
|
5372
|
-
[data-component~="ui-input-group"][hidden][data-v-
|
|
5392
|
+
[data-component~="ui-input-group"][hidden][data-v-57e02424] {
|
|
5373
5393
|
display: none;
|
|
5374
5394
|
}
|
|
5375
5395
|
|
|
@@ -8236,7 +8256,11 @@ tbody tr[data-v-93c9ac9c-s]:last-child > * {
|
|
|
8236
8256
|
syntax: "*";
|
|
8237
8257
|
inherits: false;
|
|
8238
8258
|
}
|
|
8239
|
-
|
|
8259
|
+
@property --ui-textarea-padding-inline-end {
|
|
8260
|
+
syntax: "*";
|
|
8261
|
+
inherits: false;
|
|
8262
|
+
}
|
|
8263
|
+
[data-component~="ui-textarea"][data-v-f5b6ae17] {
|
|
8240
8264
|
box-sizing: border-box;
|
|
8241
8265
|
display: inline-block;
|
|
8242
8266
|
inline-size: 100%;
|
|
@@ -8245,6 +8269,10 @@ tbody tr[data-v-93c9ac9c-s]:last-child > * {
|
|
|
8245
8269
|
margin: 0;
|
|
8246
8270
|
--_padding-block: var(--ui-space-2);
|
|
8247
8271
|
padding: var(--ui-space-2) var(--ui-space-3);
|
|
8272
|
+
padding-inline-end: var(
|
|
8273
|
+
--ui-textarea-padding-inline-end,
|
|
8274
|
+
var(--_ui-default-textarea-padding-inline-end, var(--ui-space-3))
|
|
8275
|
+
);
|
|
8248
8276
|
appearance: none;
|
|
8249
8277
|
resize: vertical;
|
|
8250
8278
|
border: var(
|
|
@@ -8277,15 +8305,15 @@ tbody tr[data-v-93c9ac9c-s]:last-child > * {
|
|
|
8277
8305
|
}
|
|
8278
8306
|
|
|
8279
8307
|
/* Tabbing into a field selects its text; tint that selection softly instead of the page highlight. */
|
|
8280
|
-
[data-component~="ui-textarea"][data-v-
|
|
8308
|
+
[data-component~="ui-textarea"][data-v-f5b6ae17]::selection {
|
|
8281
8309
|
background: color-mix(in srgb, var(--ui-accent-solid) 20%, transparent);
|
|
8282
8310
|
color: inherit;
|
|
8283
8311
|
}
|
|
8284
|
-
[data-component~="ui-textarea"][data-v-
|
|
8312
|
+
[data-component~="ui-textarea"][data-v-f5b6ae17]::placeholder {
|
|
8285
8313
|
color: var(--ui-control-placeholder, var(--ui-text-secondary));
|
|
8286
8314
|
opacity: 1;
|
|
8287
8315
|
}
|
|
8288
|
-
[data-component~="ui-textarea"][data-v-
|
|
8316
|
+
[data-component~="ui-textarea"][data-v-f5b6ae17]:hover:not(:focus):not(:disabled):not(:read-only):not([aria-invalid="true"]):not(:is(:user-invalid, [data-user-invalid])) {
|
|
8289
8317
|
border-color: var(
|
|
8290
8318
|
--ui-textarea-border-hover,
|
|
8291
8319
|
var(
|
|
@@ -8294,7 +8322,7 @@ tbody tr[data-v-93c9ac9c-s]:last-child > * {
|
|
|
8294
8322
|
)
|
|
8295
8323
|
);
|
|
8296
8324
|
}
|
|
8297
|
-
[data-component~="ui-textarea"][data-v-
|
|
8325
|
+
[data-component~="ui-textarea"][data-v-f5b6ae17]:focus-visible {
|
|
8298
8326
|
border-color: var(
|
|
8299
8327
|
--ui-textarea-focus-border,
|
|
8300
8328
|
var(--_ui-default-textarea-focus-border, var(--ui-control-focus, var(--ui-accent-solid)))
|
|
@@ -8311,14 +8339,14 @@ tbody tr[data-v-93c9ac9c-s]:last-child > * {
|
|
|
8311
8339
|
}
|
|
8312
8340
|
|
|
8313
8341
|
/* The app's invalid flag, or the browser's own verdict once the user has left an invalid field. */
|
|
8314
|
-
[data-component~="ui-textarea"][aria-invalid="true"][data-v-
|
|
8315
|
-
[data-component~="ui-textarea"][data-v-
|
|
8342
|
+
[data-component~="ui-textarea"][aria-invalid="true"][data-v-f5b6ae17],
|
|
8343
|
+
[data-component~="ui-textarea"][data-v-f5b6ae17]:is(:user-invalid, [data-user-invalid]) {
|
|
8316
8344
|
border-color: var(
|
|
8317
8345
|
--ui-textarea-invalid-border,
|
|
8318
8346
|
var(--_ui-default-textarea-invalid-border, var(--ui-field-danger, var(--ui-danger-solid)))
|
|
8319
8347
|
);
|
|
8320
8348
|
}
|
|
8321
|
-
[data-component~="ui-textarea"][data-v-
|
|
8349
|
+
[data-component~="ui-textarea"][data-v-f5b6ae17]:is([aria-invalid="true"], :is(:user-invalid, [data-user-invalid])):focus-visible {
|
|
8322
8350
|
box-shadow: var(
|
|
8323
8351
|
--ui-textarea-invalid-focus-shadow,
|
|
8324
8352
|
var(
|
|
@@ -8335,24 +8363,32 @@ tbody tr[data-v-93c9ac9c-s]:last-child > * {
|
|
|
8335
8363
|
)
|
|
8336
8364
|
);
|
|
8337
8365
|
}
|
|
8338
|
-
[data-component~="ui-textarea"][data-v-
|
|
8366
|
+
[data-component~="ui-textarea"][data-v-f5b6ae17]:disabled {
|
|
8339
8367
|
background: var(--ui-control-surface-disabled, var(--ui-surface-muted));
|
|
8340
8368
|
color: var(--ui-disabled-text);
|
|
8341
8369
|
box-shadow: none;
|
|
8342
8370
|
cursor: not-allowed;
|
|
8343
8371
|
}
|
|
8344
|
-
[data-component~="ui-textarea"][data-ui-textarea-state~="size=sm"][data-v-
|
|
8372
|
+
[data-component~="ui-textarea"][data-ui-textarea-state~="size=sm"][data-v-f5b6ae17] {
|
|
8345
8373
|
--_padding-block: var(--ui-space-1);
|
|
8346
8374
|
padding: var(--ui-space-1) var(--ui-space-2);
|
|
8375
|
+
padding-inline-end: var(
|
|
8376
|
+
--ui-textarea-padding-inline-end,
|
|
8377
|
+
var(--_ui-default-textarea-padding-inline-end, var(--ui-space-2))
|
|
8378
|
+
);
|
|
8347
8379
|
font-size: var(--ui-font-size-sm);
|
|
8348
8380
|
}
|
|
8349
|
-
[data-component~="ui-textarea"][data-ui-textarea-state~="size=lg"][data-v-
|
|
8381
|
+
[data-component~="ui-textarea"][data-ui-textarea-state~="size=lg"][data-v-f5b6ae17] {
|
|
8350
8382
|
--_padding-block: var(--ui-space-3);
|
|
8351
8383
|
padding: var(--ui-space-3) var(--ui-space-4);
|
|
8384
|
+
padding-inline-end: var(
|
|
8385
|
+
--ui-textarea-padding-inline-end,
|
|
8386
|
+
var(--_ui-default-textarea-padding-inline-end, var(--ui-space-4))
|
|
8387
|
+
);
|
|
8352
8388
|
font-size: var(--ui-font-size-md);
|
|
8353
8389
|
}
|
|
8354
8390
|
@supports (field-sizing: content) {
|
|
8355
|
-
[data-component~="ui-textarea"][data-ui-textarea-state~="autosize"][data-v-
|
|
8391
|
+
[data-component~="ui-textarea"][data-ui-textarea-state~="autosize"][data-v-f5b6ae17] {
|
|
8356
8392
|
field-sizing: content;
|
|
8357
8393
|
min-block-size: calc(var(--_rows) * 1lh + var(--_padding-block) + var(--_padding-block) + 2px);
|
|
8358
8394
|
}
|
|
@@ -8360,13 +8396,13 @@ tbody tr[data-v-93c9ac9c-s]:last-child > * {
|
|
|
8360
8396
|
|
|
8361
8397
|
/* Below 16px, iOS zooms the page into the focused field, so touch keeps body-size text. */
|
|
8362
8398
|
@media (pointer: coarse) {
|
|
8363
|
-
[data-component~="ui-textarea"][data-ui-textarea-state~="size=sm"][data-v-
|
|
8399
|
+
[data-component~="ui-textarea"][data-ui-textarea-state~="size=sm"][data-v-f5b6ae17] {
|
|
8364
8400
|
font-size: inherit;
|
|
8365
8401
|
}
|
|
8366
8402
|
}
|
|
8367
8403
|
|
|
8368
8404
|
/* A component that sets its display still honours the hidden attribute on its root. */
|
|
8369
|
-
[data-component~="ui-textarea"][hidden][data-v-
|
|
8405
|
+
[data-component~="ui-textarea"][hidden][data-v-f5b6ae17] {
|
|
8370
8406
|
display: none;
|
|
8371
8407
|
}
|
|
8372
8408
|
|