sprintify-ui 0.11.29 → 0.11.31

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.
@@ -11429,9 +11429,21 @@ const FM = ["src"], _M = ["fill"], VM = ["font-size"], jM = { class: "truncate"
11429
11429
  __name: "BaseAvatar",
11430
11430
  props: {
11431
11431
  user: {
11432
- required: !0,
11432
+ default: void 0,
11433
11433
  type: Object
11434
11434
  },
11435
+ name: {
11436
+ default: void 0,
11437
+ type: String
11438
+ },
11439
+ email: {
11440
+ default: void 0,
11441
+ type: String
11442
+ },
11443
+ src: {
11444
+ default: void 0,
11445
+ type: String
11446
+ },
11435
11447
  size: {
11436
11448
  default: "base",
11437
11449
  type: String
@@ -11459,28 +11471,31 @@ const FM = ["src"], _M = ["fill"], VM = ["font-size"], jM = { class: "truncate"
11459
11471
  },
11460
11472
  setup(n) {
11461
11473
  const t = n, e = S(() => {
11462
- var u;
11463
- return zM(((u = t.user) == null ? void 0 : u.full_name) || "");
11474
+ var f, p, h, m;
11475
+ return ((m = [t.name, (f = t.user) == null ? void 0 : f.name, (p = t.user) == null ? void 0 : p.full_name, (h = t.user) == null ? void 0 : h.label].find((v) => !!(v && v.trim()))) == null ? void 0 : m.trim()) || "";
11464
11476
  }), r = S(() => {
11465
- var u, c;
11466
- return PM(((u = t.user) == null ? void 0 : u.full_name) || "", (c = t.user) == null ? void 0 : c.email);
11467
- }), o = S(() => Ze(
11477
+ var f;
11478
+ return (t.email || ((f = t.user) == null ? void 0 : f.email) || "").trim();
11479
+ }), o = S(() => {
11480
+ var f;
11481
+ return (t.src || ((f = t.user) == null ? void 0 : f.avatar_url) || "").trim();
11482
+ }), i = S(() => zM(e.value)), s = S(() => PM(e.value, r.value)), l = S(() => Ze(
11468
11483
  "inline-flex",
11469
11484
  "shrink-0",
11470
11485
  "items-center",
11471
11486
  t.class
11472
- )), i = S(() => t.tooltip ? `<p class="font-medium leading-tight">
11473
- ${t.user.full_name}
11487
+ )), a = S(() => !t.tooltip || !e.value && !r.value ? null : `<p class="font-medium leading-tight">
11488
+ ${e.value}
11474
11489
  </p>
11475
11490
  <p class="text-slate-500 leading-tight">
11476
- ${t.user.email}
11477
- </p>` : null), s = S(() => {
11478
- const u = "h-9 w-9";
11479
- return t.size == "xs" ? "h-6 w-6" : t.size == "sm" ? "h-8 w-8" : t.size == "base" ? u : t.size == "lg" ? "h-12 w-12" : t.size == "xl" ? "h-14 w-14" : u;
11480
- }), l = S(() => {
11481
- const u = "text-sm";
11482
- return t.size == "xs" ? "text-[11px]" : t.size == "sm" ? "text-xs" : t.size == "base" ? u : t.size == "lg" ? "text-sm" : t.size == "xl" ? "text-base" : u;
11483
- }), a = S(() => {
11491
+ ${r.value}
11492
+ </p>`), u = S(() => {
11493
+ const f = "h-9 w-9";
11494
+ return t.size == "xs" ? "h-6 w-6" : t.size == "sm" ? "h-8 w-8" : t.size == "base" ? f : t.size == "lg" ? "h-12 w-12" : t.size == "xl" ? "h-14 w-14" : f;
11495
+ }), c = S(() => {
11496
+ const f = "text-sm";
11497
+ return t.size == "xs" ? "text-[11px]" : t.size == "sm" ? "text-xs" : t.size == "base" ? f : t.size == "lg" ? "text-sm" : t.size == "xl" ? "text-base" : f;
11498
+ }), d = S(() => {
11484
11499
  switch (t.size) {
11485
11500
  case "xl":
11486
11501
  return "0.95rem";
@@ -11496,11 +11511,10 @@ const FM = ["src"], _M = ["fill"], VM = ["font-size"], jM = { class: "truncate"
11496
11511
  return "1rem";
11497
11512
  }
11498
11513
  });
11499
- return (u, c) => n.user ? (k(), re(Qi, {
11500
- key: 0,
11514
+ return (f, p) => (k(), re(Qi, {
11501
11515
  visible: n.tooltip,
11502
- text: g(i),
11503
- class: j(g(o))
11516
+ text: g(a),
11517
+ class: j(g(l))
11504
11518
  }, {
11505
11519
  default: Q(() => [
11506
11520
  (k(), re($n(n.to ? "RouterLink" : "div"), {
@@ -11508,20 +11522,20 @@ const FM = ["src"], _M = ["fill"], VM = ["font-size"], jM = { class: "truncate"
11508
11522
  class: "flex items-center"
11509
11523
  }, {
11510
11524
  default: Q(() => [
11511
- n.user.avatar_url ? (k(), $("img", {
11525
+ g(o) ? (k(), $("img", {
11512
11526
  key: 0,
11513
- src: n.user.avatar_url,
11514
- class: j([[g(s), n.detailsPosition == "left" ? "order-2" : "order-1"], "shrink-0 block overflow-hidden rounded-full object-cover object-center"])
11527
+ src: g(o),
11528
+ class: j([[g(u), n.detailsPosition == "left" ? "order-2" : "order-1"], "shrink-0 block overflow-hidden rounded-full object-cover object-center"])
11515
11529
  }, null, 10, FM)) : (k(), $("svg", {
11516
11530
  key: 1,
11517
11531
  viewBox: "0 0 100 100",
11518
- class: j([[g(s), n.detailsPosition == "left" ? "order-2" : "order-1"], "shrink-0 block overflow-hidden rounded-full"])
11532
+ class: j([[g(u), n.detailsPosition == "left" ? "order-2" : "order-1"], "shrink-0 block overflow-hidden rounded-full"])
11519
11533
  }, [
11520
11534
  A("circle", {
11521
11535
  cx: "50",
11522
11536
  cy: "50",
11523
11537
  r: "50",
11524
- fill: g(r)
11538
+ fill: g(s)
11525
11539
  }, null, 8, _M),
11526
11540
  A("text", {
11527
11541
  x: "50",
@@ -11529,31 +11543,31 @@ const FM = ["src"], _M = ["fill"], VM = ["font-size"], jM = { class: "truncate"
11529
11543
  "text-anchor": "middle",
11530
11544
  "dominant-baseline": "central",
11531
11545
  fill: "white",
11532
- "font-size": g(e).length === 1 ? "45" : "40",
11546
+ "font-size": g(i).length === 1 ? "45" : "40",
11533
11547
  "font-weight": "600",
11534
11548
  "font-family": "system-ui, -apple-system, sans-serif"
11535
- }, ie(g(e)), 9, VM)
11549
+ }, ie(g(i)), 9, VM)
11536
11550
  ], 2)),
11537
11551
  n.showDetails ? (k(), $("div", {
11538
11552
  key: 2,
11539
11553
  class: j(["max-w-[120px] grow leading-tight", [
11540
- g(l),
11554
+ g(c),
11541
11555
  n.detailsPosition == "left" ? "order-1 text-right" : "order-2 text-left"
11542
11556
  ]]),
11543
11557
  style: Fe({
11544
- marginLeft: n.detailsPosition == "right" ? g(a) : "0",
11545
- marginRight: n.detailsPosition == "left" ? g(a) : "0"
11558
+ marginLeft: n.detailsPosition == "right" ? g(d) : "0",
11559
+ marginRight: n.detailsPosition == "left" ? g(d) : "0"
11546
11560
  })
11547
11561
  }, [
11548
- A("div", jM, ie(n.user.full_name), 1),
11549
- A("div", HM, ie(n.user.email), 1)
11562
+ A("div", jM, ie(g(e)), 1),
11563
+ A("div", HM, ie(g(r)), 1)
11550
11564
  ], 6)) : Z("", !0)
11551
11565
  ]),
11552
11566
  _: 1
11553
11567
  }, 8, ["to"]))
11554
11568
  ]),
11555
11569
  _: 1
11556
- }, 8, ["visible", "text", "class"])) : Z("", !0);
11570
+ }, 8, ["visible", "text", "class"]));
11557
11571
  }
11558
11572
  }), WM = { class: "flex items-center -space-x-4" }, qM = { class: "rounded-full border-[3px] border-white" }, UM = { class: "rounded-full border-[3px] border-white bg-slate-300" }, KM = { key: 0 }, YM = { key: 1 }, GM = /* @__PURE__ */ te({
11559
11573
  __name: "BaseAvatarGroup",
@@ -1,10 +1,26 @@
1
1
  import { PropType } from 'vue';
2
2
  import { User } from '@/types/User';
3
3
  import { RouteLocationRaw } from 'vue-router';
4
+ type AvatarUserInput = Partial<User> & {
5
+ name?: string;
6
+ label?: string;
7
+ };
4
8
  declare const _default: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
5
9
  user: {
6
- required: true;
7
- type: PropType<User>;
10
+ default: undefined;
11
+ type: PropType<AvatarUserInput>;
12
+ };
13
+ name: {
14
+ default: undefined;
15
+ type: StringConstructor;
16
+ };
17
+ email: {
18
+ default: undefined;
19
+ type: StringConstructor;
20
+ };
21
+ src: {
22
+ default: undefined;
23
+ type: StringConstructor;
8
24
  };
9
25
  size: {
10
26
  default: string;
@@ -32,8 +48,20 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
32
48
  };
33
49
  }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
34
50
  user: {
35
- required: true;
36
- type: PropType<User>;
51
+ default: undefined;
52
+ type: PropType<AvatarUserInput>;
53
+ };
54
+ name: {
55
+ default: undefined;
56
+ type: StringConstructor;
57
+ };
58
+ email: {
59
+ default: undefined;
60
+ type: StringConstructor;
61
+ };
62
+ src: {
63
+ default: undefined;
64
+ type: StringConstructor;
37
65
  };
38
66
  size: {
39
67
  default: string;
@@ -61,9 +89,13 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
61
89
  };
62
90
  }>> & Readonly<{}>, {
63
91
  class: string;
92
+ email: string;
64
93
  to: string | import("vue-router").RouteLocationAsRelativeGeneric | import("vue-router").RouteLocationAsPathGeneric;
65
94
  size: string;
95
+ name: string;
66
96
  tooltip: boolean;
97
+ user: AvatarUserInput;
98
+ src: string;
67
99
  showDetails: boolean;
68
100
  detailsPosition: "left" | "right";
69
101
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sprintify-ui",
3
- "version": "0.11.29",
3
+ "version": "0.11.31",
4
4
  "type": "module",
5
5
  "scripts": {
6
6
  "generate-llm-txt": "node scripts/generate-llm-txt.js",
@@ -1,6 +1,5 @@
1
1
  <template>
2
2
  <BaseTooltip
3
- v-if="user"
4
3
  :visible="tooltip"
5
4
  :text="tooltipText"
6
5
  :class="classInternal"
@@ -11,8 +10,8 @@
11
10
  class="flex items-center"
12
11
  >
13
12
  <img
14
- v-if="user.avatar_url"
15
- :src="user.avatar_url"
13
+ v-if="resolvedUrl"
14
+ :src="resolvedUrl"
16
15
  :class="[sizeClass, detailsPosition == 'left' ? 'order-2' : 'order-1']"
17
16
  class="shrink-0 block overflow-hidden rounded-full object-cover object-center"
18
17
  >
@@ -54,10 +53,10 @@
54
53
  }"
55
54
  >
56
55
  <div class="truncate">
57
- {{ user.full_name }}
56
+ {{ resolvedName }}
58
57
  </div>
59
58
  <div class="truncate opacity-50">
60
- {{ user.email }}
59
+ {{ resolvedEmail }}
61
60
  </div>
62
61
  </div>
63
62
  </component>
@@ -76,10 +75,27 @@ defineOptions({
76
75
  inheritAttrs: false,
77
76
  })
78
77
 
78
+ type AvatarUserInput = Partial<User> & {
79
+ name?: string;
80
+ label?: string;
81
+ };
82
+
79
83
  const props = defineProps({
80
84
  user: {
81
- required: true,
82
- type: Object as PropType<User>,
85
+ default: undefined,
86
+ type: Object as PropType<AvatarUserInput>,
87
+ },
88
+ name: {
89
+ default: undefined,
90
+ type: String,
91
+ },
92
+ email: {
93
+ default: undefined,
94
+ type: String,
95
+ },
96
+ src: {
97
+ default: undefined,
98
+ type: String,
83
99
  },
84
100
  size: {
85
101
  default: 'base',
@@ -107,8 +123,23 @@ const props = defineProps({
107
123
  },
108
124
  });
109
125
 
110
- const initials = computed(() => getInitials(props.user?.full_name || ''));
111
- const avatarColor = computed(() => getAvatarColor(props.user?.full_name || '', props.user?.email));
126
+ const resolvedName = computed(() => {
127
+ return (
128
+ [props.name, props.user?.name, props.user?.full_name, props.user?.label]
129
+ .find((value) => Boolean(value && value.trim()))?.trim() || ''
130
+ );
131
+ });
132
+
133
+ const resolvedEmail = computed(() => {
134
+ return (props.email || props.user?.email || '').trim();
135
+ });
136
+
137
+ const resolvedUrl = computed(() => {
138
+ return (props.src || props.user?.avatar_url || '').trim();
139
+ });
140
+
141
+ const initials = computed(() => getInitials(resolvedName.value));
142
+ const avatarColor = computed(() => getAvatarColor(resolvedName.value, resolvedEmail.value));
112
143
 
113
144
  const classInternal = computed(() => {
114
145
  return twMerge(
@@ -125,11 +156,15 @@ const tooltipText = computed(() => {
125
156
  return null;
126
157
  }
127
158
 
159
+ if (!resolvedName.value && !resolvedEmail.value) {
160
+ return null;
161
+ }
162
+
128
163
  return `<p class="font-medium leading-tight">
129
- ${props.user.full_name}
164
+ ${resolvedName.value}
130
165
  </p>
131
166
  <p class="text-slate-500 leading-tight">
132
- ${props.user.email}
167
+ ${resolvedEmail.value}
133
168
  </p>`;
134
169
  })
135
170
 
@@ -23,6 +23,7 @@
23
23
  />
24
24
 
25
25
  <slot />
26
+
26
27
  <BaseIcon
27
28
  v-if="icon && iconPosition == 'end'"
28
29
  :icon="icon"