@threadlabs/looma 0.26.26 → 0.27.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.
Files changed (76) hide show
  1. package/components/shared/editor.js +4 -5
  2. package/components/shared/overlay.js +231 -55
  3. package/components/ui-affordance-scope/ui-affordance-scope.js +4 -8
  4. package/components/ui-badge/ui-badge.html +17 -3
  5. package/components/ui-card/ui-card.html +3 -0
  6. package/components/ui-dialog/ui-dialog.html +7 -5
  7. package/components/ui-dialog/ui-dialog.js +67 -7
  8. package/components/ui-editor-mention-menu/ui-editor-mention-menu.html +6 -0
  9. package/components/ui-editor-mention-menu/ui-editor-mention-menu.js +5 -9
  10. package/components/ui-editor-slash-menu/ui-editor-slash-menu.html +6 -0
  11. package/components/ui-editor-slash-menu/ui-editor-slash-menu.js +5 -9
  12. package/components/ui-editor-table-context-menu/ui-editor-table-context-menu.html +21 -4
  13. package/components/ui-editor-table-context-menu/ui-editor-table-context-menu.js +50 -22
  14. package/components/ui-editor-table-overlay/ui-editor-table-overlay.js +4 -6
  15. package/components/ui-editor-table-toolbar/ui-editor-table-toolbar.html +3 -11
  16. package/components/ui-editor-table-toolbar/ui-editor-table-toolbar.js +33 -44
  17. package/components/ui-listbox/ui-listbox.html +22 -17
  18. package/components/ui-menu/ui-menu.js +5 -3
  19. package/components/ui-popover/ui-popover.js +3 -2
  20. package/components/ui-scroll-area/ui-scroll-area.html +16 -0
  21. package/components/ui-search-shell/ui-search-shell.html +1 -1
  22. package/components/ui-search-shell/ui-search-shell.js +3 -5
  23. package/components/ui-section/ui-section.html +3 -0
  24. package/components/ui-toast/ui-toast.html +2 -1
  25. package/components/ui-toast/ui-toast.js +18 -2
  26. package/components/ui-toast-region/ui-toast-region.js +11 -3
  27. package/dist/index.js +1 -1
  28. package/editor/chunks/extensions.js +2 -0
  29. package/editor/extensions/slash-command.d.ts +2 -0
  30. package/editor/mention-contract.d.ts +2 -0
  31. package/package.json +1 -1
  32. package/styles/ui-badge.css +16 -0
  33. package/styles/ui-card.css +3 -0
  34. package/styles/ui-dialog.css +4 -2
  35. package/styles/ui-editor-mention-menu.css +7 -1
  36. package/styles/ui-editor-slash-menu.css +7 -1
  37. package/styles/ui-editor-table-context-menu.css +29 -5
  38. package/styles/ui-editor-table-toolbar.css +3 -11
  39. package/styles/ui-listbox.css +6 -0
  40. package/styles/ui-scroll-area.css +13 -0
  41. package/styles/ui-search-shell.css +1 -1
  42. package/styles/ui-section.css +3 -0
  43. package/vanilla/UiBadge.d.ts +1 -1
  44. package/vanilla/UiBadge.js +1 -1
  45. package/vanilla/UiDialog.js +10 -6
  46. package/vanilla/UiListbox.js +10 -9
  47. package/vanilla/UiScrollArea.d.ts +1 -0
  48. package/vanilla/UiScrollArea.js +4 -4
  49. package/vue/UiBadge.d.ts +3 -3
  50. package/vue/UiBadge.vue +24 -6
  51. package/vue/UiCard.vue +3 -0
  52. package/vue/UiDialog.vue +12 -6
  53. package/vue/UiEditorMentionMenu.vue +6 -0
  54. package/vue/UiEditorSlashMenu.vue +6 -0
  55. package/vue/UiEditorTableContextMenu.vue +21 -4
  56. package/vue/UiEditorTableToolbar.vue +3 -11
  57. package/vue/UiListbox.vue +20 -15
  58. package/vue/UiScrollArea.d.ts +9 -0
  59. package/vue/UiScrollArea.vue +39 -1
  60. package/vue/UiSearchShell.vue +1 -1
  61. package/vue/UiSection.vue +3 -0
  62. package/vue/UiToast.vue +1 -1
  63. package/vue/chunks/UiBadge.js +5 -4
  64. package/vue/chunks/UiCard.js +1 -1
  65. package/vue/chunks/UiDialog.js +25 -8
  66. package/vue/chunks/UiEditorMentionMenu.js +1 -1
  67. package/vue/chunks/UiEditorSlashMenu.js +1 -1
  68. package/vue/chunks/UiEditorTableContextMenu.js +1 -1
  69. package/vue/chunks/UiEditorTableToolbar.js +1 -1
  70. package/vue/chunks/UiListbox.js +12 -12
  71. package/vue/chunks/UiScrollArea.js +33 -2
  72. package/vue/chunks/UiSearchShell.js +1 -1
  73. package/vue/chunks/UiSection.js +1 -1
  74. package/vue/chunks/UiToast.js +2 -2
  75. package/vue/components.css +332 -272
  76. package/vue/editor/index.js +225 -40
