@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
@@ -1,174 +1,163 @@
1
1
  <script lang="ts">
2
- import { defineComponent, type PropType } from 'vue'
2
+ export default { name: 'XTable' }
3
+ </script>
4
+
5
+ <script setup lang="ts">
6
+ import type { PropType } from 'vue'
7
+ import { useTheme } from '../../composables/theme'
3
8
 
4
- import TableHead from './TableHead.vue'
5
- import TableHeader, { type Sort, type Align } from './TableHeader.vue'
6
- import TableBody from './TableBody.vue'
7
- import TableRow from './TableRow.vue'
8
- import TableCell from './TableCell.vue'
9
+ import XTableHead from './TableHead'
10
+ import XTableHeader, { type Sort, type Align } from './TableHeader.vue'
11
+ import XTableBody from './TableBody'
12
+ import XTableRow from './TableRow.vue'
13
+ import XTableCell from './TableCell.vue'
9
14
  import XSpinner from '../spinner/Spinner.vue'
10
15
 
16
+ import theme from './Table.theme'
17
+
11
18
  export type Header = {
12
- sortable?: boolean,
13
- sort?: string[],
14
- align?: Align,
15
- value: string,
16
- text: string,
17
- width: string | number
19
+ sortable?: boolean
20
+ sort?: string[]
21
+ align?: Align
22
+ value?: string
23
+ text?: string
24
+ width?: string | number
18
25
  }
19
26
 
