@threadlabs/looma 0.23.5 → 0.23.7

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.
@@ -9,6 +9,7 @@ export interface UiListItemProps {
9
9
  current?: boolean | null;
10
10
  highlighted?: boolean | null;
11
11
  variant?: "row" | "card" | null;
12
+ wrap?: boolean | null;
12
13
  attributes?: Readonly<Record<string, string | number | boolean | null | undefined>>;
13
14
  children?: readonly (string | Node)[];
14
15
  slots?: Readonly<Record<string, readonly (string | Node)[]>>;
@@ -8,6 +8,7 @@ export function createUiListItem(options = {}) {
8
8
  const prop0 = componentProps["current"] === undefined ? false : componentProps["current"];
9
9
  const prop1 = componentProps["highlighted"] === undefined ? false : componentProps["highlighted"];
10
10
  const prop2 = componentProps["variant"] === undefined ? "row" : componentProps["variant"];
11
+ const prop3 = componentProps["wrap"] === undefined ? false : componentProps["wrap"];
11
12
  const element = document.createElement("li");
12
13
  for (const [name, value] of Object.entries(attributes)) {
13
14
  if (value === null || value === undefined || value === false) continue;
@@ -72,6 +73,7 @@ export function createUiListItem(options = {}) {
72
73
  { name: "current", attribute: "data-current", value: componentProps["current"], default: false, type: "boolean", required: false },
73
74
  { name: "highlighted", attribute: "data-highlighted", value: componentProps["highlighted"], default: false, type: "boolean", required: false },
74
75
  { name: "variant", attribute: "data-variant", value: componentProps["variant"], default: "row", type: ["row","card"], required: false },
76
+ { name: "wrap", attribute: "data-wrap", value: componentProps["wrap"], default: false, type: "boolean", required: false },
75
77
  ], (name, value) => {
76
78
  if (name === "current") {
77
79
  if (value === null || value === undefined) element.removeAttribute("aria-current");
package/vue/UiBadge.d.ts CHANGED
@@ -5,7 +5,7 @@ type __VLS_Slots = {} & {
5
5
  };
6
6
  declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
7
7
  shape: {
8
- type: PropType<"pill" | "tag" | "dot" | null>;
8
+ type: PropType<"pill" | "tag" | "dot" | "square" | null>;
9
9
  default: string;
10
10
  };
11
11
  size: {
@@ -22,7 +22,7 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
22
22
  };
23
23
  }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
24
24
  shape: {
25
- type: PropType<"pill" | "tag" | "dot" | null>;
25
+ type: PropType<"pill" | "tag" | "dot" | "square" | null>;
26
26
  default: string;
27
27
  };
28
28
  size: {
@@ -38,7 +38,7 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
38
38
  default: string;
39
39
  };
40
40
  }>> & Readonly<{}>, {
41
- shape: "dot" | "tag" | "pill" | null;
41
+ shape: "dot" | "tag" | "square" | "pill" | null;
42
42
  size: "xs" | "md" | null;
43
43
  tone: "info" | "neutral" | "accent" | "success" | "warning" | "danger" | null;
44
44
  variant: "solid" | "subtle" | "outline" | null;
package/vue/UiBadge.vue CHANGED
@@ -13,8 +13,8 @@ const propValidityContract = {
13
13
  required: false,
14
14
  target: { attribute: 'shape' },
15
15
  description:
16
- 'Silhouette. pill is rounded at both ends; tag is a pointed label. dot is a compact circular signal with visually hidden text: include a state label, or set\n aria-hidden when the surrounding control already names that state.',
17
- values: ['pill', 'tag', 'dot'],
16
+ 'Silhouette. pill is rounded at both ends; tag is a pointed label. dot is a compact circular signal with visually hidden text: include a state label, or set\n aria-hidden when the surrounding control already names that state. square is a fixed rounded square for an icon or single glyph beside a heading; hide a\n decorative icon when adjacent words name it.',
17
+ values: ['pill', 'tag', 'dot', 'square'],
18
18
  default: 'pill',
19
19
  },
20
20
  size: {
@@ -22,7 +22,7 @@ const propValidityContract = {
22
22
  required: false,
23
23
  target: { attribute: 'size' },
24
24
  description:
25
- 'Scale. xs is a compact count beside small controls; md is the usual text badge.',
25
+ 'Scale. xs is a compact count beside small controls; md is the usual text badge. A square is 24px at xs and 32px at md with default spacing.',
26
26
  values: ['xs', 'md'],
27
27
  default: 'md',
28
28
  },
@@ -47,7 +47,10 @@ const propValidityContract = {
47
47
  },
48
48
  } as const
49
49
  const props = defineProps({
50
- shape: { type: null as unknown as PropType<'pill' | 'tag' | 'dot' | null>, default: 'pill' },
50
+ shape: {
51
+ type: null as unknown as PropType<'pill' | 'tag' | 'dot' | 'square' | null>,
52
+ default: 'pill',
53
+ },
51
54
  size: { type: null as unknown as PropType<'xs' | 'md' | null>, default: 'md' },
52
55
  tone: {
53
56
  type: null as unknown as PropType<
@@ -67,13 +70,13 @@ const acceptedProps: Record<string, unknown> = {
67
70
  variant: 'subtle',
68
71
  }
69
72
  const checkedProps = computed(() => ({
70
- shape: checkedProp<'pill' | 'tag' | 'dot'>(
73
+ shape: checkedProp<'pill' | 'tag' | 'dot' | 'square'>(
71
74
  props['shape'],
72
75
  { kind: 'terminal', name: 'keyword' },
73
76
  false,
74
77
  'shape',
75
78
  acceptedProps,
76
- ) as 'pill' | 'tag' | 'dot',
79
+ ) as 'pill' | 'tag' | 'dot' | 'square',
77
80
  size: checkedProp<'xs' | 'md'>(
78
81
  props['size'],
79
82
  { kind: 'terminal', name: 'keyword' },
@@ -183,6 +186,10 @@ const hostState = computed(() =>
183
186
  syntax: "*";
184
187
  inherits: false;
185
188
  }
189
+ @property --ui-badge-square-size {
190
+ syntax: "*";
191
+ inherits: false;
192
+ }
186
193
  @property --ui-badge-dot-size {
187
194
  syntax: "*";
188
195
  inherits: false;
@@ -394,6 +401,31 @@ const hostState = computed(() =>
394
401
  --_badge-text: var(--ui-info-subtle-text, var(--ui-info-solid));
395
402
  }
396
403
 
404
+ /* An icon mark keeps the existing tone recipe and follows the global spacing and radius. */
405
+ [data-component~="ui-badge"][data-ui-badge-state~="shape=square"] {
406
+ --_badge-square-size: var(--ui-badge-square-size, calc(var(--ui-space-4) * 2));
407
+ display: inline-flex;
408
+ box-sizing: border-box;
409
+ flex: none;
410
+ inline-size: var(--_badge-square-size);
411
+ block-size: var(--_badge-square-size);
412
+ min-inline-size: var(--_badge-square-size);
413
+ min-block-size: var(--_badge-square-size);
414
+ padding: 0;
415
+ border-radius: var(--ui-radius-md);
416
+ text-box-trim: none;
417
+ }
418
+
419
+ [data-component~="ui-badge"][data-ui-badge-state~="shape=square"][data-ui-badge-state~="size=xs"] {
420
+ --_badge-square-size: var(--ui-badge-square-size, calc(var(--ui-space-3) * 2));
421
+ }
422
+
423
+ [data-component~="ui-badge"][data-ui-badge-state~="shape=square"] .label {
424
+ display: inline-flex;
425
+ align-items: center;
426
+ justify-content: center;
427
+ }
428
+
397
429
  /* A dot uses the badge's tone recipe; only its silhouette and visible label change. */
398
430
  [data-component~="ui-badge"][data-ui-badge-state~="shape=dot"] {
399
431
  position: relative;
package/vue/UiIcon.vue CHANGED
@@ -107,6 +107,10 @@ const shapes = cycleCheckedComputed(() =>
107
107
  d: 'M21 19H7',
108
108
  }],
109
109
  'arrow-left': [{ tag: 'path', d: 'm12 19-7-7 7-7' }, { tag: 'path', d: 'M19 12H5' }],
110
+ bell: [{ tag: 'path', d: 'M10.268 21a2 2 0 0 0 3.464 0' }, {
111
+ tag: 'path',
112
+ d: 'M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326',
113
+ }],
110
114
  bold: [{
111
115
  tag: 'path',
112
116
  d: 'M6 12h9a4 4 0 0 1 0 8H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h7a4 4 0 0 1 0 8',
@@ -22,6 +22,10 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
22
22
  type: PropType<"row" | "card" | null>;
23
23
  default: string;
24
24
  };
25
+ wrap: {
26
+ type: PropType<boolean | null>;
27
+ default: boolean;
28
+ };
25
29
  }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
26
30
  current: {
27
31
  type: PropType<boolean | null>;
@@ -35,9 +39,14 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
35
39
  type: PropType<"row" | "card" | null>;
36
40
  default: string;
37
41
  };
42
+ wrap: {
43
+ type: PropType<boolean | null>;
44
+ default: boolean;
45
+ };
38
46
  }>> & Readonly<{}>, {
39
47
  variant: "row" | "card" | null;
40
48
  current: boolean | null;
49
+ wrap: boolean | null;
41
50
  highlighted: boolean | null;
42
51
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
43
52
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
@@ -33,17 +33,27 @@ const propValidityContract = {
33
33
  values: ['row', 'card'],
34
34
  default: 'row',
35
35
  },
36
+ wrap: {
37
+ type: { kind: 'terminal', name: 'boolean' },
38
+ required: false,
39
+ target: { attribute: 'wrap' },
40
+ description:
41
+ 'Lets the title and description wrap so explanatory text stays readable on narrow screens. Omit it for the default equal-height, one-line rows.',
42
+ default: false,
43
+ },
36
44
  },
37
45
  } as const
38
46
  const props = defineProps({
39
47
  current: { type: null as unknown as PropType<boolean | null>, default: false },
40
48
  highlighted: { type: null as unknown as PropType<boolean | null>, default: false },
41
49
  variant: { type: null as unknown as PropType<'row' | 'card' | null>, default: 'row' },
50
+ wrap: { type: null as unknown as PropType<boolean | null>, default: false },
42
51
  })
43
52
  const acceptedProps: Record<string, unknown> = {
44
53
  current: false,
45
54
  highlighted: false,
46
55
  variant: 'row',
56
+ wrap: false,
47
57
  }
48
58
  const checkedProps = computed(() => ({
49
59
  current: checkedProp<boolean>(
@@ -67,6 +77,13 @@ const checkedProps = computed(() => ({
67
77
  'variant',
68
78
  acceptedProps,
69
79
  ) as 'row' | 'card',
80
+ wrap: checkedProp<boolean>(
81
+ props['wrap'],
82
+ { kind: 'terminal', name: 'boolean' },
83
+ false,
84
+ 'wrap',
85
+ acceptedProps,
86
+ ) as boolean,
70
87
  }))
71
88
  void checkedProps.value
72
89
  watchSyncEffect(() => {
@@ -131,6 +148,7 @@ const hostState = computed(() =>
131
148
  && `variant=${encodeURIComponent(checkedProps.value.variant)}`,
132
149
  checkedProps.value.highlighted && 'highlighted',
133
150
  checkedProps.value.current && 'current',
151
+ checkedProps.value.wrap && 'wrap',
134
152
  ].filter(Boolean).join(' ')
135
153
  )
136
154
  </script>
@@ -144,6 +162,7 @@ const hostState = computed(() =>
144
162
  :data-current="reflectedProp('current', 'current', checkedProps.current, undefined, false)"
145
163
  :data-highlighted="reflectedProp('highlighted', 'highlighted', checkedProps.highlighted, undefined, false)"
146
164
  :data-variant="reflectedProp('variant', 'variant', checkedProps.variant, undefined, false)"
165
+ :data-wrap="reflectedProp('wrap', 'wrap', checkedProps.wrap, undefined, false)"
147
166
  :data-ui-list-item-state="hostState || undefined"
148
167
  >
149
168
  <span class="leading"><slot name="leading" /></span>
@@ -279,6 +298,12 @@ const hostState = computed(() =>
279
298
  white-space: nowrap;
280
299
  }
281
300
 
301
+ [data-component~="ui-list-item"][data-ui-list-item-state~="wrap"] .title,
302
+ [data-component~="ui-list-item"][data-ui-list-item-state~="wrap"] .description {
303
+ white-space: normal;
304
+ overflow-wrap: anywhere;
305
+ }
306
+
282
307
  .title {
283
308
  font-size: var(--ui-font-size-md);
284
309
  font-weight: var(--_ui-list-item-title-weight, var(--ui-font-medium));
@@ -42,11 +42,12 @@ var UiBadge_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE
42
42
  },
43
43
  required: false,
44
44
  target: { attribute: "shape" },
45
- description: "Silhouette. pill is rounded at both ends; tag is a pointed label. dot is a compact circular signal with visually hidden text: include a state label, or set\n aria-hidden when the surrounding control already names that state.",
45
+ description: "Silhouette. pill is rounded at both ends; tag is a pointed label. dot is a compact circular signal with visually hidden text: include a state label, or set\n aria-hidden when the surrounding control already names that state. square is a fixed rounded square for an icon or single glyph beside a heading; hide a\n decorative icon when adjacent words name it.",
46
46
  values: [
47
47
  "pill",
48
48
  "tag",
49
- "dot"
49
+ "dot",
50
+ "square"
50
51
  ],
51
52
  default: "pill"
52
53
  },
@@ -57,7 +58,7 @@ var UiBadge_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE
57
58
  },
58
59
  required: false,
59
60
  target: { attribute: "size" },
60
- description: "Scale. xs is a compact count beside small controls; md is the usual text badge.",
61
+ description: "Scale. xs is a compact count beside small controls; md is the usual text badge. A square is 24px at xs and 32px at md with default spacing.",
61
62
  values: ["xs", "md"],
62
63
  default: "md"
63
64
  },
@@ -168,6 +169,6 @@ var UiBadge_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE
168
169
  }]]);
169
170
  };
170
171
  }
171
- }), [["__scopeId", "data-v-84736a7c"]]);
172
+ }), [["__scopeId", "data-v-470f6e28"]]);
172
173
  //#endregion
