@redseed/redseed-ui-vue3 2.23.0 → 2.23.1

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": "2.23.0",
3
+ "version": "2.23.1",
4
4
  "description": "RedSeed UI Vue 3 components",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -1,36 +1,59 @@
1
1
  <script setup>
2
+ import { computed } from 'vue'
2
3
  import LinkedListItem from './LinkedListItem.vue'
3
4
 
4
- const props = defineProps({
5
- items: {
6
- type: Array,
7
- default: () =>[],
8
- }
9
- });
5
+ defineOptions({
6
+ inheritAttrs: false,
7
+ })
10
8
 
11
- function isLastItem(item) {
12
- return props.items.indexOf(item) === props.items.length - 1;
13
- }
9
+ const props = defineProps({
10
+ items: {
11
+ type: Array,
12
+ default: () =>[],
13
+ },
14
+ active: {
15
+ type: Boolean,
16
+ default: false,
17
+ },
18
+ done: {
19
+ type: Boolean,
20
+ default: false,
21
+ },
22
+ })
23
+
24
+ const componentClass = computed(() => [
25
+ 'rsui-linked-list',
26
+ {
27
+ 'rsui-linked-list--active': props.active,
28
+ 'rsui-linked-list--done': props.done,
29
+ }
30
+ ])
14
31
  </script>
15
32
 
16
33
  <template>
17
- <ul class="rsui-linked-list">
18
- <LinkedListItem v-for="item in props.items" :key="item.id" :status="item.status" :show-line="!isLastItem(item)">
19
- <template #title>{{ item.title }}</template>
20
- <template #body>{{ item.body }}</template>
21
- </LinkedListItem>
22
- </ul>
34
+ <ul :class="componentClass" v-bind="$attrs">
35
+ <slot>
36
+ <LinkedListItem
37
+ v-for="item in props.items"
38
+ :key="item"
39
+ :active="!!item.active || props.active"
40
+ :done="!!item.done || props.done"
41
+ >
42
+ <template #title>{{ item.title }}</template>
43
+ <template #body>{{ item.body }}</template>
44
+ </LinkedListItem>
45
+ </slot>
46
+ </ul>
23
47
  </template>
24
48
 
25
49
  <style lang="scss" scoped>
26
50
  .rsui-linked-list {
27
- list-style-type: none;
28
- padding: 0;
29
- margin: 0;
51
+ @apply list-none p-0 m-0;
52
+
53
+ &--active {
54
+ :deep(.rsui-linked-list-item--active) {
55
+ @apply before:bg-current;
56
+ }
57
+ }
30
58
  }
31
59
  </style>
32
-
33
-
34
-
35
-
36
-
@@ -1,55 +1,114 @@
1
1
  <script setup>
2
- import { computed } from 'vue';
2
+ import { ref, computed, watch, useAttrs } from 'vue'
3
+ import { CheckIcon } from '@heroicons/vue/24/outline'
4
+
5
+ defineOptions({
6
+ inheritAttrs: false,
7
+ })
3
8
 
4
9
  const props = defineProps({
5
- status: {
6
- type: String,
7
- default: 'default',
8
- },
9
- showLine: {
10
- type: Boolean,
11
- default: true,
12
- }
13
- });
14
-
15
- const statusClass = computed(() => `rsui-linked-list-item--${props.status}`);
10
+ active: {
11
+ type: Boolean,
12
+ default: false,
13
+ },
14
+ done: {
15
+ type: Boolean,
16
+ default: false,
17
+ },
18
+ })
19
+
20
+ const isActive = ref(props.active)
21
+ watch(() => props.active, () => { isActive.value = props.active })
22
+
23
+ const isDone = ref(props.done)
24
+ watch(() => props.done, () => { isDone.value = props.done })
25
+
26
+ const componentClass = computed(() => [
27
+ 'rsui-linked-list-item',
28
+ isActive.value || isDone.value ? useAttrs().class : '',
29
+ {
30
+ 'rsui-linked-list-item--active': isActive.value,
31
+ 'rsui-linked-list-item--done': isDone.value,
32
+ },
33
+ ])
34
+
35
+ const statusClass = computed(() => [
36
+ 'rsui-linked-list-item__status',
37
+ {
38
+ 'rsui-linked-list-item__status--active': isActive.value,
39
+ 'rsui-linked-list-item__status--done': isDone.value,
40
+ }
41
+ ])
16
42
  </script>
