@threadlabs/looma 0.15.7 → 0.16.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.
package/vue/UiDialog.d.ts CHANGED
@@ -3,6 +3,7 @@ type __VLS_Props = {
3
3
  closedby?: 'any' | 'closerequest' | 'none';
4
4
  for?: string;
5
5
  label?: string;
6
+ modal?: boolean;
6
7
  modeless?: boolean;
7
8
  open?: boolean;
8
9
  size?: 'sm' | 'md' | 'lg' | 'fullscreen';
@@ -42,7 +43,7 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {},
42
43
  for: string;
43
44
  open: boolean;
44
45
  alert: boolean;
45
- closedby: "any" | "closerequest" | "none";
46
+ modal: boolean;
46
47
  modeless: boolean;
47
48
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
48
49
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
package/vue/UiDialog.vue CHANGED
@@ -12,14 +12,15 @@ const props = withDefaults(
12
12
  closedby?: 'any' | 'closerequest' | 'none'
13
13
  for?: string
14
14
  label?: string
15
+ modal?: boolean
15
16
  modeless?: boolean
16
17
  open?: boolean
17
18
  size?: 'sm' | 'md' | 'lg' | 'fullscreen'
18
19
  }>(),
19
20
  {
20
21
  alert: false,
21
- closedby: 'closerequest',
22
22
  for: '',
23
+ modal: false,
23
24
  modeless: false,
24
25
  open: false,
25
26
  size: 'md',
package/vue/UiIcon.vue CHANGED
@@ -281,6 +281,10 @@ const shapes = computed(() =>
281
281
  tag: 'path',
282
282
  d: 'M9 3H5a2 2 0 0 0-2 2v4m6-6h10a2 2 0 0 1 2 2v4M9 3v18m0 0h10a2 2 0 0 0 2-2V9M9 21H5a2 2 0 0 1-2-2V9m0 0h18',
283
283
  }],
284
+ tag: [{
285
+ tag: 'path',
286
+ d: 'M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z',
287
+ }, { tag: 'circle', cx: '7.5', cy: '7.5', r: '.5', fill: 'currentColor' }],
284
288
  trash: [
285
289
  { tag: 'path', d: 'M10 11v6' },
286
290
  { tag: 'path', d: 'M14 11v6' },
@@ -31,8 +31,8 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {},
31
31
  }>, {
32
32
  label: string;
33
33
  open: boolean;
34
- dismissible: boolean;
35
34
  modal: boolean;
35
+ dismissible: boolean;
36
36
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
37
37
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
38
38
  declare const _default: typeof __VLS_export;
@@ -24,6 +24,6 @@ var UiBadge_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE
24
24
  return openBlock(), createElementBlock("span", mergeProps({ "data-component": "ui-badge" }, _ctx.$attrs, { "data-ui-badge-state": hostState.value || void 0 }), [renderSlot(_ctx.$slots, "default", {}, void 0, true)], 16, _hoisted_1);
25
25
  };
26
26
  }
27
- }), [["__scopeId", "data-v-3485e390"]]);
27
+ }), [["__scopeId", "data-v-bea7b3f9"]]);
28
28
  //#endregion
29
29
  export { UiBadge_default as t };
@@ -25,9 +25,13 @@ var UiDialog_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PUR
25
25
  type: Boolean,
26
26
  default: false
27
27
  },
28
- closedby: { default: "closerequest" },
28
+ closedby: {},
29
29
  for: { default: "" },
30
30
  label: {},
31
+ modal: {
32
+ type: Boolean,
33
+ default: false
34
+ },
31
35
  modeless: {
32
36
  type: Boolean,
33
37
  default: false
@@ -92,6 +96,6 @@ var UiDialog_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PUR
92
96
  ], 16, _hoisted_1);
93
97
  };
94
98
  }
95
- }), [["__scopeId", "data-v-8d67e1e0"]]);
99
+ }), [["__scopeId", "data-v-ef5a672e"]]);
96
100
  //#endregion
97
101
  export { UiDialog_default as t };
@@ -879,6 +879,16 @@ var UiIcon_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE_
879
879
  tag: "path",
880
880
  d: "M9 3H5a2 2 0 0 0-2 2v4m6-6h10a2 2 0 0 1 2 2v4M9 3v18m0 0h10a2 2 0 0 0 2-2V9M9 21H5a2 2 0 0 1-2-2V9m0 0h18"
881
881
  }],
