@indielayer/ui 1.0.0-alpha.9 → 1.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.
Files changed (209) hide show
  1. package/README.md +6 -3
  2. package/lib/index.cjs.js +1 -15
  3. package/lib/index.es.js +4451 -3650
  4. package/lib/nuxt.js +2 -1
  5. package/package.json +16 -6
  6. package/src/common/icons.ts +15 -0
  7. package/src/common/utils.ts +68 -0
  8. package/src/components/alert/Alert.theme.ts +57 -0
  9. package/src/components/alert/Alert.vue +51 -127
  10. package/src/components/alert/__tests__/Alert.spec.ts +14 -0
  11. package/src/components/avatar/Avatar.theme.ts +39 -0
  12. package/src/components/avatar/Avatar.vue +58 -96
  13. package/src/components/avatar/__tests__/Avatar.spec.ts +11 -0
  14. package/src/components/badge/Badge.theme.ts +13 -0
  15. package/src/components/badge/Badge.vue +58 -65
  16. package/src/components/badge/__tests__/Badge.spec.ts +11 -0
  17. package/src/components/breadcrumbs/Breadcrumbs.theme.ts +9 -0
  18. package/src/components/breadcrumbs/Breadcrumbs.vue +34 -24
  19. package/src/components/breadcrumbs/__tests__/Breadcrumbs.spec.ts +11 -0
  20. package/src/components/button/Button.theme.ts +234 -0
  21. package/src/components/button/Button.vue +94 -356
  22. package/src/components/button/ButtonGroup.theme.ts +5 -0
  23. package/src/components/button/ButtonGroup.vue +30 -29
  24. package/src/components/button/__tests__/ Button.spec.ts +11 -0
  25. package/src/components/button/__tests__/ ButtonGroup.spec.ts +11 -0
  26. package/src/components/card/Card.theme.ts +7 -0
  27. package/src/components/card/Card.vue +18 -11
  28. package/src/components/card/__tests__/Card.spec.ts +11 -0
  29. package/src/components/checkbox/Checkbox.theme.ts +92 -0
  30. package/src/components/checkbox/Checkbox.vue +69 -156
  31. package/src/components/checkbox/__tests__/Checkbox.spec.ts +11 -0
  32. package/src/components/collapse/Collapse.theme.ts +11 -0
  33. package/src/components/collapse/Collapse.vue +99 -118
  34. package/src/components/collapse/__tests__/Collapse.spec.ts +11 -0
  35. package/src/components/container/Container.theme.ts +7 -0
  36. package/src/components/container/Container.vue +17 -9
  37. package/src/components/container/__tests__/Container.spec.ts +11 -0
  38. package/src/components/divider/Divider.theme.ts +11 -0
  39. package/src/components/divider/Divider.vue +22 -18
  40. package/src/components/divider/__tests__/Divider.spec.ts +11 -0
  41. package/src/components/drawer/Drawer.theme.ts +9 -0
  42. package/src/components/drawer/Drawer.vue +160 -177
  43. package/src/components/drawer/__tests__/Drawer.spec.ts +11 -0
  44. package/src/components/form/Form.theme.ts +7 -0
  45. package/src/components/form/Form.vue +90 -73
  46. package/src/components/form/__tests__/Form.spec.ts +11 -0
  47. package/src/components/helpers/InputError.tsx +14 -0
  48. package/src/components/icon/Icon.theme.ts +16 -0
  49. package/src/components/icon/Icon.vue +72 -88
  50. package/src/components/icon/__tests__/Icon.spec.ts +11 -0
  51. package/src/components/image/Image.theme.ts +7 -0
  52. package/src/components/image/Image.vue +22 -23
  53. package/src/components/image/__tests__/Image.spec.ts +11 -0
  54. package/src/components/index.ts +3 -3
  55. package/src/components/input/Input.theme.ts +44 -0
  56. package/src/components/input/Input.vue +97 -130
  57. package/src/components/input/__tests__/Input.spec.ts +11 -0
  58. package/src/components/link/Link.theme.ts +26 -0
  59. package/src/components/link/Link.vue +41 -66
  60. package/src/components/link/__tests__/Link.spec.ts +11 -0
  61. package/src/components/menu/Menu.theme.ts +7 -0
  62. package/src/components/menu/Menu.vue +54 -45
  63. package/src/components/menu/MenuItem.theme.ts +107 -0
  64. package/src/components/menu/MenuItem.vue +97 -199
  65. package/src/components/menu/__tests__/Menu.spec.ts +11 -0
  66. package/src/components/menu/__tests__/MenuItem.spec.ts +11 -0
  67. package/src/components/modal/Modal.theme.ts +29 -0
  68. package/src/components/modal/Modal.vue +78 -101
  69. package/src/components/modal/__tests__/Modal.spec.ts +11 -0
  70. package/src/components/notifications/Notifications.theme.ts +11 -0
  71. package/src/components/notifications/Notifications.vue +233 -249
  72. package/src/components/notifications/__tests__/Notifications.spec.ts +11 -0
  73. package/src/components/pagination/Pagination.theme.ts +27 -0
  74. package/src/components/pagination/Pagination.vue +142 -164
  75. package/src/components/pagination/PaginationItem.theme.ts +14 -0
  76. package/src/components/pagination/PaginationItem.vue +26 -33
  77. package/src/components/pagination/__tests__/Pagination.spec.ts +11 -0
  78. package/src/components/pagination/__tests__/PaginationItem.spec.ts +11 -0
  79. package/src/components/popover/Popover.theme.ts +9 -0
  80. package/src/components/popover/Popover.vue +153 -101
  81. package/src/components/popover/PopoverContainer.theme.ts +7 -0
  82. package/src/components/popover/PopoverContainer.vue +17 -9
  83. package/src/components/popover/__tests__/Popover.spec.ts +11 -0
  84. package/src/components/popover/__tests__/PopoverContainer.spec.ts +11 -0
  85. package/src/components/progress/Progress.theme.ts +26 -0
  86. package/src/components/progress/Progress.vue +29 -53
  87. package/src/components/progress/__tests__/Progress.spec.ts +11 -0
  88. package/src/components/radio/Radio.theme.ts +121 -0
  89. package/src/components/radio/Radio.vue +81 -158
  90. package/src/components/radio/__tests__/Radio.spec.ts +11 -0
  91. package/src/components/scroll/Scroll.theme.ts +7 -0
  92. package/src/components/scroll/Scroll.vue +34 -36
  93. package/src/components/scroll/__tests__/Scroll.spec.ts +11 -0
  94. package/src/components/select/Select.theme.ts +54 -0
  95. package/src/components/select/Select.vue +219 -273
  96. package/src/components/select/__tests__/Select.spec.ts +11 -0
  97. package/src/components/skeleton/Skeleton.theme.ts +7 -0
  98. package/src/components/skeleton/Skeleton.vue +17 -9
  99. package/src/components/skeleton/__tests__/Skeleton.spec.ts +11 -0
  100. package/src/components/slider/Slider.theme.ts +30 -0
  101. package/src/components/slider/Slider.vue +135 -168
  102. package/src/components/slider/__tests__/Slider.spec.ts +11 -0
  103. package/src/components/spacer/{Spacer.vue → Spacer.tsx} +3 -6
  104. package/src/components/spacer/__tests__/Spacer.spec.ts +11 -0
  105. package/src/components/spinner/Spinner.vue +10 -34
  106. package/src/components/spinner/__tests__/Spinner.spec.ts +11 -0
  107. package/src/components/tab/Tab.theme.ts +22 -0
  108. package/src/components/tab/Tab.vue +89 -93
  109. package/src/components/tab/TabGroup.theme.ts +43 -0
  110. package/src/components/tab/TabGroup.vue +94 -127
  111. package/src/components/tab/__tests__/Tab.spec.ts +11 -0
  112. package/src/components/tab/__tests__/TabGroup.spec.ts +11 -0
  113. package/src/components/table/Table.theme.ts +19 -0
  114. package/src/components/table/Table.vue +136 -147
  115. package/src/components/table/{TableBody.vue → TableBody.tsx} +3 -8
  116. package/src/components/table/TableCell.theme.ts +27 -0
  117. package/src/components/table/TableCell.vue +30 -58
  118. package/src/components/table/TableHead.tsx +14 -0
  119. package/src/components/table/TableHeader.vue +18 -20
  120. package/src/components/table/TableRow.vue +23 -20
  121. package/src/components/table/__tests__/Table.spec.ts +11 -0
  122. package/src/components/tag/Tag.theme.ts +32 -0
  123. package/src/components/tag/Tag.vue +40 -68
  124. package/src/components/tag/__tests__/Tag.spec.ts +11 -0
  125. package/src/components/textarea/Textarea.theme.ts +62 -0
  126. package/src/components/textarea/Textarea.vue +100 -115
  127. package/src/components/textarea/__tests__/Textarea.spec.ts +11 -0
  128. package/src/components/toggle/Toggle.theme.ts +51 -0
  129. package/src/components/toggle/Toggle.vue +51 -81
  130. package/src/components/toggle/__tests__/Toggle.spec.ts +11 -0
  131. package/src/components/tooltip/Tooltip.theme.ts +51 -0
  132. package/src/components/tooltip/Tooltip.vue +9 -14
  133. package/src/components/tooltip/__tests__/Tooltip.spec.ts +11 -0
  134. package/src/composables/colors-utils.ts +68 -68
  135. package/src/composables/colors.ts +18 -6
  136. package/src/composables/common.ts +1 -0
  137. package/src/composables/css.ts +7 -2
  138. package/src/composables/index.ts +1 -1
  139. package/src/composables/inputtable.ts +1 -1
  140. package/src/composables/interactive.ts +8 -4
  141. package/src/composables/keys.ts +1 -0
  142. package/src/composables/notifications.ts +10 -0
  143. package/src/composables/theme.ts +88 -0
  144. package/src/create.ts +8 -3
  145. package/src/exports/nuxt.js +2 -1
  146. package/src/version.ts +1 -1
  147. package/volar.d.ts +1 -0
  148. package/lib/components/alert/Alert.vue.d.ts +0 -42
  149. package/lib/components/avatar/Avatar.vue.d.ts +0 -49
  150. package/lib/components/badge/Badge.vue.d.ts +0 -75
  151. package/lib/components/breadcrumbs/Breadcrumbs.vue.d.ts +0 -30
  152. package/lib/components/button/Button.vue.d.ts +0 -87
  153. package/lib/components/button/ButtonGroup.vue.d.ts +0 -49
  154. package/lib/components/card/Card.vue.d.ts +0 -17
  155. package/lib/components/checkbox/Checkbox.vue.d.ts +0 -81
  156. package/lib/components/collapse/Collapse.vue.d.ts +0 -47
  157. package/lib/components/container/Container.vue.d.ts +0 -14
  158. package/lib/components/divider/Divider.vue.d.ts +0 -10
  159. package/lib/components/drawer/Drawer.vue.d.ts +0 -73
  160. package/lib/components/form/Form.vue.d.ts +0 -46
  161. package/lib/components/icon/Icon.vue.d.ts +0 -40
  162. package/lib/components/image/Image.vue.d.ts +0 -8
  163. package/lib/components/index.d.ts +0 -45
  164. package/lib/components/input/Input.vue.d.ts +0 -117
  165. package/lib/components/link/Link.vue.d.ts +0 -36
  166. package/lib/components/menu/Menu.vue.d.ts +0 -62
  167. package/lib/components/menu/MenuItem.vue.d.ts +0 -114
  168. package/lib/components/modal/Modal.vue.d.ts +0 -34
  169. package/lib/components/notifications/Notifications.vue.d.ts +0 -104
  170. package/lib/components/pagination/Pagination.vue.d.ts +0 -58
  171. package/lib/components/pagination/PaginationItem.vue.d.ts +0 -32
  172. package/lib/components/popover/Popover.vue.d.ts +0 -64
  173. package/lib/components/popover/PopoverContainer.vue.d.ts +0 -14
  174. package/lib/components/progress/Progress.vue.d.ts +0 -42
  175. package/lib/components/radio/Radio.vue.d.ts +0 -79
  176. package/lib/components/scroll/Scroll.vue.d.ts +0 -29
  177. package/lib/components/select/Select.vue.d.ts +0 -100
  178. package/lib/components/skeleton/Skeleton.vue.d.ts +0 -14
  179. package/lib/components/slider/Slider.vue.d.ts +0 -96
  180. package/lib/components/spacer/Spacer.vue.d.ts +0 -2
  181. package/lib/components/spinner/Spinner.vue.d.ts +0 -16
  182. package/lib/components/tab/Tab.vue.d.ts +0 -52
  183. package/lib/components/tab/TabGroup.vue.d.ts +0 -61
  184. package/lib/components/table/Table.vue.d.ts +0 -82
  185. package/lib/components/table/TableBody.vue.d.ts +0 -2
  186. package/lib/components/table/TableCell.vue.d.ts +0 -33
  187. package/lib/components/table/TableHead.vue.d.ts +0 -2
  188. package/lib/components/table/TableHeader.vue.d.ts +0 -33
  189. package/lib/components/table/TableRow.vue.d.ts +0 -23
  190. package/lib/components/tag/Tag.vue.d.ts +0 -45
  191. package/lib/components/textarea/Textarea.vue.d.ts +0 -106
  192. package/lib/components/toggle/Toggle.vue.d.ts +0 -79
  193. package/lib/components/tooltip/Tooltip.vue.d.ts +0 -2
  194. package/lib/composables/colors-utils.d.ts +0 -8
  195. package/lib/composables/colors.d.ts +0 -26
  196. package/lib/composables/common.d.ts +0 -14
  197. package/lib/composables/css.d.ts +0 -5
  198. package/lib/composables/index.d.ts +0 -7
  199. package/lib/composables/inputtable.d.ts +0 -37
  200. package/lib/composables/interactive.d.ts +0 -10
  201. package/lib/composables/keys.d.ts +0 -7
  202. package/lib/composables/notification.d.ts +0 -1
  203. package/lib/create.d.ts +0 -12
  204. package/lib/index.d.ts +0 -6
  205. package/lib/install.d.ts +0 -4
  206. package/lib/style.css +0 -1
  207. package/lib/version.d.ts +0 -2
  208. package/src/components/table/TableHead.vue +0 -15
  209. package/src/composables/notification.ts +0 -10