@@ -394,6 +394,12 @@ useComponentHost(() => import('../components/ui-editor-slash-menu/ui-editor-slas
394
394
  </template>
395
395
 
396
396
  <style scoped>
397
+ [data-component~="ui-editor-slash-menu"][popover] {
398
+ position: fixed;
399
+ inset: auto;
400
+ margin: 0;
401
+ }
402
+
397
403
  [data-component~="ui-editor-slash-menu"] {
398
404
  user-select: none;
399
405
  }
@@ -654,10 +654,16 @@ function uniqueKeys<T>(
654
654
  </template>
655
655
 
656
656
  <style scoped>
657
+ [data-component~="ui-editor-table-context-menu"][popover] {
658
+ position: fixed;
659
+ inset: auto;
660
+ margin: 0;
661
+ }
662
+
657
663
  [data-component~="ui-editor-table-context-menu"] {
658
664
  /* The max-width is a promise about the menu's footprint, so it counts padding and border. */
659
665
  box-sizing: border-box;
660
- min-width: 14rem;
666
+ min-width: min(14rem, calc(100vw - 24px));
661
667
  max-width: min(17rem, calc(100vw - 24px));
662
668
  max-height: min(28rem, calc(100vh - 24px));
663
669
  padding: var(--ui-space-2);
@@ -712,16 +718,22 @@ function uniqueKeys<T>(
712
718
  color: var(--ui-danger);
713
719
  }
714
720
 
721
+ /* Swatches wrap like words: the row asks for the menu's full width, and a narrower menu fits fewer. */
715
722
  .swatches {
716
- display: grid;
717
- grid-template-columns: repeat(3, minmax(0, 1fr));
723
+ display: flex;
724
+ flex-wrap: wrap;
718
725
  gap: 3px;
719
726
  }
720
727
 
721
- .swatch-button {
728
+ /* Three to a row at the menu's full width; 5rem keeps the longest label, "Default", whole. */
729
+ [data-component~="ui-editor-table-context-menu"] .swatch-button {
722
730
  display: inline-flex;
723
731
  align-items: center;
724
732
  gap: var(--ui-space-2);
733
+ flex: 1 0 5rem;
734
+ min-width: 5rem;
735
+ max-width: calc((100% - 6px) / 3);
736
+ padding-inline-end: var(--ui-space-1);
725
737
  }
726
738
 
727
739
  .swatch {
@@ -768,6 +780,11 @@ function uniqueKeys<T>(
768
780
  margin: var(--ui-space-1) 0;
769
781
  }
770
782
 
783
+ /* Separators divide sections, so none sits above the first. */
784
+ .sep:first-child {
785
+ display: none;
786
+ }
787
+
771
788
  [data-component~="ui-editor-table-context-menu"][hidden] {
772
789
  display: none;
773
790
  }
@@ -796,14 +796,6 @@ function uniqueKeys<T>(
796
796
  background: var(--ui-accent-soft, var(--ui-accent-subtle));
797
797
  }
798
798
 
799
- .looma-editor__mobile-toolbar-shell [data-component~="ui-editor-table-toolbar"] .menu {
800
- top: auto;
801
- right: 0;
802
- bottom: calc(100% + var(--ui-space-2));
803
- max-height: min(50dvh, 22rem);
804
- overflow-y: auto;
805
- overscroll-behavior: contain;
806
- }
807
799
  [data-component~="ui-editor-table-toolbar"] {
808
800
  display: inline-flex;
809
801
  align-items: center;
@@ -894,9 +886,9 @@ function uniqueKeys<T>(
894
886
 
895
887
  .menu {
896
888
  box-sizing: border-box;
897
- position: absolute;
898
- top: calc(100% + var(--ui-space-2));
899
- right: 0;
889
+ position: fixed;
890
+ inset: auto;
891
+ margin: 0;
900
892
  min-width: 12rem;
901
893
  max-width: min(17rem, calc(100vw - 24px));
902
894
  padding: var(--ui-space-1);
package/vue/UiListbox.vue CHANGED
@@ -479,21 +479,23 @@ function uniqueKeys<T>(
479
479
  :data-values="reflectedProp('values', 'values', checkedProps.values, undefined, false)"
480
480
  ref="root"
481
481
  >
482
- <UiScrollArea class="choices" ref="choicesElement"><KeyedBoundary><div
483
- v-for="choice in uniqueKeys(choices, (choice, index, loop) => choice.index)"
484
- :key="choice.index"
485
- class="option"
486
- role="option"
487
- data-ui-choice-option=""
488
- :data-multiple="checkedProps.multiple ? '' : undefined"
489
- :id="concat(uid, '-option-', choice.index)"
490
- :data-index="choice.index"
491
- :aria-selected="choice.selected"
492
- :aria-disabled="choice.disabled"
493
- :class="{ active: choice.index === active }"
494
- >
495
- <span>{{ choice.label }}</span>
496
- </div></KeyedBoundary></UiScrollArea>
482
+ <div class="choices">
483
+ <UiScrollArea ref="choicesElement"><KeyedBoundary><div
484
+ v-for="choice in uniqueKeys(choices, (choice, index, loop) => choice.index)"
485
+ :key="choice.index"
486
+ class="option"
487
+ role="option"
488
+ data-ui-choice-option=""
489
+ :data-multiple="checkedProps.multiple ? '' : undefined"
490
+ :id="concat(uid, '-option-', choice.index)"
491
+ :data-index="choice.index"
492
+ :aria-selected="choice.selected"
493
+ :aria-disabled="choice.disabled"
494
+ :class="{ active: choice.index === active }"
495
+ >
496
+ <span>{{ choice.label }}</span>
497
+ </div></KeyedBoundary></UiScrollArea>
498
+ </div>
497
499
  <select
498
500
  class="fallback"
499
501
  aria-label="Choices"
@@ -566,7 +568,10 @@ function uniqueKeys<T>(
566
568
  outline: none;
567
569
  }
568
570
 
571
+ /* Its own box around the nested Scroll Area, which it shrinks into so the choices scroll. */
569
572
  .choices {
573
+ display: flex;
574
+ flex-direction: column;
570
575
  max-block-size: calc(max(2, var(--_rows, 5)) * var(--ui-control-size-md));
571
576
  }
572
577
 
@@ -12,6 +12,10 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
12
12
  type: PropType<"vertical" | "horizontal" | null>;
13
13
  default: string;
14
14
  };
15
+ padding: {
16
+ type: PropType<"none" | "xs" | "sm" | "md" | "lg" | null>;
17
+ default: string;
18
+ };
15
19
  size: {
16
20
  type: PropType<"content" | "sm" | "md" | "lg" | null>;
17
21
  default: string;
@@ -29,6 +33,10 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
29
33
  type: PropType<"vertical" | "horizontal" | null>;
30
34
  default: string;
31
35
  };
36
+ padding: {
37
+ type: PropType<"none" | "xs" | "sm" | "md" | "lg" | null>;
38
+ default: string;
39
+ };
32
40
  size: {
33
41
  type: PropType<"content" | "sm" | "md" | "lg" | null>;
34
42
  default: string;
@@ -40,6 +48,7 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
40
48
  }>> & Readonly<{}>, {
41
49
  fill: boolean | null;
42
50
  size: "sm" | "md" | "lg" | "content" | null;
51
+ padding: "none" | "xs" | "sm" | "md" | "lg" | null;
43
52
  trim: boolean | null;
44
53
  orientation: "vertical" | "horizontal" | null;
45
54
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
@@ -26,6 +26,15 @@ const propValidityContract = {
26
26
  values: ['vertical', 'horizontal'],
27
27
  default: 'vertical',
28
28
  },
29
+ padding: {
30
+ type: { kind: 'terminal', name: 'keyword' },
31
+ required: false,
32
+ target: { attribute: 'padding' },
33
+ description:
34
+ 'The space inside the scrolling region, on Card\'s scale: xs is 0.5rem, sm 0.75rem, md 1.5rem, and lg 2rem. It scrolls with the content, so the scrollbar and\n fades stay at the edges.',
35
+ values: ['none', 'xs', 'sm', 'md', 'lg'],
36
+ default: 'none',
37
+ },
29
38
  size: {
30
39
  type: { kind: 'terminal', name: 'keyword' },
31
40
  required: false,
@@ -51,6 +60,10 @@ const props = defineProps({
51
60
  type: null as unknown as PropType<'vertical' | 'horizontal' | null>,
52
61
  default: 'vertical',
53
62
  },
63
+ padding: {
64
+ type: null as unknown as PropType<'none' | 'xs' | 'sm' | 'md' | 'lg' | null>,
65
+ default: 'none',
66
+ },
54
67
  size: {
55
68
  type: null as unknown as PropType<'content' | 'sm' | 'md' | 'lg' | null>,
56
69
  default: 'content',
@@ -60,6 +73,7 @@ const props = defineProps({
60
73
  const acceptedProps: Record<string, unknown> = {
61
74
  fill: false,
62
75
  orientation: 'vertical',
76
+ padding: 'none',
63
77
  size: 'content',
64
78
  trim: false,
65
79
  }
@@ -78,6 +92,13 @@ const checkedProps = computed(() => ({
78
92
  'orientation',
79
93
  acceptedProps,
80
94
  ) as 'vertical' | 'horizontal',
95
+ padding: checkedProp<'none' | 'xs' | 'sm' | 'md' | 'lg'>(
96
+ props['padding'],
97
+ { kind: 'terminal', name: 'keyword' },
98
+ false,
99
+ 'padding',
100
+ acceptedProps,
101
+ ) as 'none' | 'xs' | 'sm' | 'md' | 'lg',
81
102
  size: checkedProp<'content' | 'sm' | 'md' | 'lg'>(
82
103
  props['size'],
83
104
  { kind: 'terminal', name: 'keyword' },
@@ -160,6 +181,9 @@ const hostState = computed(() =>
160
181
  && `orientation=${encodeURIComponent(checkedProps.value.orientation)}`,
161
182
  checkedProps.value.size && 'size',
162
183
  checkedProps.value.size != null && `size=${encodeURIComponent(checkedProps.value.size)}`,
184
+ checkedProps.value.padding && 'padding',
185
+ checkedProps.value.padding != null
186
+ && `padding=${encodeURIComponent(checkedProps.value.padding)}`,
163
187
  ].filter(Boolean).join(' ')
164
188
  )
165
189
 
@@ -180,7 +204,7 @@ useComponentHost(() => import('../components/ui-scroll-area/ui-scroll-area.js'),
180
204
  ? (incoming[name] ?? incoming[kebab] ?? null)
181
205
  : null
182
206
  },
183
- propNames: ['fill', 'orientation', 'size', 'trim'],
207
+ propNames: ['fill', 'orientation', 'padding', 'size', 'trim'],
184
208
  propValidity: (name: string) =>
185
209
  propValidityState({ contract: propValidityContract, values: { ...props } }, name),
186
210
  refs: { content: contentElement },
@@ -194,6 +218,7 @@ useComponentHost(() => import('../components/ui-scroll-area/ui-scroll-area.js'),
194
218
  v-prop-validity="{ contract: propValidityContract, values: { ...props } }"
195
219
  :data-fill="reflectedProp('fill', 'fill', checkedProps.fill, undefined, false)"
196
220
  :data-orientation="reflectedProp('orientation', 'orientation', checkedProps.orientation, undefined, false)"
221
+ :data-padding="reflectedProp('padding', 'padding', checkedProps.padding, undefined, false)"
197
222
  :data-size="reflectedProp('size', 'size', checkedProps.size, undefined, false)"
198
223
  :data-trim="reflectedProp('trim', 'trim', checkedProps.trim, undefined, false)"
199
224
  :data-ui-scroll-area-state="hostState || undefined"
@@ -268,6 +293,19 @@ useComponentHost(() => import('../components/ui-scroll-area/ui-scroll-area.js'),
268
293
  max-block-size: 30rem;
269
294
  }
270
295
 
296
+ [data-component~="ui-scroll-area"][data-ui-scroll-area-state~="padding=xs"] {
297
+ padding: var(--ui-space-2);
298
+ }
299
+ [data-component~="ui-scroll-area"][data-ui-scroll-area-state~="padding=sm"] {
300
+ padding: var(--ui-space-3);
301
+ }
302
+ [data-component~="ui-scroll-area"][data-ui-scroll-area-state~="padding=md"] {
303
+ padding: var(--ui-space-5);
304
+ }
305
+ [data-component~="ui-scroll-area"][data-ui-scroll-area-state~="padding=lg"] {
306
+ padding: var(--ui-space-6);
307
+ }
308
+
271
309
  /* A component that sets its display still honours the hidden attribute on its root. */
272
310
  [data-component~="ui-scroll-area"][hidden] {
273
311
  display: none;
@@ -302,7 +302,7 @@ dialog {
302
302
  color: var(--ui-text-primary);
303
303
  }
304
304
 
305
- dialog::backdrop {
305
+ dialog:modal::backdrop {
306
306
  background: var(--ui-overlay-backdrop);
307
307
  }
308
308
 
package/vue/UiSection.vue CHANGED
@@ -191,6 +191,9 @@ const hostState = computed(() =>
191
191
  --_ui-selection-context-text: var(--ui-text-primary);
192
192
  border-color: color-mix(in srgb, var(--ui-danger) 45%, var(--ui-border-default));
193
193
  border-inline-start: var(--ui-accent-line-width) solid var(--ui-danger);
194
+ /* An accent edge keeps the corners on its side straight. */
195
+ border-start-start-radius: 0;
196
+ border-end-start-radius: 0;
194
197
  background: var(--ui-danger-soft);
195
198
  }
196
199
 
package/vue/UiToast.vue CHANGED
@@ -16,7 +16,7 @@ const propValidityContract = {
16
16
  required: false,
17
17
  target: { attribute: 'duration' },
18
18
  description:
19
- 'Milliseconds before requesting dismissal; 0 keeps the toast until an action dismisses it. The timer pauses on hover or focus.',
19
+ 'Milliseconds the toast is shown before it dismisses itself; 0 keeps it until an action dismisses it. The timer starts when the toast is shown, starts again\n each time it is shown, and pauses on hover or focus.',
20
20
  default: 0,
21
21
  },
22
22
  tone: {
@@ -63,7 +63,7 @@ var UiBadge_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE
63
63
  },
64
64
  required: false,
65
65
  target: { attribute: "size" },
66
- description: "Scale. xs is compact; sm keeps the usual badge geometry with compact text, fitting short counts such as 99+ inside a 24px circle. md is the usual text\n badge; lg adds room to fixed marks while retaining the usual text size. A square is 24px at xs, 32px at sm and md, and 40px at lg. A circle is 16px at xs,\n 24px at sm and md, and 32px at lg.",
66
+ description: "Scale. xs is compact; sm keeps the usual badge geometry with compact text, fitting short counts such as 99+ inside a 24px circle. md is the usual text\n badge; lg adds room to fixed marks while retaining the usual text size. A square is 24px at xs, 32px at sm and md, and 40px at lg. A circle is 16px at xs,\n 24px at sm and md, and 32px at lg. A small overlay circle is 20px.",
67
67
  values: [
68
68
  "xs",
69
69
  "sm",
@@ -97,12 +97,13 @@ var UiBadge_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE
97
97
  },
98
98
  required: false,
99
99
  target: { attribute: "variant" },
100
- description: "Emphasis. subtle sets toned text over a soft wash; solid fills with the tone and uses contrasting text; outline keeps the surface with a toned edge.\n inverse uses a translucent contrasting surface and toned ink for a count or label on a filled control of that tone. Neutral looks the same in solid and\n subtle. When space is constrained, the label truncates with an ellipsis while its full text remains available.",
100
+ description: "Emphasis. subtle sets toned text over a soft wash; solid fills with the tone and uses contrasting text; outline keeps the surface with a toned edge.\n inverse uses a translucent contrasting surface and toned ink for a count or label on a filled control of that tone. Neutral looks the same in solid and\n subtle. overlay inherits the containing filled control's text colour on a faint translucent fill, without a visible rim or shadow. Its small circle is\n 20px. When space is constrained, the label truncates with an ellipsis while its full text remains available.",
101
101
  values: [
102
102
  "solid",
103
103
  "subtle",
104
104
  "outline",
105
- "inverse"
105
+ "inverse",
106
+ "overlay"
106
107
  ],
107
108
  default: "subtle"
108
109
  }
@@ -180,6 +181,6 @@ var UiBadge_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE
180
181
  }]]);
181
182
  };
182
183
  }
183
- }), [["__scopeId", "data-v-491791b3"]]);
184
+ }), [["__scopeId", "data-v-3a29482a"]]);
184
185
  //#endregion
185
186
  export { UiBadge_default as t };
@@ -274,6 +274,6 @@ var UiCard_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE_
274
274
  }]]);
275
275
  };
276
276
  }
277
- }), [["__scopeId", "data-v-150bfc3d"]]);
277
+ }), [["__scopeId", "data-v-b5f8424c"]]);
278
278
  //#endregion
