@indielayer/ui 1.0.0-alpha.9 → 1.0.2

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 (293) hide show
  1. package/README.md +6 -3
  2. package/lib/common/icons.d.ts +15 -0
  3. package/lib/common/utils.d.ts +32 -0
  4. package/lib/components/alert/Alert.theme.d.ts +8 -0
  5. package/lib/components/alert/Alert.vue.d.ts +1 -12
  6. package/lib/components/alert/__tests__/Alert.spec.d.ts +1 -0
  7. package/lib/components/avatar/Avatar.theme.d.ts +8 -0
  8. package/lib/components/avatar/Avatar.vue.d.ts +5 -8
  9. package/lib/components/avatar/__tests__/Avatar.spec.d.ts +1 -0
  10. package/lib/components/badge/Badge.theme.d.ts +8 -0
  11. package/lib/components/badge/Badge.vue.d.ts +5 -6
  12. package/lib/components/badge/__tests__/Badge.spec.d.ts +1 -0
  13. package/lib/components/breadcrumbs/Breadcrumbs.theme.d.ts +8 -0
  14. package/lib/components/breadcrumbs/Breadcrumbs.vue.d.ts +19 -8
  15. package/lib/components/breadcrumbs/__tests__/Breadcrumbs.spec.d.ts +1 -0
  16. package/lib/components/button/Button.theme.d.ts +10 -0
  17. package/lib/components/button/Button.vue.d.ts +10 -16
  18. package/lib/components/button/ButtonGroup.theme.d.ts +6 -0
  19. package/lib/components/button/ButtonGroup.vue.d.ts +5 -2
  20. package/lib/components/button/__tests__/ Button.spec.d.ts +1 -0
  21. package/lib/components/button/__tests__/ ButtonGroup.spec.d.ts +1 -0
  22. package/lib/components/card/Card.theme.d.ts +7 -0
  23. package/lib/components/card/Card.vue.d.ts +2 -2
  24. package/lib/components/card/__tests__/Card.spec.d.ts +1 -0
  25. package/lib/components/checkbox/Checkbox.theme.d.ts +11 -0
  26. package/lib/components/checkbox/Checkbox.vue.d.ts +10 -14
  27. package/lib/components/checkbox/__tests__/Checkbox.spec.d.ts +1 -0
  28. package/lib/components/collapse/Collapse.theme.d.ts +9 -0
  29. package/lib/components/collapse/Collapse.vue.d.ts +12 -19
  30. package/lib/components/collapse/__tests__/Collapse.spec.d.ts +1 -0
  31. package/lib/components/container/Container.theme.d.ts +6 -0
  32. package/lib/components/container/Container.vue.d.ts +1 -1
  33. package/lib/components/container/__tests__/Container.spec.d.ts +1 -0
  34. package/lib/components/divider/Divider.theme.d.ts +9 -0
  35. package/lib/components/divider/Divider.vue.d.ts +1 -1
  36. package/lib/components/divider/__tests__/Divider.spec.d.ts +1 -0
  37. package/lib/components/drawer/Drawer.theme.d.ts +7 -0
  38. package/lib/components/drawer/Drawer.vue.d.ts +3 -15
  39. package/lib/components/drawer/__tests__/Drawer.spec.d.ts +1 -0
  40. package/lib/components/form/Form.theme.d.ts +6 -0
  41. package/lib/components/form/Form.vue.d.ts +9 -7
  42. package/lib/components/form/__tests__/Form.spec.d.ts +1 -0
  43. package/lib/components/helpers/InputError.d.ts +8 -0
  44. package/lib/components/icon/Icon.theme.d.ts +7 -0
  45. package/lib/components/icon/Icon.vue.d.ts +4 -8
  46. package/lib/components/icon/__tests__/Icon.spec.d.ts +1 -0
  47. package/lib/components/image/Image.theme.d.ts +6 -0
  48. package/lib/components/image/Image.vue.d.ts +1 -3
  49. package/lib/components/image/__tests__/Image.spec.d.ts +1 -0
  50. package/lib/components/index.d.ts +3 -3
  51. package/lib/components/input/Input.theme.d.ts +11 -0
  52. package/lib/components/input/Input.vue.d.ts +27 -25
  53. package/lib/components/input/__tests__/Input.spec.d.ts +1 -0
  54. package/lib/components/link/Link.theme.d.ts +8 -0
  55. package/lib/components/link/Link.vue.d.ts +3 -5
  56. package/lib/components/link/__tests__/Link.spec.d.ts +1 -0
  57. package/lib/components/menu/Menu.theme.d.ts +6 -0
  58. package/lib/components/menu/Menu.vue.d.ts +6 -3
  59. package/lib/components/menu/MenuItem.theme.d.ts +8 -0
  60. package/lib/components/menu/MenuItem.vue.d.ts +5 -30
  61. package/lib/components/menu/__tests__/Menu.spec.d.ts +1 -0
  62. package/lib/components/menu/__tests__/MenuItem.spec.d.ts +1 -0
  63. package/lib/components/modal/Modal.theme.d.ts +13 -0
  64. package/lib/components/modal/Modal.vue.d.ts +1 -6
  65. package/lib/components/modal/__tests__/Modal.spec.d.ts +1 -0
  66. package/lib/components/notifications/Notifications.theme.d.ts +8 -0
  67. package/lib/components/notifications/Notifications.vue.d.ts +11 -24
  68. package/lib/components/notifications/__tests__/Notifications.spec.d.ts +1 -0
  69. package/lib/components/pagination/Pagination.theme.d.ts +9 -0
  70. package/lib/components/pagination/Pagination.vue.d.ts +7 -16
  71. package/lib/components/pagination/PaginationItem.theme.d.ts +7 -0
  72. package/lib/components/pagination/PaginationItem.vue.d.ts +4 -3
  73. package/lib/components/pagination/__tests__/Pagination.spec.d.ts +1 -0
  74. package/lib/components/pagination/__tests__/PaginationItem.spec.d.ts +1 -0
  75. package/lib/components/popover/Popover.theme.d.ts +7 -0
  76. package/lib/components/popover/Popover.vue.d.ts +13 -13
  77. package/lib/components/popover/PopoverContainer.theme.d.ts +6 -0
  78. package/lib/components/popover/PopoverContainer.vue.d.ts +1 -1
  79. package/lib/components/popover/__tests__/Popover.spec.d.ts +1 -0
  80. package/lib/components/popover/__tests__/PopoverContainer.spec.d.ts +1 -0
  81. package/lib/components/progress/Progress.theme.d.ts +10 -0
  82. package/lib/components/progress/Progress.vue.d.ts +1 -3
  83. package/lib/components/progress/__tests__/Progress.spec.d.ts +1 -0
  84. package/lib/components/radio/Radio.theme.d.ts +12 -0
  85. package/lib/components/radio/Radio.vue.d.ts +12 -13
  86. package/lib/components/radio/__tests__/Radio.spec.d.ts +1 -0
  87. package/lib/components/scroll/Scroll.theme.d.ts +6 -0
  88. package/lib/components/scroll/Scroll.vue.d.ts +1 -7
  89. package/lib/components/scroll/__tests__/Scroll.spec.d.ts +1 -0
  90. package/lib/components/select/Select.theme.d.ts +13 -0
  91. package/lib/components/select/Select.vue.d.ts +8 -28
  92. package/lib/components/select/__tests__/Select.spec.d.ts +1 -0
  93. package/lib/components/skeleton/Skeleton.theme.d.ts +6 -0
  94. package/lib/components/skeleton/Skeleton.vue.d.ts +1 -1
  95. package/lib/components/skeleton/__tests__/Skeleton.spec.d.ts +1 -0
  96. package/lib/components/slider/Slider.theme.d.ts +10 -0
  97. package/lib/components/slider/Slider.vue.d.ts +8 -17
  98. package/lib/components/slider/__tests__/Slider.spec.d.ts +1 -0
  99. package/lib/components/spacer/Spacer.d.ts +2 -0
  100. package/lib/components/spacer/__tests__/Spacer.spec.d.ts +1 -0
  101. package/lib/components/spinner/Spinner.vue.d.ts +15 -6
  102. package/lib/components/spinner/__tests__/Spinner.spec.d.ts +1 -0
  103. package/lib/components/tab/Tab.theme.d.ts +9 -0
  104. package/lib/components/tab/Tab.vue.d.ts +4 -13
  105. package/lib/components/tab/TabGroup.theme.d.ts +10 -0
  106. package/lib/components/tab/TabGroup.vue.d.ts +4 -8
  107. package/lib/components/tab/__tests__/Tab.spec.d.ts +1 -0
  108. package/lib/components/tab/__tests__/TabGroup.spec.d.ts +1 -0
  109. package/lib/components/table/Table.theme.d.ts +8 -0
  110. package/lib/components/table/Table.vue.d.ts +6 -10
  111. package/lib/components/table/TableBody.d.ts +2 -0
  112. package/lib/components/table/TableCell.theme.d.ts +7 -0
  113. package/lib/components/table/TableCell.vue.d.ts +1 -1
  114. package/lib/components/table/TableHead.d.ts +2 -0
  115. package/lib/components/table/TableHeader.vue.d.ts +2 -2
  116. package/lib/components/table/TableRow.vue.d.ts +1 -1
  117. package/lib/components/table/__tests__/Table.spec.d.ts +1 -0
  118. package/lib/components/tag/Tag.theme.d.ts +9 -0
  119. package/lib/components/tag/Tag.vue.d.ts +5 -5
  120. package/lib/components/tag/__tests__/Tag.spec.d.ts +1 -0
  121. package/lib/components/textarea/Textarea.theme.d.ts +10 -0
  122. package/lib/components/textarea/Textarea.vue.d.ts +18 -24
  123. package/lib/components/textarea/__tests__/Textarea.spec.d.ts +1 -0
  124. package/lib/components/toggle/Toggle.theme.d.ts +11 -0
  125. package/lib/components/toggle/Toggle.vue.d.ts +10 -11
  126. package/lib/components/toggle/__tests__/Toggle.spec.d.ts +1 -0
  127. package/lib/components/tooltip/Tooltip.theme.d.ts +11 -0
  128. package/lib/components/tooltip/__tests__/Tooltip.spec.d.ts +1 -0
  129. package/lib/composables/colors-utils.d.ts +0 -1
  130. package/lib/composables/colors.d.ts +8 -4
  131. package/lib/composables/common.d.ts +1 -0
  132. package/lib/composables/css.d.ts +6 -5
  133. package/lib/composables/index.d.ts +1 -1
  134. package/lib/composables/inputtable.d.ts +1 -1
  135. package/lib/composables/interactive.d.ts +7 -2
  136. package/lib/composables/keys.d.ts +1 -0
  137. package/lib/composables/notifications.d.ts +1 -0
  138. package/lib/composables/theme.d.ts +20 -0
  139. package/lib/create.d.ts +3 -2
  140. package/lib/index.cjs.js +1 -15
  141. package/lib/index.es.js +4479 -3667
  142. package/lib/nuxt.js +2 -1
  143. package/lib/version.d.ts +1 -1
  144. package/package.json +16 -6
  145. package/src/common/icons.ts +15 -0
  146. package/src/common/utils.ts +68 -0
  147. package/src/components/alert/Alert.theme.ts +57 -0
  148. package/src/components/alert/Alert.vue +51 -127
  149. package/src/components/alert/__tests__/Alert.spec.ts +14 -0
  150. package/src/components/avatar/Avatar.theme.ts +39 -0
  151. package/src/components/avatar/Avatar.vue +61 -97
  152. package/src/components/avatar/__tests__/Avatar.spec.ts +11 -0
  153. package/src/components/badge/Badge.theme.ts +13 -0
  154. package/src/components/badge/Badge.vue +58 -65
  155. package/src/components/badge/__tests__/Badge.spec.ts +11 -0
  156. package/src/components/breadcrumbs/Breadcrumbs.theme.ts +9 -0
  157. package/src/components/breadcrumbs/Breadcrumbs.vue +34 -24
  158. package/src/components/breadcrumbs/__tests__/Breadcrumbs.spec.ts +11 -0
  159. package/src/components/button/Button.theme.ts +234 -0
  160. package/src/components/button/Button.vue +94 -356
  161. package/src/components/button/ButtonGroup.theme.ts +5 -0
  162. package/src/components/button/ButtonGroup.vue +30 -29
  163. package/src/components/button/__tests__/ Button.spec.ts +11 -0
  164. package/src/components/button/__tests__/ ButtonGroup.spec.ts +11 -0
  165. package/src/components/card/Card.theme.ts +7 -0
  166. package/src/components/card/Card.vue +18 -11
  167. package/src/components/card/__tests__/Card.spec.ts +11 -0
  168. package/src/components/checkbox/Checkbox.theme.ts +92 -0
  169. package/src/components/checkbox/Checkbox.vue +69 -156
  170. package/src/components/checkbox/__tests__/Checkbox.spec.ts +11 -0
  171. package/src/components/collapse/Collapse.theme.ts +11 -0
  172. package/src/components/collapse/Collapse.vue +99 -118
  173. package/src/components/collapse/__tests__/Collapse.spec.ts +11 -0
  174. package/src/components/container/Container.theme.ts +7 -0
  175. package/src/components/container/Container.vue +17 -9
  176. package/src/components/container/__tests__/Container.spec.ts +11 -0
  177. package/src/components/divider/Divider.theme.ts +11 -0
  178. package/src/components/divider/Divider.vue +22 -18
  179. package/src/components/divider/__tests__/Divider.spec.ts +11 -0
  180. package/src/components/drawer/Drawer.theme.ts +9 -0
  181. package/src/components/drawer/Drawer.vue +167 -179
  182. package/src/components/drawer/__tests__/Drawer.spec.ts +11 -0
  183. package/src/components/form/Form.theme.ts +7 -0
  184. package/src/components/form/Form.vue +90 -73
  185. package/src/components/form/__tests__/Form.spec.ts +11 -0
  186. package/src/components/helpers/InputError.tsx +14 -0
  187. package/src/components/icon/Icon.theme.ts +16 -0
  188. package/src/components/icon/Icon.vue +72 -88
  189. package/src/components/icon/__tests__/Icon.spec.ts +11 -0
  190. package/src/components/image/Image.theme.ts +7 -0
  191. package/src/components/image/Image.vue +22 -23
  192. package/src/components/image/__tests__/Image.spec.ts +11 -0
  193. package/src/components/index.ts +3 -3
  194. package/src/components/input/Input.theme.ts +44 -0
  195. package/src/components/input/Input.vue +97 -130
  196. package/src/components/input/__tests__/Input.spec.ts +11 -0
  197. package/src/components/link/Link.theme.ts +26 -0
  198. package/src/components/link/Link.vue +41 -66
  199. package/src/components/link/__tests__/Link.spec.ts +11 -0
  200. package/src/components/menu/Menu.theme.ts +7 -0
  201. package/src/components/menu/Menu.vue +54 -45
  202. package/src/components/menu/MenuItem.theme.ts +107 -0
  203. package/src/components/menu/MenuItem.vue +97 -199
  204. package/src/components/menu/__tests__/Menu.spec.ts +11 -0
  205. package/src/components/menu/__tests__/MenuItem.spec.ts +11 -0
  206. package/src/components/modal/Modal.theme.ts +29 -0
  207. package/src/components/modal/Modal.vue +78 -101
  208. package/src/components/modal/__tests__/Modal.spec.ts +11 -0
  209. package/src/components/notifications/Notifications.theme.ts +11 -0
  210. package/src/components/notifications/Notifications.vue +233 -249
  211. package/src/components/notifications/__tests__/Notifications.spec.ts +11 -0
  212. package/src/components/pagination/Pagination.theme.ts +27 -0
  213. package/src/components/pagination/Pagination.vue +142 -164
  214. package/src/components/pagination/PaginationItem.theme.ts +14 -0
  215. package/src/components/pagination/PaginationItem.vue +26 -33
  216. package/src/components/pagination/__tests__/Pagination.spec.ts +11 -0
  217. package/src/components/pagination/__tests__/PaginationItem.spec.ts +11 -0
  218. package/src/components/popover/Popover.theme.ts +9 -0
  219. package/src/components/popover/Popover.vue +153 -101
  220. package/src/components/popover/PopoverContainer.theme.ts +7 -0
  221. package/src/components/popover/PopoverContainer.vue +17 -9
  222. package/src/components/popover/__tests__/Popover.spec.ts +11 -0
  223. package/src/components/popover/__tests__/PopoverContainer.spec.ts +11 -0
  224. package/src/components/progress/Progress.theme.ts +26 -0
  225. package/src/components/progress/Progress.vue +29 -53
  226. package/src/components/progress/__tests__/Progress.spec.ts +11 -0
  227. package/src/components/radio/Radio.theme.ts +121 -0
  228. package/src/components/radio/Radio.vue +81 -158
  229. package/src/components/radio/__tests__/Radio.spec.ts +11 -0
  230. package/src/components/scroll/Scroll.theme.ts +7 -0
  231. package/src/components/scroll/Scroll.vue +34 -36
  232. package/src/components/scroll/__tests__/Scroll.spec.ts +11 -0
  233. package/src/components/select/Select.theme.ts +54 -0
  234. package/src/components/select/Select.vue +219 -273
  235. package/src/components/select/__tests__/Select.spec.ts +11 -0
  236. package/src/components/skeleton/Skeleton.theme.ts +7 -0
  237. package/src/components/skeleton/Skeleton.vue +17 -9
  238. package/src/components/skeleton/__tests__/Skeleton.spec.ts +11 -0
  239. package/src/components/slider/Slider.theme.ts +30 -0
  240. package/src/components/slider/Slider.vue +137 -168
  241. package/src/components/slider/__tests__/Slider.spec.ts +11 -0
  242. package/src/components/spacer/{Spacer.vue → Spacer.tsx} +3 -6
  243. package/src/components/spacer/__tests__/Spacer.spec.ts +11 -0
  244. package/src/components/spinner/Spinner.vue +10 -34
  245. package/src/components/spinner/__tests__/Spinner.spec.ts +11 -0
  246. package/src/components/tab/Tab.theme.ts +22 -0
  247. package/src/components/tab/Tab.vue +89 -93
  248. package/src/components/tab/TabGroup.theme.ts +43 -0
  249. package/src/components/tab/TabGroup.vue +94 -127
  250. package/src/components/tab/__tests__/Tab.spec.ts +11 -0
  251. package/src/components/tab/__tests__/TabGroup.spec.ts +11 -0
  252. package/src/components/table/Table.theme.ts +19 -0
  253. package/src/components/table/Table.vue +136 -147
  254. package/src/components/table/{TableBody.vue → TableBody.tsx} +3 -8
  255. package/src/components/table/TableCell.theme.ts +27 -0
  256. package/src/components/table/TableCell.vue +30 -58
  257. package/src/components/table/TableHead.tsx +14 -0
  258. package/src/components/table/TableHeader.vue +18 -20
  259. package/src/components/table/TableRow.vue +23 -20
  260. package/src/components/table/__tests__/Table.spec.ts +11 -0
  261. package/src/components/tag/Tag.theme.ts +32 -0
  262. package/src/components/tag/Tag.vue +40 -68
  263. package/src/components/tag/__tests__/Tag.spec.ts +11 -0
  264. package/src/components/textarea/Textarea.theme.ts +62 -0
  265. package/src/components/textarea/Textarea.vue +100 -115
  266. package/src/components/textarea/__tests__/Textarea.spec.ts +11 -0
  267. package/src/components/toggle/Toggle.theme.ts +51 -0
  268. package/src/components/toggle/Toggle.vue +51 -81
  269. package/src/components/toggle/__tests__/Toggle.spec.ts +11 -0
  270. package/src/components/tooltip/Tooltip.theme.ts +51 -0
  271. package/src/components/tooltip/Tooltip.vue +9 -14
  272. package/src/components/tooltip/__tests__/Tooltip.spec.ts +11 -0
  273. package/src/composables/colors-utils.ts +68 -68
  274. package/src/composables/colors.ts +18 -6
  275. package/src/composables/common.ts +1 -0
  276. package/src/composables/css.ts +7 -2
  277. package/src/composables/index.ts +1 -1
  278. package/src/composables/inputtable.ts +1 -1
  279. package/src/composables/interactive.ts +8 -4
  280. package/src/composables/keys.ts +1 -0
  281. package/src/composables/notifications.ts +10 -0
  282. package/src/composables/theme.ts +88 -0
  283. package/src/create.ts +8 -3
  284. package/src/exports/nuxt.js +2 -1
  285. package/src/version.ts +1 -1
  286. package/volar.d.ts +1 -0
  287. package/lib/components/spacer/Spacer.vue.d.ts +0 -2
  288. package/lib/components/table/TableBody.vue.d.ts +0 -2
  289. package/lib/components/table/TableHead.vue.d.ts +0 -2
  290. package/lib/composables/notification.d.ts +0 -1
  291. package/lib/style.css +0 -1
  292. package/src/components/table/TableHead.vue +0 -15
  293. 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
+ }