@threadlabs/looma 0.23.5 → 0.23.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.
@@ -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/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));
@@ -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 };
@@ -92,7 +92,7 @@
92
92
  syntax: "*";
93
93
  inherits: false;
94
94
  }
95
- [data-component~="ui-icon"][data-v-87aa3ce3] {
95
+ [data-component~="ui-icon"][data-v-47b12d9e] {
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-87aa3ce3] {
105
+ svg[data-v-47b12d9e] {
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-87aa3ce3] {
112
+ [data-component~="ui-icon"][hidden][data-v-47b12d9e] {
113
113
  display: none;
114
114
  }
115
115
 
@@ -5150,7 +5150,7 @@ svg[data-v-7bb0fe2e-s] {
5150
5150
  padding follow it too, and the item takes the link's focus ring. The link stays a real link, so
5151
5151
  a router, a modified click, and "open in new tab" all work. Trailing controls sit above it and
5152
5152
  stay their own. */
5153
- [data-component~="ui-list-item"][data-v-e7ecd203] {
5153
+ [data-component~="ui-list-item"][data-v-b8e3f0cd] {
5154
5154
  /* Hooks do not inherit, so the parts below read them from the root. */
5155
5155
  --_ui-list-item-icon-size: var(--ui-list-item-icon-size);
5156
5156
 
@@ -5175,86 +5175,91 @@ svg[data-v-7bb0fe2e-s] {
5175
5175
  background-color var(--ui-motion-fast) var(--ui-motion-ease),
5176
5176
  border-color var(--ui-motion-fast) var(--ui-motion-ease);
5177
5177
  }
5178
- [data-component~="ui-list-item"][data-ui-list-item-state~="variant=card"][data-v-e7ecd203] {
5178
+ [data-component~="ui-list-item"][data-ui-list-item-state~="variant=card"][data-v-b8e3f0cd] {
5179
5179
  padding-block: var(--ui-list-item-padding-block, var(--ui-space-3));
5180
5180
  padding-inline: var(--ui-list-item-padding-inline, var(--ui-space-4));
5181
5181
  border: var(--ui-border-width) solid var(--ui-border-strong);
5182
5182
  border-radius: var(--ui-radius-lg);
5183
5183
  background: var(--ui-surface-raised);
5184
5184
  }
5185
- [data-component~="ui-list-item"][data-v-e7ecd203]:has(.title a[href]:hover) {
5185
+ [data-component~="ui-list-item"][data-v-b8e3f0cd]:has(.title a[href]:hover) {
5186
5186
  background: var(--ui-surface-hover);
5187
5187
  }
5188
- [data-component~="ui-list-item"][data-ui-list-item-state~="variant=card"][data-v-e7ecd203]:has(.title
5188
+ [data-component~="ui-list-item"][data-ui-list-item-state~="variant=card"][data-v-b8e3f0cd]:has(.title
5189
5189
  a[href]:hover) {
5190
5190
  border-color: var(--ui-border-strong);
5191
5191
  }
5192
- [data-component~="ui-list-item"][data-ui-list-item-state~="highlighted"][data-v-e7ecd203] {
5192
+ [data-component~="ui-list-item"][data-ui-list-item-state~="highlighted"][data-v-b8e3f0cd] {
5193
5193
  background: var(--ui-selection-surface);
5194
5194
  }
5195
- [data-component~="ui-list-item"][data-ui-list-item-state~="current"][data-v-e7ecd203] {
5195
+ [data-component~="ui-list-item"][data-ui-list-item-state~="current"][data-v-b8e3f0cd] {
5196
5196
  background: var(--ui-selection-surface);
5197
5197
  color: var(--ui-selection-text);
5198
5198
  }
5199
- [data-component~="ui-list-item"][data-v-e7ecd203]:has(.title a[href]:focus-visible) {
5199
+ [data-component~="ui-list-item"][data-v-b8e3f0cd]:has(.title a[href]:focus-visible) {
5200
5200
  box-shadow: 0 0 0 var(--ui-focus-width) var(--ui-focus-ring);
5201
5201
  }
5202
- .leading[data-v-e7ecd203],
5203
- .trailing[data-v-e7ecd203] {
5202
+ .leading[data-v-b8e3f0cd],
5203
+ .trailing[data-v-b8e3f0cd] {
5204
5204
  display: inline-flex;
5205
5205
  flex: none;
5206
5206
  align-items: center;
5207
5207
  gap: var(--ui-space-2);
5208
5208
  }
5209
- .leading[data-v-e7ecd203] {
5209
+ .leading[data-v-b8e3f0cd] {
5210
5210
  color: var(--ui-text-muted);
5211
5211
  font-size: var(--_ui-list-item-icon-size, var(--ui-font-size-lg));
5212
5212
  }
5213
- [data-component~="ui-list-item"][data-ui-list-item-state~="current"] .leading[data-v-e7ecd203] {
5213
+ [data-component~="ui-list-item"][data-ui-list-item-state~="current"] .leading[data-v-b8e3f0cd] {
5214
5214
  color: var(--ui-selection-text);
5215
5215
  }
5216
5216
 
5217
5217
  /* Trailing controls take their own clicks, above the title link's stretched hit area. */
5218
- .trailing[data-v-e7ecd203] {
5218
+ .trailing[data-v-b8e3f0cd] {
5219
5219
  position: relative;
5220
5220
  z-index: 1;
5221
5221
  color: var(--ui-text-muted);
5222
5222
  font-size: var(--ui-font-size-sm);
5223
5223
  }
5224
- .content[data-v-e7ecd203] {
5224
+ .content[data-v-b8e3f0cd] {
5225
5225
  display: flex;
5226
5226
  flex: 1;
5227
5227
  flex-direction: column;
5228
5228
  gap: var(--ui-space-0-5, 2px);
5229
5229
  min-inline-size: 0;
5230
5230
  }
5231
- .title[data-v-e7ecd203],
5232
- .description[data-v-e7ecd203] {
5231
+ .title[data-v-b8e3f0cd],
5232
+ .description[data-v-b8e3f0cd] {
5233
5233
  display: block;
5234
5234
  min-inline-size: 0;
5235
5235
  overflow: hidden;
5236
5236
  text-overflow: ellipsis;
5237
5237
  white-space: nowrap;
5238
5238
  }
5239
- .title[data-v-e7ecd203] {
5239
+ [data-component~="ui-list-item"][data-ui-list-item-state~="wrap"] .title[data-v-b8e3f0cd],
5240
+ [data-component~="ui-list-item"][data-ui-list-item-state~="wrap"] .description[data-v-b8e3f0cd] {
5241
+ white-space: normal;
5242
+ overflow-wrap: anywhere;
5243
+ }
5244
+ .title[data-v-b8e3f0cd] {
5240
5245
  font-size: var(--ui-font-size-md);
5241
5246
  font-weight: var(--_ui-list-item-title-weight, var(--ui-font-medium));
5242
5247
  line-height: var(--ui-line-height-tight);
5243
5248
  }
5244
- .description[data-v-e7ecd203] {
5249
+ .description[data-v-b8e3f0cd] {
5245
5250
  color: var(--ui-text-muted);
5246
5251
  font-size: var(--ui-font-size-sm);
5247
5252
  line-height: var(--ui-line-height-tight);
5248
5253
  }
5249
- .title > a[data-v-e7ecd203-s] {
5254
+ .title > a[data-v-b8e3f0cd-s] {
5250
5255
  color: inherit;
5251
5256
  text-decoration: none;
5252
5257
  }
5253
- .title > a[data-v-e7ecd203-s]:focus-visible {
5258
+ .title > a[data-v-b8e3f0cd-s]:focus-visible {
5254
5259
  outline: none;
5255
5260
  box-shadow: none;
5256
5261
  }
5257
- .title > a[href][data-v-e7ecd203-s]::after {
5262
+ .title > a[href][data-v-b8e3f0cd-s]::after {
5258
5263
  position: absolute;
5259
5264
  inset: 0;
5260
5265
  border-radius: inherit;
@@ -5262,24 +5267,24 @@ svg[data-v-7bb0fe2e-s] {
5262
5267
  }
5263
5268
 
5264
5269
  /* An unused region takes no space. */
5265
- .leading[data-v-e7ecd203]:empty,
5266
- .description[data-v-e7ecd203]:empty,
5267
- .trailing[data-v-e7ecd203]:empty {
5270
+ .leading[data-v-b8e3f0cd]:empty,
5271
+ .description[data-v-b8e3f0cd]:empty,
5272
+ .trailing[data-v-b8e3f0cd]:empty {
5268
5273
  display: none;
5269
5274
  }
5270
5275
  @media (forced-colors: active) {
5271
- [data-component~="ui-list-item"][data-v-e7ecd203]:has(a:focus-visible) {
5276
+ [data-component~="ui-list-item"][data-v-b8e3f0cd]:has(a:focus-visible) {
5272
5277
  outline: var(--ui-focus-width) solid Highlight;
5273
5278
  outline-offset: calc(-1 * var(--ui-focus-width));
5274
5279
  }
5275
- :is([data-component~="ui-list-item"][data-ui-list-item-state~="current"][data-v-e7ecd203], [data-component~="ui-list-item"][data-ui-list-item-state~="highlighted"][data-v-e7ecd203]):not(:has(a:focus-visible)) {
5280
+ :is([data-component~="ui-list-item"][data-ui-list-item-state~="current"][data-v-b8e3f0cd], [data-component~="ui-list-item"][data-ui-list-item-state~="highlighted"][data-v-b8e3f0cd]):not(:has(a:focus-visible)) {
5276
5281
  outline: var(--ui-border-width) solid Highlight;
5277
5282
  outline-offset: calc(-1 * var(--ui-border-width));
5278
5283
  }
5279
5284
  }
5280
5285
 
5281
5286
  /* A component that sets its display still honours the hidden attribute on its root. */
5282
- [data-component~="ui-list-item"][hidden][data-v-e7ecd203] {
5287
+ [data-component~="ui-list-item"][hidden][data-v-b8e3f0cd] {
5283
5288
  display: none;
5284
5289
  }
5285
5290