@indielayer/ui 0.0.0-dev-20240125104319 → 0.0.0-dev-20240129122517

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 (94) hide show
  1. package/lib/common/icons.d.ts +2 -1
  2. package/lib/common/icons.js +3 -2
  3. package/lib/components/icon/theme/Icon.carbon.theme.js +7 -4
  4. package/lib/components/index.js +1 -1
  5. package/lib/components/link/Link.vue.js +2 -2
  6. package/lib/components/link/Link.vue2.js +1 -1
  7. package/lib/components/link/theme/Link.base.theme.js +4 -4
  8. package/lib/components/link/theme/Link.carbon.theme.js +23 -3
  9. package/lib/components/menu/MenuItem.vue.js +2 -2
  10. package/lib/components/menu/MenuItem.vue2.js +1 -1
  11. package/lib/components/select/Select.vue.js +49 -47
  12. package/lib/components/select/theme/Select.base.theme.js +10 -10
  13. package/lib/components/select/theme/Select.carbon.theme.js +4 -4
  14. package/lib/components/skeleton/Skeleton.vue.d.ts +19 -1
  15. package/lib/components/skeleton/Skeleton.vue.js +25 -15
  16. package/lib/components/skeleton/theme/Skeleton.base.theme.js +7 -4
  17. package/lib/components/table/Table.vue.d.ts +115 -9
  18. package/lib/components/table/Table.vue.js +209 -98
  19. package/lib/components/table/TableCell.vue.d.ts +4 -5
  20. package/lib/components/table/TableCell.vue.js +21 -22
  21. package/lib/components/table/TableHead.vue.d.ts +16 -0
  22. package/lib/components/table/TableHead.vue.js +21 -0
  23. package/lib/components/table/TableHead.vue2.js +4 -0
  24. package/lib/components/table/TableHeader.vue.d.ts +4 -0
  25. package/lib/components/table/TableHeader.vue.js +45 -54
  26. package/lib/components/table/TableRow.vue.d.ts +15 -1
  27. package/lib/components/table/TableRow.vue.js +21 -25
  28. package/lib/components/table/index.d.ts +4 -2
  29. package/lib/components/table/theme/Table.base.theme.js +7 -6
  30. package/lib/components/table/theme/Table.carbon.theme.js +11 -3
  31. package/lib/components/table/theme/TableCell.base.theme.js +3 -3
  32. package/lib/components/table/theme/TableCell.carbon.theme.js +9 -3
  33. package/lib/components/table/theme/TableHead.base.theme.d.ts +3 -0
  34. package/lib/components/table/theme/TableHead.base.theme.js +9 -0
  35. package/lib/components/table/theme/TableHead.carbon.theme.d.ts +3 -0
  36. package/lib/components/table/theme/TableHead.carbon.theme.js +9 -0
  37. package/lib/components/table/theme/TableHeader.base.theme.d.ts +3 -0
  38. package/lib/components/table/theme/TableHeader.base.theme.js +12 -0
  39. package/lib/components/table/theme/TableHeader.carbon.theme.d.ts +3 -0
  40. package/lib/components/table/theme/TableHeader.carbon.theme.js +12 -0
  41. package/lib/components/table/theme/TableRow.base.theme.d.ts +3 -0
  42. package/lib/components/table/theme/TableRow.base.theme.js +11 -0
  43. package/lib/components/table/theme/TableRow.carbon.theme.d.ts +3 -0
  44. package/lib/components/table/theme/TableRow.carbon.theme.js +11 -0
  45. package/lib/components/tag/Tag.vue.d.ts +1 -1
  46. package/lib/components/tag/Tag.vue.js +17 -17
  47. package/lib/components/tag/theme/Tag.base.theme.js +14 -13
  48. package/lib/components/tag/theme/Tag.carbon.theme.js +14 -14
  49. package/lib/index.js +2 -2
  50. package/lib/index.umd.js +3 -3
  51. package/lib/theme.d.ts +4 -1
  52. package/lib/themes/base/components.d.ts +3 -0
  53. package/lib/themes/base/components.js +44 -38
  54. package/lib/themes/carbon/components.d.ts +3 -0
  55. package/lib/themes/carbon/components.js +44 -38
  56. package/lib/version.d.ts +1 -1
  57. package/lib/version.js +1 -1
  58. package/package.json +1 -1
  59. package/src/common/icons.ts +2 -1
  60. package/src/components/icon/theme/Icon.carbon.theme.ts +9 -1
  61. package/src/components/link/Link.vue +1 -1
  62. package/src/components/link/theme/Link.carbon.theme.ts +23 -2
  63. package/src/components/menu/MenuItem.vue +1 -1
  64. package/src/components/select/Select.vue +6 -4
  65. package/src/components/select/theme/Select.base.theme.ts +1 -1
  66. package/src/components/select/theme/Select.carbon.theme.ts +1 -1
  67. package/src/components/skeleton/Skeleton.vue +18 -2
  68. package/src/components/skeleton/theme/Skeleton.base.theme.ts +8 -1
  69. package/src/components/table/Table.vue +123 -27
  70. package/src/components/table/TableCell.vue +5 -6
  71. package/src/components/table/TableHead.vue +25 -0
  72. package/src/components/table/TableHeader.vue +35 -56
  73. package/src/components/table/TableRow.vue +19 -17
  74. package/src/components/table/index.ts +4 -2
  75. package/src/components/table/theme/Table.base.theme.ts +9 -7
  76. package/src/components/table/theme/Table.carbon.theme.ts +18 -2
  77. package/src/components/table/theme/TableCell.base.theme.ts +1 -1
  78. package/src/components/table/theme/TableCell.carbon.theme.ts +24 -2
  79. package/src/components/table/theme/TableHead.base.theme.ts +10 -0
  80. package/src/components/table/theme/TableHead.carbon.theme.ts +10 -0
  81. package/src/components/table/theme/TableHeader.base.theme.ts +28 -0
  82. package/src/components/table/theme/TableHeader.carbon.theme.ts +28 -0
  83. package/src/components/table/theme/TableRow.base.theme.ts +21 -0
  84. package/src/components/table/theme/TableRow.carbon.theme.ts +21 -0
  85. package/src/components/tag/Tag.vue +4 -4
  86. package/src/components/tag/theme/Tag.base.theme.ts +4 -4
  87. package/src/components/tag/theme/Tag.carbon.theme.ts +5 -6
  88. package/src/theme.ts +6 -0
  89. package/src/themes/base/components.ts +3 -0
  90. package/src/themes/carbon/components.ts +3 -0
  91. package/src/version.ts +1 -1
  92. package/lib/components/table/TableHead.d.ts +0 -2
  93. package/lib/components/table/TableHead.js +0 -19
  94. package/src/components/table/TableHead.tsx +0 -14