@@ -1,137 +1,99 @@
1
1
  <script lang="ts">
2
- import { computed, defineComponent, ref, watch } from 'vue'
2
+ export default {
3
+ name: 'XAvatar',
4
+ validators: useCommon.validators(),
5
+ }
6
+ </script>
7
+
8
+ <script setup lang="ts">
9
+ import { computed, ref, watch } from 'vue'
3
10
  import { useCommon } from '../../composables/common'
4
11
  import { useColors } from '../../composables/colors'
5
- import { useCSS } from '../../composables/css'
12
+ import { useTheme } from '../../composables/theme'
13
+ import { avatarIcon } from '../../common/icons'
6
14
 
7
15
  import XIcon from '../../components/icon/Icon.vue'
8
16
 
9
- export default defineComponent({
10
- name: 'XAvatar',
11
-
12
- components: {
13
- XIcon,
14
- },
15
-
16
- validators: {
17
- ...useCommon.validators(),
18
- },
17
+ import theme from './Avatar.theme'
19
18
 
20
- props: {
21
- ...useCommon.props(),
22
- ...useColors.props('primary'),
23
- tag: {
24
- type: String,
25
- default: 'div',
26
- },
27
- name: String,
28
- alt: String,
29
- image: String,
30
- outlined: Boolean,
31
- rounded: Boolean,
19
+ const props = defineProps({
20
+ ...useCommon.props(),
21
+ ...useColors.props('primary'),
22
+ tag: {
23
+ type: String,
24
+ default: 'div',
32
25
  },
26
+ name: String,
27
+ alt: String,
28
+ image: String,
29
+ outlined: Boolean,
30
+ rounded: Boolean,
31
+ })
33
32
 
34
- setup(props) {
35
- const avatarIcon = '<path d="M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z" />'
36
- const source = ref<string>()
37
- const initials = computed(() => {
38
- if (props.name) {
39
- const initials = props.name.match(/\b\w/g) || []
40
-
41
- return ((initials.shift() || '') + (initials.pop() || '')).toUpperCase()
42
- }
43
-
44
- return ''
45
- })
46
-
47
- watch(() => props.image, (src) => {
48
- if (!src) return
49
- const img = new Image()
50
-
51
- img.onload = () => { source.value = props.image }
52
- img.onerror = () => { }
53
- img.src = src
54
- }, {
55
- immediate: true,
56
- })
57
-
58
- const sizeClasses = computed(() => {
59
- if (props.size === 'xs') return 'h-6 w-6 text-xs'
60
- else if (props.size === 'sm') return 'h-9 w-9 text-sm'
61
- else if (props.size === 'lg') return 'h-12 w-12 text-lg'
62
- else if (props.size === 'xl') return 'h-[3.75rem] w-[3.75rem] text-xl'
63
-
64
- return 'h-10 w-10'
65
- })
33
+ const source = ref<string>()
34
+ const initials = computed(() => {
35
+ if (props.name) {
36
+ const initials = props.name.match(/\b\w/g) || []
66
37
 
67
- const css = useCSS('avatar')
68
- const colors = useColors()
69
- const styles = computed(() => {
70
- const color = colors.getPalette(props.color)
38
+ return ((initials.shift() || '') + (initials.pop() || '')).toUpperCase()
39
+ }
71
40
 
72
- if (source.value) return css.variables({
73
- bg: 'transparent',
74
- border: props.outlined ? color[500] : 'transparent',
75
- })
41
+ return ''
42
+ })
76
43
 
77
- return css.variables({
78
- bg: color[100],
79
- text: color[500],
80
- border: props.outlined ? color[500] : 'transparent',
81
- dark: {
82
- bg: color[200],
83
- },
84
- })
85
- })
44
+ watch(() => props.image, (src) => {
45
+ source.value = undefined
46
+ if (!src) return
47
+ const img = new Image()
86
48
 
87
- return {
88
- avatarIcon,
89
- source,
90
- initials,
91
- sizeClasses,
92
- styles,
93
- }
94
- },
49
+ img.onload = () => { source.value = props.image }
50
+ img.onerror = () => { }
51
+ img.src = src
52
+ }, {
53
+ immediate: true,
95
54
  })
55
+
56
+ const { styles, classes, className } = useTheme('avatar', theme, props, { source })
96
57
  </script>
97
58
 
98
59
  <template>
99
60
  <component
100
61
  :is="tag"
101
- class="relative inline-flex items-center justify-center overflow-hidden align-middle border box-content"
102
62
  :style="styles"
103
63
  :class="[
64
+ className,
104
65
  $style.avatar,
105
- sizeClasses,
106
- rounded ? 'rounded-full' : 'rounded-md'
66
+ classes.wrapper,
107
67
  ]"
108
68
  >
109
- <span
110
- v-if="!source && name"
111
- class="leading-none"
112
- >{{ initials }}</span>
113
- <slot v-else>
114
- <x-icon :size="size" :icon="avatarIcon"/>
115
- </slot>
116
69
  <img
117
70
  v-if="source"
118
71
  :alt="alt"
119
72
  :src="image"
120
73
  class="h-full w-full"
121
74
  />
75
+
76
+ <span
77
+ v-else-if="name"
78
+ class="leading-none"
79
+ >{{ initials }}</span>
80
+
81
+ <slot v-else-if="!name" name="avatarIcon">
82
+ <x-icon :size="size" :icon="avatarIcon"/>
83
+ </slot>
122
84
  </component>
123
85
  </template>
124
86
 
125
- <style lang="postcss" module scoped>
87
+ <style lang="postcss" module>
126
88
  .avatar {
127
89
  color: var(--x-avatar-text);
128
90
  background-color: var(--x-avatar-bg);
129
91
  border-color: var(--x-avatar-border);
130
92
 
131
- :global(.dark) & {
132
- color: var(--x-dark-avatar-text, var(--x-avatar-text));
133
- background-color: var(--x-dark-avatar-bg, var(--x-avatar-bg));
134
- border-color: var(--x-dark-avatar-border, var(--x-avatar-border));
93
+ :global(.dark) &, &:global(.dark) {
94
+ color: var(--x-avatar-dark-text, var(--x-avatar-text));
95
+ background-color: var(--x-avatar-dark-bg, var(--x-avatar-bg));
96
+ border-color: var(--x-avatar-dark-border, var(--x-avatar-border));
135
97
  }
136
98
  }
137
99
  </style>
@@ -0,0 +1,11 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import { mount } from '@vue/test-utils'
3
+ import Avatar from '../Avatar.vue'
4
+
5
+ describe('Avatar', () => {
6
+ it('renders without errors', () => {
7
+ const wrapper = mount(Avatar)
8
+
9
+ expect(wrapper.vm).toBeTruthy()
10
+ })
11
+ })
@@ -0,0 +1,13 @@
1
+ import type { ThemeParams } from '../../composables/theme'
2
+
3
+ export default {
4
+ classes: {
5
+ wrapper: 'inline-block',
6
+ },
7
+
8
+ styles({ props, colors, css }: ThemeParams) {
9
+ const color = colors.getPalette(props.color)
10
+
11
+ return css.get('bg', color[500])
12
+ },
13
+ }
@@ -1,87 +1,80 @@
1
1
  <script lang="ts">
2
- import { computed, defineComponent, type PropType } from 'vue'
3
- import { useCSS } from '../../composables/css'
2
+ export default { name: 'XBadge' }
3
+ </script>
4
+
5
+ <script setup lang="ts">
6
+ import { computed, useSlots, type PropType } from 'vue'
7
+ import { useTheme } from '../../composables/theme'
4
8
  import { useCommon } from '../../composables/common'
5
9
  import { useColors } from '../../composables/colors'
6
10
 
7
- export default defineComponent({
8
- name: 'XBadge',
11
+ import theme from './Badge.theme'
9
12
 
10
- props: {
11
- ...useCommon.props(),
12
- ...useColors.props('primary'),
13
- tag: {
14
- type: String,
15
- default: 'div',
16
- },
17
- position: {
18
- type: String as PropType<'top' | 'bottom'>,
19
- default: 'top',
20
- },
21
- align: {
22
- type: String as PropType<'left' | 'right'>,
23
- default: 'right',
24
- },
25
- offsetX: [Number, String],
26
- offsetY: [Number, String],
27
- animated: Boolean,
28
- outlined: Boolean,
29
- icon: String,
30
- show: {
31
- type: Boolean,
32
- default: true,
33
- },
13
+ const props = defineProps({
14
+ ...useCommon.props(),
15
+ ...useColors.props('primary'),
16
+ tag: {
17
+ type: String,
18
+ default: 'div',
34
19
  },
20
+ position: {
21
+ type: String as PropType<'top' | 'bottom'>,
22
+ default: 'top',
23
+ },
24
+ align: {
25
+ type: String as PropType<'left' | 'right'>,
26
+ default: 'right',
27
+ },
28
+ offsetX: [Number, String],
29
+ offsetY: [Number, String],
30
+ animated: Boolean,
31
+ outlined: Boolean,
32
+ icon: String,
33
+ show: {
34
+ type: Boolean,
35
+ default: true,
36
+ },
37
+ })
35
38
 
36
- setup(props, { slots }) {
37
- const css = useCSS('badge')
38
- const colors = useColors()
39
- const styles = computed(() => {
40
- const color = colors.getPalette(props.color)
41
-
42
- return css.get('bg', color[500])
43
- })
44
-
45
- const positionClasses = computed(() => {
46
- const classes = []
39
+ const slots = useSlots()
47
40
 
48
- if (props.position === 'top') classes.push('top-0')
49
- if (props.position === 'bottom') classes.push('bottom-0')
50
- if (props.align === 'left') classes.push('left-0')
51
- if (props.align === 'right') classes.push('right-0')
52
- if (slots.content) classes.push('-m-[7.5%]')
53
- else if (props.outlined) {
54
- classes.push('-m-[5%]')
55
- } else {
56
- classes.push('-m-[3.5%]')
57
- }
41
+ const positionClasses = computed(() => {
42
+ const classes = []
58
43
 
59
- return classes
60
- })
44
+ if (props.position === 'top') classes.push('top-0')
45
+ if (props.position === 'bottom') classes.push('bottom-0')
46
+ if (props.align === 'left') classes.push('left-0')
47
+ if (props.align === 'right') classes.push('right-0')
48
+ if (slots.content) classes.push('-m-[7.5%]')
49
+ else if (props.outlined) {
50
+ classes.push('-m-[5%]')
51
+ } else {
52
+ classes.push('-m-[3.5%]')
53
+ }
61
54
 
62
- const offsetStyle = computed(() => {
63
- const style: any = {}
55
+ return classes
56
+ })
64
57
 
65
- if (props.offsetX) style[props.align === 'left' ? 'marginLeft' : 'marginRight'] = props.offsetX + 'px'
66
- if (props.offsetY) style[props.position === 'top' ? 'marginTop' : 'marginBottom'] = props.offsetY + 'px'
58
+ const offsetStyle = computed(() => {
59
+ const style: any = {}
67
60
 
68
- return style
69
- })
61
+ if (props.offsetX) style[props.align === 'left' ? 'marginLeft' : 'marginRight'] = props.offsetX + 'px'
62
+ if (props.offsetY) style[props.position === 'top' ? 'marginTop' : 'marginBottom'] = props.offsetY + 'px'
70
63
 
71
- return {
72
- styles,
73
- offsetStyle,
74
- positionClasses,
75
- }
76
- },
64
+ return style
77
65
  })
66
+
67
+ const { styles, classes, className } = useTheme('badge', theme, props)
78
68
  </script>
79
69
 
80
70
  <template>
81
71
  <component
82
72
  :is="tag"
83
- class="inline-block"
84
73
  :style="styles"
74
+ :class="[
75
+ className,
76
+ classes.wrapper
77
+ ]"
85
78
  >
86
79
  <div class="relative inline-block">
87
80
  <slot></slot>
@@ -103,7 +96,7 @@ export default defineComponent({
103
96
  <div
104
97
  class="text-xs text-white overflow-hidden"
105
98
  :class="[
106
- $slots.content ? 'flex items-center justify-center min-w-[1.25rem] h-5 px-0.5' : {
99
+ $slots.content ? 'flex items-center justify-center min-w-[1.25rem] h-5 px-1.5' : {
107
100
  'p-1': size === 'xs',
108
101
  'p-[0.312rem]': size === 'sm',
109
102
  'p-1.5': !size || !['xs', 'sm', 'lg', 'xl'].includes(size),
@@ -0,0 +1,11 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import { mount } from '@vue/test-utils'
3
+ import Badge from '../Badge.vue'
4
+
5
+ describe('Badge', () => {
6
+ it('renders without errors', () => {
7
+ const wrapper = mount(Badge)
8
+
9
+ expect(wrapper.vm).toBeTruthy()
10
+ })
11
+ })
@@ -0,0 +1,9 @@
1
+ import type { ThemeParams } from '../../composables/theme'
2
+
3
+ export default {
4
+ classes: {
5
+ wrapper: 'flex items-center flex-wrap',
6
+ item: 'flex items-center',
7
+ lastItem: 'font-semibold',
8
+ },
9
+ }
@@ -1,5 +1,17 @@
1
1
  <script lang="ts">
2
- import { computed, defineComponent, type PropType } from 'vue'
2
+ export default { name: 'XBreadcrumbs' }
3
+ </script>
4
+
5
+ <script setup lang="ts">
6
+ import { computed, type PropType } from 'vue'
7
+ import { useTheme } from '../../composables/theme'
8
+ import { arrowRightIcon } from '../../common/icons'
9
+ import { useColors } from '../../composables/colors'
10
+
11
+ import XIcon from '../../components/icon/Icon.vue'
12
+ import XLink from '../../components/link/Link.vue'
13
+
14
+ import theme from './Breadcrumbs.theme'
3
15
 
4
16
  export type BreadcrumbItem = {
5
17
  label: string,
@@ -11,33 +23,31 @@ export type BreadcrumbItem = {
11
23
  underline?: boolean
12
24
  }
13
25
 
14
- export default defineComponent({
15
- name: 'XBreadcrumbs',
16
-
17
- props: {
18
- items: Array as PropType<Array<BreadcrumbItem>>,
19
- icon: String,
20
- color: String,
21
- shadow: Boolean,
22
- underline: Boolean,
26
+ const props = defineProps({
27
+ ...useColors.props(),
28
+ items: Array as PropType<Array<BreadcrumbItem>>,
29
+ icon: {
30
+ type: String,
31
+ default: arrowRightIcon,
23
32
  },
33
+ shadow: Boolean,
34
+ underline: Boolean,
35
+ })
24
36
 
25
- setup(props) {
26
- const arrowIcon = '<path d="M13 7l5 5m0 0l-5 5m5-5H6" />'
27
- const lastItem = computed(() => props.items && props.items.length > 0 ? props.items[props.items.length - 1] : undefined)
37
+ const lastItem = computed(() => props.items && props.items.length > 0 ? props.items[props.items.length - 1] : undefined)
28
38
 
29
- return {
30
- arrowIcon,
31
- lastItem,
32
- }
33
- },
34
- })
39
+ const { styles, classes, className } = useTheme('breadcrumbs', theme, props)
35
40
  </script>
36
41
 
37
42
  <template>
38
- <nav v-if="items && items.length > 0" aria-label="Breadcrumb">
39
- <ul class="flex items-center flex-wrap">
40
- <li v-for="(item, index) in items?.slice(0,-1)" :key="index" class="flex items-center">
43
+ <nav
44
+ v-if="items && items.length > 0"
45
+ aria-label="Breadcrumb"
46
+ :class="className"
47
+ :style="styles"
48
+ >
49
+ <ul :class="classes.wrapper">
50
+ <li v-for="(item, index) in items?.slice(0,-1)" :key="index" :class="classes.item">
41
51
  <x-link
42
52
  :to="item.to"
43
53
  :href="item.href"
@@ -49,9 +59,9 @@ export default defineComponent({
49
59
  <x-icon v-if="item.icon" :icon="item.icon" class="mr-1.5"/>
50
60
  {{ item.label }}
51
61
  </x-link>
52
- <x-icon :icon="icon || arrowIcon" class="text-gray-400 mx-1.5 shrink-0" size="sm" />
62
+ <x-icon :icon="icon" class="text-gray-400 mx-1.5" size="sm" />
53
63
  </li>
54
- <li v-if="lastItem" class="font-semibold">
64
+ <li v-if="lastItem" :class="classes.lastItem">
55
65
  <x-icon v-if="lastItem.icon" :icon="lastItem.icon" class="mr-1"/>
56
66
  {{ lastItem.label }}
57
67
  </li>
@@ -0,0 +1,11 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import { mount } from '@vue/test-utils'
3
+ import Breadcrumbs from '../Breadcrumbs.vue'
4
+
5
+ describe('Breadcrumbs', () => {
6
+ it('renders without errors', () => {
7
+ const wrapper = mount(Breadcrumbs)
8
+
9
+ expect(wrapper.vm).toBeTruthy()
10
+ })
11
+ })