17
43
 
18
44
  <template>
19
- <li class="rsui-linked-list-item" :class="statusClass">
20
- <div v-if="showLine" class="rsui-linked-list-item__line"></div>
21
- <div class="rsui-linked-list-item__status"></div>
22
- <div class="rsui-linked-list-item__content">
23
- <div class="rsui-linked-list-item__title">
45
+ <li :class="componentClass">
46
+ <div :class="statusClass">
47
+ <div class="rsui-linked-list-item__active-icon"
48
+ v-if="$slots['active-icon']"
49
+ >
50
+ <slot name="active-icon" v-if="isActive" />
51
+ </div>
52
+ <div class="rsui-linked-list-item__done-icon"
53
+ >
54
+ <slot name="done-icon" v-if="isDone">
55
+ <CheckIcon />
56
+ </slot>
57
+ </div>
58
+ </div>
59
+ <div class="rsui-linked-list-item__title">
24
60
  <slot name="title"></slot>
25
- </div>
26
- <div class="rsui-linked-list-item__body">
61
+ </div>
62
+ <div class="rsui-linked-list-item__body" v-if="$slots.body">
27
63
  <slot name="body"></slot>
28
- </div>
29
64
  </div>
30
- </li>
65
+ </li>
31
66
  </template>
32
67
 
33
68
  <style lang="scss" scoped>
34
69
  .rsui-linked-list-item {
35
- @apply pl-[30px] pb-[30px] relative;
36
- &__line {
37
- @apply absolute top-[10px] left-[4px] bg-[#eee] w-[2px] h-[calc(100%-10px)];
38
- }
39
- &__status {
40
- @apply absolute top-[6.5px] left-0 z-[1] w-[10px] h-[10px] bg-[#eee] rounded-full border-white;
41
- }
42
- &:last-child {
43
- @apply pb-0;
44
- .rsui-linked-list-item__line {
45
- @apply h-[calc(100%-10px)];
46
- }
47
- }
48
- &__title {
49
- @apply font-bold mb-[5px];
50
- }
51
- &__body {
52
- @apply font-normal;
53
- }
70
+ @apply pl-9 pr-3 pt-0 pb-2 relative text-rsui-light;
71
+
72
+ /** Line style */
73
+ @apply before:absolute before:content-[''] before:top-1.5 before:left-[17px] before:h-full;
74
+ @apply last:before:hidden before:transition;
75
+ @apply before:inline-block before:w-0.5 before:bg-current;
76
+
77
+ &--active {
78
+ @apply text-primary before:bg-rsui-light;
79
+ }
80
+
81
+ &--done {
82
+ @apply text-primary;
83
+ }
84
+
85
+ &__status {
86
+ @apply absolute top-1.5 left-3 size-3 border border-current bg-current rounded-full;
87
+ @apply flex items-center justify-center transition;
88
+
89
+ &--active {
90
+ @apply bg-white;
91
+ }
92
+ }
93
+
94
+ &__active-icon {
95
+ :deep(svg), svg {
96
+ @apply size-2 text-current;
97
+ }
98
+ }
99
+
100
+ &__done-icon {
101
+ :deep(svg), svg {
102
+ @apply size-2 text-white;
103
+ }
104
+ }
105
+
106
+ &__title {
107
+ @apply font-semibold text-base text-rsui-default leading-normal;
108
+ }
109
+
110
+ &__body {
111
+ @apply font-normal text-sm text-rsui-medium leading-normal;
112
+ }
54
113
  }
55
114
  </style>