@@ -13,6 +13,12 @@ const tableProps = {
13
13
  default: () => [],
14
14
  },
15
15
  loading: Boolean,
16
+ loadingSkeleton: Boolean,
17
+ loadingLines: {
18
+ type: [Number, String],
19
+ default: 3,
20
+ },
21
+ error: Boolean,
16
22
  dense: Boolean,
17
23
  fixed: Boolean,
18
24
  striped: Boolean,
@@ -25,6 +31,7 @@ const tableProps = {
25
31
  type: Boolean,
26
32
  default: true,
27
33
  },
34
+ expandable: Boolean,
28
35
  }
29
36
 
30
37
  export type TableHeader = {
@@ -34,26 +41,32 @@ export type TableHeader = {
34
41
  value?: string;
35
42
  text?: string;
36
43
  width?: string | number;
44
+ truncate?: boolean;
45
+ skeletonShape?: SkeletonShape;
37
46
  }
38
47
 
39
48
  export type TableProps = ExtractPublicPropTypes<typeof tableProps>
40
49
 
41
- type InternalClasses = 'wrapper' | 'loadingWrapper'
50
+ type InternalClasses = 'wrapper' | 'table' | 'loadingWrapper'
42
51
  export interface TableTheme extends ThemeComponent<TableProps, InternalClasses> {}
43
52
 
44
53
  export default { name: 'XTable' }
45
54
  </script>
46
55
 
47
56
  <script setup lang="ts" generic="T">
48
- import type { ExtractPublicPropTypes, PropType } from 'vue'
57
+ import { ref, type ExtractPublicPropTypes, type PropType, watch } from 'vue'
49
58
  import { useTheme, type ThemeComponent } from '../../composables/useTheme'
50
59
 
51
- import XTableHead from './TableHead'
60
+ import XTableHead from './TableHead.vue'
52
61
  import XTableHeader, { type TableHeaderSort, type TableHeaderAlign } from './TableHeader.vue'
53
62
  import XTableBody from './TableBody'
54
63
  import XTableRow from './TableRow.vue'
55
64
  import XTableCell from './TableCell.vue'
56
65
  import XSpinner from '../spinner/Spinner.vue'
66
+ import XSkeleton from '../skeleton/Skeleton.vue'
67
+ import type { SkeletonShape } from '../skeleton/Skeleton.vue'
68
+
69
+ import { chevronDownIcon } from '../../common/icons'
57
70
 
58
71
  const props = defineProps({
59
72
  ...tableProps,
@@ -63,6 +76,24 @@ const props = defineProps({
63
76
  },
64
77
  })
65
78
 
79
+ type internalT = T & {
80
+ __expanded?: boolean;
81
+ }
82
+
83
+ function clone<T>(source: T[]): T[] {
84
+ try {
85
+ return JSON.parse(JSON.stringify(source))
86
+ } catch (e) {
87
+ return []
88
+ }
89
+ }
90
+
91
+ const internalItems = ref<internalT[]>([])
92
+
93
+ watch(() => props.items, (newValue) => {
94
+ if (props.expandable) internalItems.value = clone(newValue as any)
95
+ }, { immediate: true })
96
+
66
97
  const emit = defineEmits(['update:sort', 'click-row'])
67
98
 
68
99
  function getSort(headerValue: string | undefined, sort: string[]): TableHeaderSort {
@@ -120,15 +151,16 @@ const { styles, classes, className } = useTheme('Table', {}, props)
120
151
  </script>
121
152
 
122
153
  <template>
123
- <div class="w-full overflow-x-auto">
154
+ <div :class="[className, classes.wrapper]">
155
+ <slot name="title"></slot>
156
+ <slot name="actions"></slot>
157
+
124
158
  <table
125
159
  :style="styles"
126
- :class="[
127
- className,
128
- classes.wrapper,
129
- ]"
160
+ :class="classes.table"
130
161
  >
131
162
  <x-table-head>
163
+ <x-table-header v-if="expandable" width="48" class="!p-0" :sticky-header="stickyHeader"/>
132
164
  <x-table-header
133
165
  v-for="(header, index) in headers"
134
166
  :key="index"
@@ -139,29 +171,93 @@ const { styles, classes, className } = useTheme('Table', {}, props)
139
171
  :width="header.width"
140
172
  @click="header.sortable ? sortHeader(header) : null"
141
173
  >
142
- {{ header.text }}
174
+ <slot :name="`header-${header.value}`" :header="header">
175
+ {{ header.text }}
176
+ </slot>
143
177
  </x-table-header>
144
178
  </x-table-head>
145
179
  <x-table-body>
146
- <x-table-row
147
- v-for="(item, index) in (items as T[])"
148
- :key="index"
149
- :pointer="pointer"
150
- :striped="striped"
151
- @click="$emit('click-row', item)"
152
- >
153
- <x-table-cell
154
- v-for="(header, index2) in headers"
155
- :key="index2"
156
- :text-align="header.align"
157
- :dense="dense"
158
- :fixed="fixed"
180
+ <template v-if="loading">
181
+ <x-table-row
182
+ v-for="(item, index) in Number(loadingLines)"
183
+ :key="index"
184
+ :striped="striped"
185
+ >
186
+ <x-table-cell
187
+ v-for="(header, index2) in headers"
188
+ :key="index2"
189
+ :text-align="header.align"
190
+ :width="header.width"
191
+ :dense="dense"
192
+ :fixed="fixed"
193
+ >
194
+ <slot :name="`loading-${header.value}`" :item="item">
195
+ <x-skeleton
196
+ class="max-w-[60%]"
197
+ :shape="header.skeletonShape || 'line'"
198
+ :class="{
199
+ 'mx-auto': header.align === 'center',
200
+ 'ml-auto': header.align === 'right',
201
+ }"
202
+ />
203
+ </slot>
204
+ </x-table-cell>
205
+ </x-table-row>
206
+ </template>
207
+ <template v-else-if="error">
208
+ <tr>
209
+ <td :colspan="headers.length">
210
+ <slot name="error"></slot>
211
+ </td>
212
+ </tr>
213
+ </template>
214
+ <template v-else-if="!items || items.length === 0">
215
+ <tr>
216
+ <td :colspan="headers.length">
217
+ <slot name="empty"></slot>
218
+ </td>
219
+ </tr>
220
+ </template>
221
+ <template v-for="(item, index) in items" v-else :key="index">
222
+ <x-table-row
223
+ :pointer="pointer"
224
+ :striped="striped"
225
+ @click="$emit('click-row', item)"
159
226
  >
160
- <slot :name="`item-${header.value}`" :item="item">
161
- {{ getValue(item, header.value) }}
162
- </slot>
163
- </x-table-cell>
164
- </x-table-row>
227
+ <x-table-cell v-if="expandable" width="48" class="!p-1">
228
+ <button class="p-4" @click="internalItems[index].__expanded = !internalItems[index].__expanded">
229
+ <x-icon
230
+ :icon="chevronDownIcon"
231
+ :size="dense ? 'xs' : 'md'"
232
+ class="transition-transform"
233
+ :class="{
234
+ 'rotate-180': internalItems[index]?.__expanded,
235
+ }"
236
+ />
237
+ </button>
238
+ </x-table-cell>
239
+ <x-table-cell
240
+ v-for="(header, index2) in headers"
241
+ :key="index2"
242
+ :text-align="header.align"
243
+ :truncate="header.truncate"
244
+ :width="header.width"
245
+ :dense="dense"
246
+ :fixed="fixed"
247
+ >
248
+ <slot :name="`item-${header.value}`" :item="item">
249
+ {{ getValue(item, header.value) }}
250
+ </slot>
251
+ </x-table-cell>
252
+ </x-table-row>
253
+ <tr v-if="expandable">
254
+ <td colspan="999">
255
+ <div class="overflow-hidden transition-opacity" :class="[internalItems[index]?.__expanded ? '' : 'opacity-0 max-h-0']">
256
+ <slot name="expanded-row" :item="item"></slot>
257
+ </div>
258
+ </td>
259
+ </tr>
260
+ </template>
165
261
  </x-table-body>