279
279
  export { UiCard_default as t };
@@ -20,7 +20,6 @@ var _hoisted_2 = {
20
20
  key: 0,
21
21
  class: "title"
22
22
  };
23
- var _hoisted_3 = { class: "body" };
24
23
  var htmlNextAuthoredCheck2Reported = /* @__PURE__ */ new Set();
25
24
  function htmlNextAuthoredCheck2(accepted, location, message) {
26
25
  if (!accepted && !htmlNextAuthoredCheck2Reported.has(location)) {
@@ -229,7 +228,10 @@ var UiDialog_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PUR
229
228
  const hydrationInstance = getCurrentInstance();
230
229
  const emit = __emit;
231
230
  const root = ref(null);
231
+ const headerElement = useTemplateRef("headerElement");
232
232
  const closeElement = useTemplateRef("closeElement");
233
+ const bodyElement = useTemplateRef("bodyElement");
234
+ const footerElement = useTemplateRef("footerElement");
233
235
  const internalOpen = ref(false);
234
236
  const accessibleLabel = ref("Dialog");
235
237
  let guardedPrevious;
@@ -307,7 +309,12 @@ var UiDialog_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PUR
307
309
  contract: propValidityContract,
308
310
  values: { ...props }
309
311
  }, name),
310
- refs: { close: closeElement },
312
+ refs: {
313
+ header: headerElement,
314
+ close: closeElement,
315
+ body: bodyElement,
316
+ footer: footerElement
317
+ },
311
318
  state: {
312
319
  internalOpen,
313
320
  accessibleLabel
@@ -328,24 +335,34 @@ var UiDialog_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PUR
328
335
  ref_key: "root",
329
336
  ref: root
330
337
  }), [
331
- createElementVNode("header", null, [checkedProps.value.label ? (openBlock(), createElementBlock("h2", _hoisted_2, toDisplayString(checkedProps.value.label), 1)) : createCommentVNode("v-if", true), createElementVNode("button", {
338
+ createElementVNode("header", {
339
+ ref_key: "headerElement",
340
+ ref: headerElement
341
+ }, [checkedProps.value.label ? (openBlock(), createElementBlock("h2", _hoisted_2, toDisplayString(checkedProps.value.label), 1)) : createCommentVNode("v-if", true), createElementVNode("button", {
332
342
  class: "close",
333
343
  type: "button",
334
344
  "aria-label": "Close",
335
345
  ref_key: "closeElement",
336
346
  ref: closeElement
337
- }, null, 512)]),
338
- createElementVNode("div", _hoisted_3, [createVNode(UiScrollArea_default, { trim: true }, {
347
+ }, null, 512)], 512),
348
+ createElementVNode("div", {
349
+ class: "body",
350
+ ref_key: "bodyElement",
351
+ ref: bodyElement
352
+ }, [createVNode(UiScrollArea_default, { trim: true }, {
339
353
  default: withCtx(() => [renderSlot(_ctx.$slots, "default", {}, void 0, true)]),
340
354
  _: 3
341
- })]),
342
- createElementVNode("footer", null, [renderSlot(_ctx.$slots, "actions", {}, void 0, true)])
355
+ })], 512),
356
+ createElementVNode("footer", {
357
+ ref_key: "footerElement",
358
+ ref: footerElement
359
+ }, [renderSlot(_ctx.$slots, "actions", {}, void 0, true)], 512)
343
360
  ], 16, _hoisted_1)), [[unref(vPropValidity), {
344
361
  contract: propValidityContract,
345
362
  values: { ...props }
346
363
  }]]);