173
174
  export { UiBadge_default as t };
@@ -148,6 +148,13 @@ var UiIcon_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE_
148
148
  tag: "path",
149
149
  d: "M19 12H5"
150
150
  }],
151
+ bell: [{
152
+ tag: "path",
153
+ d: "M10.268 21a2 2 0 0 0 3.464 0"
154
+ }, {
155
+ tag: "path",
156
+ d: "M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326"
157
+ }],
151
158
  bold: [{
152
159
  tag: "path",
153
160
  d: "M6 12h9a4 4 0 0 1 0 8H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h7a4 4 0 0 1 0 8"
@@ -1214,6 +1221,6 @@ var UiIcon_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE_
1214
1221
  }]]);
1215
1222
  };
1216
1223
  }
1217
- }), [["__scopeId", "data-v-87aa3ce3"]]);
1224
+ }), [["__scopeId", "data-v-47b12d9e"]]);
1218
1225
  //#endregion
1219
1226
  export { UiIcon_default as t };
@@ -7,6 +7,7 @@ var _hoisted_1 = [
7
7
  "data-current",
8
8
  "data-highlighted",
9
9
  "data-variant",
10
+ "data-wrap",
10
11
  "data-ui-list-item-state"
11
12
  ];
12
13
  var _hoisted_2 = { class: "leading" };
