@threadlabs/looma 0.22.10 → 0.22.12

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@threadlabs/looma",
3
- "version": "0.22.10",
3
+ "version": "0.22.12",
4
4
  "type": "module",
5
5
  "description": "Looma components as HTML, Vue, and plain DOM, with design tokens.",
6
6
  "license": "MIT",
@@ -213,6 +213,12 @@
213
213
  background-color: var(--ui-overlay-backdrop);
214
214
  animation: ui-dialog-backdrop-enter var(--_ui-dialog-duration, var(--ui-motion-base)) var(--ui-motion-ease);
215
215
  }
216
+
217
+ :scope[open][data-ui-backdrop-hidden]::backdrop {
218
+ background-color: transparent;
219
+ animation: none;
220
+ transition: none;
221
+ }
216
222
  }
217
223
  @scope ([data-component~="ui-dialog"]) to ([data-component]) {
218
224
  /* This component's hooks style the element they are set on, and never a nested one. */
@@ -125,6 +125,20 @@
125
125
  white-space: nowrap;
126
126
  }
127
127
 
128
+ /* Fixed text is part of the value, but should not look editable. */
129
+ .affix:has([slot="prefix"]),
130
+ .affix:has([slot="suffix"]) {
131
+ background: var(--ui-surface-muted);
132
+ }
133
+
134
+ .affix:has([slot="prefix"]) {
135
+ border-inline-end: 1px solid var(--ui-border-divider);
136
+ }
137
+
138
+ .affix:has([slot="suffix"]) {
139
+ border-inline-start: 1px solid var(--ui-border-divider);
140
+ }
141
+
128
142
  /* Centred rather than padded above and below: the group is exactly a lone Input's height, so a
129
143
  small button sits inside it with the difference split evenly, and the field keeps its height. */
130
144
  .action {
@@ -166,6 +180,8 @@
166
180
  @media (forced-colors: active) {
167
181
  }
168
182
 
183
+ /* Fixed text is part of the value, but should not look editable. */
184
+
169
185
  /* Centred rather than padded above and below: the group is exactly a lone Input's height, so a
170
186
  small button sits inside it with the difference split evenly, and the field keeps its height. */
171
187
 
@@ -80,6 +80,14 @@
80
80
  background: var(--ui-overlay-backdrop);
81
81
  }
82
82
 
83
+ dialog:modal {
84
+ background: transparent;
85
+ }
86
+
87
+ dialog[data-ui-backdrop-hidden]::backdrop {
88
+ background: transparent;
89
+ }
90
+
83
91
  .panel {
84
92
  position: relative;
85
93
  display: flex;
package/vue/UiDialog.vue CHANGED
@@ -545,6 +545,12 @@ footer:empty {
545
545
  var(--ui-motion-ease);
546
546
  }
547
547
 
548
+ [data-component~="ui-dialog"][open][data-ui-backdrop-hidden]::backdrop {
549
+ background-color: transparent;
550
+ animation: none;
551
+ transition: none;
552
+ }
553
+
548
554
  @keyframes ui-dialog-backdrop-enter {
549
555
  from {
550
556
  background-color: transparent;
@@ -269,6 +269,20 @@ useComponentHost(() => import('../components/ui-input-group/ui-input-group.js'),
269
269
  white-space: nowrap;
270
270
  }
271
271
 
272
+ /* Fixed text is part of the value, but should not look editable. */
273
+ .affix:has([slot="prefix"]),
274
+ .affix:has([slot="suffix"]) {
275
+ background: var(--ui-surface-muted);
276
+ }
277
+
278
+ .affix:has([slot="prefix"]) {
279
+ border-inline-end: 1px solid var(--ui-border-divider);
280
+ }
281
+
282
+ .affix:has([slot="suffix"]) {
283
+ border-inline-start: 1px solid var(--ui-border-divider);
284
+ }
285
+
272
286
  /* Centred rather than padded above and below: the group is exactly a lone Input's height, so a
273
287
  small button sits inside it with the difference split evenly, and the field keeps its height. */
274
288
  .action {
@@ -298,6 +298,14 @@ dialog::backdrop {
298
298
  background: var(--ui-overlay-backdrop);
299
299
  }
300
300
 
301
+ dialog:modal {
302
+ background: transparent;
303
+ }
304
+
305
+ dialog[data-ui-backdrop-hidden]::backdrop {
306
+ background: transparent;
307
+ }
308
+
301
309
  .panel {
302
310
  position: relative;
303
311
  display: flex;
@@ -327,6 +327,6 @@ var UiDialog_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PUR
327
327
  }]]);
328
328
  };
