@redseed/redseed-ui-vue3 7.6.2 → 8.0.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/index.js CHANGED
@@ -18,6 +18,7 @@ export * from './src/components/Empty'
18
18
  export * from './src/components/Form'
19
19
  export * from './src/components/FormField'
20
20
  export * from './src/components/HTML'
21
+ export * from './src/components/Icon'
21
22
  export * from './src/components/Image'
22
23
  export * from './src/components/Layouts'
23
24
  export * from './src/components/Link'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@redseed/redseed-ui-vue3",
3
- "version": "7.6.2",
3
+ "version": "8.0.0",
4
4
  "description": "RedSeed UI Vue 3 components",
5
5
  "main": "index.js",
6
6
  "repository": "https://github.com/redseedtraining/redseed-ui",
@@ -16,6 +16,6 @@
16
16
  "@vueuse/core": "^14.0.0",
17
17
  "lodash": "^4.17.21",
18
18
  "lottie-web": "^5.13.0",
19
- "vue": "^3.5.22"
19
+ "vue": "^3.5.24"
20
20
  }
21
21
  }
@@ -1,4 +1,5 @@
1
1
  <script setup>
2
+ import IconCircleBackground from '../Icon/IconCircleBackground.vue'
2
3
  import { UserIcon } from '@heroicons/vue/24/outline'
3
4
 