@@ -31,6 +32,10 @@ var UiListItem_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__P
31
32
  variant: {
32
33
  type: null,
33
34
  default: "row"
35
+ },
36
+ wrap: {
37
+ type: null,
38
+ default: false
34
39
  }
35
40
  },
36
41
  setup(__props) {
@@ -65,13 +70,24 @@ var UiListItem_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__P
65
70
  description: "How the item is drawn. A row is flat and takes a hover surface when it is a link, for items read down a list. A card sits on a raised, bordered surface,\n for items set in a grid (a List with layout=\"grid\"). Both have the same parts: leading, title, description, and trailing.",
66
71
  values: ["row", "card"],
67
72
  default: "row"
73
+ },
74
+ wrap: {
75
+ type: {
76
+ kind: "terminal",
77
+ name: "boolean"
78
+ },
79
+ required: false,
80
+ target: { attribute: "wrap" },
81
+ description: "Lets the title and description wrap so explanatory text stays readable on narrow screens. Omit it for the default equal-height, one-line rows.",
82
+ default: false
68
83
  }
69
84
  } };
70
85
  const props = __props;
71
86
  const acceptedProps = {
72
87
  current: false,
73
88
  highlighted: false,
74
- variant: "row"
89
+ variant: "row",
90
+ wrap: false
75
91
  };
