@threadlabs/looma 0.37.4 → 0.37.6

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 (132) hide show
  1. package/components/shared/active-item-reveal.js +74 -0
  2. package/components/shared/menu-navigation.js +3 -1
  3. package/components/ui-button/ui-button.html +13 -0
  4. package/components/ui-combobox/ui-combobox.js +3 -1
  5. package/components/ui-context-menu/ui-context-menu.js +4 -1
  6. package/components/ui-editor-link-form/ui-editor-link-form.js +3 -1
  7. package/components/ui-editor-mention-menu/ui-editor-mention-menu.js +12 -5
  8. package/components/ui-editor-slash-menu/ui-editor-slash-menu.js +12 -5
  9. package/components/ui-listbox/ui-listbox.js +3 -1
  10. package/components/ui-menu/ui-menu.js +5 -1
  11. package/components/ui-pagination/ui-pagination.html +74 -0
  12. package/components/ui-pagination/ui-pagination.js +19 -0
  13. package/components/ui-search-shell/ui-search-shell.js +7 -4
  14. package/components/ui-skeleton/ui-skeleton.html +91 -0
  15. package/dist/index.js +20 -19
  16. package/docs/catalog.json +491 -1
  17. package/docs/examples/ui-pagination/examples/01-numbered.behavior.js +11 -0
  18. package/package.json +1 -1
  19. package/styles/ui-button.css +12 -0
  20. package/styles/ui-pagination.css +1 -0
  21. package/styles/ui-skeleton.css +91 -0
  22. package/vanilla/UiButton.d.ts +1 -0
  23. package/vanilla/UiButton.js +31 -31
  24. package/vanilla/UiPagination.d.ts +35 -0
  25. package/vanilla/UiPagination.js +202 -0
  26. package/vanilla/UiSkeleton.d.ts +26 -0
  27. package/vanilla/UiSkeleton.js +42 -0
  28. package/vanilla/index.js +2 -0
  29. package/vue/UiButton.d.ts +6 -0
  30. package/vue/UiButton.vue +34 -0
  31. package/vue/UiPagination.d.ts +115 -0
  32. package/vue/UiPagination.js +2 -0
  33. package/vue/UiPagination.vue +598 -0
  34. package/vue/UiSkeleton.d.ts +37 -0
  35. package/vue/UiSkeleton.js +2 -0
  36. package/vue/UiSkeleton.vue +235 -0
  37. package/vue/chunks/UiActionBar.js +1 -1
  38. package/vue/chunks/UiAffordanceScope.js +1 -1
  39. package/vue/chunks/UiAvatar.js +1 -1
  40. package/vue/chunks/UiAvatarGroup.js +1 -1
  41. package/vue/chunks/UiBadge.js +1 -1
  42. package/vue/chunks/UiBreadcrumbItem.js +1 -1
  43. package/vue/chunks/UiBreadcrumbs.js +1 -1
  44. package/vue/chunks/UiButton.js +30 -2
  45. package/vue/chunks/UiCallout.js +1 -1
  46. package/vue/chunks/UiCard.js +1 -1
  47. package/vue/chunks/UiCheckbox.js +1 -1
  48. package/vue/chunks/UiCluster.js +1 -1
  49. package/vue/chunks/UiColorPicker.js +1 -1
  50. package/vue/chunks/UiCombobox.js +1 -1
  51. package/vue/chunks/UiContainer.js +1 -1
  52. package/vue/chunks/UiContextMenu.js +1 -1
  53. package/vue/chunks/UiCover.js +1 -1
  54. package/vue/chunks/UiCurveEditor.js +1 -1
  55. package/vue/chunks/UiCycleButton.js +1 -1
  56. package/vue/chunks/UiDescriptionItem.js +1 -1
  57. package/vue/chunks/UiDescriptionList.js +1 -1
  58. package/vue/chunks/UiDialog.js +1 -1
  59. package/vue/chunks/UiDisclosure.js +1 -1
  60. package/vue/chunks/UiEditable.js +1 -1
  61. package/vue/chunks/UiEditorBlockActions.js +1 -1
  62. package/vue/chunks/UiEditorChipEditor.js +1 -1
  63. package/vue/chunks/UiEditorCodeLanguage.js +1 -1
  64. package/vue/chunks/UiEditorFootnoteEditor.js +1 -1
  65. package/vue/chunks/UiEditorImageToolbar.js +1 -1
  66. package/vue/chunks/UiEditorInsertTableGrid.js +1 -1
  67. package/vue/chunks/UiEditorLinkCard.js +1 -1
  68. package/vue/chunks/UiEditorLinkForm.js +1 -1
  69. package/vue/chunks/UiEditorMentionMenu.js +1 -1
  70. package/vue/chunks/UiEditorMentionMenuItem.js +1 -1
  71. package/vue/chunks/UiEditorSlashMenu.js +1 -1
  72. package/vue/chunks/UiEditorSlashMenuGroup.js +1 -1
  73. package/vue/chunks/UiEditorSlashMenuItem.js +1 -1
  74. package/vue/chunks/UiEditorSurface.js +1 -1
  75. package/vue/chunks/UiEditorTableContextMenu.js +1 -1
  76. package/vue/chunks/UiEditorTableOverlay.js +1 -1
  77. package/vue/chunks/UiEditorTableToolbar.js +1 -1
  78. package/vue/chunks/UiEditorToolbar.js +1 -1
  79. package/vue/chunks/UiFloatingActionButton.js +1 -1
  80. package/vue/chunks/UiFormField.js +1 -1
  81. package/vue/chunks/UiGrid.js +1 -1
  82. package/vue/chunks/UiIcon.js +1 -1
  83. package/vue/chunks/UiIconButton.js +1 -1
  84. package/vue/chunks/UiImage.js +1 -1
  85. package/vue/chunks/UiInput.js +1 -1
  86. package/vue/chunks/UiInputGroup.js +1 -1
  87. package/vue/chunks/UiLightEditor.js +1 -1
  88. package/vue/chunks/UiList.js +1 -1
  89. package/vue/chunks/UiListItem.js +1 -1
  90. package/vue/chunks/UiListbox.js +1 -1
  91. package/vue/chunks/UiMenu.js +1 -1
  92. package/vue/chunks/UiMenuGroup.js +1 -1
  93. package/vue/chunks/UiMenuItem.js +1 -1
  94. package/vue/chunks/UiMeter.js +1 -1
  95. package/vue/chunks/UiNavItem.js +1 -1
  96. package/vue/chunks/UiNumberInput.js +1 -1
  97. package/vue/chunks/UiPageHeader.js +1 -1
  98. package/vue/chunks/UiPagination.js +551 -0
  99. package/vue/chunks/UiPopover.js +1 -1
  100. package/vue/chunks/UiRadio.js +1 -1
  101. package/vue/chunks/UiRadioGroup.js +1 -1
  102. package/vue/chunks/UiReel.js +1 -1
  103. package/vue/chunks/UiScrollArea.js +1 -1
  104. package/vue/chunks/UiSearchResultRow.js +1 -1
  105. package/vue/chunks/UiSearchShell.js +1 -1
  106. package/vue/chunks/UiSection.js +1 -1
  107. package/vue/chunks/UiSelect.js +1 -1
  108. package/vue/chunks/UiSeparator.js +1 -1
  109. package/vue/chunks/UiSidebar.js +1 -1
  110. package/vue/chunks/UiSkeleton.js +151 -0
  111. package/vue/chunks/UiSlider.js +1 -1
  112. package/vue/chunks/UiSpinner.js +1 -1
  113. package/vue/chunks/UiStack.js +1 -1
  114. package/vue/chunks/UiStatusMessage.js +1 -1
  115. package/vue/chunks/UiSwatch.js +1 -1
  116. package/vue/chunks/UiSwitch.js +1 -1
  117. package/vue/chunks/UiSwitcher.js +1 -1
  118. package/vue/chunks/UiTable.js +1 -1
  119. package/vue/chunks/UiTabs.js +1 -1
  120. package/vue/chunks/UiText.js +1 -1
  121. package/vue/chunks/UiTextarea.js +1 -1
  122. package/vue/chunks/UiToast.js +1 -1
  123. package/vue/chunks/UiToastRegion.js +1 -1
  124. package/vue/chunks/UiTooltip.js +1 -1
  125. package/vue/chunks/UiTopBar.js +1 -1
  126. package/vue/chunks/UiTree.js +1 -1
  127. package/vue/chunks/UiTreeItem.js +1 -1
  128. package/vue/chunks/_plugin-vue_export-helper.js +27 -2
  129. package/vue/components.css +93 -0
  130. package/vue/editor/index.js +139 -35
  131. package/vue/index.d.ts +2 -0
  132. package/vue/index.js +3 -1