166
262
  <div
167
263
  v-if="loading"
@@ -10,7 +10,7 @@ const tableCellProps = {
10
10
  },
11
11
  truncate: Boolean,
12
12
  dense: Boolean,
13
- fixed: Boolean,
13
+ width: [String, Number],
14
14
  verticalAlign: {
15
15
  type: String as PropType<TableCellVerticalAlign>,
16
16
  default: 'middle',
@@ -32,22 +32,21 @@ export default {
32
32
  </script>
33
33
 
34
34
  <script setup lang="ts">
35
- import type { ExtractPublicPropTypes, PropType } from 'vue'
35
+ import { computed, type ExtractPublicPropTypes, type PropType } from 'vue'
36
36
  import { useTheme, type ThemeComponent } from '../../composables/useTheme'
37
37
 
38
38
  const props = defineProps(tableCellProps)
39
39
 
40
- if (props.truncate && !props.fixed) {
41
- console.warn('Table must have "fixed" property set to true when using TableCell "truncate" property')
42
- }
40
+ const computedWidth = computed(() => typeof props.width === 'number' ? `${props.width}px` : props.width)
43
41
 
44
42
  const { styles, classes, className } = useTheme('TableCell', {}, props)
45
43
  </script>
46
44
 
47
45
  <template>
48
46
  <td
49
- :style="styles"
47
+ :style="[styles, { width: computedWidth, minWidth: computedWidth, maxWidth: computedWidth }]"
50
48
  :class="[
49
+ 'relative',
51
50
  className,
52
51
  classes.wrapper,
53
52
  ]"
@@ -0,0 +1,25 @@
1
+ <script lang="ts">
2
+ const tableHeadProps = {}
3
+
4
+ export type TableHeadProps = ExtractPublicPropTypes<typeof tableHeadProps>
5
+
6
+ type InternalClasses = 'thead' | 'row'
7
+ export interface TableHeadTheme extends ThemeComponent<TableHeadProps, InternalClasses> {}
8
+
9
+ export default { name: 'XTableHead' }
10
+ </script>
11
+
12
+ <script setup lang="ts">
13
+ import type { ExtractPublicPropTypes } from 'vue'
14
+ import { useTheme, type ThemeComponent } from '../../composables/useTheme'
15
+
16
+ const { styles, classes, className } = useTheme('TableHead', {}, {})
17
+ </script>
18
+
19
+ <template>
20
+ <thead :class="[className, classes.thead]" :style="styles">
21
+ <tr :class="classes.row">
22
+ <slot></slot>
23
+ </tr>
24
+ </thead>
25
+ </template>
@@ -22,74 +22,53 @@ export type TableHeaderSort = typeof validators.sort[number]
22
22
  export type TableHeaderAlign = typeof validators.textAlign[number]
23
23
  export type TableHeaderProps = ExtractPublicPropTypes<typeof tableHeaderProps>
24
24
 
25
+ type InternalClasses = 'th' | 'sortIcon'
26
+ export interface TableHeaderTheme extends ThemeComponent<TableHeaderProps, InternalClasses> {}
27
+
25
28
  export default { name: 'XTableHeader', validators }
26
29
  </script>
27
30
 
28
31
  <script setup lang="ts">
29
32
  import type { ExtractPublicPropTypes, PropType } from 'vue'
33
+ import { useTheme, type ThemeComponent } from '../../composables/useTheme'
34
+
35
+ const props = defineProps(tableHeaderProps)
30
36
 
31
- defineProps(tableHeaderProps)
37
+ const { styles, classes, className } = useTheme('TableHeader', {}, props)
32
38
  </script>
33
39
 
34
40
  <template>
35
- <th
36
- class="py-2 font-semibold tracking-widest uppercase text-xs px-3"
37
- :class="[
38
- {
39
- // sort
40
- 'cursor-pointer hover:text-gray-800 dark:hover:text-gray-300 transition-colors duration-150 ease-in-out': sortable,
41
- // stickyHeader
42
- 'sticky top-0': stickyHeader,
43
- // textAlign
44
- 'text-left': textAlign === 'left',
45
- 'text-right': textAlign === 'right',
46
- 'text-center': textAlign === 'center',
47
- 'text-justify': textAlign === 'justify',
48
- },
49
- ]"
50
- >
51
- <div
41
+ <th :style="styles" :class="[className, classes.th, 'group/th']">
42
+ <slot></slot>
43
+
44
+ <svg
52
45
  v-if="sortable"