4
5
  const props = defineProps({
@@ -44,8 +45,12 @@ function handleClick() {
44
45
 
45
46
  <div class="rsui-feed-item__avatar">
46
47
 
47
- <slot name="avatar">
48
- <UserIcon />
48
+ <slot name="icon">
49
+ <IconCircleBackground lg invert>
50
+ <slot name="avatar">
51
+ <UserIcon />
52
+ </slot>
53
+ </IconCircleBackground>
49
54
  </slot>
50
55
 
51
56
  <div v-if="status !== false"
@@ -1,6 +1,7 @@
1
1
  <script setup>
2
2
  import { computed, ref, toRefs } from 'vue'
3
3
  import ButtonTertiary from '../Button/ButtonTertiary.vue'
4
+ import Icon from '../Icon/Icon.vue'
4
5
  import { useResponsiveWidth } from '../../helpers'
5
6
  import { EllipsisVerticalIcon } from '@heroicons/vue/24/outline'
6
7
 
@@ -133,7 +134,9 @@ function handleMoreActionsClick() {
133
134
  >
134
135
  <ButtonTertiary @click="handleMoreActionsClick">
135
136
  <slot name="more-actions-label">
136
- <EllipsisVerticalIcon class="rsui-card-header__more-actions-icon" />
137
+ <Icon>
138
+ <EllipsisVerticalIcon />
139
+ </Icon>
137
140
  </slot>
138
141
  </ButtonTertiary>
139
142
  </slot>
@@ -2,6 +2,7 @@
2
2
  import { ref, watch, watchEffect, nextTick, onMounted } from 'vue'
3
3
  import { ChevronDownIcon } from '@heroicons/vue/24/outline'
4
4
  import { ButtonTertiary } from '../Button'
5
+ import Icon from '../Icon/Icon.vue'
5
6
 
6
7
  defineOptions({
7
8
  inheritAttrs: false,
@@ -12,6 +13,10 @@ const props = defineProps({
12
13
  type: Boolean,
13
14
  default: false,
14
15
  },
16
+ iconProps: {
17
+ type: Object,
18
+ default: () => {},
19
+ },
15
20
  })
16
21
 
17
22
  const emit = defineEmits(['click'])
@@ -104,14 +109,16 @@ onMounted(() => {
104
109
  :full="$attrs.full"
105
110
  @click.stop="handleTrigger"
106
111
  >
107
- <ChevronDownIcon
108
- :class="[
109
- 'rsui-disclosure__trigger-icon',
110
- {
111
- 'rsui-disclosure__trigger-icon--open': isOpen,
112
- }
113
- ]"
114
- ></ChevronDownIcon>
112
+ <Icon v-bind="iconProps">
113
+ <ChevronDownIcon
114
+ :class="[
115
+ 'rsui-disclosure__trigger-icon',
116
+ {
117
+ 'rsui-disclosure__trigger-icon--open': isOpen,
118
+ }
119
+ ]"
120
+ ></ChevronDownIcon>
121
+ </Icon>
115
122
  </ButtonTertiary>
116
123
  </slot>
117
124
  </Teleport>
@@ -4,6 +4,7 @@ import ButtonPrimary from '../Button/ButtonPrimary.vue'
4
4
  import ButtonSecondary from '../Button/ButtonSecondary.vue'
5
5
  import ButtonTertiary from '../Button/ButtonTertiary.vue'
6
6
  import BodyText from '../HTML/BodyText.vue'
7
+ import IconCircleBackground from '../Icon/IconCircleBackground.vue'
7
8
  import { ExclamationCircleIcon } from '@heroicons/vue/24/outline'
8
9
  import { useResponsiveWidth } from '../../helpers'
9
10
 
@@ -43,7 +44,9 @@ const emptyClass = computed(() => [
43
44
  class="rsui-empty__image"
44
45
  >
45
46
  <slot name="image">
46
- <ExclamationCircleIcon></ExclamationCircleIcon>
47
+ <IconCircleBackground lg invert>
48
+ <ExclamationCircleIcon />
49
+ </IconCircleBackground>
47
50
  </slot>
48
51
  </div>
49
52
 
@@ -0,0 +1,9 @@
1
+ <script setup>
2
+ import IconSlot from './IconSlot.vue'
3
+ </script>
4
+
5
+ <template>
6
+ <IconSlot>
7
+ <slot></slot>
8
+ </IconSlot>
9
+ </template>
@@ -0,0 +1,9 @@
1
+ <script setup>
2
+ import IconSlot from './IconSlot.vue'
3
+ </script>
4
+
5
+ <template>
6
+ <IconSlot circle background>
7
+ <slot></slot>
8
+ </IconSlot>
9
+ </template>
@@ -0,0 +1,9 @@
1
+ <script setup>
2
+ import IconSlot from './IconSlot.vue'
3
+ </script>
4
+
5
+ <template>
6
+ <IconSlot rounded background>
7
+ <slot></slot>
8
+ </IconSlot>
9
+ </template>
@@ -0,0 +1,167 @@
1
+ <script setup>
2
+ import { computed } from 'vue'
3
+
4
+ const props = defineProps({
5
+ xxs: {
6
+ type: Boolean,
7
+ default: false,
8
+ },
9
+ xs: {
10
+ type: Boolean,
11
+ default: false,
12
+ },
13
+ sm: {
14
+ type: Boolean,
15
+ default: false,
16
+ },
17
+ md: {
18
+ type: Boolean,
19
+ default: false,
20
+ },
21
+ lg: {
22
+ type: Boolean,
23
+ default: false,
24
+ },
25
+ xl: {
26
+ type: Boolean,
27
+ default: false,
28
+ },
29
+ xxl: {
30
+ type: Boolean,
31
+ default: false,
32
+ },
33
+ xxxl: {
34
+ type: Boolean,
35
+ default: false,
36
+ },
37
+ primary: {
38
+ type: Boolean,
39
+ default: false,
40
+ },
41
+ secondary: {
42
+ type: Boolean,
43
+ default: false,
44
+ },
45
+ brand: {
46
+ type: Boolean,
47
+ default: false,
48
+ },
49
+ success: {
50
+ type: Boolean,
51
+ default: false,
52
+ },
53
+ info: {
54
+ type: Boolean,
55
+ default: false,
56
+ },
57
+ warning: {
58
+ type: Boolean,
59
+ default: false,
60
+ },
61
+ error: {
62
+ type: Boolean,
63
+ default: false,
64
+ },
65
+ ai: {
66
+ type: Boolean,
67
+ default: false,
68
+ },
69
+ disabled: {
70
+ type: Boolean,
71
+ default: false,
72
+ },
73
+ rounded: {
74
+ type: Boolean,
75
+ default: false,
76
+ },
77
+ circle: {
78
+ type: Boolean,
79
+ default: false,
80
+ },
81
+ background: {
82
+ type: Boolean,
83
+ default: false,
84
+ },
85
+ invert: {
86
+ type: Boolean,
87
+ default: false,
88
+ },
89
+ })
90
+
91
+ /**
92
+ * Default size is md (size-5) if no size is specified.
93
+ */
94
+ const defaultSize = computed(() =>
95
+ !props.xxs
96
+ && !props.xs
97
+ && !props.sm
98
+ && !props.md
99
+ && !props.lg
100
+ && !props.xl
101
+ && !props.xxl
102
+ && !props.xxxl
103
+ )
104
+
105
+ /**
106
+ * Default color is primary if no color is specified.
107
+ */
108
+ const defaultColor = computed(() =>
109
+ !props.primary
110
+ && !props.secondary
111
+ && !props.brand
112
+ && !props.success
113
+ && !props.info
114
+ && !props.warning
115
+ && !props.error
116
+ && !props.ai
117
+ && !props.disabled
118
+ )
119
+
120
+ const iconClass = computed(() => [
121
+ 'rsui-icon',
122
+ {
123
+ /**
124
+ * Sizes
125
+ */
126
+ 'rsui-icon--xxs': props.xxs, // size-2
127
+ 'rsui-icon--xs': props.xs, // size-3
128
+ 'rsui-icon--sm': props.sm, // size-4
129
+ 'rsui-icon--md': props.md || defaultSize.value, // size-5
130
+ 'rsui-icon--lg': props.lg, // size-6
131
+ 'rsui-icon--xl': props.xl, // size-8
132
+ 'rsui-icon--xxl': props.xxl, // size-10
133
+ 'rsui-icon--xxxl': props.xxxl, // size-12
134
+
135
+ /**
136
+ * Colors
137
+ */
138
+ 'rsui-icon--primary': props.primary || defaultColor.value,
139
+ 'rsui-icon--secondary': props.secondary,
140
+ 'rsui-icon--brand': props.brand,
141
+ 'rsui-icon--success': props.success,
142
+ 'rsui-icon--info': props.info,
143
+ 'rsui-icon--warning': props.warning,
144
+ 'rsui-icon--error': props.error,
145
+ 'rsui-icon--ai': props.ai,
146
+ 'rsui-icon--disabled': props.disabled,
147
+
148
+ /**
149
+ * Shapes
150
+ */
151
+ 'rsui-icon--rounded': props.rounded,
152
+ 'rsui-icon--circle': props.circle,
153
+
154
+ /**
155
+ * Variants
156
+ */
157
+ 'rsui-icon--background': props.background,
158
+ 'rsui-icon--invert': props.invert,
159
+ }
160
+ ])
161
+ </script>
162
+
163
+ <template>
164
+ <div :class="iconClass">
165
+ <slot></slot>
166
+ </div>
167
+ </template>
@@ -0,0 +1,11 @@
1
+ import Icon from './Icon.vue'
2
+ import IconSlot from './IconSlot.vue'
3
+ import IconRoundedBackground from './IconRoundedBackground.vue'
4
+ import IconCircleBackground from './IconCircleBackground.vue'
5
+
6
+ export {
7
+ Icon,
8
+ IconSlot,
9
+ IconRoundedBackground,
10
+ IconCircleBackground,
11
+ }
@@ -1,6 +1,7 @@
1
1
  <script setup>
2
2
  import { ref, computed, watch } from 'vue'
3
3
  import { useImage } from '@vueuse/core'
4
+ import Icon from '../Icon/Icon.vue'
4
5
  import { PhotoIcon } from '@heroicons/vue/24/outline'
5
6
 
6
7
  const props = defineProps({
@@ -140,7 +141,9 @@ const imageClass = computed(() => [
140
141
  class="rsui-image__empty"
141
142
  >
142
143
  <slot name="empty-icon">
143
- <PhotoIcon class="rsui-image__empty-icon"></PhotoIcon>
144
+ <Icon xxl disabled>
145
+ <PhotoIcon></PhotoIcon>
146
+ </Icon>
144
147
  </slot>
145
148
  </div>
146
149
  <div v-else-if="isLoading"
@@ -1,6 +1,7 @@
1
1
  <script setup>
2
2
  import { ref, computed, useSlots } from 'vue'
3
3
  import ButtonTertiary from '../Button/ButtonTertiary.vue'
4
+ import Icon from '../Icon/Icon.vue'
4
5
  import { useResponsiveWidth } from '../../helpers'
5
6
  import { EllipsisVerticalIcon } from '@heroicons/vue/24/outline'
6
7
 
@@ -103,7 +104,9 @@ const showToolbar = computed(() => {
103
104
  >
104
105
  <ButtonTertiary @click="handleMoreActionsClick">
105
106
  <slot name="more-actions-label">
106
- <EllipsisVerticalIcon class="rsui-section-header__more-actions-icon" />
107
+ <Icon>
108
+ <EllipsisVerticalIcon />
109
+ </Icon>
107
110
  </slot>
108
111
  </ButtonTertiary>
109
112
  </slot>
@@ -1,5 +1,6 @@
1
1
  <script setup>
2
2
  import { ref, computed, watch, useAttrs } from 'vue'
3
+ import Icon from '../Icon/Icon.vue'
3
4
  import { CheckIcon } from '@heroicons/vue/24/outline'
4
5
 
5
6
  defineOptions({
@@ -44,17 +45,18 @@ const statusClass = computed(() => [
44
45
  <template>
45
46
  <li :class="componentClass">
46
47
  <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"
48
+
49
+ <slot name="active-icon"
50
+ v-if="$slots['active-icon'] && isActive"
51
+ />
52
+
53
+ <slot name="done-icon"
54
+ v-if="isDone"
53
55
  >
54
- <slot name="done-icon" v-if="isDone">
56
+ <Icon xxs invert>
55
57
  <CheckIcon />
56
- </slot>
57
- </div>
58
+ </Icon>
59
+ </slot>
58
60
  </div>
59
61
  <div class="rsui-linked-list-item__title">
60
62
  <slot name="title"></slot>
@@ -18,14 +18,13 @@ const props = defineProps({
18
18
  },
19
19
  })
20
20
 
21
- const defaultColor = computed(() => !props.secondary && !props.tertiary && !props.white)
21
+ const defaultColor = computed(() => !props.primary && !props.secondary && !props.white)
22
22
 
23
23
  const loaderClass = computed(() => [
24
24
  'rsui-loader',
25
25
  {
26
- 'rsui-loader--primary': props.primary,
26
+ 'rsui-loader--primary': props.primary || defaultColor.value,
27
27
  'rsui-loader--secondary': props.secondary,
28
- 'rsui-loader--tertiary': props.tertiary,
29
28
  'rsui-loader--white': props.white,
30
29
  }
31
30
  ])
@@ -1,5 +1,6 @@
1
1
  <script setup>
2
2
  import { ref } from 'vue'
3
+ import Icon from '../Icon/Icon.vue'
3
4
  import { XMarkIcon } from '@heroicons/vue/24/outline'
4
5
 
5
6
  const props = defineProps({
@@ -36,9 +37,11 @@ function close() {
36
37
  </div>
37
38
  <div class="rsui-message-box__close">
38
39
  <div class="rsui-message-box__close-icon">
39
- <XMarkIcon
40
- @click="close"
41
- ></XMarkIcon>
40
+ <Icon disabled>
41
+ <XMarkIcon
42
+ @click="close"
43
+ ></XMarkIcon>
44
+ </Icon>
42
45
  </div>
43
46
  </div>
44
47
  </div>
@@ -1,5 +1,6 @@
1
1
  <script setup>
2
2
  import { computed } from 'vue'
3
+ import Icon from '../Icon/Icon.vue'
3
4
  import { QuestionMarkCircleIcon } from '@heroicons/vue/24/outline'
4
5
 
5
6
  const props = defineProps({
@@ -36,7 +37,9 @@ const emit = defineEmits(['click'])
36
37
  @click="$emit('click')"
37
38
  >
38
39
  <slot name="help-icon">
39
- <QuestionMarkCircleIcon></QuestionMarkCircleIcon>
40
+ <Icon sm secondary>
41
+ <QuestionMarkCircleIcon />
42
+ </Icon>
40
43
  </slot>
41
44
  </div>
42
45
  </div>
@@ -167,6 +167,8 @@ const goingNext = ref(false)
167
167
 
168
168
  function goToPage(page) {
169
169
  if (page == current.value) return
170
+ if (page < 1) return
171
+ if (page > totalPages.value) return
170
172
 
171
173
  if (page < current.value) {
172
174
  goingPrevious.value = true
@@ -1,11 +1,14 @@
1
1
  <script setup>
2
2
  import PaginationItem from './PaginationItem.vue'
3
+ import Icon from '../Icon/Icon.vue'
3
4
  import { EllipsisHorizontalIcon } from '@heroicons/vue/24/outline'
4
5
  </script>
5
6
  <template>
6
7
  <PaginationItem freeze
7
8
  class="rsui-pagination-item-collapsed"
8
9
  >
9
- <EllipsisHorizontalIcon></EllipsisHorizontalIcon>
10
+ <Icon sm>
11
+ <EllipsisHorizontalIcon />
12
+ </Icon>
10
13
  </PaginationItem>
11
14
  </template>
@@ -1,9 +1,19 @@
1
1
  <script setup>
2
2
  import PaginationItem from './PaginationItem.vue'
3
+ import Icon from '../Icon/Icon.vue'
3
4
  import { ChevronRightIcon } from '@heroicons/vue/24/outline'
5
+
6
+ const props = defineProps({
7
+ disabled: {
8
+ type: Boolean,
9
+ default: false
10
+ }
11
+ })
4
12
  </script>
5
13
  <template>
6
14
  <PaginationItem class="rsui-pagination-item-next">
7
- <ChevronRightIcon></ChevronRightIcon>
15
+ <Icon :disabled="disabled">
16
+ <ChevronRightIcon />
17
+ </Icon>
8
18
  </PaginationItem>
9
19
  </template>
@@ -1,9 +1,19 @@
1
1
  <script setup>
2
2
  import PaginationItem from './PaginationItem.vue'
3
+ import Icon from '../Icon/Icon.vue'
3
4
  import { ChevronLeftIcon } from '@heroicons/vue/24/outline'
5
+
6
+ const props = defineProps({
7
+ disabled: {
8
+ type: Boolean,
9
+ default: false
10
+ }
11
+ })
4
12
  </script>
5
13
  <template>
6
14
  <PaginationItem class="rsui-pagination-item-previous">
7
- <ChevronLeftIcon></ChevronLeftIcon>
15
+ <Icon :disabled="disabled">
16
+ <ChevronLeftIcon />
17
+ </Icon>
8
18
  </PaginationItem>
9
19
  </template>
@@ -1,5 +1,6 @@
1
1
  <script setup>
2
2
  import { ref, computed } from 'vue'
3
+ import Icon from '../Icon/Icon.vue'
3
4
  import { ArrowLongUpIcon } from '@heroicons/vue/24/outline'
4
5
  import LinkPrimary from '../Link/LinkPrimary.vue'
5
6
 
@@ -58,6 +59,9 @@ function toggleDesc() {
58
59
  <slot name="desc-label"></slot>
59
60
  </LinkPrimary>
60
61
  </slot>
61
- <ArrowLongUpIcon :class="iconClass"></ArrowLongUpIcon>
62
+
63
+ <Icon sm>
64
+ <ArrowLongUpIcon :class="iconClass"></ArrowLongUpIcon>
65
+ </Icon>
62
66
  </div>
63
67
  </template>
@@ -1,5 +1,6 @@
1
1
  <script setup>
2
2
  import { ref } from 'vue'
3
+ import Icon from '../Icon/Icon.vue'
3
4
  import SwitcherItem from './SwitcherItem.vue'
4
5
 
5
6
  const props = defineProps({
@@ -35,9 +36,9 @@ function setActiveItem(item) {
35
36
  :disabled="item.disabled"
36
37
  @click="setActiveItem(item)"
37
38
  >
38
- <component v-if="item.icon"
39
- :is="item.icon"
40
- ></component>
39
+ <Icon v-if="item.icon">
40
+ <component :is="item.icon"></component>
41
+ </Icon>
41
42
 
42
43
  {{ item.label }}
43
44
 
@@ -1,4 +1,5 @@
1
1
  <script setup>
2
+ import IconCircleBackground from '../Icon/IconCircleBackground.vue'
2
3
  import { UserIcon } from '@heroicons/vue/24/outline'
3
4
  </script>
4
5
 
@@ -6,7 +7,9 @@ import { UserIcon } from '@heroicons/vue/24/outline'
6
7
  <div class="rsui-td-user">
7
8
  <div class="rsui-td-user__avatar">
8
9
  <slot name="avatar">
9
- <UserIcon class="rsui-td-user__avatar-icon" />
10
+ <IconCircleBackground disabled>
11
+ <UserIcon />
12
+ </IconCircleBackground>
10
13
  </slot>
11
14
  </div>
12
15
 
@@ -1,5 +1,6 @@
1
1
  <script setup>
2
2
  import { ref, computed, watch } from 'vue'
3
+ import Icon from '../Icon/Icon.vue'
3
4
  import { ArrowUpIcon, ChevronUpDownIcon } from '@heroicons/vue/24/outline'
4
5
 
5
6
  const props = defineProps({
@@ -75,10 +76,14 @@ function handleSort() {
75
76
  <div v-if="sortable"
76
77
  class="rsui-th__sort"
77
78
  >
78
- <ChevronUpDownIcon v-if="!isAsc && !isDesc"
79
+ <Icon v-if="!isAsc && !isDesc"
79
80
  class="rsui-th__sort-icon"
80
- />
81
- <ArrowUpIcon v-if="isAsc || isDesc"
81
+ >
82
+ <ChevronUpDownIcon />
83
+ </Icon>
84
+
85
+ <Icon v-if="isAsc || isDesc"
86
+ sm
82
87
  :class="[
83
88
  'rsui-th__sort-icon',
84
89
  {
@@ -86,7 +91,9 @@ function handleSort() {
86
91
  'rsui-th__sort-icon--desc': isDesc,
87
92
  },
88
93
  ]"
89
- />
94
+ >
95
+ <ArrowUpIcon />
96
+ </Icon>
90
97
  </div>
91
98
  </div>
92
99
  </th>