347
364
  };
348
365
  }
349
- }), [["__scopeId", "data-v-6d90ae32"]]);
366
+ }), [["__scopeId", "data-v-1ec9644b"]]);
350
367
  //#endregion
351
368
  export { UiDialog_default as t };
@@ -613,6 +613,6 @@ var UiEditorMentionMenu_default = /*#__PURE__*/ _plugin_vue_export_helper_defaul
613
613
  }]]);
614
614
  };
615
615
  }
616
- }), [["__scopeId", "data-v-ba581126"]]);
616
+ }), [["__scopeId", "data-v-f27cd779"]]);
617
617
  //#endregion
618
618
  export { UiEditorMentionMenu_default as t };
@@ -538,6 +538,6 @@ var UiEditorSlashMenu_default = /*#__PURE__*/ _plugin_vue_export_helper_default(
538
538
  }]]);
539
539
  };
540
540
  }
541
- }), [["__scopeId", "data-v-cedd7cd4"]]);
541
+ }), [["__scopeId", "data-v-a85c3b18"]]);
542
542
  //#endregion
543
543
  export { UiEditorSlashMenu_default as t };
@@ -547,6 +547,6 @@ var UiEditorTableContextMenu_default = /*#__PURE__*/ _plugin_vue_export_helper_d
547
547
  }]]);