53
- class="relative inline-block"
46
+ :class="[
47
+ classes.sortIcon,
48
+ [sort && [1, -1].includes(sort) ? '' : 'invisible group-hover/th:visible']
49
+ ]"
50
+ width="24"
51
+ height="24"
52
+ viewBox="0 0 24 24"
53
+ stroke="currentColor"
54
+ stroke-linejoin="round"
55
+ stroke-linecap="round"
56
+ fill="none"
57
+ role="presentation"
54
58
  >
55
- <slot></slot>
56
-
57
- <svg
58
- v-if="sort && [1, -1].includes(sort)"
59
- class="absolute stroke-2 w-3 h-3 ml-0.5 -right-3 top-0.5"
60
- width="24"
61
- height="24"
62
- viewBox="0 0 24 24"
63
- stroke="currentColor"
64
- stroke-linejoin="round"
65
- stroke-linecap="round"
66
- fill="none"
67
- role="presentation"
68
- >
69
- <template v-if="sort === -1">
70
- <line
71
- x1="12"
72
- y1="5"
73
- x2="12"
74
- y2="19"
75
- />
76
- <polyline points="19 12 12 19 5 12" />
77
- </template>
59
+ <template v-if="sort === -1">
60
+ <line x1="12" y1="5" x2="12" y2="19"/>
61
+ <polyline points="19 12 12 19 5 12" />
62
+ </template>
78
63
 