329
329
  }
330
- }), [["__scopeId", "data-v-6680d681"]]);
330
+ }), [["__scopeId", "data-v-89cad3bb"]]);
331
331
  //#endregion
332
332
  export { UiDialog_default as t };
@@ -99,6 +99,6 @@ var UiInputGroup_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
99
99
  }]]);
100
100
  };
101
101
  }
102
- }), [["__scopeId", "data-v-4ad9e91a"]]);
102
+ }), [["__scopeId", "data-v-5cf4aea5"]]);
103
103
  //#endregion
104
104
  export { UiInputGroup_default as t };
@@ -194,6 +194,6 @@ var UiSearchShell_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @
194
194
  }]]);
195
195
  };
196
196
  }
197
- }), [["__scopeId", "data-v-d7cd9501"]]);
197
+ }), [["__scopeId", "data-v-34344651"]]);
198
198
  //#endregion
199
199
  export { UiSearchShell_default as t };
@@ -2381,7 +2381,7 @@ dd[data-v-7a7db3d1] {
2381
2381
  syntax: "*";
2382
2382
  inherits: false;
2383
2383
  }
2384
- [data-component~="ui-dialog"][data-v-6680d681] {
2384
+ [data-component~="ui-dialog"][data-v-89cad3bb] {
2385
2385
  /* Hooks do not inherit, so the parts below read them from the root. */
2386
2386
  --_ui-dialog-duration: var(--ui-dialog-duration);
2387
2387
 
@@ -2416,21 +2416,21 @@ dd[data-v-7a7db3d1] {
2416
2416
  display var(--ui-dialog-duration, var(--ui-motion-base)) var(--ui-motion-ease) allow-discrete,
2417
2417
  overlay var(--ui-dialog-duration, var(--ui-motion-base)) var(--ui-motion-ease) allow-discrete;
2418
2418
  }
2419
- [data-component~="ui-dialog"][open][data-v-6680d681] {
2419
+ [data-component~="ui-dialog"][open][data-v-89cad3bb] {
2420
2420
  display: flex;
2421
2421
  visibility: visible;
2422
2422
  pointer-events: auto;
2423
2423
  opacity: 1;
2424
2424
  transform: scale(1);
2425
- animation: ui-dialog-enter-6680d681 var(--ui-dialog-duration, var(--ui-motion-base)) var(--ui-motion-ease);
2425
+ animation: ui-dialog-enter-89cad3bb var(--ui-dialog-duration, var(--ui-motion-base)) var(--ui-motion-ease);
2426
2426
  }
2427
- [data-component~="ui-dialog"][data-ui-dialog-state~="size=sm"][data-v-6680d681] {
2427
+ [data-component~="ui-dialog"][data-ui-dialog-state~="size=sm"][data-v-89cad3bb] {
2428
2428
  --_ui-dialog-size: 360px;
2429
2429
  }
2430
- [data-component~="ui-dialog"][data-ui-dialog-state~="size=lg"][data-v-6680d681] {
2430
+ [data-component~="ui-dialog"][data-ui-dialog-state~="size=lg"][data-v-89cad3bb] {
2431
2431
  --_ui-dialog-size: 640px;
2432
2432
  }
2433
- [data-component~="ui-dialog"][data-ui-dialog-state~="size=fullscreen"][data-v-6680d681] {
2433
+ [data-component~="ui-dialog"][data-ui-dialog-state~="size=fullscreen"][data-v-89cad3bb] {
2434
2434
  inset: 0;
2435
2435
  inline-size: 100%;
2436
2436
  block-size: 100dvh;
@@ -2438,12 +2438,12 @@ dd[data-v-7a7db3d1] {
2438
2438
  margin: 0;
2439
2439
  border-radius: var(--ui-dialog-radius, 0);
2440
2440
  }
2441
- [data-component~="ui-dialog"][data-ui-dialog-state~="alert"] .close[data-v-6680d681] {
2441
+ [data-component~="ui-dialog"][data-ui-dialog-state~="alert"] .close[data-v-89cad3bb] {
2442
2442
  display: none;
2443
2443
  }
2444
2444
 
2445
2445
  /* Header and actions stay pinned; only the body scrolls when content is long. */
2446
- header[data-v-6680d681] {
2446
+ header[data-v-89cad3bb] {
2447
2447
  display: flex;
2448
2448
  align-items: center;
2449
2449
  gap: var(--ui-space-3);
@@ -2452,7 +2452,7 @@ header[data-v-6680d681] {
2452
2452
  }
2453
2453
 
2454
2454
  /* :host-qualified so page heading rules that reach in cannot outrank the dialog chrome. */
2455
- [data-component~="ui-dialog"] .title[data-v-6680d681] {
2455
+ [data-component~="ui-dialog"] .title[data-v-89cad3bb] {
2456
2456
  flex: 1;
2457
2457
  min-inline-size: 0;
2458
2458
  margin: 0;
@@ -2464,7 +2464,7 @@ header[data-v-6680d681] {
2464
2464
  font-weight: var(--ui-font-semibold);
2465
2465
  line-height: var(--ui-line-height-tight);
2466
2466
  }
2467
- .close[data-v-6680d681] {
2467
+ .close[data-v-89cad3bb] {
2468
2468
  display: inline-grid;
2469
2469
  place-items: center;
2470
2470
  flex: none;
@@ -2483,8 +2483,8 @@ header[data-v-6680d681] {
2483
2483
  }
2484
2484
 
2485
2485
  /* A CSS-drawn X. */
2486
- .close[data-v-6680d681]::before,
2487
- .close[data-v-6680d681]::after {
2486
+ .close[data-v-89cad3bb]::before,
2487
+ .close[data-v-89cad3bb]::after {
2488
2488
  content: "";
2489
2489
  grid-area: 1 / 1;
2490
2490
  inline-size: 0.875rem;
@@ -2493,35 +2493,35 @@ header[data-v-6680d681] {
2493
2493
  background: currentColor;
2494
2494
  transform: rotate(45deg);
2495
2495
  }
2496
- .close[data-v-6680d681]::after {
2496
+ .close[data-v-89cad3bb]::after {
2497
2497
  transform: rotate(-45deg);
2498
2498
  }
2499
- .close[data-v-6680d681]:hover {
2499
+ .close[data-v-89cad3bb]:hover {
2500
2500
  background: var(--ui-surface-muted);
2501
2501
  color: var(--ui-text-primary);
2502
2502
  }
2503
- .close[data-v-6680d681]:focus-visible {
2503
+ .close[data-v-89cad3bb]:focus-visible {
2504
2504
  outline: 2px solid var(--ui-focus-ring);
2505
2505
  outline-offset: 2px;
2506
2506
  }
2507
2507
 
2508
2508
  /* A touch target, like Button on coarse pointers. */
2509
2509
  @media (pointer: coarse) {
2510
- .close[data-v-6680d681] {
2510
+ .close[data-v-89cad3bb] {
2511
2511
  inline-size: var(--ui-control-min-block-size);
2512
2512
  block-size: var(--ui-control-min-block-size);
2513
2513
  }
2514
2514
  }
2515
- html[data-ui-input-modality="touch"] [data-component~="ui-dialog"] .close[data-v-6680d681] {
2515
+ html[data-ui-input-modality="touch"] [data-component~="ui-dialog"] .close[data-v-89cad3bb] {
2516
2516
  inline-size: var(--ui-control-min-block-size);
2517
2517
  block-size: var(--ui-control-min-block-size);
2518
2518
  }
2519
- .body[data-v-6680d681] {
2519
+ .body[data-v-89cad3bb] {
2520
2520
  flex: 1 1 auto;
2521
2521
  min-block-size: 0;
2522
2522
  padding: var(--ui-space-5);
2523
2523
  }
2524
- footer[data-v-6680d681] {
2524
+ footer[data-v-89cad3bb] {
2525
2525
  display: flex;
2526
2526
  flex: none;
2527
2527
  flex-wrap: wrap;
@@ -2529,28 +2529,33 @@ footer[data-v-6680d681] {
2529
2529
  gap: var(--ui-space-2);
2530
2530
  padding: var(--ui-space-3) var(--ui-space-5);
2531
2531
  }
2532
- footer[data-v-6680d681]:empty {
2532
+ footer[data-v-89cad3bb]:empty {
2533
2533
  display: none;
2534
2534
  }
2535
- @keyframes ui-dialog-enter-6680d681 {
2535
+ @keyframes ui-dialog-enter-89cad3bb {
2536
2536
  from {
2537
2537
  opacity: 0;
2538
2538
  transform: scale(0.96);
2539
2539
  }
2540
2540
  }
2541
- [data-component~="ui-dialog"][data-v-6680d681]::backdrop {
2541
+ [data-component~="ui-dialog"][data-v-89cad3bb]::backdrop {
2542
2542
  background-color: transparent;
2543
2543
  transition:
2544
2544
  background-color var(--_ui-dialog-duration, var(--ui-motion-base)) var(--ui-motion-ease),
2545
2545
  display var(--_ui-dialog-duration, var(--ui-motion-base)) var(--ui-motion-ease) allow-discrete,
2546
2546
  overlay var(--_ui-dialog-duration, var(--ui-motion-base)) var(--ui-motion-ease) allow-discrete;
2547
2547
  }
2548
- [data-component~="ui-dialog"][open][data-v-6680d681]::backdrop {
2548
+ [data-component~="ui-dialog"][open][data-v-89cad3bb]::backdrop {
2549
2549
  background-color: var(--ui-overlay-backdrop);
2550
- animation: ui-dialog-backdrop-enter-6680d681 var(--_ui-dialog-duration, var(--ui-motion-base))
2550
+ animation: ui-dialog-backdrop-enter-89cad3bb var(--_ui-dialog-duration, var(--ui-motion-base))
2551
2551
  var(--ui-motion-ease);
2552
2552
  }
2553
- @keyframes ui-dialog-backdrop-enter-6680d681 {
2553
+ [data-component~="ui-dialog"][open][data-ui-backdrop-hidden][data-v-89cad3bb]::backdrop {
2554
+ background-color: transparent;
2555
+ animation: none;
2556
+ transition: none;
2557
+ }
2558
+ @keyframes ui-dialog-backdrop-enter-89cad3bb {
2554
2559
  from {
2555
2560
  background-color: transparent;
2556
2561
  }
@@ -4790,7 +4795,7 @@ svg[data-v-0d1b1c7d-s] {
4790
4795
  whole value is. The action slot takes one button at the end, inside the border, for the one
4791
4796
  thing the field is for ("Continue" after a site's address), so it reads as the field's action
4792
4797
  and not the form's. */
4793
- [data-component~="ui-input-group"][data-v-4ad9e91a] {
4798
+ [data-component~="ui-input-group"][data-v-5cf4aea5] {
4794
4799
  /* The group's own border and height stand for the input's, so the group is a lone Input's height.
4795
4800
  Hooks do not inherit, so these are defaults for the input; its own hooks still win. */
4796
4801
  --_ui-default-input-border-width: 0;
@@ -4826,36 +4831,36 @@ svg[data-v-0d1b1c7d-s] {
4826
4831
  }
4827
4832
 
4828
4833
  /* The frame takes its input's size, so a small group lines up with small buttons and fields. */
4829
- [data-component~="ui-input-group"][data-v-4ad9e91a]:has(.field [data-ui-input-state~="size=sm"]) {
4834
+ [data-component~="ui-input-group"][data-v-5cf4aea5]:has(.field [data-ui-input-state~="size=sm"]) {
4830
4835
  min-block-size: var(--ui-control-size-sm);
4831
4836
  }
4832
- [data-component~="ui-input-group"][data-v-4ad9e91a]:has(.field [data-ui-input-state~="size=lg"]) {
4837
+ [data-component~="ui-input-group"][data-v-5cf4aea5]:has(.field [data-ui-input-state~="size=lg"]) {
4833
4838
  min-block-size: var(--ui-control-size-lg);
4834
4839
  }
4835
4840
  @media (pointer: coarse) {
4836
- [data-component~="ui-input-group"][data-v-4ad9e91a]:has(.field [data-ui-input-state~="size=sm"]) {
4841
+ [data-component~="ui-input-group"][data-v-5cf4aea5]:has(.field [data-ui-input-state~="size=sm"]) {
4837
4842
  min-block-size: var(--ui-control-min-block-size);
4838
4843
  }
4839
4844
  }
4840
- [data-component~="ui-input-group"][data-v-4ad9e91a]:hover:not(:has(input:focus, input:disabled, input:read-only, [aria-invalid="true"], :is(:user-invalid, [data-user-invalid]))) {
4845
+ [data-component~="ui-input-group"][data-v-5cf4aea5]:hover:not(:has(input:focus, input:disabled, input:read-only, [aria-invalid="true"], :is(:user-invalid, [data-user-invalid]))) {
4841
4846
  border-color: var(--ui-control-border-hover, var(--ui-text-secondary));
4842
4847
  }
4843
4848
 
4844
4849
  /* The ring shows when the field's input would show its own: when it is focus-visible, which a
4845
4850
  text input is for a pointer as well as a keyboard. A focused action button draws its own. */
4846
- [data-component~="ui-input-group"][data-v-4ad9e91a]:has(.field input:focus-visible) {
4851
+ [data-component~="ui-input-group"][data-v-5cf4aea5]:has(.field input:focus-visible) {
4847
4852
  border-color: var(--ui-control-focus, var(--ui-accent-solid));
4848
4853
  box-shadow:
4849
4854
  var(--ui-control-inset),
4850
4855
  var(--ui-control-focus-halo-shadow);
4851
4856
  }
4852
- [data-component~="ui-input-group"][data-v-4ad9e91a]:has([aria-invalid="true"], :is(:user-invalid, [data-user-invalid])) {
4857
+ [data-component~="ui-input-group"][data-v-5cf4aea5]:has([aria-invalid="true"], :is(:user-invalid, [data-user-invalid])) {
4853
4858
  border-color: var(
4854
4859
  --ui-input-group-invalid-border,
4855
4860
  var(--ui-field-danger, var(--ui-danger-solid))
4856
4861
  );
4857
4862
  }
4858
- [data-component~="ui-input-group"][data-v-4ad9e91a]:has(input:is([aria-invalid="true"], :is(:user-invalid, [data-user-invalid])):focus-visible) {
4863
+ [data-component~="ui-input-group"][data-v-5cf4aea5]:has(input:is([aria-invalid="true"], :is(:user-invalid, [data-user-invalid])):focus-visible) {
4859
4864
  box-shadow: var(
4860
4865
  --ui-input-group-invalid-focus-shadow,
4861
4866
  var(--ui-control-inset),
@@ -4869,23 +4874,23 @@ svg[data-v-0d1b1c7d-s] {
4869
4874
 
4870
4875
  /* Forced colors drop box shadows, so the focus ring becomes an outline. */
4871
4876
  @media (forced-colors: active) {
4872
- [data-component~="ui-input-group"][data-v-4ad9e91a]:has(input:focus-visible) {
4877
+ [data-component~="ui-input-group"][data-v-5cf4aea5]:has(input:focus-visible) {
4873
4878
  outline: 2px solid Highlight;
4874
4879
  outline-offset: 1px;
4875
4880
  }
4876
4881
  }
4877
- [data-component~="ui-input-group"][data-ui-input-group-state~="disabled"][data-v-4ad9e91a],
4878
- [data-component~="ui-input-group"][data-v-4ad9e91a]:has(input:disabled) {
4882
+ [data-component~="ui-input-group"][data-ui-input-group-state~="disabled"][data-v-5cf4aea5],
4883
+ [data-component~="ui-input-group"][data-v-5cf4aea5]:has(input:disabled) {
4879
4884
  background: var(--ui-control-surface-disabled, var(--ui-surface-muted));
4880
4885
  box-shadow: none;
4881
4886
  cursor: not-allowed;
4882
4887
  }
4883
- .field[data-v-4ad9e91a] {
4888
+ .field[data-v-5cf4aea5] {
4884
4889
  display: flex;
4885
4890
  flex: 1;
4886
4891
  min-inline-size: 0;
4887
4892
  }
4888
- .affix[data-v-4ad9e91a] {
4893
+ .affix[data-v-5cf4aea5] {
4889
4894
  display: inline-flex;
4890
4895
  flex: none;
4891
4896
  align-items: center;
@@ -4896,21 +4901,33 @@ svg[data-v-0d1b1c7d-s] {
4896
4901
  white-space: nowrap;
4897
4902
  }
4898
4903
 
4904
+ /* Fixed text is part of the value, but should not look editable. */
4905
+ .affix[data-v-5cf4aea5]:has([slot="prefix"]),
4906
+ .affix[data-v-5cf4aea5]:has([slot="suffix"]) {
4907
+ background: var(--ui-surface-muted);
4908
+ }
4909
+ .affix[data-v-5cf4aea5]:has([slot="prefix"]) {
4910
+ border-inline-end: 1px solid var(--ui-border-divider);
4911
+ }
4912
+ .affix[data-v-5cf4aea5]:has([slot="suffix"]) {
4913
+ border-inline-start: 1px solid var(--ui-border-divider);
4914
+ }
4915
+
4899
4916
  /* Centred rather than padded above and below: the group is exactly a lone Input's height, so a
4900
4917
  small button sits inside it with the difference split evenly, and the field keeps its height. */
4901
- .action[data-v-4ad9e91a] {
4918
+ .action[data-v-5cf4aea5] {
4902
4919
  display: flex;
4903
4920
  flex: none;
4904
4921
  align-items: center;
4905
4922
  padding-inline: var(--ui-space-1);
4906
4923
  }
4907
- .affix[data-v-4ad9e91a]:empty,
4908
- .action[data-v-4ad9e91a]:empty {
4924
+ .affix[data-v-5cf4aea5]:empty,
4925
+ .action[data-v-5cf4aea5]:empty {
4909
4926
  display: none;
4910
4927
  }
4911
4928
 
4912
4929
  /* A component that sets its display still honours the hidden attribute on its root. */
4913
- [data-component~="ui-input-group"][hidden][data-v-4ad9e91a] {
4930
+ [data-component~="ui-input-group"][hidden][data-v-5cf4aea5] {
4914
4931
  display: none;
4915
4932
  }
4916
4933
 
@@ -6319,7 +6336,7 @@ legend[data-v-f7b72b3f] + * {
6319
6336
  syntax: "*";
6320
6337
  inherits: false;
6321
6338
  }
6322
- [data-component~="ui-search-shell"][data-v-d7cd9501] {
6339
+ [data-component~="ui-search-shell"][data-v-34344651] {
6323
6340
  /* Hooks do not inherit, so the parts below read them from the root. */
6324
6341
  --_ui-search-shell-z-index: var(--ui-search-shell-z-index);
6325
6342
  --_ui-search-shell-padding-top: var(--ui-search-shell-padding-top);
@@ -6334,7 +6351,7 @@ legend[data-v-f7b72b3f] + * {
6334
6351
 
6335
6352
  display: contents;
6336
6353
  }
6337
- dialog[data-v-d7cd9501] {
6354
+ dialog[data-v-34344651] {
6338
6355
  position: fixed;
6339
6356
  inset: 0;
6340
6357
  z-index: var(--_ui-search-shell-z-index, 400);
@@ -6352,10 +6369,16 @@ dialog[data-v-d7cd9501] {
6352
6369
  background: var(--ui-overlay-backdrop);
6353
6370
  color: var(--ui-text-primary);
6354
6371
  }
6355
- dialog[data-v-d7cd9501]::backdrop {
6372
+ dialog[data-v-34344651]::backdrop {
6356
6373
  background: var(--ui-overlay-backdrop);
6357
6374
  }
6358
- .panel[data-v-d7cd9501] {
6375
+ dialog[data-v-34344651]:modal {
6376
+ background: transparent;
6377
+ }
6378
+ dialog[data-ui-backdrop-hidden][data-v-34344651]::backdrop {
6379
+ background: transparent;
6380
+ }
6381
+ .panel[data-v-34344651] {
6359
6382
  position: relative;
6360
6383
  display: flex;
6361
6384
  flex-direction: column;
@@ -6375,10 +6398,10 @@ dialog[data-v-d7cd9501]::backdrop {
6375
6398
  var(--ui-overlay-shadow, var(--ui-elevation-dialog, var(--ui-shadow-xl)))
6376
6399
  );
6377
6400
  }
6378
- .search[data-v-d7cd9501] {
6401
+ .search[data-v-34344651] {
6379
6402
  padding: var(--ui-space-3);
6380
6403
  }
6381
- input[slot="search"][data-v-d7cd9501-s] {
6404
+ input[slot="search"][data-v-34344651-s] {
6382
6405
  box-sizing: border-box;
6383
6406
  inline-size: 100%;
6384
6407
  min-block-size: var(--ui-control-min-block-size);
@@ -6390,24 +6413,24 @@ input[slot="search"][data-v-d7cd9501-s] {
6390
6413
  font: inherit;
6391
6414
  box-shadow: var(--ui-shadow-xs);
6392
6415
  }
6393
- input[slot="search"][data-v-d7cd9501-s]:focus-visible {
6416
+ input[slot="search"][data-v-34344651-s]:focus-visible {
6394
6417
  border-color: var(--_ui-search-shell-focus-color, var(--ui-control-focus));
6395
6418
  outline: 2px solid var(--ui-focus-ring);
6396
6419
  outline-offset: 2px;
6397
6420
  }
6398
- .status[data-v-d7cd9501],
6399
- .actions[data-v-d7cd9501] {
6421
+ .status[data-v-34344651],
6422
+ .actions[data-v-34344651] {
6400
6423
  flex-shrink: 0;
6401
6424
  padding: var(--ui-space-2) var(--ui-space-4);
6402
6425
  color: var(--ui-text-secondary);
6403
6426
  font-size: var(--ui-font-size-sm);
6404
6427
  }
6405
- .status[data-v-d7cd9501] {
6428
+ .status[data-v-34344651] {
6406
6429
  padding-block-start: 0;
6407
6430
  }
6408
6431
 
6409
6432
  /* Laid out like the dialog's action row: actions right-aligned, spaced as buttons, no fill. */
6410
- .actions[data-v-d7cd9501] {
6433
+ .actions[data-v-34344651] {
6411
6434
  display: flex;
6412
6435
  flex-wrap: wrap;
6413
6436
  align-items: center;
@@ -6415,11 +6438,11 @@ input[slot="search"][data-v-d7cd9501-s]:focus-visible {
6415
6438
  gap: var(--ui-space-2);
6416
6439
  padding: var(--ui-space-3) var(--ui-space-4);
6417
6440
  }
6418
- .status[data-v-d7cd9501]:empty,
6419
- .actions[data-v-d7cd9501]:empty {
6441
+ .status[data-v-34344651]:empty,
6442
+ .actions[data-v-34344651]:empty {
6420
6443
  display: none;
6421
6444
  }
6422
- .body[data-v-d7cd9501] {
6445
+ .body[data-v-34344651] {
6423
6446
  flex: 1;
6424
6447
  min-block-size: 0;
6425
6448
  overflow: auto;
@@ -6447,10 +6470,10 @@ input[slot="search"][data-v-d7cd9501-s]:focus-visible {
6447
6470
  calc(100% - var(--_ui-scroll-fade-size)) 100%;
6448
6471
  }
6449
6472
  @media (max-width: 47.9375rem) {
6450
- dialog[data-v-d7cd9501] {
6473
+ dialog[data-v-34344651] {
6451
6474
  padding: 0;
6452
6475
  }
6453
- .panel[data-v-d7cd9501] {
6476
+ .panel[data-v-34344651] {
6454
6477
  inline-size: 100%;
6455
6478
  min-block-size: 100dvh;
6456
6479
  max-block-size: none;
@@ -6460,7 +6483,7 @@ dialog[data-v-d7cd9501] {
6460
6483
  }
6461
6484
 
6462
6485
  /* A component that sets its display still honours the hidden attribute on its root. */
6463
- [data-component~="ui-search-shell"][hidden][data-v-d7cd9501] {
6486
+ [data-component~="ui-search-shell"][hidden][data-v-34344651] {
6464
6487
  display: none;
6465
6488
  }
6466
6489
 
@@ -9047,18 +9070,26 @@ html[data-ui-input-modality="touch"]
9047
9070
 
9048
9071
  .looma-editor__link-context-actions {
9049
9072
  display: flex;
9073
+ flex-wrap: wrap;
9050
9074
  align-items: center;
9051
9075
  gap: var(--ui-space-1);
9052
9076
  }
9053
9077
 
9054
9078
  .looma-editor__link-context-url {
9055
9079
  min-width: 0;
9056
- max-width: 10rem;
9057
- overflow: hidden;
9080
+ flex: 1 1 100%;
9058
9081
  padding-inline: var(--ui-space-2);
9059
9082
  color: var(--ui-text-secondary);
9060
- text-overflow: ellipsis;
9061
- white-space: nowrap;
9083
+ overflow-wrap: anywhere;
9084
+ font-size: var(--ui-font-size-sm);
9085
+ }
9086
+
9087
+ .looma-editor__link-context-url :is(strong, small) {
9088
+ display: block;
9089
+ }
9090
+
9091
+ .looma-editor__link-context-url strong {
9092
+ color: var(--ui-text-primary);
9062
9093
  }
9063
9094
 
9064
9095
  .looma-editor__link-context-actions :is(button, a) {
@@ -9175,6 +9206,57 @@ html[data-ui-input-modality="touch"]
9175
9206
  align-items: center;
9176
9207
  }
9177
9208
 
9209
+ .looma-editor__link-modes {
9210
+ display: flex;
9211
+ gap: var(--ui-space-1);
9212
+ }
9213
+
9214
+ .looma-editor__link-modes button,
9215
+ .looma-editor__link-results button {
9216
+ min-height: var(--ui-control-min-block-size);
9217
+ padding: var(--ui-space-2);
9218
+ border: 1px solid var(--ui-control-border);
9219
+ border-radius: var(--ui-field-radius, var(--ui-radius-md));
9220
+ background: var(--ui-control-surface);
9221
+ color: var(--ui-text-primary);
9222
+ font: inherit;
9223
+ text-align: left;
9224
+ cursor: pointer;
9225
+ }
9226
+
9227
+ .looma-editor__link-modes button[aria-pressed="true"] {
9228
+ border-color: var(--ui-accent);
9229
+ color: var(--ui-accent);
9230
+ }
9231
+
9232
+ .looma-editor__link-results {
9233
+ display: flex;
9234
+ flex-direction: column;
9235
+ gap: var(--ui-space-1);
9236
+ max-height: 15rem;
9237
+ overflow-y: auto;
9238
+ }
9239
+
9240
+ .looma-editor__link-results p {
9241
+ margin: 0;
9242
+ color: var(--ui-text-secondary);
9243
+ font-size: var(--ui-font-size-sm);
9244
+ }
9245
+
9246
+ .looma-editor__link-results button {
9247
+ display: flex;
9248
+ flex-direction: column;
9249
+ width: 100%;
9250
+ }
9251
+
9252
+ .looma-editor__link-results button:is(:hover, :focus-visible) {
9253
+ background: var(--ui-surface-subtle);
9254
+ }
9255
+
9256
+ .looma-editor__link-results button small {
9257
+ color: var(--ui-text-secondary);
9258
+ }
9259
+
9178
9260
  .looma-editor__link-error {
9179
9261
  margin: 0;
9180
9262
  color: var(--ui-field-danger, var(--ui-danger));