package/vue/UiButton.d.ts CHANGED
@@ -53,6 +53,9 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
53
53
  size: {
54
54
  type: PropType<"xs" | "sm" | "md" | "lg" | null>;
55
55
  };
56
+ square: {
57
+ type: PropType<boolean | null>;
58
+ };
56
59
  stretch: {
57
60
  type: PropType<boolean | null>;
58
61
  };
@@ -102,6 +105,9 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
102
105
  size: {
103
106
  type: PropType<"xs" | "sm" | "md" | "lg" | null>;
104
107
  };
108
+ square: {
109
+ type: PropType<boolean | null>;
110
+ };
105
111
  stretch: {
106
112
  type: PropType<boolean | null>;
107
113
  };
package/vue/UiButton.vue CHANGED
@@ -117,6 +117,14 @@ const propValidityContract = {
117
117
  values: ['xs', 'sm', 'md', 'lg'],
118
118
  default: 'md',
119
119
  },
120
+ square: {
121
+ type: { kind: 'terminal', name: 'boolean' },
122
+ required: false,
123
+ target: { attribute: 'square' },
124
+ description:
125
+ 'Gives short labels and icons the same square minimum footprint at each size. Longer labels grow naturally. Applies to boxed actions; link and card variants\n keep their normal layout.',
126
+ default: false,
127
+ },
120
128
  stretch: {
121
129
  type: { kind: 'terminal', name: 'boolean' },
122
130
  required: false,
@@ -174,6 +182,7 @@ const props = defineProps({
174
182
  rel: { type: null as unknown as PropType<string | null> },
175
183
  shape: { type: null as unknown as PropType<'rounded' | 'pill' | null> },
176
184
  size: { type: null as unknown as PropType<'xs' | 'sm' | 'md' | 'lg' | null> },
185
+ square: { type: null as unknown as PropType<boolean | null> },
177
186
  stretch: { type: null as unknown as PropType<boolean | null> },
178
187
  target: { type: null as unknown as PropType<string | null> },
179
188
  tone: {
@@ -200,6 +209,7 @@ const acceptedProps: Record<string, unknown> = {
200
209
  rel: null,
201
210
  shape: 'rounded',
202
211
  size: 'md',
212
+ square: false,
203
213
  stretch: false,
204
214
  target: null,
205
215
  tone: 'accent',
@@ -215,6 +225,7 @@ const inputTracking = vuePropInputs(acceptedProps, {
215
225
  preset: 'none',
216
226
  shape: 'rounded',
217
227
  size: 'md',
228
+ square: false,
218
229
  stretch: false,
219
230
  tone: 'accent',
220
231
  type: 'button',
@@ -241,6 +252,8 @@ const inputTracking = vuePropInputs(acceptedProps, {
241
252
  return checkPropInput(value, { kind: 'terminal', name: 'keyword' }, true, true)
242
253
  case 'size':
243
254
  return checkPropInput(value, { kind: 'terminal', name: 'keyword' }, true, true)
255
+ case 'square':
256
+ return checkPropInput(value, { kind: 'terminal', name: 'boolean' }, true, true)
244
257
  case 'stretch':
245
258
  return checkPropInput(value, { kind: 'terminal', name: 'boolean' }, true, true)
246
259
  case 'target':
@@ -301,6 +314,11 @@ const checkedProps = computed(() => {
301
314
  props['size'],
302
315
  props[BINDING_INPUTS_PROP],
303
316
  ) as 'xs' | 'sm' | 'md' | 'lg',
317
+ square: propInputs.value<boolean | null>(
318
+ 'square',
319
+ props['square'],
320
+ props[BINDING_INPUTS_PROP],
321
+ ) as boolean,
304
322
  stretch: propInputs.value<boolean | null>(
305
323
  'stretch',
306
324
  props['stretch'],
@@ -703,6 +721,7 @@ const hostState = computed(() =>
703
721
  checkedProps.value.size != null && `size=${encodeURIComponent(checkedProps.value.size)}`,
704
722
  checkedProps.value.shape && 'shape',
705
723
  checkedProps.value.shape != null && `shape=${encodeURIComponent(checkedProps.value.shape)}`,
724
+ checkedProps.value.square && 'square',
706
725
  checkedProps.value.loading && 'loading',
707
726
  checkedProps.value.pending && 'pending',
708
727
  ].filter(Boolean).join(' ')
@@ -739,6 +758,7 @@ useComponentHost(() => import('../components/ui-button/ui-button.js'), {
739
758
  'rel',
740
759
  'shape',
741
760
  'size',
761
+ 'square',
742
762
  'stretch',
743
763
  'target',
744
764
  'tone',
@@ -778,6 +798,7 @@ useComponentHost(() => import('../components/ui-button/ui-button.js'), {
778
798
  :data-ui-button-prop-rel="reflectedProp('rel', 'rel', checkedProps.rel, undefined, false)"
779
799
  :data-ui-button-prop-shape="reflectedProp('shape', 'shape', checkedProps.shape, undefined, false)"
780
800
  :data-ui-button-prop-size="reflectedProp('size', 'size', checkedProps.size, undefined, false)"
801
+ :data-ui-button-prop-square="reflectedProp('square', 'square', checkedProps.square, undefined, false)"
781
802
  :data-ui-button-prop-stretch="reflectedProp('stretch', 'stretch', checkedProps.stretch, undefined, false)"
782
803
  :data-ui-button-prop-target="reflectedProp('target', 'target', checkedProps.target, undefined, false)"
783
804
  :data-ui-button-prop-tone="reflectedProp('tone', 'tone', checkedProps.tone, undefined, false)"
@@ -822,6 +843,7 @@ useComponentHost(() => import('../components/ui-button/ui-button.js'), {
822
843
  :data-ui-button-prop-rel="reflectedProp('rel', 'rel', checkedProps.rel, undefined, false)"
823
844
  :data-ui-button-prop-shape="reflectedProp('shape', 'shape', checkedProps.shape, undefined, false)"
824
845
  :data-ui-button-prop-size="reflectedProp('size', 'size', checkedProps.size, undefined, false)"
846
+ :data-ui-button-prop-square="reflectedProp('square', 'square', checkedProps.square, undefined, false)"
825
847
  :data-ui-button-prop-stretch="reflectedProp('stretch', 'stretch', checkedProps.stretch, undefined, false)"
826
848
  :data-ui-button-prop-target="reflectedProp('target', 'target', checkedProps.target, undefined, false)"
827
849
  :data-ui-button-prop-tone="reflectedProp('tone', 'tone', checkedProps.tone, undefined, false)"
@@ -870,6 +892,7 @@ useComponentHost(() => import('../components/ui-button/ui-button.js'), {
870
892
  :data-ui-button-prop-rel="reflectedProp('rel', 'rel', checkedProps.rel, undefined, false)"
871
893
  :data-ui-button-prop-shape="reflectedProp('shape', 'shape', checkedProps.shape, undefined, false)"
872
894
  :data-ui-button-prop-size="reflectedProp('size', 'size', checkedProps.size, undefined, false)"
895
+ :data-ui-button-prop-square="reflectedProp('square', 'square', checkedProps.square, undefined, false)"
873
896
  :data-ui-button-prop-stretch="reflectedProp('stretch', 'stretch', checkedProps.stretch, undefined, false)"
874
897
  :data-ui-button-prop-target="reflectedProp('target', 'target', checkedProps.target, undefined, false)"
875
898
  :data-ui-button-prop-tone="reflectedProp('tone', 'tone', checkedProps.tone, undefined, false)"
@@ -908,6 +931,7 @@ useComponentHost(() => import('../components/ui-button/ui-button.js'), {
908
931
  :data-ui-button-prop-rel="reflectedProp('rel', 'rel', checkedProps.rel, undefined, false)"
909
932
  :data-ui-button-prop-shape="reflectedProp('shape', 'shape', checkedProps.shape, undefined, false)"
910
933
  :data-ui-button-prop-size="reflectedProp('size', 'size', checkedProps.size, undefined, false)"
934
+ :data-ui-button-prop-square="reflectedProp('square', 'square', checkedProps.square, undefined, false)"
911
935
  :data-ui-button-prop-stretch="reflectedProp('stretch', 'stretch', checkedProps.stretch, undefined, false)"
912
936
  :data-ui-button-prop-target="reflectedProp('target', 'target', checkedProps.target, undefined, false)"
913
937
  :data-ui-button-prop-tone="reflectedProp('tone', 'tone', checkedProps.tone, undefined, false)"
@@ -1007,6 +1031,8 @@ useComponentHost(() => import('../components/ui-button/ui-button.js'), {
1007
1031
  /* A count is an adornment, not another line of label text. Keep the standard control height
1008
1032
  with enough inset for a 24px mark; large content can still grow the button naturally. */
1009
1033
 
1034
+ /* Short numeric and icon actions share a minimum box; large values remain readable. */
1035
+
1010
1036
  /* Card actions inherit Button's palette and behavior; only their shared layout changes.
1011
1037
  The icon may contain any decorative composition. Empty icons remove their column. */
1012
1038
 
@@ -1103,6 +1129,7 @@ useComponentHost(() => import('../components/ui-button/ui-button.js'), {
1103
1129
  }
1104
1130
 
1105
1131
  :global(:scope:where([data-hn-ui-button])) {
1132
+ --_button-square-size: var(--ui-button-min-block-size, var(--ui-control-size-md));
1106
1133
  appearance: none;
1107
1134
  min-block-size: var(--ui-button-min-block-size, var(--ui-control-size-md));
1108
1135
  border-style: solid;
@@ -1163,6 +1190,7 @@ useComponentHost(() => import('../components/ui-button/ui-button.js'), {
1163
1190
  }
1164
1191
 
1165
1192
  :global(:scope[data-ui-button-state~="size=xs"]:where([data-hn-ui-button])) {
1193
+ --_button-square-size: 1.5rem;
1166
1194
  min-block-size: 1.5rem;
1167
1195
  padding: calc(var(--ui-space-0-5) * 1.5) calc(var(--ui-space-1) * 1.25) !important;
1168
1196
  font-size: var(--ui-font-size-xs);
@@ -1173,6 +1201,7 @@ useComponentHost(() => import('../components/ui-button/ui-button.js'), {
1173
1201
  }
1174
1202
 
1175
1203
  :global(:scope[data-ui-button-state~="size=sm"]:where([data-hn-ui-button])) {
1204
+ --_button-square-size: var(--ui-control-size-sm);
1176
1205
  min-block-size: var(--ui-control-size-sm);
1177
1206
  padding: var(--ui-control-inset-block-sm, var(--ui-space-1))
1178
1207
  var(--ui-action-inset-sm, var(--ui-space-2)) !important;
@@ -1180,11 +1209,16 @@ useComponentHost(() => import('../components/ui-button/ui-button.js'), {
1180
1209
  }
1181
1210
 
1182
1211
  :global(:scope[data-ui-button-state~="size=lg"]:where([data-hn-ui-button])) {
1212
+ --_button-square-size: var(--ui-control-size-lg);
1183
1213
  min-block-size: var(--ui-control-size-lg);
1184
1214
  padding: var(--ui-control-inset-block-lg, var(--ui-space-3))
1185
1215
  var(--ui-action-inset-lg, var(--ui-space-4)) !important;
1186
1216
  font-size: var(--ui-font-size-md);
1187
1217
  }
1218
+ :global(:scope[data-ui-button-state~="square"]:not([data-appearance="link"], [data-appearance="card"]):where([data-hn-ui-button])) {
1219
+ min-inline-size: var(--_button-square-size);
1220
+ padding-inline: var(--ui-space-1) !important;
1221
+ }
1188
1222
  :global(:scope[data-appearance="card"]:where([data-hn-ui-button])) {
1189
1223
  display: grid !important;
1190
1224
  grid-template-columns: auto minmax(0, 1fr) auto;
@@ -0,0 +1,115 @@
1
+ import type { PropType } from 'vue';
2
+ import { type InputBindings } from './props.js';
3
+ declare var __VLS_46: {};
4
+ type __VLS_Slots = {} & {
5
+ default?: (props: typeof __VLS_46) => any;
6
+ };
7
+ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
8
+ disabled: {
9
+ type: PropType<boolean | null>;
10
+ };
11
+ hasNext: {
12
+ type: PropType<boolean | null>;
13
+ };
14
+ hasPrevious: {
15
+ type: PropType<boolean | null>;
16
+ };
17
+ label: {
18
+ type: PropType<string | null>;
19
+ };
20
+ nextHref: {
21
+ type: PropType<string | null>;
22
+ };
23
+ nextLabel: {
24
+ type: PropType<string | null>;
25
+ };
26
+ page: {
27
+ type: PropType<number | null>;
28
+ };
29
+ pageLabel: {
30
+ type: PropType<string | null>;
31
+ };
32
+ pages: {
33
+ type: PropType<readonly ({
34
+ readonly value: number;
35
+ readonly href?: string | null;
36
+ })[] | null>;
37
+ };
38
+ previousHref: {
39
+ type: PropType<string | null>;
40
+ };
41
+ previousLabel: {
42
+ type: PropType<string | null>;
43
+ };
44
+ size: {
45
+ type: PropType<"sm" | "md" | "lg" | null>;
46
+ };
47
+ "\0htmlNextInputStatus": {
48
+ type: PropType<InputBindings>;
49
+ };
50
+ }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
51
+ "update:page": (value: number) => any;
52
+ navigate: (event: CustomEvent<{
53
+ readonly page: number;
54
+ readonly previousPage: number;
55
+ readonly trigger: "keyboard" | "pointer" | "programmatic";
56
+ }>) => any;
57
+ }, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
58
+ disabled: {
59
+ type: PropType<boolean | null>;
60
+ };
61
+ hasNext: {
62
+ type: PropType<boolean | null>;
63
+ };
64
+ hasPrevious: {
65
+ type: PropType<boolean | null>;
66
+ };
67
+ label: {
68
+ type: PropType<string | null>;
69
+ };
70
+ nextHref: {
71
+ type: PropType<string | null>;
72
+ };
73
+ nextLabel: {
74
+ type: PropType<string | null>;
75
+ };
76
+ page: {
77
+ type: PropType<number | null>;
78
+ };
79
+ pageLabel: {
80
+ type: PropType<string | null>;
81
+ };
82
+ pages: {
83
+ type: PropType<readonly ({
84
+ readonly value: number;
85
+ readonly href?: string | null;
86
+ })[] | null>;
87
+ };
88
+ previousHref: {
89
+ type: PropType<string | null>;
90
+ };
91
+ previousLabel: {
92
+ type: PropType<string | null>;
93
+ };
94
+ size: {
95
+ type: PropType<"sm" | "md" | "lg" | null>;
96
+ };
97
+ "\0htmlNextInputStatus": {
98
+ type: PropType<InputBindings>;
99
+ };
100
+ }>> & Readonly<{
101
+ "onUpdate:page"?: ((value: number) => any) | undefined;
102
+ onNavigate?: ((event: CustomEvent<{
103
+ readonly page: number;
104
+ readonly previousPage: number;
105
+ readonly trigger: "keyboard" | "pointer" | "programmatic";
106
+ }>) => any) | undefined;
107
+ }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
108
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
109
+ declare const _default: typeof __VLS_export;
110
+ export default _default;
111
+ type __VLS_WithSlots<T, S> = T & {
112
+ new (): {
113
+ $slots: S;
114
+ };
115
+ };
@@ -0,0 +1,2 @@
1
+ import { t as UiPagination_default } from "./chunks/UiPagination.js";
2
+ export { UiPagination_default as default };