@indielayer/ui 1.0.0-alpha.7 → 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 +4453 -3651
  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 -247
  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 +9 -4
  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
@@ -0,0 +1,107 @@
1
+ import type { ThemeParams } from '../../composables/theme'
2
+
3
+ export default {
4
+ classes: {
5
+ wrapper: ({ props, data }: ThemeParams) => {
6
+ const classes: any[] = ['relative !flex items-center whitespace-nowrap px-3']
7
+
8
+ classes.push({
9
+ 'font-medium': data.isActive,
10
+ 'cursor-pointer': !props.disabled && !props.inactive,
11
+
12
+ // size
13
+ 'py-1 text-xs': props.size === 'xs',
14
+ 'py-2 text-sm': props.size === 'sm',
15
+ 'py-1.5': !props.size || !['xs', 'sm', 'lg', 'xl'].includes(props.size),
16
+ 'py-3': props.size === 'lg',
17
+ 'py-4 text-lg': props.size === 'xl',
18
+
19
+ 'rounded': props.rounded,
20
+ })
21
+
22
+ return classes
23
+ },
24
+ },
25
+
26
+ styles: ({ colors, props, css, data }: ThemeParams) => {
27
+ const color = colors.getPalette(props.color || 'gray')
28
+ const gray = colors.getPalette('gray')
29
+
30
+ if (props.disabled) return css.variables({
31
+ text: gray[300],
32
+ dark: {
33
+ text: gray[600],
34
+ },
35
+ })
36
+
37
+ if (props.filled) {
38
+ if (data.isActive) {
39
+ return css.variables({
40
+ bg: props.selected ? color[100] : color[50],
41
+ text: color[500],
42
+ hover: {
43
+ bg: props.selected ? color[100] : color[50],
44
+ text: color[500],
45
+ },
46
+ dark: {
47
+ bg: props.selected ? color[800] : color[700],
48
+ text: color[100],
49
+ hover: {
50
+ bg: props.selected ? color[800] : color[700],
51
+ text: color[100],
52
+ },
53
+ },
54
+ })
55
+ }
56
+
57
+ return css.variables({
58
+ bg: props.selected ? gray[50] : 'transparent',
59
+ text: gray[800],
60
+ hover: {
61
+ bg: gray[50],
62
+ text: gray[900],
63
+ },
64
+ dark: {
65
+ bg: props.selected ? gray[800] : 'transparent',
66
+ text: gray[200],
67
+ hover: {
68
+ bg: gray[800],
69
+ text: gray[100],
70
+ },
71
+ },
72
+ })
73
+ }
74
+
75
+ if (data.isActive) {
76
+ return css.variables({
77
+ text: color[500],
78
+ hover: {
79
+ text: color[500],
80
+ border: color[500],
81
+ },
82
+ dark: {
83
+ text: color[500],
84
+ hover: {
85
+ text: color[500],
86
+ border: color[500],
87
+ },
88
+ },
89
+ })
90
+ }
91
+
92
+ return css.variables({
93
+ text: gray[800],
94
+ hover: {
95
+ text: gray[900],
96
+ border: gray[300],
97
+ },
98
+ dark: {
99
+ text: gray[300],
100
+ hover: {
101
+ text: gray[200],
102
+ border: gray[800],
103
+ },
104
+ },
105
+ })
106
+ },
107
+ }
@@ -1,201 +1,110 @@
1
1
  <script lang="ts">
2
- import { defineComponent, ref, computed, watch, onMounted, onBeforeUnmount } from 'vue'
2
+ export default { name: 'XMenuItem' }
3
+ </script>
4
+
5
+ <script setup lang="ts">
6
+ import { ref, computed, watch, onMounted } from 'vue'
3
7
  import { useMutationObserver } from '@vueuse/core'
4
- import { useCSS } from '../../composables/css'
5
8
  import { useColors } from '../../composables/colors'
6
9
  import { useCommon } from '../../composables/common'
10
+ import { useTheme } from '../../composables/theme'
7
11
 
12
+ import XIcon from '../../components/icon/Icon.vue'
8
13
  import XSpinner from '../../components/spinner/Spinner.vue'
9
14
  import XLink from '../../components/link/Link.vue'
10
15
 