548
548
  };
549
549
  }
550
- }), [["__scopeId", "data-v-d311fe5d"]]);
550
+ }), [["__scopeId", "data-v-f2ebbbc8"]]);
551
551
  //#endregion
552
552
  export { UiEditorTableContextMenu_default as t };
@@ -737,6 +737,6 @@ var UiEditorTableToolbar_default = /*#__PURE__*/ _plugin_vue_export_helper_defau
737
737
  }]]);
738
738
  };
739
739
  }
740
- }), [["__scopeId", "data-v-b9979342"]]);
740
+ }), [["__scopeId", "data-v-8c2d4497"]]);
741
741
  //#endregion
742
742
  export { UiEditorTableToolbar_default as t };
@@ -19,22 +19,23 @@ var _hoisted_1 = [
19
19
  "data-value",
20
20
  "data-values"
21
21
  ];
22
- var _hoisted_2 = [
22
+ var _hoisted_2 = { class: "choices" };
23
+ var _hoisted_3 = [
23
24
  "data-multiple",
24
25
  "id",
25
26
  "data-index",
26
27
  "aria-selected",
27
28
  "aria-disabled"
28
29
  ];
29
- var _hoisted_3 = [
30
+ var _hoisted_4 = [
30
31
  "size",
31
32
  "multiple",
32
33
  "disabled",
33
34
  "required",
34
35
  "name"
35
36
  ];
36
- var _hoisted_4 = ["name", "^value"];
37
- var _hoisted_5 = [
37
+ var _hoisted_5 = ["name", "^value"];
38
+ var _hoisted_6 = [
38
39
  "required",
39
40
  "^checked",
40
41
  "disabled"
@@ -498,8 +499,7 @@ var UiListbox_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PU
498
499
  ref_key: "root",
499
500
  ref: root
500
501
  }), [
501
- createVNode(UiScrollArea_default, {
502
- class: "choices",
502
+ createElementVNode("div", _hoisted_2, [createVNode(UiScrollArea_default, {
503
503
  ref_key: "choicesElement",
504
504
  ref: choicesElement
505
505
  }, {
@@ -515,12 +515,12 @@ var UiListbox_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PU
515
515
  "data-index": choice.index,
516
516
  "aria-selected": choice.selected,
517
517
  "aria-disabled": choice.disabled
518
- }, [createElementVNode("span", null, toDisplayString(choice.label), 1)], 10, _hoisted_2);
518
+ }, [createElementVNode("span", null, toDisplayString(choice.label), 1)], 10, _hoisted_3);
519
519
  }), 128))]),