20
- export default defineComponent({
21
- name: 'XTable',
22
-
23
- components: {
24
- TableHead,
25
- TableHeader,
26
- TableBody,
27
- TableRow,
28
- TableCell,
29
- XSpinner,
27
+ const props = defineProps({
28
+ headers: {
29
+ type: Array as PropType<Array<Header>>,
30
+ default: () => [],
30
31
  },
31
-
32
- props: {
33
- headers: {
34
- type: Array as PropType<Array<Header>>,
35
- default: () => [],
36
- },
37
- items: {
38
- type: Array,
39
- default: () => [],
40
- },
41
- sort: {
42
- type: Array as PropType<Array<string>>,
43
- default: () => [],
44
- },
45
- loading: Boolean,
46
- dense: Boolean,
47
- fixed: Boolean,
48
- striped: Boolean,
49
- pointer: Boolean,
50
- scrollable: {
51
- type: Boolean,
52
- default: true,
53
- },
54
- stickyHeader: {
55
- type: Boolean,
56
- default: true,
57
- },
32
+ items: {
33
+ type: Array,
34
+ default: () => [],
35
+ },
36
+ sort: {
37
+ type: Array as PropType<Array<string>>,
38
+ default: () => [],
39
+ },
40
+ loading: Boolean,
41
+ dense: Boolean,
42
+ fixed: Boolean,
43
+ striped: Boolean,
44
+ pointer: Boolean,
45
+ scrollable: {
46
+ type: Boolean,
47
+ default: true,
58
48
  },
49
+ stickyHeader: {
50
+ type: Boolean,
51
+ default: true,
52
+ },
53
+ })
59
54
 
60
- emits: ['update:sort', 'click-row'],
55
+ const emit = defineEmits(['update:sort', 'click-row'])
61
56
 
62
- setup(props, { emit }) {
63
- function getSort(headerValue: string, sort: string[]): Sort {
64
- for (let i = 0; i < sort.length; i++) {
65
- const { 0: value, 1: order } = sort[i].split(',')
57
+ function getSort(headerValue: string | undefined, sort: string[]): Sort {
58
+ if (!headerValue) return undefined
66
59
 
67
- if (headerValue === value) {
68
- if (parseInt(order) > 0) return 1
69
- else return -1
70
- }
71
- }
60
+ for (let i = 0; i < sort.length; i++) {
61
+ const { 0: value, 1: order } = sort[i].split(',')
72
62
 
73
- return undefined
63
+ if (headerValue === value) {
64
+ if (parseInt(order) > 0) return 1
65
+ else return -1
74
66
  }
67
+ }
75
68
 
76
- function sortHeader(header: Header) {
77
- // update sort array
78
- const sort = props.sort.slice(0)
79
- let exists = false
80
-
81
- for (let i = 0; i < sort.length; i++) {
82
- const { 0: value, 1: order } = sort[i].split(',')
83
-
84
- if (value === header.value) {
85
- exists = true
86
-
87
- if (order === '-1') {
88
- // update position to 1
89
- sort.splice(i, 1, `${header.value},1`)
90
- break
91
- } else if (order === '1') {
92
- // delete position
93
- sort.splice(i, 1)
94
- break
95
- }
96
- }
69
+ return undefined
70
+ }
71
+
72
+ function sortHeader(header: Header) {
73
+ // update sort array
74
+ const sort = props.sort.slice(0)
75
+ let exists = false
76
+
77
+ for (let i = 0; i < sort.length; i++) {
78
+ const { 0: value, 1: order } = sort[i].split(',')
79
+
80
+ if (value === header.value) {
81
+ exists = true
82
+
83
+ if (order === '-1') {
84
+ // update position to 1
85
+ sort.splice(i, 1, `${header.value},1`)
86
+ break
87
+ } else if (order === '1') {
88
+ // delete position
89
+ sort.splice(i, 1)
90
+ break
97
91
  }
92
+ }
93
+ }
98
94
 
99
- if (!exists) sort.push(`${header.value},-1`)
95
+ if (!exists) sort.push(`${header.value},-1`)
100
96
 
101
- emit('update:sort', sort)
102
- }
97
+ emit('update:sort', sort)
98
+ }
103
99
 
104
- function getValue(item: any, path: string | string[]) {
105
- if (!path) return ''
106
- const pathArray = Array.isArray(path) ? path : path.match(/([^[.\]])+/g)
107
- const result = pathArray?.reduce((prevObj: any, key: string) => prevObj && prevObj[key], item)
100
+ function getValue(item: any, path: string | string[] | undefined) {
101
+ if (!path) return ''
102
+ const pathArray = Array.isArray(path) ? path : path.match(/([^[.\]])+/g)
103
+ const result = pathArray?.reduce((prevObj: any, key: string) => prevObj && prevObj[key], item)
108
104
 
109
- return result ?? ''
110
- }
105
+ return result ?? ''
106
+ }
111
107
 
112
- return {
113
- getSort,
114
- getValue,
115
- sortHeader,
116
- }
117
- },
118
- })
108
+ const { styles, classes, className } = useTheme('table', theme, props)
119
109
  </script>
120
110
 
121
111
  <template>
122
- <table
123
- class="w-full relative"
124
- :class="[
125
- {
126
- 'overflow-x-scroll sm:overflow-x-auto whitespace-wrap sm:whitespace-normal block sm:table': scrollable,
127
- 'relative': stickyHeader,
128
- 'table-fixed': fixed,
129
- }
130
- ]"
131
- >
132
- <table-head>
133
- <table-header
134
- v-for="(header, index) in headers"
135
- :key="index"
136
- :sticky-header="stickyHeader"
137
- :text-align="header.align"
138
- :sort="getSort(header.value, sort)"
139
- :sortable="header.sortable"
140
- :width="header.width"
141
- @click="header.sortable ? sortHeader(header) : null"
142
- >
143
- {{ header.text }}
144
- </table-header>
145
- </table-head>
146
- <table-body>
147
- <table-row
148
- v-for="(item, index) in items"
149
- :key="index"
150
- :pointer="pointer"
151
- :striped="striped"
152
- @click="$emit('click-row', item)"
153
- >
154
- <table-cell
155
- v-for="(header, index2) in headers"
156
- :key="index2"
112
+ <div class="w-full overflow-x-auto">
113
+ <table
114
+ :style="styles"
115
+ :class="[
116
+ className,
117
+ classes.wrapper,
118
+ ]"
119
+ >
120
+ <x-table-head>
121
+ <x-table-header
122
+ v-for="(header, index) in headers"
123
+ :key="index"
124
+ :sticky-header="stickyHeader"
157
125
  :text-align="header.align"
158
- :dense="dense"
159
- :fixed="fixed"
126
+ :sort="getSort(header.value, sort)"
127
+ :sortable="header.sortable"
128
+ :width="header.width"
129
+ @click="header.sortable ? sortHeader(header) : null"
160
130
  >
161
- <slot :name="`item-${header.value}`" :item="item">
162
- {{ getValue(item, header.value) }}
163
- </slot>
164
- </table-cell>
165
- </table-row>
166
- </table-body>
167
- <div
168
- v-if="loading"
169
- class="absolute inset-0 flex items-center justify-center z-40 bg-gray-300 dark:bg-gray-600 rounded opacity-50"
170
- >
171
- <x-spinner size="lg"/>
172
- </div>
173
- </table>
131
+ {{ header.text }}
132
+ </x-table-header>
133
+ </x-table-head>
134
+ <x-table-body>
135
+ <x-table-row
136
+ v-for="(item, index) in items"
137
+ :key="index"
138
+ :pointer="pointer"
139
+ :striped="striped"
140
+ @click="$emit('click-row', item)"
141
+ >
142
+ <x-table-cell
143
+ v-for="(header, index2) in headers"
144
+ :key="index2"
145
+ :text-align="header.align"
146
+ :dense="dense"
147
+ :fixed="fixed"
148
+ >
149
+ <slot :name="`item-${header.value}`" :item="item">
150
+ {{ getValue(item, header.value) }}
151
+ </slot>
152
+ </x-table-cell>
153
+ </x-table-row>
154
+ </x-table-body>
155
+ <div
156
+ v-if="loading"
157
+ :class="classes.loadingWrapper"
158
+ >
159
+ <x-spinner size="lg"/>
160
+ </div>
161
+ </table>
162
+ </div>
174
163
  </template>
@@ -1,13 +1,8 @@
1
- <script lang="ts">
2
1
  import { defineComponent } from 'vue'
3
2
 
4
3
  export default defineComponent({
5
4
  name: 'XTableBody',
5
+ setup(props, { slots }) {
6
+ return () => <tbody>{slots.default?.()}</tbody>
7
+ },
6
8
  })
7
- </script>
8
-
9
- <template>
10
- <tbody>
11
- <slot></slot>
12
- </tbody>
13
- </template>
@@ -0,0 +1,27 @@
1
+ import type { ThemeParams } from '../../composables/theme'
2
+
3
+ export default {
4
+ classes: {
5
+ wrapper: ({ props }: ThemeParams) => {
6
+ const c = ['last:pr-0 px-3']
7
+
8
+ c.push(props.dense ? 'py-2' : 'py-4')
9
+
10
+ if (props.textAlign === 'left') c.push('text-left')
11
+ else if (props.textAlign === 'center') c.push('text-center')
12
+ else if (props.textAlign === 'right') c.push('text-right')
13
+ else if (props.textAlign === 'justify') c.push('text-justify')
14
+
15
+ if (props.verticalAlign === 'baseline') c.push('align-baseline')
16
+ else if (props.verticalAlign === 'bottom') c.push('align-bottom')
17
+ else if (props.verticalAlign === 'middle') c.push('align-middle')
18
+ else if (props.verticalAlign === 'text-bottom') c.push('align-text-bottom')
19
+ else if (props.verticalAlign === 'text-top') c.push('align-text-top')
20
+ else if (props.verticalAlign === 'top') c.push('align-top')
21
+
22
+ if (props.truncate && props.fixed) c.push('truncate')
23
+
24
+ return c
25
+ },
26
+ },
27
+ }
@@ -1,76 +1,48 @@
1
1
  <script lang="ts">
2
- import { defineComponent } from 'vue'
3
-
4
2
  const validators = {
5
- textAlign: [
6
- null,
7
- 'left',
8
- 'center',
9
- 'right',
10
- 'justify',
11
- ],
12
- verticalAlign: [
13
- null,
14
- 'baseline',
15
- 'bottom',
16
- 'middle',
17
- 'text-bottom',
18
- 'text-top',
19
- 'top',
20
- ],
3
+ textAlign: [null,'left','center','right','justify'],
4
+ verticalAlign: [null,'baseline','bottom','middle','text-bottom','text-top','top'],
21
5
  }
22
6
 
23
- export default defineComponent({
7
+ export default {
24
8
  name: 'XTableCell',
25
-
26
9
  validators,
10
+ }
11
+ </script>
27
12
 
28
- props: {
29
- textAlign: {
30
- type: String,
31
- validator: (value: string) => validators.textAlign.includes(value),
32
- },
33
- truncate: Boolean,
34
- dense: Boolean,
35
- fixed: Boolean,
36
- verticalAlign: {
37
- type: String,
38
- default: 'middle',
39
- validator: (value: string) => validators.verticalAlign.includes(value),
40
- },
41
- },
13
+ <script setup lang="ts">
14
+ import { useTheme } from '../../composables/theme'
42
15
 
43
- setup(props) {
44
- if (props.truncate && !props.fixed) {
45
- console.warn('Table must have "fixed" property set to true when using TableCell "truncate" property')
46
- }
16
+ import theme from './TableCell.theme'
17
+
18
+ const props = defineProps({
19
+ textAlign: {
20
+ type: String,
21
+ validator: (value: string) => validators.textAlign.includes(value),
22
+ },
23
+ truncate: Boolean,
24
+ dense: Boolean,
25
+ fixed: Boolean,
26
+ verticalAlign: {
27
+ type: String,
28
+ default: 'middle',
29
+ validator: (value: string) => validators.verticalAlign.includes(value),
47
30
  },
48
31
  })
32
+
33
+ if (props.truncate && !props.fixed) {
34
+ console.warn('Table must have "fixed" property set to true when using TableCell "truncate" property')
35
+ }
36
+
37
+ const { styles, classes, className } = useTheme('table-cell', theme, props)
49
38
  </script>
50
39
 
51
40
  <template>
52
41
  <td
53
- class="last:pr-0 px-3"
42
+ :style="styles"
54
43
  :class="[
55
- {
56
- // density
57
- 'py-2': dense,
58
- 'py-4': !dense,
59
- // text-align
60
- 'text-left': textAlign === 'left',
61
- 'text-center': textAlign === 'center',
62
- 'text-right': textAlign === 'right',
63
- 'text-justify': textAlign === 'justify',
64
- // vertical-align
65
- 'align-baseline': verticalAlign === 'baseline',
66
- 'align-bottom': verticalAlign === 'bottom',
67
- 'align-middle': verticalAlign === 'middle',
68
- 'align-text-bottom': verticalAlign === 'text-bottom',
69
- 'align-text-top': verticalAlign === 'text-top',
70
- 'align-top': verticalAlign === 'top',
71
- // truncate
72
- 'truncate': truncate && fixed,
73
- },
44
+ className,
45
+ classes.wrapper,
74
46
  ]"
75
47
  >
76
48
  <slot></slot>
@@ -0,0 +1,14 @@
1
+ import { defineComponent } from 'vue'
2
+
3
+ export default defineComponent({
4
+ name: 'XTableHead',
5
+ setup(props, { slots }) {
6
+ return () => (
7
+ <thead class="align-bottom">
8
+ <tr class="text-sm text-gray-600 dark:text-gray-400 border-b">
9
+ {slots.default?.()}
10
+ </tr>
11
+ </thead>
12
+ )
13
+ },
14
+ })
@@ -1,32 +1,30 @@
1
1
  <script lang="ts">
2
- import { defineComponent, type PropType } from 'vue'
3
-
4
- export type Sort = 1 | -1 | undefined
5
- export type Align = 'left' | 'center' | 'right' | 'justify' | undefined
6
-
7
2
  const validators = {
8
3
  sort: [1,-1],
9
4
  textAlign: ['left','center','right','justify'],
10
5
  }
11
6
 
12
- export default defineComponent({
13
- name: 'XTableHeader',
7
+ export default { name: 'XTableHeader', validators }
8
+ </script>
14
9
 
15
- validators,
10
+ <script setup lang="ts">
11
+ import type { PropType } from 'vue'
16
12
 
17
- props: {
18
- sort: {
19
- type: Number as PropType<Sort>,
20
- validator: (value: number) => validators.sort.includes(value),
21
- },
22
- sortable: Boolean,
23
- textAlign: {
24
- type: String as PropType<Align>,
25
- default: 'left',
26
- validator: (value: string) => validators.textAlign.includes(value),
27
- },
28
- stickyHeader: Boolean,
13
+ export type Sort = 1 | -1 | undefined
14
+ export type Align = 'left' | 'center' | 'right' | 'justify' | undefined
15
+
16
+ const props = defineProps({
17
+ sort: {
18
+ type: Number as PropType<Sort>,
19
+ validator: (value: number) => validators.sort.includes(value),
20
+ },
21
+ sortable: Boolean,
22
+ textAlign: {
23
+ type: String as PropType<Align>,
24
+ default: 'left',
25
+ validator: (value: string) => validators.textAlign.includes(value),
29
26
  },
27
+ stickyHeader: Boolean,
30
28
  })
31
29
  </script>
32
30
 
@@ -1,25 +1,34 @@
1
1
  <script lang="ts">
2
- import { defineComponent, type PropType } from 'vue'
3
-
4
2
  const validators = {
5
3
  verticalAlign: ['baseline','bottom','middle','text-bottom','text-top','top'],
6
4
  }
7
5
 
8
- export default defineComponent({
9
- name: 'XTableRow',
6
+ export default { name: 'XTableRow', validators }
7
+ </script>
10
8
 
11
- validators,
9
+ <script setup lang="ts">
10
+ import { computed, type PropType } from 'vue'
12
11
 
13
- props: {
14
- pointer: Boolean,
15
- striped: Boolean,
16
- verticalAlign: {
17
- type: String as PropType<'baseline' | 'bottom' | 'middle' | 'text-bottom' | 'text-top' | 'top'>,
18
- default: 'top',
19
- validator: (value: string) => validators.verticalAlign.includes(value),
20
- },
12
+ const props = defineProps({
13
+ pointer: Boolean,
14
+ striped: Boolean,
15
+ verticalAlign: {
16
+ type: String as PropType<'baseline' | 'bottom' | 'middle' | 'text-bottom' | 'text-top' | 'top'>,
17
+ default: 'top',
18
+ validator: (value: string) => validators.verticalAlign.includes(value),
21
19
  },
22
20
  })
21
+
22
+ const alignClass = computed(() => {
23
+ if (props.verticalAlign === 'baseline') return 'align-baseline'
24
+ else if (props.verticalAlign === 'bottom') return 'align-bottom'
25
+ else if (props.verticalAlign === 'middle') return 'align-middle'
26
+ else if (props.verticalAlign === 'text-bottom') return 'align-text-bottom'
27
+ else if (props.verticalAlign === 'text-top') return 'align-text-top'
28
+ else if (props.verticalAlign === 'top') return 'align-top'
29
+
30
+ return ''
31
+ })
23
32
  </script>
24
33
 
25
34
  <template>
@@ -28,14 +37,8 @@ export default defineComponent({
28
37
  striped ? 'odd:bg-gray-50 dark:odd:bg-gray-800' : 'border-b border-gray-200 dark:border-gray-700',
29
38
  {
30
39
  'hover:bg-gray-50 dark:hover:bg-gray-700 cursor-pointer': pointer,
31
- // vertical-align
32
- 'align-baseline': verticalAlign === 'baseline',
33
- 'align-bottom': verticalAlign === 'bottom',
34
- 'align-middle': verticalAlign === 'middle',
35
- 'align-text-bottom': verticalAlign === 'text-bottom',
36
- 'align-text-top': verticalAlign === 'text-top',
37
- 'align-top': verticalAlign === 'top',
38
40
  },
41
+ alignClass
39
42
  ]"
40
43
  >
41
44
  <slot></slot>
@@ -0,0 +1,11 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import { mount } from '@vue/test-utils'
3
+ import Table from '../Table.vue'
4
+
5
+ describe('Table', () => {
6
+ it('renders without errors', () => {
7
+ const wrapper = mount(Table)
8
+
9
+ expect(wrapper.vm).toBeTruthy()
10
+ })
11
+ })
@@ -0,0 +1,32 @@
1
+ import type { ThemeParams } from '../../composables/theme'
2
+
3
+ export default {
4
+ classes: {
5
+ wrapper: ({ props, data }: ThemeParams) => {
6
+ let c = 'inline-flex items-center leading-none max-w-full'
7
+
8
+ if (props.size === 'xs') c += ' px-2 py-1 text-xs'
9
+ else if (props.size === 'sm') c += ' px-2 py-1 text-sm'
10
+ else if (props.size === 'lg') c += ' px-4 py-3 text-lg'
11
+ else if (props.size === 'xl') c += ' px-6 py-6 text-xl'
12
+ else c += ' px-3 py-2'
13
+
14
+ return c
15
+ },
16
+
17
+ loadingWrapper: 'absolute inset-0 flex items-center justify-center z-40 bg-gray-300 dark:bg-gray-600 rounded opacity-50',
18
+ },
19
+
20
+ styles: ({ colors, props, css }: ThemeParams) => {
21
+ const color = colors.getPalette(props.color)
22
+
23
+ return css.variables({
24
+ bg: color[100],
25
+ text: color[800],
26
+ border: color[800],
27
+ dark: {
28
+ text: props.outlined ? color[200] : color[800],
29
+ },
30
+ })
31
+ },
32
+ }