882
+ tag: [{
883
+ tag: "path",
884
+ d: "M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z"
885
+ }, {
886
+ tag: "circle",
887
+ cx: "7.5",
888
+ cy: "7.5",
889
+ r: ".5",
890
+ fill: "currentColor"
891
+ }],
882
892
  trash: [
883
893
  {
884
894
  tag: "path",
@@ -1042,6 +1052,6 @@ var UiIcon_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE_
1042
1052
  }), 128))]))], 16);
1043
1053
  };
1044
1054
  }
1045
- }), [["__scopeId", "data-v-50d3f581"]]);
1055
+ }), [["__scopeId", "data-v-988c6eae"]]);
1046
1056
  //#endregion
1047
1057
  export { UiIcon_default as t };
@@ -92,7 +92,7 @@
92
92
  syntax: "*";
93
93
  inherits: false;
94
94
  }
95
- [data-component~="ui-icon"][data-v-50d3f581] {
95
+ [data-component~="ui-icon"][data-v-988c6eae] {
96
96
  /* Hooks do not inherit, so the svg reads the stroke from the root. A Looma component that
97
97
  sizes the icons it renders sets --_ui-default-icon-*, which the icon's own hooks override. */
98
98
  --_ui-icon-stroke-width: var(--ui-icon-stroke-width, var(--_ui-default-icon-stroke-width));
@@ -102,14 +102,14 @@
102
102
  inline-size: var(--ui-icon-size, var(--_ui-default-icon-size, 1em));
103
103
  block-size: var(--ui-icon-size, var(--_ui-default-icon-size, 1em));
104
104
  }
105
- svg[data-v-50d3f581] {
105
+ svg[data-v-988c6eae] {
106
106
  inline-size: 100%;
107
107
  block-size: 100%;
108
108
  stroke-width: var(--_ui-icon-stroke-width, 2);
109
109
  }
110
110
 
111
111
  /* A component that sets its display still honours the hidden attribute on its root. */
112
- [data-component~="ui-icon"][hidden][data-v-50d3f581] {
112
+ [data-component~="ui-icon"][hidden][data-v-988c6eae] {
113
113
  display: none;
114
114
  }
115
115
 
@@ -314,11 +314,11 @@ svg[data-v-50d3f581] {
314
314
  syntax: "*";
315
315
  inherits: false;
316
316
  }
317
- [data-component~="ui-badge"][data-v-3485e390] {
317
+ [data-component~="ui-badge"][data-v-bea7b3f9] {
318
318
  --_badge-surface: var(--ui-surface-subtle);
319
319
  --_badge-text: var(--ui-text-secondary);
320
- /* Every tone's edge is its fill, so it is unseen until forced colors draw it. */
321
- --_badge-border: var(--ui-surface-subtle);
320
+ /* Sit between the soft fill and its stronger theme ink. */
321
+ --_badge-border: color-mix(in srgb, var(--_badge-surface) 75%, var(--_badge-text) 25%);
322
322
  /* --ui-badge-color derives a wash and an ink from one colour, between the tone and the explicit
323
323
  surface, text, and border hooks. Each value is invalid, so the tone shows, while it is unset. The
324
324
  mixes keep 4.5:1 text contrast for any colour, in a light theme or a dark one. */
@@ -326,7 +326,11 @@ svg[data-v-50d3f581] {
326
326
  --_badge-color-wash: color-mix(in oklab, var(--_ui-badge-color) 15%, var(--ui-surface-default));
327
327
  --_badge-color-ink: color-mix(in oklab, var(--_ui-badge-color) 35%, var(--ui-text-primary));
328
328
  --_badge-color-surface: var(--_badge-color-wash);
329
- --_badge-color-border: var(--_badge-color-wash);
329
+ --_badge-color-border: color-mix(
330
+ in srgb,
331
+ var(--_badge-color-wash) 75%,
332
+ var(--_badge-color-ink) 25%
333
+ );
330
334
  --_badge-color-text: var(--_badge-color-ink);
331
335
  --_badge-outline-surface: var(
332
336
  --ui-badge-surface,
@@ -354,7 +358,7 @@ svg[data-v-50d3f581] {
354
358
  * Trimming applies to block containers; an inline-block is one and, like the inline-flex it
355
359
  * replaces, still sizes to its label rather than filling its container. */
356
360
  @supports (text-box-trim: trim-both) {
357
- [data-component~="ui-badge"][data-v-3485e390] {
361
+ [data-component~="ui-badge"][data-v-bea7b3f9] {
358
362
  display: inline-block;
359
363
  min-block-size: var(--ui-badge-min-block-size, 1.5rem);
360
364
  text-align: center;
@@ -363,65 +367,60 @@ svg[data-v-50d3f581] {
363
367
  text-box-edge: cap alphabetic;
364
368
  }
365
369
  }
366
- [data-component~="ui-badge"][data-ui-badge-state~="tone=accent"][data-v-3485e390] {
370
+ [data-component~="ui-badge"][data-ui-badge-state~="tone=accent"][data-v-bea7b3f9] {
367
371
  --_badge-surface: var(--ui-accent-strong-surface, var(--ui-accent-solid));
368
372
  --_badge-border: var(--ui-accent-strong-surface, var(--ui-accent-solid));
369
373
  --_badge-text: var(--ui-accent-on-strong, var(--ui-text-on-accent));
370
374
  }
371
- [data-component~="ui-badge"][data-ui-badge-state~="tone=danger"][data-v-3485e390] {
375
+ [data-component~="ui-badge"][data-ui-badge-state~="tone=danger"][data-v-bea7b3f9] {
372
376
  --_badge-surface: var(--ui-danger-strong-surface, var(--ui-danger-solid));
373
377
  --_badge-border: var(--ui-danger-strong-surface, var(--ui-danger-solid));
374
378
  --_badge-text: var(--ui-danger-on-strong, var(--ui-text-on-accent));
375
379
  }
376
- [data-component~="ui-badge"][data-ui-badge-state~="tone=success"][data-v-3485e390] {
380
+ [data-component~="ui-badge"][data-ui-badge-state~="tone=success"][data-v-bea7b3f9] {
377
381
  --_badge-surface: var(--ui-success-strong-surface, var(--ui-success-solid));
378
382
  --_badge-border: var(--ui-success-strong-surface, var(--ui-success-solid));
379
383
  --_badge-text: var(--ui-success-on-strong, var(--ui-text-on-accent));
380
384
  }
381
- [data-component~="ui-badge"][data-ui-badge-state~="tone=warning"][data-v-3485e390] {
385
+ [data-component~="ui-badge"][data-ui-badge-state~="tone=warning"][data-v-bea7b3f9] {
382
386
  --_badge-surface: var(--ui-warning-strong-surface, var(--ui-warning-solid));
383
387
  --_badge-border: var(--ui-warning-strong-surface, var(--ui-warning-solid));
384
388
  --_badge-text: var(--ui-warning-on-strong, var(--ui-text-on-accent));
385
389
  }
386
- [data-component~="ui-badge"][data-ui-badge-state~="tone=info"][data-v-3485e390] {
390
+ [data-component~="ui-badge"][data-ui-badge-state~="tone=info"][data-v-bea7b3f9] {
387
391
  --_badge-surface: var(--ui-info-strong-surface, var(--ui-info-solid));
388
392
  --_badge-border: var(--ui-info-strong-surface, var(--ui-info-solid));
389
393
  --_badge-text: var(--ui-info-on-strong, var(--ui-text-on-accent));
390
394
  }
391
- [data-component~="ui-badge"][data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=accent"][data-v-3485e390] {
395
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=accent"][data-v-bea7b3f9] {
392
396
  --_badge-surface: var(--ui-accent-soft);
393
- --_badge-border: var(--ui-accent-soft);
394
397
  --_badge-text: var(--ui-accent-subtle-text, var(--ui-accent-solid));
395
398
  }
396
- [data-component~="ui-badge"][data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=danger"][data-v-3485e390] {
399
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=danger"][data-v-bea7b3f9] {
397
400
  --_badge-surface: var(--ui-danger-soft);
398
- --_badge-border: var(--ui-danger-soft);
399
401
  --_badge-text: var(--ui-danger-subtle-text, var(--ui-danger-solid));
400
402
  }
401
- [data-component~="ui-badge"][data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=success"][data-v-3485e390] {
403
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=success"][data-v-bea7b3f9] {
402
404
  --_badge-surface: var(--ui-success-soft);
403
- --_badge-border: var(--ui-success-soft);
404
405
  --_badge-text: var(--ui-success-subtle-text, var(--ui-success-solid));
405
406
  }
406
- [data-component~="ui-badge"][data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=warning"][data-v-3485e390] {
407
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=warning"][data-v-bea7b3f9] {
407
408
  --_badge-surface: var(--ui-warning-soft);
408
- --_badge-border: var(--ui-warning-soft);
409
409
  --_badge-text: var(--ui-warning-subtle-text, var(--ui-warning-solid));
410
410
  }
411
- [data-component~="ui-badge"][data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=info"][data-v-3485e390] {
411
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=info"][data-v-bea7b3f9] {
412
412
  --_badge-surface: var(--ui-info-soft);
413
- --_badge-border: var(--ui-info-soft);
414
413
  --_badge-text: var(--ui-info-subtle-text, var(--ui-info-solid));
415
414
  }
416
415
 
417
416
  /* A solid colour fills with the ink. Its text is the page surface, mixed at 0% only so that it too is
418
417
  invalid while the hook is unset. */
419
- [data-component~="ui-badge"][data-ui-badge-state~="variant=solid"][data-v-3485e390] {
418
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=solid"][data-v-bea7b3f9] {
420
419
  --_badge-color-surface: var(--_badge-color-ink);
421
420
  --_badge-color-border: var(--_badge-color-ink);
422
421
  --_badge-color-text: color-mix(in oklab, var(--_ui-badge-color) 0%, var(--ui-surface-default));
423
422
  }
424
- [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-v-3485e390] {
423
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-v-bea7b3f9] {
425
424
  --_badge-surface: var(--ui-surface-default);
426
425
  --_badge-border: var(--ui-border-strong);
427
426
  --_badge-text: var(--ui-text-secondary);
@@ -429,23 +428,23 @@ svg[data-v-50d3f581] {
429
428
  --_badge-color-surface: initial;
430
429
  --_badge-color-border: var(--_badge-color-ink);
431
430
  }
432
- [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-ui-badge-state~="tone=accent"][data-v-3485e390] {
431
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-ui-badge-state~="tone=accent"][data-v-bea7b3f9] {
433
432
  --_badge-border: var(--ui-accent-solid);
434
433
  --_badge-text: var(--ui-accent-subtle-text, var(--ui-accent-solid));
435
434
  }
436
- [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-ui-badge-state~="tone=danger"][data-v-3485e390] {
435
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-ui-badge-state~="tone=danger"][data-v-bea7b3f9] {
437
436
  --_badge-border: var(--ui-danger-solid);
438
437
  --_badge-text: var(--ui-danger-subtle-text, var(--ui-danger-solid));
439
438
  }
440
- [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-ui-badge-state~="tone=success"][data-v-3485e390] {
439
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-ui-badge-state~="tone=success"][data-v-bea7b3f9] {
441
440
  --_badge-border: var(--ui-success-solid);
442
441
  --_badge-text: var(--ui-success-subtle-text, var(--ui-success-solid));
443
442
  }
444
- [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-ui-badge-state~="tone=warning"][data-v-3485e390] {
443
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-ui-badge-state~="tone=warning"][data-v-bea7b3f9] {
445
444
  --_badge-border: var(--ui-warning-solid);
446
445
  --_badge-text: var(--ui-warning-subtle-text, var(--ui-warning-solid));
447
446
  }
448
- [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-ui-badge-state~="tone=info"][data-v-3485e390] {
447
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-ui-badge-state~="tone=info"][data-v-bea7b3f9] {
449
448
  --_badge-border: var(--ui-info-solid);
450
449
  --_badge-text: var(--ui-info-subtle-text, var(--ui-info-solid));
451
450
  }
@@ -453,7 +452,7 @@ svg[data-v-50d3f581] {
453
452
  /* A tag is flat at the start and points at the end. The point is cut from the box, so it has no
454
453
  outline to follow: the edge is the fill. The end padding grows by the point's depth so the
455
454
  label never runs into it. */
456
- [data-component~="ui-badge"][data-ui-badge-state~="shape=tag"][data-v-3485e390] {
455
+ [data-component~="ui-badge"][data-ui-badge-state~="shape=tag"][data-v-bea7b3f9] {
457
456
  --_badge-point: var(--ui-badge-point, var(--ui-space-2));
458
457
 
459
458
  border-color: transparent;
@@ -467,7 +466,7 @@ svg[data-v-50d3f581] {
467
466
  0 100%
468
467
  );
469
468
  }
470
- [data-component~="ui-badge"][data-ui-badge-state~="shape=tag"][data-v-3485e390]:dir(rtl) {
469
+ [data-component~="ui-badge"][data-ui-badge-state~="shape=tag"][data-v-bea7b3f9]:dir(rtl) {
471
470
  padding-inline-end: var(--ui-badge-padding-inline, var(--ui-space-2));
472
471
  padding-inline-start: calc(
473
472
  var(--ui-badge-padding-inline, var(--ui-space-2)) + var(--_badge-point)
@@ -477,12 +476,12 @@ svg[data-v-50d3f581] {
477
476
 
478
477
  /* The tag clips its point, including the native border. Draw the outer shape in the border
479
478
  colour and an inset inner shape in the surface colour to keep a visible diagonal edge. */
480
- [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-ui-badge-state~="shape=tag"][data-v-3485e390] {
479
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-ui-badge-state~="shape=tag"][data-v-bea7b3f9] {
481
480
  position: relative;
482
481
  isolation: isolate;
483
482
  background: var(--ui-badge-border, var(--_badge-color-border, var(--_badge-border)));
484
483
  }
485
- [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-ui-badge-state~="shape=tag"][data-v-3485e390]::before {
484
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-ui-badge-state~="shape=tag"][data-v-bea7b3f9]::before {
486
485
  content: "";
487
486
  position: absolute;
488
487
  inset: 1px;
@@ -497,22 +496,22 @@ svg[data-v-50d3f581] {
497
496
  );
498
497
  pointer-events: none;
499
498
  }
500
- [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-ui-badge-state~="shape=tag"][data-v-3485e390]:dir(rtl)::before {
499
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-ui-badge-state~="shape=tag"][data-v-bea7b3f9]:dir(rtl)::before {
501
500
  clip-path: polygon(var(--_badge-point) 0, 100% 0, 100% 100%, var(--_badge-point) 100%, 0 50%);
502
501
  }
503
502
  @media (forced-colors: active) {
504
- [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-ui-badge-state~="shape=tag"][data-v-3485e390] {
503
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-ui-badge-state~="shape=tag"][data-v-bea7b3f9] {
505
504
  forced-color-adjust: none;
506
505
  background: CanvasText;
507
506
  color: CanvasText;
508
507
  }
509
- [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-ui-badge-state~="shape=tag"][data-v-3485e390]::before {
508
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-ui-badge-state~="shape=tag"][data-v-bea7b3f9]::before {
510
509
  background: Canvas;
511
510
  }
512
511
  }
513
512
 
514
513
  /* A component that sets its display still honours the hidden attribute on its root. */
515
- [data-component~="ui-badge"][hidden][data-v-3485e390] {
514
+ [data-component~="ui-badge"][hidden][data-v-bea7b3f9] {
516
515
  display: none;
517
516
  }
518
517
 
@@ -2214,7 +2213,7 @@ dd[data-v-6e5b491d] {
2214
2213
  syntax: "*";
2215
2214
  inherits: false;
2216
2215
  }
2217
- [data-component~="ui-dialog"][data-v-8d67e1e0] {
2216
+ [data-component~="ui-dialog"][data-v-ef5a672e] {
2218
2217
  /* Hooks do not inherit, so the parts below read them from the root. */
2219
2218
  --_ui-dialog-duration: var(--ui-dialog-duration);
2220
2219
 
@@ -2249,21 +2248,21 @@ dd[data-v-6e5b491d] {
2249
2248
  display var(--ui-dialog-duration, var(--ui-motion-base)) var(--ui-motion-ease) allow-discrete,
2250
2249
  overlay var(--ui-dialog-duration, var(--ui-motion-base)) var(--ui-motion-ease) allow-discrete;
2251
2250
  }
2252
- [data-component~="ui-dialog"][open][data-v-8d67e1e0] {
2251
+ [data-component~="ui-dialog"][open][data-v-ef5a672e] {
2253
2252
  display: flex;
2254
2253
  visibility: visible;
2255
2254
  pointer-events: auto;
2256
2255
  opacity: 1;
2257
2256
  transform: scale(1);
2258
- animation: ui-dialog-enter-8d67e1e0 var(--ui-dialog-duration, var(--ui-motion-base)) var(--ui-motion-ease);
2257
+ animation: ui-dialog-enter-ef5a672e var(--ui-dialog-duration, var(--ui-motion-base)) var(--ui-motion-ease);
2259
2258
  }
2260
- [data-component~="ui-dialog"][data-ui-dialog-state~="size=sm"][data-v-8d67e1e0] {
2259
+ [data-component~="ui-dialog"][data-ui-dialog-state~="size=sm"][data-v-ef5a672e] {
2261
2260
  --_ui-dialog-size: 360px;
2262
2261
  }
2263
- [data-component~="ui-dialog"][data-ui-dialog-state~="size=lg"][data-v-8d67e1e0] {
2262
+ [data-component~="ui-dialog"][data-ui-dialog-state~="size=lg"][data-v-ef5a672e] {
2264
2263
  --_ui-dialog-size: 640px;
2265
2264
  }
2266
- [data-component~="ui-dialog"][data-ui-dialog-state~="size=fullscreen"][data-v-8d67e1e0] {
2265
+ [data-component~="ui-dialog"][data-ui-dialog-state~="size=fullscreen"][data-v-ef5a672e] {
2267
2266
  inset: 0;
2268
2267
  inline-size: 100%;
2269
2268
  block-size: 100dvh;
@@ -2271,12 +2270,12 @@ dd[data-v-6e5b491d] {
2271
2270
  margin: 0;
2272
2271
  border-radius: var(--ui-dialog-radius, 0);
2273
2272
  }
2274
- [data-component~="ui-dialog"][data-ui-dialog-state~="alert"] .close[data-v-8d67e1e0] {
2273
+ [data-component~="ui-dialog"][data-ui-dialog-state~="alert"] .close[data-v-ef5a672e] {
2275
2274
  display: none;
2276
2275
  }
2277
2276
 
2278
2277
  /* Header and actions stay pinned; only the body scrolls when content is long. */
2279
- header[data-v-8d67e1e0] {
2278
+ header[data-v-ef5a672e] {
2280
2279
  display: flex;
2281
2280
  align-items: center;
2282
2281
  gap: var(--ui-space-3);
@@ -2286,7 +2285,7 @@ header[data-v-8d67e1e0] {
2286
2285
  }
2287
2286
 
2288
2287
  /* :host-qualified so page heading rules that reach in cannot outrank the dialog chrome. */
2289
- [data-component~="ui-dialog"] .title[data-v-8d67e1e0] {
2288
+ [data-component~="ui-dialog"] .title[data-v-ef5a672e] {
2290
2289
  flex: 1;
2291
2290
  min-inline-size: 0;
2292
2291
  margin: 0;
@@ -2298,7 +2297,7 @@ header[data-v-8d67e1e0] {
2298
2297
  font-weight: var(--ui-font-semibold);
2299
2298
  line-height: var(--ui-line-height-tight);
2300
2299
  }
2301
- .close[data-v-8d67e1e0] {
2300
+ .close[data-v-ef5a672e] {
2302
2301
  display: inline-grid;
2303
2302
  place-items: center;
2304
2303
  flex: none;
@@ -2317,8 +2316,8 @@ header[data-v-8d67e1e0] {
2317
2316
  }
2318
2317
 
2319
2318
  /* A CSS-drawn X. */
2320
- .close[data-v-8d67e1e0]::before,
2321
- .close[data-v-8d67e1e0]::after {
2319
+ .close[data-v-ef5a672e]::before,
2320
+ .close[data-v-ef5a672e]::after {
2322
2321
  content: "";
2323
2322
  grid-area: 1 / 1;
2324
2323
  inline-size: 0.875rem;
@@ -2327,30 +2326,30 @@ header[data-v-8d67e1e0] {
2327
2326
  background: currentColor;
2328
2327
  transform: rotate(45deg);
2329
2328
  }
2330
- .close[data-v-8d67e1e0]::after {
2329
+ .close[data-v-ef5a672e]::after {
2331
2330
  transform: rotate(-45deg);
2332
2331
  }
2333
- .close[data-v-8d67e1e0]:hover {
2332
+ .close[data-v-ef5a672e]:hover {
2334
2333
  background: var(--ui-surface-muted);
2335
2334
  color: var(--ui-text-primary);
2336
2335
  }
2337
- .close[data-v-8d67e1e0]:focus-visible {
2336
+ .close[data-v-ef5a672e]:focus-visible {
2338
2337
  outline: 2px solid var(--ui-focus-ring);
2339
2338
  outline-offset: 2px;
2340
2339
  }
2341
2340
 
2342
2341
  /* A touch target, like Button on coarse pointers. */
2343
2342
  @media (pointer: coarse) {
2344
- .close[data-v-8d67e1e0] {
2343
+ .close[data-v-ef5a672e] {
2345
2344
  inline-size: var(--ui-control-min-block-size);
2346
2345
  block-size: var(--ui-control-min-block-size);
2347
2346
  }
2348
2347
  }
2349
- html[data-ui-input-modality="touch"] [data-component~="ui-dialog"] .close[data-v-8d67e1e0] {
2348
+ html[data-ui-input-modality="touch"] [data-component~="ui-dialog"] .close[data-v-ef5a672e] {
2350
2349
  inline-size: var(--ui-control-min-block-size);
2351
2350
  block-size: var(--ui-control-min-block-size);
2352
2351
  }
2353
- .body[data-v-8d67e1e0] {
2352
+ .body[data-v-ef5a672e] {
2354
2353
  flex: 1 1 auto;
2355
2354
  min-block-size: 0;
2356
2355
  overflow: auto;
@@ -2378,7 +2377,7 @@ html[data-ui-input-modality="touch"] [data-component~="ui-dialog"] .close[data-v
2378
2377
  -1px calc(100% - var(--_ui-scroll-fade-size)),
2379
2378
  calc(100% - var(--_ui-scroll-fade-size)) 100%;
2380
2379
  }
2381
- footer[data-v-8d67e1e0] {
2380
+ footer[data-v-ef5a672e] {
2382
2381
  display: flex;
2383
2382
  flex: none;
2384
2383
  flex-wrap: wrap;
@@ -2387,28 +2386,28 @@ footer[data-v-8d67e1e0] {
2387
2386
  padding: var(--ui-space-3) var(--ui-space-5);
2388
2387
  border-block-start: 1px solid var(--ui-border-default);
2389
2388
  }
2390
- footer[data-v-8d67e1e0]:empty {
2389
+ footer[data-v-ef5a672e]:empty {
2391
2390
  display: none;
2392
2391
  }
2393
- @keyframes ui-dialog-enter-8d67e1e0 {
2392
+ @keyframes ui-dialog-enter-ef5a672e {
2394
2393
  from {
2395
2394
  opacity: 0;
2396
2395
  transform: scale(0.96);
2397
2396
  }
2398
2397
  }
2399
- [data-component~="ui-dialog"][data-v-8d67e1e0]::backdrop {
2398
+ [data-component~="ui-dialog"][data-v-ef5a672e]::backdrop {
2400
2399
  background-color: transparent;
2401
2400
  transition:
2402
2401
  background-color var(--_ui-dialog-duration, var(--ui-motion-base)) var(--ui-motion-ease),
2403
2402
  display var(--_ui-dialog-duration, var(--ui-motion-base)) var(--ui-motion-ease) allow-discrete,
2404
2403
  overlay var(--_ui-dialog-duration, var(--ui-motion-base)) var(--ui-motion-ease) allow-discrete;
2405
2404
  }
2406
- [data-component~="ui-dialog"][open][data-v-8d67e1e0]::backdrop {
2405
+ [data-component~="ui-dialog"][open][data-v-ef5a672e]::backdrop {
2407
2406
  background-color: var(--ui-overlay-backdrop);
2408
- animation: ui-dialog-backdrop-enter-8d67e1e0 var(--_ui-dialog-duration, var(--ui-motion-base))
2407
+ animation: ui-dialog-backdrop-enter-ef5a672e var(--_ui-dialog-duration, var(--ui-motion-base))
2409
2408
  var(--ui-motion-ease);
2410
2409
  }
2411
- @keyframes ui-dialog-backdrop-enter-8d67e1e0 {
2410
+ @keyframes ui-dialog-backdrop-enter-ef5a672e {
2412
2411
  from {
2413
2412
  background-color: transparent;
2414
2413
  }
@@ -8577,6 +8576,7 @@ html[data-ui-input-modality="touch"]
8577
8576
 
8578
8577
  .looma-editor__table-picker-popover,
8579
8578
  .looma-editor__link-popover,
8579
+ .looma-editor__chip-popover,
8580
8580
  .looma-editor__table-toolbar-shell,
8581
8581
  .looma-editor__table-menu-shell {
8582
8582
  z-index: var(--ui-editor-popover-z-index, 300);
@@ -8593,6 +8593,55 @@ html[data-ui-input-modality="touch"]
8593
8593
  inline-size: min(22rem, calc(100vw - 2rem));
8594
8594
  }
8595
8595
 
8596
+ .looma-editor__chip-popover {
8597
+ inline-size: min(15rem, calc(100vw - 2rem));
8598
+ }
8599
+
8600
+ .looma-editor__chip-form {
8601
+ display: flex;
8602
+ flex-direction: column;
8603
+ gap: var(--ui-space-3);
8604
+ }
8605
+
8606
+ .looma-editor__chip-form input {
8607
+ box-sizing: border-box;
8608
+ width: 100%;
8609
+ min-height: var(--ui-control-min-block-size);
8610
+ padding: var(--ui-space-2);
8611
+ border: 1px solid var(--ui-control-border);
8612
+ border-radius: var(--ui-field-radius, var(--ui-radius-md));
8613
+ background: var(--ui-control-surface);
8614
+ color: var(--ui-text-primary);
8615
+ font: inherit;
8616
+ }
8617
+
8618
+ .looma-editor__chip-colors {
8619
+ display: flex;
8620
+ justify-content: space-between;
8621
+ gap: var(--ui-space-1);
8622
+ }
8623
+
8624
+ .looma-editor__chip-color {
8625
+ display: grid;
8626
+ place-items: center;
8627
+ width: 1.65rem;
8628
+ height: 1.65rem;
8629
+ padding: 0;
8630
+ border: 1px solid var(--_chip-border);
8631
+ border-radius: 50%;
8632
+ background: var(--_chip-surface);
8633
+ color: var(--_chip-text);
8634
+ font: inherit;
8635
+ font-size: var(--ui-font-size-xs);
8636
+ cursor: pointer;
8637
+ }
8638
+
8639
+ .looma-editor__chip-form :is(input, button):focus-visible,
8640
+ .looma-editor .ProseMirror [data-looma-chip]:focus-visible {
8641
+ outline: 2px solid var(--ui-focus-ring);
8642
+ outline-offset: 2px;
8643
+ }
8644
+
8596
8645
  .looma-editor__link-form,
8597
8646
  .looma-editor__link-form label {
8598
8647
  display: flex;
@@ -8741,6 +8790,59 @@ html[data-ui-input-modality="touch"]
8741
8790
  white-space: nowrap;
8742
8791
  }
8743
8792
 
8793
+ .looma-editor .ProseMirror [data-looma-chip],
8794
+ .looma-editor__chip-color {
8795
+ --_chip-tone-surface: var(--ui-surface-subtle);
8796
+ --_chip-tone-text: var(--ui-text-secondary);
8797
+ --_chip-surface: var(--ui-editor-chip-surface, var(--_chip-tone-surface));
8798
+ --_chip-text: var(--ui-editor-chip-text, var(--_chip-tone-text));
8799
+ --_chip-border: var(--ui-editor-chip-border, color-mix(in srgb, var(--_chip-surface) 75%, var(--_chip-text) 25%));
8800
+ }
8801
+
8802
+ .looma-editor .ProseMirror [data-looma-chip][data-color="blue"],
8803
+ .looma-editor__chip-color[data-color="blue"] {
8804
+ --_chip-tone-surface: var(--ui-info-soft);
8805
+ --_chip-tone-text: var(--ui-info-subtle-text);
8806
+ }
8807
+
8808
+ .looma-editor .ProseMirror [data-looma-chip][data-color="green"],
8809
+ .looma-editor__chip-color[data-color="green"] {
8810
+ --_chip-tone-surface: var(--ui-success-soft);
8811
+ --_chip-tone-text: var(--ui-success-subtle-text);
8812
+ }
8813
+
8814
+ .looma-editor .ProseMirror [data-looma-chip][data-color="yellow"],
8815
+ .looma-editor__chip-color[data-color="yellow"] {
8816
+ --_chip-tone-surface: var(--ui-warning-soft);
8817
+ --_chip-tone-text: var(--ui-warning-subtle-text);
8818
+ }
8819
+
8820
+ .looma-editor .ProseMirror [data-looma-chip][data-color="red"],
8821
+ .looma-editor__chip-color[data-color="red"] {
8822
+ --_chip-tone-surface: var(--ui-danger-soft);
8823
+ --_chip-tone-text: var(--ui-danger-subtle-text);
8824
+ }
8825
+
8826
+ .looma-editor .ProseMirror [data-looma-chip][data-color="purple"],
8827
+ .looma-editor__chip-color[data-color="purple"] {
8828
+ --_chip-tone-surface: var(--ui-accent-soft);
8829
+ --_chip-tone-text: var(--ui-accent-subtle-text);
8830
+ }
8831
+
8832
+ .looma-editor .ProseMirror [data-looma-chip] {
8833
+ padding: 0.08em 0.45em;
8834
+ border: 1px solid var(--_chip-border);
8835
+ border-radius: var(--ui-radius-round);
8836
+ background: var(--_chip-surface);
8837
+ color: var(--_chip-text);
8838
+ font-size: var(--ui-editor-chip-font-size, var(--ui-font-size-sm));
8839
+ font-weight: var(--ui-font-medium);
8840
+ line-height: var(--ui-line-height-tight);
8841
+ -webkit-box-decoration-break: clone;
8842
+ box-decoration-break: clone;
8843
+ cursor: pointer;
8844
+ }
8845
+
8744
8846
  .ProseMirror .tableWrapper {
8745
8847
  max-width: 100%;
8746
8848
  overflow-x: auto;