520
520
  _: 1
521
521
  })]),
522
522
  _: 1
523
- }, 512),
523
+ }, 512)]),
524
524
  createElementVNode("select", {
525
525
  class: "fallback",
526
526
  "aria-label": "Choices",
@@ -531,14 +531,14 @@ var UiListbox_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PU
531
531
  name: checkedProps.value.name ?? void 0,
532
532
  ref_key: "optionsElement",
533
533
  ref: optionsElement
534
- }, [renderSlot(_ctx.$slots, "default", {}, void 0, true)], 8, _hoisted_3),
534
+ }, [renderSlot(_ctx.$slots, "default", {}, void 0, true)], 8, _hoisted_4),
535
535
  checkedProps.value.name && !checkedProps.value.disabled ? (openBlock(true), createElementBlock(Fragment, { key: 0 }, renderList(selection.value, (selected, indexLoop) => {
536
536
  return openBlock(), createElementBlock("input", {
537
537
  key: indexLoop,
538
538
  type: "hidden",
539
539
  name: checkedProps.value.name ?? void 0,
540
540
  "^value": selected
541
- }, null, 8, _hoisted_4);
541
+ }, null, 8, _hoisted_5);
542
542
  }), 128)) : createCommentVNode("v-if", true),
543
543
  createElementVNode("input", {
544
544
  class: "validity",
@@ -550,13 +550,13 @@ var UiListbox_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PU
550
550
  disabled: checkedProps.value.disabled ?? void 0,
551
551
  ref_key: "validityElement",
552
552
  ref: validityElement
553
- }, null, 8, _hoisted_5)
553
+ }, null, 8, _hoisted_6)
554
554
  ], 16, _hoisted_1)), [[unref(vPropValidity), {
555
555
  contract: propValidityContract,
556
556
  values: { ...props }
557
557
  }]]);