76
92
  const checkedProps = computed(() => ({
77
93
  current: checkedProp(props["current"], {
@@ -85,7 +101,11 @@ var UiListItem_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__P
85
101
  variant: checkedProp(props["variant"], {
86
102
  kind: "terminal",
87
103
  name: "keyword"
88
- }, false, "variant", acceptedProps)
104
+ }, false, "variant", acceptedProps),
105
+ wrap: checkedProp(props["wrap"], {
106
+ kind: "terminal",
107
+ name: "boolean"
108
+ }, false, "wrap", acceptedProps)
89
109
  }));
90
110
  checkedProps.value;
91
111
  watchSyncEffect(() => {
@@ -116,7 +136,8 @@ var UiListItem_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__P
116
136
  checkedProps.value.variant && "variant",
117
137
  checkedProps.value.variant != null && `variant=${encodeURIComponent(checkedProps.value.variant)}`,
118
138
  checkedProps.value.highlighted && "highlighted",
119
- checkedProps.value.current && "current"
139
+ checkedProps.value.current && "current",
140
+ checkedProps.value.wrap && "wrap"
120
141
  ].filter(Boolean).join(" "));
121
142
  return (_ctx, _cache) => {
122
143
  return withDirectives((openBlock(), createElementBlock("li", mergeProps({ "data-component": "ui-list-item" }, nativeAttrs(_ctx.$attrs), {
@@ -124,6 +145,7 @@ var UiListItem_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__P
124
145
  "data-current": reflectedProp("current", "current", checkedProps.value.current, void 0, false),
125
146
  "data-highlighted": reflectedProp("highlighted", "highlighted", checkedProps.value.highlighted, void 0, false),
126
147
  "data-variant": reflectedProp("variant", "variant", checkedProps.value.variant, void 0, false),
148
+ "data-wrap": reflectedProp("wrap", "wrap", checkedProps.value.wrap, void 0, false),
127
149
  "data-ui-list-item-state": hostState.value || void 0
128
150
  }), [
129
151
  createElementVNode("span", _hoisted_2, [renderSlot(_ctx.$slots, "leading")]),
@@ -135,6 +157,6 @@ var UiListItem_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__P
135
157
  }]]);
136
158
  };
137
159
  }
138
- }), [["__scopeId", "data-v-e7ecd203"]]);
160
+ }), [["__scopeId", "data-v-b8e3f0cd"]]);
139
161
  //#endregion
140
162
  export { UiListItem_default as t };