79
- <template v-if="sort === 1">
80
- <line
81
- x1="12"
82
- y1="19"
83
- x2="12"
84
- y2="5"
85
- />
86
- <polyline points="5 12 12 5 19 12" />
87
- </template>
88
- </svg>
89
- </div>
64
+ <template v-else-if="sort === 1">
65
+ <line x1="12" y1="19" x2="12" y2="5"/>
66
+ <polyline points="5 12 12 5 19 12" />
67
+ </template>
90
68
 
91
- <template v-else>
92
- <slot></slot>
93
- </template>
69
+ <template v-else>
70
+ <path d="m3 9l4-4l4 4M7 5v14m14-4l-4 4l-4-4m4 4V5"/>
71
+ </template>
72
+ </svg>
94
73
  </th>
95
74
  </template>
@@ -3,13 +3,7 @@ const validators = {
3
3
  verticalAlign: ['baseline', 'bottom', 'middle', 'text-bottom', 'text-top', 'top'],
4
4
  }
5
5
 
6
- export default { name: 'XTableRow', validators }
7
- </script>
8
-
9
- <script setup lang="ts">
10
- import { computed, type PropType } from 'vue'
11
-
12
- const props = defineProps({
6
+ const tableRowProps = {
13
7
  pointer: Boolean,
14
8
  striped: Boolean,
15
9
  verticalAlign: {
@@ -17,7 +11,21 @@ const props = defineProps({
17
11
  default: 'top',
18
12
  validator: (value: string) => validators.verticalAlign.includes(value),
19
13
  },
20
- })
14
+ }
15
+
16
+ export type TableRowProps = ExtractPublicPropTypes<typeof tableRowProps>
17
+
18
+ type InternalClasses = 'row'
19
+ export interface TableRowTheme extends ThemeComponent<TableRowProps, InternalClasses> {}
20
+
21
+ export default { name: 'XTableRow', validators }
22
+ </script>
23
+
24
+ <script setup lang="ts">
25
+ import { computed, type PropType, type ExtractPublicPropTypes } from 'vue'
26
+ import { useTheme, type ThemeComponent } from '../../composables/useTheme'
27
+
28
+ const props = defineProps(tableRowProps)
21
29
 
22
30
  const alignClass = computed(() => {
23
31
  if (props.verticalAlign === 'baseline') return 'align-baseline'
@@ -29,18 +37,12 @@ const alignClass = computed(() => {
29
37
 
30
38
  return ''
31
39
  })
40
+
41
+ const { styles, classes, className } = useTheme('TableRow', {}, props)
32
42
  </script>
33
43
 
34
44
  <template>
35
- <tr
36
- :class="[
37
- striped ? 'odd:bg-gray-50 dark:odd:bg-gray-800' : 'border-b border-gray-200 dark:border-gray-700',
38
- {
39
- 'hover:bg-gray-50 dark:hover:bg-gray-700 cursor-pointer': pointer,
40
- },
41
- alignClass
42
- ]"
43
- >
45
+ <tr :style="styles" :class="[className, classes.row, alignClass]">
44
46
  <slot></slot>
45
47
  </tr>
46
48
  </template>
@@ -1,10 +1,12 @@
1
1
  export { default as XTable } from './Table.vue'
2
2
  export { default as XTableBody } from './TableBody'
3
3
  export { default as XTableCell } from './TableCell.vue'
4
- export { default as XTableHead } from './TableHead'
4
+ export { default as XTableHead } from './TableHead.vue'
5
5
  export { default as XTableHeader } from './TableHeader.vue'
6
6
  export { default as XTableRow } from './TableRow.vue'
7
7
 
8
8
  export type { TableProps, TableHeader, TableTheme } from './Table.vue'
9
- export type { TableHeaderProps, TableHeaderAlign, TableHeaderSort } from './TableHeader.vue'
9
+ export type { TableHeadProps, TableHeadTheme } from './TableHead.vue'
10
+ export type { TableRowProps, TableRowTheme } from './TableRow.vue'
11
+ export type { TableHeaderProps, TableHeaderAlign, TableHeaderSort, TableHeaderTheme } from './TableHeader.vue'
10
12
  export type { TableCellProps, TableCellTextAlign, TableCellVerticalAlign, TableCellTheme } from './TableCell.vue'
@@ -2,19 +2,21 @@ import type { TableTheme } from '../Table.vue'
2
2
 
3
3
  const theme: TableTheme = {
4
4
  classes: {
5
- wrapper: ({ props }) => {
6
- const c = ['w-full relative']
5
+ wrapper: 'w-full h-full overflow-x-auto',
7
6
 
8
- if (props.scrollable) c.push('overflow-x-scroll sm:overflow-x-auto whitespace-wrap sm:whitespace-normal block sm:table')
7
+ table: ({ props }) => {
8
+ const classes = ['w-full relative']
9
9
 
10
- if (props.stickyHeader) c.push('relative')
10
+ if (props.scrollable) classes.push('overflow-x-scroll sm:overflow-x-auto whitespace-wrap sm:whitespace-normal')
11
11
 
12
- if (props.fixed) c.push('table-fixed')
12
+ if (props.stickyHeader) classes.push('relative')
13
13
 
14
- return c
14
+ if (props.fixed) classes.push('md:table-fixed')
15
+
16
+ return classes
15
17
  },
16
18
 
17
- loadingWrapper: 'absolute inset-0 flex items-center justify-center z-40 bg-gray-300 dark:bg-gray-600 rounded opacity-50',
19
+ loadingWrapper: 'absolute inset-0 flex items-center justify-center z-40 bg-gray-300 dark:bg-gray-600 rounded opacity-30',
18
20
  },
19
21
  }
20
22
 
@@ -1,7 +1,23 @@
1
1
  import type { TableTheme } from '../Table.vue'
2
2
 
3
- import BaseTheme from './Table.base.theme'
3
+ const theme: TableTheme = {
4
+ classes: {
5
+ wrapper: 'w-full h-full shadow-sm overflow-x-auto text-sm bg-white dark:bg-gray-800',
4
6
 
5
- const theme: TableTheme = BaseTheme
7
+ table: ({ props }) => {
8
+ const classes = ['w-full relative']
9
+
10
+ if (props.scrollable) classes.push('overflow-x-scroll sm:overflow-x-auto whitespace-wrap sm:whitespace-normal')
11
+
12
+ if (props.stickyHeader) classes.push('relative')
13
+
14
+ if (props.fixed) classes.push('md:table-fixed')
15
+
16
+ return classes
17
+ },
18
+
19
+ loadingWrapper: 'absolute inset-0 flex items-center justify-center z-40 bg-gray-300 dark:bg-gray-600 rounded opacity-30',
20
+ },
21
+ }
6
22
 
7
23
  export default theme
@@ -19,7 +19,7 @@ const theme: TableCellTheme = {
19
19
  else if (props.verticalAlign === 'text-top') c.push('align-text-top')
20
20
  else if (props.verticalAlign === 'top') c.push('align-top')
21
21
 
22
- if (props.truncate && props.fixed) c.push('truncate')
22
+ if (props.truncate) c.push('truncate')
23
23
 
24
24
  return c
25
25
  },
@@ -1,7 +1,29 @@
1
1
  import type { TableCellTheme } from '../TableCell.vue'
2
2
 
3
- import BaseTheme from './TableCell.base.theme'
3
+ const theme: TableCellTheme = {
4
+ classes: {
5
+ wrapper: ({ props }) => {
6
+ const c = ['last:pr-0 px-3']
4
7
 
5
- const theme: TableCellTheme = BaseTheme
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) c.push('truncate')
23
+
24
+ return c
25
+ },
26
+ },
27
+ }
6
28
 
7
29
  export default theme
@@ -0,0 +1,10 @@
1
+ import type { TableHeadTheme } from '../TableHead.vue'
2
+
3
+ const theme: TableHeadTheme = {
4
+ classes: {
5
+ thead: 'align-bottom',
6
+ row: 'text-sm text-gray-600 dark:text-gray-400 border-b',
7
+ },
8
+ }
9
+
10
+ export default theme
@@ -0,0 +1,10 @@
1
+ import type { TableHeadTheme } from '../TableHead.vue'
2
+
3
+ const theme: TableHeadTheme = {
4
+ classes: {
5
+ thead: 'align-bottom',
6
+ row: 'text-gray-900 dark:text-gray-50',
7
+ },
8
+ }
9
+
10
+ export default theme
@@ -0,0 +1,28 @@
1
+ import type { TableHeaderTheme } from '../TableHeader.vue'
2
+
3
+ const theme: TableHeaderTheme = {
4
+ classes: {
5
+ th: ({ props }) => {
6
+ const classes = ['relative py-2 font-semibold tracking-widest uppercase text-xs px-3']
7
+
8
+ if (props.sortable) classes.push('cursor-pointer hover:text-gray-800 dark:hover:text-gray-300 transition-colors duration-150 ease-in-out')
9
+
10
+ if (props.stickyHeader) classes.push('sticky top-0')
11
+
12
+ if (props.textAlign === 'left') classes.push('text-left')
13
+ if (props.textAlign === 'right') classes.push('text-right')
14
+ if (props.textAlign === 'center') classes.push('text-center')
15
+ if (props.textAlign === 'justify') classes.push('text-justify')
16
+
17
+ return classes
18
+ },
19
+
20
+ sortIcon: ({ props }) => {
21
+ const classes = ['absolute stroke-2 w-3 h-3 top-2.5 right-0.5']
22
+
23
+ return classes
24
+ },
25
+ },
26
+ }
27
+
28
+ export default theme
@@ -0,0 +1,28 @@
1
+ import type { TableHeaderTheme } from '../TableHeader.vue'
2
+
3
+ const theme: TableHeaderTheme = {
4
+ classes: {
5
+ th: ({ props }) => {
6
+ const classes = ['relative py-3.5 font-semibold text-sm px-3 bg-gray-200 dark:bg-gray-700 select-none']
7
+
8
+ if (props.sortable) classes.push('cursor-pointer hover:bg-gray-300 dark:hover:bg-gray-600 transition-colors duration-150 ease-in-out pr-5')
9
+
10
+ if (props.stickyHeader) classes.push('sticky top-0')
11
+
12
+ if (props.textAlign === 'left') classes.push('text-left')
13
+ if (props.textAlign === 'right') classes.push('text-right')
14
+ if (props.textAlign === 'center') classes.push('text-center')
15
+ if (props.textAlign === 'justify') classes.push('text-justify')
16
+
17
+ return classes
18
+ },
19
+
20
+ sortIcon: ({ props }) => {
21
+ const classes = ['absolute stroke-2 w-4 h-4 top-4 right-2']
22
+
23
+ return classes
24
+ },
25
+ },
26
+ }
27
+
28
+ export default theme
@@ -0,0 +1,21 @@
1
+ import type { TableRowTheme } from '../TableRow.vue'
2
+
3
+ const theme: TableRowTheme = {
4
+ classes: {
5
+ row: ({ props }) => {
6
+ const classes = []
7
+
8
+ if (props.striped) {
9
+ classes.push('odd:bg-gray-50 dark:odd:bg-gray-800')
10
+ } else {
11
+ classes.push('border-b border-gray-200 dark:border-gray-700')
12
+ }
13
+
14
+ if (props.pointer) classes.push('hover:bg-gray-50 dark:hover:bg-gray-700 cursor-pointer')
15
+
16
+ return classes
17
+ },
18
+ },
19
+ }
20
+
21
+ export default theme