558
558
  };
559
559
  }
560
- }), [["__scopeId", "data-v-1ba46396"]]);
560
+ }), [["__scopeId", "data-v-e7a8688c"]]);
561
561
  //#endregion
562
562
  export { UiListbox_default as t };
@@ -6,6 +6,7 @@ import { computed, createElementBlock, createElementVNode, defineComponent, getC
6
6
  var _hoisted_1 = [
7
7
  "data-fill",
8
8
  "data-orientation",
9
+ "data-padding",
9
10
  "data-size",
10
11
  "data-trim",
11
12
  "data-ui-scroll-area-state"
@@ -24,6 +25,10 @@ var UiScrollArea_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
24
25
  type: null,
25
26
  default: "vertical"
26
27
  },
28
+ padding: {
29
+ type: null,
30
+ default: "none"
31
+ },
27
32
  size: {
28
33
  type: null,
29
34
  default: "content"
@@ -56,6 +61,23 @@ var UiScrollArea_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
56
61
  values: ["vertical", "horizontal"],
57
62
  default: "vertical"
58
63
  },
64
+ padding: {
65
+ type: {
66
+ kind: "terminal",
67
+ name: "keyword"
68
+ },
69
+ required: false,
70
+ target: { attribute: "padding" },
71
+ description: "The space inside the scrolling region, on Card's scale: xs is 0.5rem, sm 0.75rem, md 1.5rem, and lg 2rem. It scrolls with the content, so the scrollbar and\n fades stay at the edges.",
72
+ values: [
73
+ "none",
74
+ "xs",
75
+ "sm",
76
+ "md",
77
+ "lg"
78
+ ],
79
+ default: "none"
80
+ },
59
81
  size: {
60
82
  type: {
61
83
  kind: "terminal",
@@ -87,6 +109,7 @@ var UiScrollArea_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
87
109
  const acceptedProps = {
88
110
  fill: false,
89
111
  orientation: "vertical",
112
+ padding: "none",
90
113
  size: "content",
91
114
  trim: false
92
115
  };
@@ -99,6 +122,10 @@ var UiScrollArea_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
99
122
  kind: "terminal",
100
123
  name: "keyword"
101
124
  }, false, "orientation", acceptedProps),
125
+ padding: checkedProp(props["padding"], {
126
+ kind: "terminal",
127
+ name: "keyword"
128
+ }, false, "padding", acceptedProps),
102
129
  size: checkedProp(props["size"], {
103
130
  kind: "terminal",
104
131
  name: "keyword"
@@ -142,7 +169,9 @@ var UiScrollArea_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
142
169
  checkedProps.value.orientation && "orientation",
143
170
  checkedProps.value.orientation != null && `orientation=${encodeURIComponent(checkedProps.value.orientation)}`,
144
171
  checkedProps.value.size && "size",
145
- checkedProps.value.size != null && `size=${encodeURIComponent(checkedProps.value.size)}`
172
+ checkedProps.value.size != null && `size=${encodeURIComponent(checkedProps.value.size)}`,
173
+ checkedProps.value.padding && "padding",
174
+ checkedProps.value.padding != null && `padding=${encodeURIComponent(checkedProps.value.padding)}`
146
175
  ].filter(Boolean).join(" "));
147
176
  const dispatch = createDispatch(root);
148
177
  useComponentHost(() => import("@threadlabs/looma/components/ui-scroll-area/ui-scroll-area.js"), {
@@ -161,6 +190,7 @@ var UiScrollArea_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
161
190
  propNames: [
162
191
  "fill",
163
192
  "orientation",
193
+ "padding",
164
194
  "size",
165
195
  "trim"
166
196
  ],
@@ -174,6 +204,7 @@ var UiScrollArea_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
174
204
  return withDirectives((openBlock(), createElementBlock("div", mergeProps({ "data-component": "ui-scroll-area" }, nativeAttrs(_ctx.$attrs), {
175
205
  "data-fill": reflectedProp("fill", "fill", checkedProps.value.fill, void 0, false),
176
206
  "data-orientation": reflectedProp("orientation", "orientation", checkedProps.value.orientation, void 0, false),
207
+ "data-padding": reflectedProp("padding", "padding", checkedProps.value.padding, void 0, false),
177
208
  "data-size": reflectedProp("size", "size", checkedProps.value.size, void 0, false),
178
209
  "data-trim": reflectedProp("trim", "trim", checkedProps.value.trim, void 0, false),
179
210
  "data-ui-scroll-area-state": hostState.value || void 0,
@@ -189,6 +220,6 @@ var UiScrollArea_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
189
220
  }]]);
190
221
  };
191
222
  }
192
- }), [["__scopeId", "data-v-a1ccf697"]]);
223
+ }), [["__scopeId", "data-v-9a5bb175"]]);
193
224
  //#endregion
194
225
  export { UiScrollArea_default as t };
@@ -199,6 +199,6 @@ var UiSearchShell_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @
199
199
  }]]);
200
200
  };
201
201
  }
202
- }), [["__scopeId", "data-v-0778ed20"]]);
202
+ }), [["__scopeId", "data-v-62b2f3da"]]);
203
203
  //#endregion
204
204
  export { UiSearchShell_default as t };
@@ -138,6 +138,6 @@ var UiSection_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PU
138
138
  }]]);
139
139
  };
140
140
  }
141
- }), [["__scopeId", "data-v-93e8cb94"]]);
141
+ }), [["__scopeId", "data-v-97cdaba4"]]);
142
142
  //#endregion
143
143
  export { UiSection_default as t };