11
- export default defineComponent({
12
- name: 'XMenuItem',
16
+ import theme from './MenuItem.theme'
13
17
 
14
- components: {
15
- XSpinner,
16
- XLink,
18
+ const props = defineProps({
19
+ ...useCommon.props(),
20
+ ...useColors.props('primary'),
21
+ item: {
22
+ type: Object,
23
+ default: () => {},
17
24
  },
18
-
19
- props: {
20
- ...useCommon.props(),
21
- ...useColors.props('primary'),
22
- item: {
23
- type: Object,
24
- default: () => {},
25
- },
26
- active: Boolean,
27
- onClick: Function,
28
- inactive: Boolean,
29
- value: [Number,String],
30
- to: String,
31
- exact: Boolean,
32
- href: String,
33
- target: String,
34
- label: String,
35
- icon: String,
36
- iconRight: String,
37
- loading: Boolean,
38
- rounded: {
39
- type: Boolean,
40
- default: true,
41
- },
42
- filled: {
43
- type: Boolean,
44
- default: true,
45
- },
46
- selected: Boolean,
47
- disabled: Boolean,
25
+ active: Boolean,
26
+ onClick: Function,
27
+ inactive: Boolean,
28
+ value: [Number,String],
29
+ to: String,
30
+ exact: Boolean,
31
+ href: String,
32
+ target: String,
33
+ label: String,
34
+ icon: String,
35
+ iconRight: String,
36
+ loading: Boolean,
37
+ rounded: {
38
+ type: Boolean,
39
+ default: true,
48
40
  },
41
+ filled: {
42
+ type: Boolean,
43
+ default: true,
44
+ },
45
+ selected: Boolean,
46
+ disabled: Boolean,
47
+ })
49
48
 
50
- emits: ['active', 'click'],
51
-
52
- setup(props, { emit }) {
53
- const elRef = ref()
54
- const isActive = ref(false)
55
-
56
- const filled = computed(() => props.filled || props.item?.filled)
57
- const cItem = computed(() => ({
58
- ...props,
59
- ...props.item,
60
- }))
61
-
62
- const htmlTag = cItem.value.to || cItem.value.href ? 'x-link' : 'div'
63
-
64
- onMounted(() => {
65
- if (!elRef.value) return
49
+ const emit = defineEmits(['active', 'click'])
66
50
 
67
- check()
51
+ const elRef = ref()
52
+ const isActive = ref(false)
68
53
 
69
- if (htmlTag === 'x-link') useMutationObserver(elRef.value.$el, check, {
70
- attributes: true,
71
- attributeFilter: ['class'],
72
- })
73
- })
54
+ const cItem = computed(() => ({
55
+ ...props,
56
+ ...props.item,
57
+ }))
74
58
 
75
- function onItemClick(e: Event) {
76
- if (cItem.value.disabled) {
77
- e.stopPropagation()
78
- e.preventDefault()
59
+ const htmlTag = computed(() => cItem.value.to || cItem.value.href ? XLink : 'div')
79
60
 
80
- return
81
- }
61
+ onMounted(() => {
62
+ if (!elRef.value) return
82
63
 
83
- cItem.value.onClick && cItem.value.onClick(e)
84
- emit('click', e)
85
- }
64
+ check()
86
65
 
87
- function check() {
88
- if (elRef.value && elRef.value.$el && (cItem.value.href || cItem.value.to)) {
89
- const active = elRef.value.$el.classList.contains(cItem.value.exact ? 'router-link-exact-active' : 'router-link-active')
90
-
91
- isActive.value = active
92
- } else {
93
- isActive.value = cItem.value.active
94
- }
95
- }
66
+ if (htmlTag.value === XLink) useMutationObserver(elRef.value.$el, check, {
67
+ attributes: true,
68
+ attributeFilter: ['class'],
69
+ })
70
+ })
96
71
 
97
- watch(() => isActive.value, (val) => {
98
- if (val) emit('active')
99
- })
72
+ function onItemClick(e: Event) {
73
+ if (cItem.value.disabled) {
74
+ e.stopPropagation()
75
+ e.preventDefault()
100
76
 
101
- watch(() => cItem.value.active, (val) => {
102
- isActive.value = val
103
- })
77
+ return
78
+ }
104
79
 
105
- const css = useCSS()
106
- const colors = useColors()
107
- const cssVariables = computed(() => {
108
- const color = colors.getPalette(cItem.value.color || 'gray')
109
- const gray = colors.getPalette('gray')
80
+ cItem.value.onClick && cItem.value.onClick(e)
81
+ emit('click', e)
82
+ }
110
83
 
111
- if (cItem.value.disabled) return css.variables({
112
- text: gray[300],
113
- dark: {
114
- text: gray[600],
115
- },
116
- })
84
+ function check() {
85
+ if (elRef.value && elRef.value.$el && (cItem.value.href || cItem.value.to)) {
86
+ const active = elRef.value.$el.classList.contains(cItem.value.exact ? 'router-link-exact-active' : 'router-link-active') || false
117
87
 
118
- if (filled.value) {
119
- if (isActive.value) {
120
- return css.variables({
121
- bg: props.selected ? color[100] : color[50],
122
- text: color[500],
123
- hover: {
124
- bg: props.selected ? color[100] : color[50],
125
- text: color[500],
126
- },
127
- dark: {
128
- bg: props.selected ? color[800] : color[700],
129
- text: color[100],
130
- hover: {
131
- bg: props.selected ? color[800] : color[700],
132
- text: color[100],
133
- },
134
- },
135
- })
136
- }
88
+ isActive.value = active
89
+ } else {
90
+ isActive.value = cItem.value.active
91
+ }
92
+ }
137
93
 
138
- return css.variables({
139
- bg: props.selected ? gray[50] : 'transparent',
140
- text: gray[800],
141
- hover: {
142
- bg: gray[50],
143
- text: gray[900],
144
- },
145
- dark: {
146
- bg: props.selected ? gray[800] : 'transparent',
147
- text: gray[200],
148
- hover: {
149
- bg: gray[800],
150
- text: gray[100],
151
- },
152
- },
153
- })
154
- }
94
+ watch(() => isActive.value, (val) => {
95
+ if (val) emit('active')
96
+ })
155
97
 
156
- if (isActive.value) {
157
- return css.variables({
158
- text: color[500],
159
- hover: {
160
- text: color[500],
161
- border: color[500],
162
- },
163
- dark: {
164
- text: color[500],
165
- hover: {
166
- text: color[500],
167
- border: color[500],
168
- },
169
- },
170
- })
171
- }
98
+ watch(() => cItem.value.active, (val) => {
99
+ isActive.value = val
100
+ })
172
101
 
173
- return css.variables({
174
- text: gray[800],
175
- hover: {
176
- text: gray[900],
177
- border: gray[300],
178
- },
179
- dark: {
180
- text: gray[300],
181
- hover: {
182
- text: gray[200],
183
- border: gray[800],
184
- },
185
- },
186
- })
187
- })
102
+ const computedProps = computed(() => ({
103
+ ...cItem.value,
104
+ filled: props.filled || props.item?.filled,
105
+ }))
188
106
 
189
- return {
190
- elRef,
191
- cItem,
192
- htmlTag,
193
- isActive,
194
- cssVariables,
195
- onItemClick,
196
- }
197
- },
198
- })
107
+ const { styles, classes, className } = useTheme('menu-item', theme, computedProps, { isActive })
199
108
  </script>
200
109
 
201
110
  <template>
@@ -203,28 +112,17 @@ export default defineComponent({
203
112
  :is="htmlTag"
204
113
  ref="elRef"
205
114
  :to="cItem.to"
206
- :href="cItem.href"
207
115
  :target="cItem.target"
208
116
  :color="cItem.color"
209
- class="relative !flex items-center whitespace-nowrap px-3 mt-1"
210
- :style="cssVariables"
117
+ :style="styles"
211
118
  :class="[
119
+ className,
212
120
  $style['menu-item'],
213
121
  [isActive ? $style['menu-item--active'] : ''],
122
+ classes.wrapper,
214
123
  {
215
- 'font-medium': isActive,
216
- 'flex items-center': $slots.prefix || $slots.suffix,
217
- 'cursor-pointer': !cItem.disabled && !inactive,
218
-
219
- // size
220
- 'py-1 text-xs': cItem.size === 'xs',
221
- 'py-2 text-sm': cItem.size === 'sm',
222
- 'py-1.5': !cItem.size || !['xs', 'sm', 'lg', 'xl'].includes(cItem.size),
223
- 'py-3': cItem.size === 'lg',
224
- 'py-4 text-lg': cItem.size === 'xl',
225
-
226
- 'rounded my-[1px]': rounded
227
- },
124
+ 'flex items-center': $slots.prefix || $slots.suffix
125
+ }
228
126
  ]"
229
127
  :title="cItem.label"
230
128
  :alt="cItem.label"
@@ -233,7 +131,7 @@ export default defineComponent({
233
131
  <span v-if="$slots.prefix" class="mr-2 shrink-0">
234
132
  <slot name="prefix"></slot>
235
133
  </span>
236
- <x-icon v-else-if="cItem.icon" :size="cItem.size" :icon="cItem.icon" class="mr-2 shrink-0"/>
134
+ <x-icon v-else-if="cItem.icon" :size="cItem.size" :icon="cItem.icon" class="mr-2"/>
237
135
 
238
136
  <span class="flex-1 truncate">
239
137
  <slot>{{ cItem.label }}</slot>
@@ -252,9 +150,9 @@ export default defineComponent({
252
150
  </template>
253
151
 
254
152
  <style lang="postcss" module scoped>
255
- .menu-item {
256
- color: var(--x-text);
257
- background-color: var(--x-bg);
153
+ .menu-item, .menu-item.x-link {
154
+ color: var(--x-menu-item-text);
155
+ background-color: var(--x-menu-item-bg);
258
156
 
259
157
  &:before {
260
158
  content: '';
@@ -266,16 +164,16 @@ export default defineComponent({
266
164
  }
267
165
 
268
166
  &:hover {
269
- color: var(--x-text-hover, var(--x-text));
270
- background-color: var(--x-bg-hover, var(--x-bg));
167
+ color: var(--x-menu-item-text-hover, var(--x-menu-item-text));
168
+ background-color: var(--x-menu-item-bg-hover, var(--x-menu-item-bg));
271
169
  }
272
170
 
273
- :global(.dark) & {
274
- color: var(--x-dark-text);
275
- background: var(--x-dark-bg);
171
+ :global(.dark) &, &:global(.dark) {
172
+ color: var(--x-menu-item-dark-text);
173
+ background: var(--x-menu-item-dark-bg);
276
174
  &:hover {
277
- color: var(--x-dark-text-hover, var(--x-dark-text));
278
- background-color: var(--x-dark-bg-hover, var(--x-dark-bg));
175
+ color: var(--x-menu-item-dark-text-hover, var(--x-menu-item-dark-text));
176
+ background-color: var(--x-menu-item-dark-bg-hover, var(--x-menu-item-dark-bg));
279
177
  }
280
178
  }
281
179
  }
@@ -283,7 +181,7 @@ export default defineComponent({
283
181
  :global(.x-menu-inner) {
284
182
  .menu-item {
285
183
  &:hover:before, &--active:before {
286
- background-color: var(--x-border-hover);
184
+ background-color: var(--x-menu-item-border-hover);
287
185
  }
288
186
  }
289
187
  }
@@ -0,0 +1,11 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import { mount } from '@vue/test-utils'
3
+ import Menu from '../Menu.vue'
4
+
5
+ describe('Menu', () => {
6
+ it('renders without errors', () => {
7
+ const wrapper = mount(Menu)
8
+
9
+ expect(wrapper.vm).toBeTruthy()
10
+ })
11
+ })
@@ -0,0 +1,11 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import { mount } from '@vue/test-utils'
3
+ import MenuItem from '../MenuItem.vue'
4
+
5
+ describe('MenuItem', () => {
6
+ it('renders without errors', () => {
7
+ const wrapper = mount(MenuItem)
8
+
9
+ expect(wrapper.vm).toBeTruthy()
10
+ })
11
+ })
@@ -0,0 +1,29 @@
1
+ import type { ThemeParams } from '../../composables/theme'
2
+
3
+ export default {
4
+ classes: {
5
+ wrapper: 'fixed z-40 inset-0 overflow-y-auto transition-all',
6
+
7
+ backdrop: 'fixed inset-0 bg-gray-500 dark:bg-black transition-opacity',
8
+
9
+ modal: ({ props }: ThemeParams) => {
10
+ let c = 'relative flex flex-col z-10 bg-white dark:bg-gray-900 rounded-md shadow-lg transform transition-all overflow-hidden max-h-full w-full'
11
+
12
+ if (props.size === 'xs') c += ' sm:max-w-xs'
13
+ else if (props.size === 'sm') c += ' sm:max-w-sm'
14
+ else if (props.size === 'lg') c += ' sm:max-w-xl'
15
+ else if (props.size === 'xl') c += ' sm:max-w-3xl'
16
+ else c += ' sm:max-w-lg'
17
+
18
+ return c
19
+ },
20
+
21
+ closeIcon: 'flex absolute p-1 top-4 z-10 right-4 rounded-full bg-opacity-10 hover:bg-opacity-30 cursor-pointer',
22
+
23
+ header: 'text-lg font-semibold px-6 py-4 border-b',
24
+
25
+ content: 'px-6 py-4',
26
+
27
+ actions: 'bg-slate-50 dark:bg-gray-800 p-4',
28
+ },
29
+ }