@redseed/redseed-ui-vue3 3.0.3 → 3.1.0

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@redseed/redseed-ui-vue3",
3
- "version": "3.0.3",
3
+ "version": "3.1.0",
4
4
  "description": "RedSeed UI Vue 3 components",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -1,5 +1,5 @@
1
1
  <script setup>
2
- import { computed } from 'vue'
2
+ import { ref, computed } from 'vue'
3
3
 
4
4
  const props = defineProps({
5
5
  sm: {
@@ -47,9 +47,16 @@ const badgeClass = computed(() => [
47
47
  },
48
48
  ])
49
49
 
50
+ const badgeRef = ref(null)
51
+
52
+ defineExpose({
53
+ badgeRef
54
+ })
50
55
  </script>
51
56
  <template>
52
- <div :class="badgeClass">
57
+ <div ref="badgeRef"
58
+ :class="badgeClass"
59
+ >
53
60
  <slot></slot>
54
61
  </div>
55
62
  </template>
@@ -57,7 +64,7 @@ const badgeClass = computed(() => [
57
64
  .rsui-badge {
58
65
  @apply inline-flex items-center justify-center gap-x-1;
59
66
  @apply w-fit h-fit rounded-full;
60
- @apply text-xs font-semibold leading-3;
67
+ @apply text-sm font-medium leading-4;
61
68
  &--sm {
62
69
  @apply px-2 py-1;
63
70
  }
@@ -81,7 +88,7 @@ const badgeClass = computed(() => [
81
88
  }
82
89
 
83
90
  :deep(svg) {
84
- @apply size-3;
91
+ @apply size-4;
85
92
  }
86
93
  }
87
94
  </style>
@@ -0,0 +1,90 @@
1
+ <script setup>
2
+ import { ref, computed, watch, watchPostEffect, useAttrs } from 'vue'
3
+ import Badge from './Badge.vue'
4
+
5
+ defineProps({
6
+ badgeEnd: {
7
+ type: Boolean,
8
+ default: false,
9
+ },
10
+ })
11
+
12
+ const parentBadge = ref(null)
13
+
14
+ const childBadgeStyle = ref(getChildBadgeStyle())
15
+
16
+ const attrs = useAttrs()
17
+
18
+ // Watch the attrs for changes and update the child badge style
19
+ watch(() => attrs, () => {
20
+ childBadgeStyle.value = getChildBadgeStyle()
21
+ }, { deep: true, flush: 'post' })
22
+
23
+ // Watch the component for changes and update the child badge style
24
+ watchPostEffect(() => { childBadgeStyle.value = getChildBadgeStyle() }, { flush: 'post' })
25
+
26
+ function getChildBadgeStyle() {
27
+ if (!parentBadge.value) return {}
28
+ if (!parentBadge.value.badgeRef) return {}
29
+
30
+ // Get the parent badge element
31
+ const parentBadgeElement = parentBadge.value.badgeRef
32
+
33
+ // Get the computed style of the parent badge element
34
+ const parentBadgeStyle = window.getComputedStyle(parentBadgeElement)
35
+
36
+ // Use the background color of the parent badge as the text color of the child badge
37
+ const childColor = parentBadgeStyle.backgroundColor == 'rgba(0, 0, 0, 0)'
38
+ ? 'white'
39
+ : parentBadgeStyle.backgroundColor
40
+
41
+ // Use the text color of the parent badge as the background color of the child badge
42
+ const childBackgroundColor = parentBadgeStyle.color
43
+
44
+ // Return the style for the child badge
45
+ return {
46
+ color: childColor,
47
+ backgroundColor: childBackgroundColor,
48
+ }
49
+ }
50
+ </script>
51
+ <template>
52
+ <Badge v-if="$slots.badge || $slots.default"
53
+ ref="parentBadge"
54
+ :class="[
55
+ 'badge-group',
56
+ {
57
+ 'badge-group--badge-end': badgeEnd,
58
+ 'badge-group--no-text': !$slots.default,
59
+ 'badge-group--no-badge': !$slots.badge,
60
+ },
61
+ ]"
62
+ >
63
+ <Badge v-if="$slots.badge"
64
+ class="badge-group__badge"
65
+ :style="childBadgeStyle"
66
+ >
67
+ <slot name="badge"></slot>
68
+ </Badge>
69
+ <slot></slot>
70
+ </Badge>
71
+ </template>
72
+ <style lang="scss" scoped>
73
+ .badge-group {
74
+ @apply pl-1 pr-3 gap-x-3;
75
+ &--badge-end {
76
+ @apply pl-3 pr-1;
77
+ }
78
+ &--no-text {
79
+ @apply px-1;
80
+ }
81
+ &--no-badge {
82
+ @apply px-2;
83
+ }
84
+ }
85
+ .badge-group--badge-end {
86
+ .badge-group__badge {
87
+ @apply order-last;
88
+ }
89
+ }
90
+ </style>
@@ -4,6 +4,7 @@ import BadgeInfo from './BadgeInfo.vue'
4
4
  import BadgeNeutral from './BadgeNeutral.vue'
5
5
  import BadgeSuccess from './BadgeSuccess.vue'
6
6
  import BadgeWarning from './BadgeWarning.vue'
7
+ import BadgeGroup from './BadgeGroup.vue'
7
8
 
8
9
  export {
9
10
  Badge,
@@ -12,4 +13,5 @@ export {
12
13
  BadgeNeutral,
13
14
  BadgeSuccess,
14
15
  BadgeWarning,
16
+ BadgeGroup,
15
17
  }