@indielayer/ui 1.8.4 → 1.9.1

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 (119) hide show
  1. package/docs/pages/component/select/usage.vue +17 -5
  2. package/docs/pages/component/table/index.vue +7 -0
  3. package/docs/pages/component/table/usage.vue +5 -1
  4. package/docs/pages/component/table/virtual.vue +53 -0
  5. package/docs/pages/typography.vue +14 -12
  6. package/lib/components/accordion/Accordion.vue.d.ts +4 -4
  7. package/lib/components/accordion/AccordionItem.vue.d.ts +6 -6
  8. package/lib/components/accordion/AccordionItem.vue.js +51 -51
  9. package/lib/components/alert/Alert.vue.d.ts +8 -8
  10. package/lib/components/alert/Alert.vue2.js +20 -20
  11. package/lib/components/avatar/Avatar.vue.d.ts +4 -4
  12. package/lib/components/badge/Badge.vue.d.ts +4 -4
  13. package/lib/components/breadcrumbs/Breadcrumbs.vue.d.ts +4 -4
  14. package/lib/components/button/Button.vue.d.ts +5 -5
  15. package/lib/components/button/ButtonGroup.vue.d.ts +4 -4
  16. package/lib/components/card/Card.vue.d.ts +4 -4
  17. package/lib/components/carousel/Carousel.vue.d.ts +7 -7
  18. package/lib/components/carousel/CarouselSlide.vue.d.ts +4 -4
  19. package/lib/components/checkbox/Checkbox.vue.d.ts +6 -6
  20. package/lib/components/checkbox/Checkbox.vue2.js +60 -60
  21. package/lib/components/container/Container.vue.d.ts +4 -4
  22. package/lib/components/datepicker/Datepicker.vue.d.ts +6 -6
  23. package/lib/components/datepicker/Datepicker.vue.js +3 -3
  24. package/lib/components/divider/Divider.vue.d.ts +4 -4
  25. package/lib/components/drawer/Drawer.vue.d.ts +6 -6
  26. package/lib/components/drawer/Drawer.vue.js +1 -1
  27. package/lib/components/form/Form.vue.d.ts +5 -5
  28. package/lib/components/formGroup/FormGroup.vue.d.ts +6 -6
  29. package/lib/components/formGroup/FormGroup.vue.js +7 -7
  30. package/lib/components/icon/Icon.vue.d.ts +4 -4
  31. package/lib/components/image/Image.vue.d.ts +3 -3
  32. package/lib/components/input/Input.vue.d.ts +6 -6
  33. package/lib/components/inputFooter/InputFooter.vue.d.ts +3 -3
  34. package/lib/components/label/Label.vue.d.ts +4 -4
  35. package/lib/components/link/Link.vue.d.ts +4 -4
  36. package/lib/components/loader/Loader.vue.d.ts +4 -4
  37. package/lib/components/menu/Menu.vue.d.ts +5 -5
  38. package/lib/components/menu/MenuItem.vue.d.ts +5 -5
  39. package/lib/components/menu/MenuItem.vue2.js +1 -1
  40. package/lib/components/modal/Modal.vue.d.ts +6 -6
  41. package/lib/components/modal/Modal.vue.js +1 -1
  42. package/lib/components/notifications/Notifications.vue.d.ts +5 -5
  43. package/lib/components/pagination/Pagination.vue.d.ts +5 -5
  44. package/lib/components/pagination/Pagination.vue.js +41 -41
  45. package/lib/components/pagination/PaginationItem.vue.d.ts +6 -6
  46. package/lib/components/popover/Popover.vue.d.ts +8 -8
  47. package/lib/components/popover/Popover.vue.js +1 -1
  48. package/lib/components/popover/PopoverContainer.vue.d.ts +4 -4
  49. package/lib/components/progress/Progress.vue.d.ts +4 -4
  50. package/lib/components/qrCode/QrCode.vue.d.ts +4 -4
  51. package/lib/components/radio/Radio.vue.d.ts +6 -6
  52. package/lib/components/radio/Radio.vue2.js +63 -63
  53. package/lib/components/scroll/Scroll.vue.d.ts +6 -6
  54. package/lib/components/scroll/Scroll.vue2.js +1 -1
  55. package/lib/components/select/Select.vue.d.ts +42 -6
  56. package/lib/components/select/Select.vue.js +224 -201
  57. package/lib/components/select/theme/Select.base.theme.js +1 -1
  58. package/lib/components/skeleton/Skeleton.vue.d.ts +4 -4
  59. package/lib/components/skeleton/Skeleton.vue.js +17 -17
  60. package/lib/components/slider/Slider.vue.d.ts +6 -6
  61. package/lib/components/spacer/Spacer.d.ts +1 -1
  62. package/lib/components/spinner/Spinner.vue.d.ts +4 -4
  63. package/lib/components/stepper/Stepper.vue.d.ts +5 -5
  64. package/lib/components/tab/Tab.vue.d.ts +5 -5
  65. package/lib/components/tab/Tab.vue.js +1 -1
  66. package/lib/components/tab/TabGroup.vue.d.ts +5 -5
  67. package/lib/components/tab/TabGroup.vue.js +2 -2
  68. package/lib/components/table/Table.vue.d.ts +119 -24
  69. package/lib/components/table/Table.vue.js +226 -188
  70. package/lib/components/table/TableBody.d.ts +1 -1
  71. package/lib/components/table/TableCell.vue.d.ts +4 -4
  72. package/lib/components/table/TableHead.vue.d.ts +10 -2
  73. package/lib/components/table/TableHead.vue.js +16 -13
  74. package/lib/components/table/TableHeader.vue.d.ts +4 -8
  75. package/lib/components/table/TableHeader.vue.js +40 -41
  76. package/lib/components/table/TableRow.vue.d.ts +8 -4
  77. package/lib/components/table/TableRow.vue.js +3 -2
  78. package/lib/components/table/theme/TableHead.base.theme.js +7 -4
  79. package/lib/components/table/theme/TableHead.carbon.theme.js +7 -4
  80. package/lib/components/table/theme/TableHeader.base.theme.js +3 -3
  81. package/lib/components/table/theme/TableHeader.carbon.theme.js +1 -1
  82. package/lib/components/table/theme/TableRow.base.theme.js +1 -1
  83. package/lib/components/tag/Tag.vue.d.ts +5 -5
  84. package/lib/components/textarea/Textarea.vue.d.ts +6 -6
  85. package/lib/components/textarea/Textarea.vue.js +6 -6
  86. package/lib/components/themeProvider/ThemeProvider.vue.d.ts +3 -3
  87. package/lib/components/toggle/Toggle.vue.d.ts +6 -6
  88. package/lib/components/tooltip/ToggleTip.vue.d.ts +3 -3
  89. package/lib/components/tooltip/Tooltip.vue.d.ts +4 -4
  90. package/lib/components/tooltip/Tooltip.vue.js +1 -1
  91. package/lib/composables/index.d.ts +1 -0
  92. package/lib/composables/useInputtable.d.ts +26 -6
  93. package/lib/composables/useVirtualList.d.ts +48 -0
  94. package/lib/composables/useVirtualList.js +123 -0
  95. package/lib/index.js +35 -33
  96. package/lib/index.umd.js +4 -4
  97. package/lib/node_modules/.pnpm/@vueuse_core@10.2.0_vue@3.5.10_typescript@5.2.2_/node_modules/@vueuse/core/index.js +412 -0
  98. package/lib/version.d.ts +1 -1
  99. package/lib/version.js +1 -1
  100. package/package.json +3 -3
  101. package/src/components/select/Select.vue +56 -26
  102. package/src/components/select/theme/Select.base.theme.ts +1 -1
  103. package/src/components/table/Table.vue +158 -114
  104. package/src/components/table/TableHead.vue +6 -2
  105. package/src/components/table/TableHeader.vue +0 -1
  106. package/src/components/table/TableRow.vue +1 -0
  107. package/src/components/table/theme/TableHead.base.theme.ts +7 -1
  108. package/src/components/table/theme/TableHead.carbon.theme.ts +7 -1
  109. package/src/components/table/theme/TableHeader.base.theme.ts +0 -2
  110. package/src/components/table/theme/TableHeader.carbon.theme.ts +0 -2
  111. package/src/components/table/theme/TableRow.base.theme.ts +4 -0
  112. package/src/composables/index.ts +1 -0
  113. package/src/composables/useVirtualList.ts +286 -0
  114. package/src/version.ts +1 -1
  115. package/lib/node_modules/.pnpm/@vueuse_core@10.2.0_vue@3.3.9_typescript@5.2.2_/node_modules/@vueuse/core/index.js +0 -379
  116. /package/lib/node_modules/.pnpm/{@vuepic_vue-datepicker@8.3.2_vue@3.3.9_typescript@5.2.2_ → @vuepic_vue-datepicker@8.3.2_vue@3.5.10_typescript@5.2.2_}/node_modules/@vuepic/vue-datepicker/dist/main.css.js +0 -0
  117. /package/lib/node_modules/.pnpm/{@vuepic_vue-datepicker@8.3.2_vue@3.3.9_typescript@5.2.2_ → @vuepic_vue-datepicker@8.3.2_vue@3.5.10_typescript@5.2.2_}/node_modules/@vuepic/vue-datepicker/dist/vue-datepicker.js +0 -0
  118. /package/lib/node_modules/.pnpm/{@vueuse_shared@10.2.0_vue@3.3.9_typescript@5.2.2_ → @vueuse_shared@10.2.0_vue@3.5.10_typescript@5.2.2_}/node_modules/@vueuse/shared/index.js +0 -0
  119. /package/lib/node_modules/.pnpm/{floating-vue@5.2.2_@nuxt_kit@3.10.1_rollup@3.29.4__vue@3.3.9_typescript@5.2.2_ → floating-vue@5.2.2_@nuxt_kit@3.10.1_rollup@3.29.4__vue@3.5.10_typescript@5.2.2_}/node_modules/floating-vue/dist/floating-vue.js +0 -0
@@ -32,6 +32,17 @@ const tableProps = {
32
32
  default: true,
33
33
  },
34
34
  expandable: Boolean,
35
+ virtualList: Boolean,
36
+ virtualListOffsetTop: Number,
37
+ virtualListOffsetBottom: Number,
38
+ virtualListItemHeight: {
39
+ type: Number,
40
+ default: 54,
41
+ },
42
+ virtualListOverscan: {
43
+ type: Number,
44
+ default: 5,
45
+ },
35
46
  }
36
47
 
37
48
  export type TableHeader = {
@@ -54,8 +65,9 @@ export default { name: 'XTable' }
54
65
  </script>
55
66
 
56
67
  <script setup lang="ts" generic="T">
57
- import { ref, type ExtractPublicPropTypes, type PropType, watch } from 'vue'
68
+ import { ref, type ExtractPublicPropTypes, type PropType, watch, computed, type MaybeRef } from 'vue'
58
69
  import { useTheme, type ThemeComponent } from '../../composables/useTheme'
70
+ import { useVirtualList } from '../../composables/useVirtualList'
59
71
 
60
72
  import XTableHead from './TableHead.vue'
61
73
  import XTableHeader, { type TableHeaderSort, type TableHeaderAlign } from './TableHeader.vue'
@@ -78,6 +90,10 @@ const props = defineProps({
78
90
  },
79
91
  })
80
92
 
93
+ const selectedIndex = defineModel<number | number[]>('selected')
94
+
95
+ const hasSelectedIndex = computed(() => typeof selectedIndex.value === 'number')
96
+
81
97
  type internalT = T & {
82
98
  __expanded?: boolean;
83
99
  }
@@ -90,10 +106,23 @@ function clone<T>(source: T[]): T[] {
90
106
  }
91
107
  }
92
108
 
109
+ const items = computed(() => props.items)
110
+
111
+ const { list, containerProps, wrapperProps } = useVirtualList(
112
+ items,
113
+ {
114
+ disabled: !props.virtualList,
115
+ itemHeight: props.virtualListItemHeight || 54,
116
+ topOffset: props.virtualListOffsetTop || 0,
117
+ bottomOffset: props.virtualListOffsetBottom || 0,
118
+ overscan: props.virtualListOverscan,
119
+ },
120
+ )
121
+
93
122
  const internalItems = ref<internalT[]>([])
94
123
 
95
- watch(() => props.items, (newValue) => {
96
- if (props.expandable) internalItems.value = clone(newValue as any)
124
+ watch(items, (newValue) => {
125
+ if (props.expandable) internalItems.value = clone(newValue as any) as internalT[]
97
126
  }, { immediate: true })
98
127
 
99
128
  const emit = defineEmits(['update:sort', 'click-row'])
@@ -153,125 +182,140 @@ const { styles, classes, className } = useTheme('Table', {}, props)
153
182
  </script>
154
183
 
155
184
  <template>
156
- <div :class="[className, classes.wrapper]">
185
+ <div
186
+ :class="[className, classes.wrapper]"
187
+ v-bind="containerProps"
188
+ >
157
189
  <slot name="title"></slot>
158
190
  <slot name="actions"></slot>
159
191
 
160
- <table
161
- :style="styles"
162
- :class="classes.table"
192
+ <div
193
+ v-bind="wrapperProps"
194
+ :class="{
195
+ '!h-auto': props.loading
196
+ }"
163
197
  >
164
- <x-table-head>
165
- <x-table-header v-if="expandable" width="48" class="!p-0" :sticky-header="stickyHeader"/>
166
- <x-table-header
167
- v-for="(header, index) in headers"
168
- :key="index"
169
- :sticky-header="stickyHeader"
170
- :text-align="header.align"
171
- :sort="getSort(header.value, sort)"
172
- :sortable="header.sortable"
173
- :width="header.width"
174
- @click="header.sortable ? sortHeader(header) : null"
175
- >
176
- <slot :name="`header-${header.value}`" :header="header">
177
- {{ header.text }}
178
- </slot>
179
- </x-table-header>
180
- </x-table-head>
181
- <x-table-body>
182
- <template v-if="loading">
183
- <x-table-row
184
- v-for="(item, index) in Number(loadingLines)"
198
+ <table
199
+ :style="styles"
200
+ :class="classes.table"
201
+ >
202
+ <x-table-head :sticky-header="stickyHeader">
203
+ <x-table-header v-if="expandable" width="48" class="!p-0"/>
204
+ <x-table-header
205
+ v-for="(header, index) in headers"
185
206
  :key="index"
186
- :striped="striped"
207
+ :text-align="header.align"
208
+ :sort="getSort(header.value, sort)"
209
+ :sortable="header.sortable"
210
+ :width="header.width"
211
+ @click="header.sortable ? sortHeader(header) : null"
187
212
  >
188
- <x-table-cell
189
- v-for="(header, index2) in headers"
190
- :key="index2"
191
- :text-align="header.align"
192
- :width="header.width"
193
- :dense="dense"
194
- :fixed="fixed"
213
+ <slot :name="`header-${header.value}`" :header="header">
214
+ {{ header.text }}
215
+ </slot>
216
+ </x-table-header>
217
+ </x-table-head>
218
+ <x-table-body>
219
+ <template v-if="loading">
220
+ <x-table-row
221
+ v-for="(item, index) in Number(loadingLines)"
222
+ :key="index"
223
+ :striped="striped"
195
224
  >
196
- <slot :name="`loading-${header.value}`" :item="item">
197
- <x-skeleton
198
- class="max-w-[60%]"
199
- :shape="header.skeletonShape || 'line'"
200
- :class="{
201
- 'mx-auto': header.align === 'center',
202
- 'ml-auto': header.align === 'right',
203
- }"
204
- />
205
- </slot>
206
- </x-table-cell>
207
- </x-table-row>
208
- </template>
209
- <template v-else-if="error">
210
- <tr>
211
- <td colspan="999">
212
- <slot name="error"></slot>
213
- </td>
214
- </tr>
215
- </template>
216
- <template v-else-if="!items || items.length === 0">
217
- <tr>
218
- <td colspan="999">
219
- <slot name="empty"></slot>
220
- </td>
221
- </tr>
222
- </template>
223
- <template v-for="(item, index) in items" v-else :key="index">
224
- <x-table-row
225
- :pointer="pointer"
226
- :striped="striped"
227
- @click="$emit('click-row', item)"
228
- >
229
- <x-table-cell v-if="expandable" width="48" class="!p-1">
230
- <button
231
- type="button"
232
- class="px-3 p-2"
233
- :class="[dense ? 'p-0.5' : 'px-3 py-2']"
234
- @click="internalItems[index].__expanded = !internalItems[index].__expanded"
225
+ <x-table-cell
226
+ v-for="(header, index2) in headers"
227
+ :key="index2"
228
+ :text-align="header.align"
229
+ :width="header.width"
230
+ :dense="dense"
231
+ :fixed="fixed"
235
232
  >
236
- <x-icon
237
- :icon="chevronDownIcon"
238
- :size="dense ? 'xs' : 'md'"
239
- class="transition-transform"
240
- :class="{
241
- 'rotate-180': internalItems[index]?.__expanded,
242
- }"
243
- />
244
- </button>
245
- </x-table-cell>
246
- <x-table-cell
247
- v-for="(header, index2) in headers"
248
- :key="index2"
249
- :text-align="header.align"
250
- :truncate="header.truncate"
251
- :width="header.width"
252
- :dense="dense"
253
- :fixed="fixed"
233
+ <slot :name="`loading-${header.value}`" :item="item">
234
+ <x-skeleton
235
+ class="max-w-[60%]"
236
+ :shape="header.skeletonShape || 'line'"
237
+ :class="{
238
+ 'mx-auto': header.align === 'center',
239
+ 'ml-auto': header.align === 'right',
240
+ }"
241
+ />
242
+ </slot>
243
+ </x-table-cell>
244
+ </x-table-row>
245
+ </template>
246
+ <template v-else-if="error">
247
+ <tr>
248
+ <td colspan="999">
249
+ <slot name="error"></slot>
250
+ </td>
251
+ </tr>
252
+ </template>
253
+ <template v-else-if="!items || items.length === 0">
254
+ <tr>
255
+ <td colspan="999">
256
+ <slot name="empty"></slot>
257
+ </td>
258
+ </tr>
259
+ </template>
260
+ <template v-for="(item, index) in list" v-else :key="index">
261
+ <x-table-row
262
+ :pointer="pointer"
263
+ :striped="striped"
264
+ :selected="hasSelectedIndex ? selectedIndex === item.index : undefined"
265
+ @click="$emit('click-row', item.data, item.index)"
254
266
  >
255
- <slot :name="`item-${header.value}`" :item="item">
256
- {{ getValue(item, header.value) }}
257
- </slot>
258
- </x-table-cell>
259
- </x-table-row>
260
- <tr v-if="expandable" :class="{ 'hidden': !internalItems[index]?.__expanded }">
261
- <td colspan="999">
262
- <div class="overflow-hidden transition-opacity" :class="[internalItems[index]?.__expanded ? '' : 'opacity-0 max-h-0']">
263
- <slot name="expanded-row" :item="item"></slot>
264
- </div>
265
- </td>
266
- </tr>
267
- </template>
268
- </x-table-body>
269
- <div
270
- v-if="loading"
271
- :class="classes.loadingWrapper"
272
- >
273
- <x-spinner size="lg"/>
274
- </div>
275
- </table>
267
+ <x-table-cell v-if="expandable" width="48" class="!p-1">
268
+ <button
269
+ type="button"
270
+ class="px-3 p-2"
271
+ :class="[dense ? 'p-0.5' : 'px-3 py-2']"
272
+ @click="internalItems[item.index].__expanded = !internalItems[item.index].__expanded"
273
+ >
274
+ <x-icon
275
+ :icon="chevronDownIcon"
276
+ :size="dense ? 'xs' : 'md'"
277
+ class="transition-transform"
278
+ :class="{
279
+ 'rotate-180': internalItems[item.index]?.__expanded,
280
+ }"
281
+ />
282
+ </button>
283
+ </x-table-cell>
284
+ <x-table-cell
285
+ v-for="(header, index2) in headers"
286
+ :key="index2"
287
+ :text-align="header.align"
288
+ :truncate="header.truncate"
289
+ :width="header.width"
290
+ :dense="dense"
291
+ :style="[props.virtualList ? {
292
+ height: `${props.virtualListItemHeight}px`,
293
+ maxHeight: `${props.virtualListItemHeight}px`,
294
+ overflow: 'hidden',
295
+ whiteSpace: 'nowrap',
296
+ } : {}]"
297
+ >
298
+ <slot :name="`item-${header.value}`" :item="item.data">
299
+ {{ getValue(item.data, header.value) }}
300
+ </slot>
301
+ </x-table-cell>
302
+ </x-table-row>
303
+ <tr v-if="expandable" :class="{ 'hidden': !internalItems[item.index]?.__expanded }">
304
+ <td colspan="999">
305
+ <div class="overflow-hidden transition-opacity" :class="[internalItems[item.index]?.__expanded ? '' : 'opacity-0 max-h-0']">
306
+ <slot name="expanded-row" :item="item.data"></slot>
307
+ </div>
308
+ </td>
309
+ </tr>
310
+ </template>
311
+ </x-table-body>
312
+ <div
313
+ v-if="loading"
314
+ :class="classes.loadingWrapper"
315
+ >
316
+ <x-spinner size="lg"/>
317
+ </div>
318
+ </table>
319
+ </div>
276
320
  </div>
277
321
  </template>
@@ -1,5 +1,7 @@
1
1
  <script lang="ts">
2
- const tableHeadProps = {}
2
+ const tableHeadProps = {
3
+ stickyHeader: Boolean,
4
+ }
3
5
 
4
6
  export type TableHeadProps = ExtractPublicPropTypes<typeof tableHeadProps>
5
7
 
@@ -13,7 +15,9 @@ export default { name: 'XTableHead' }
13
15
  import type { ExtractPublicPropTypes } from 'vue'
14
16
  import { useTheme, type ThemeComponent } from '../../composables/useTheme'
15
17
 
16
- const { styles, classes, className } = useTheme('TableHead', {}, {})
18
+ const props = defineProps(tableHeadProps)
19
+
20
+ const { styles, classes, className } = useTheme('TableHead', {}, props)
17
21
  </script>
18
22
 
19
23
  <template>
@@ -15,7 +15,6 @@ const tableHeaderProps = {
15
15
  default: 'left',
16
16
  validator: (value: string) => validators.textAlign.includes(value as any),
17
17
  },
18
- stickyHeader: Boolean,
19
18
  }
20
19
 
21
20
  export type TableHeaderSort = typeof validators.sort[number]
@@ -6,6 +6,7 @@ const validators = {
6
6
  const tableRowProps = {
7
7
  pointer: Boolean,
8
8
  striped: Boolean,
9
+ selected: Boolean,
9
10
  verticalAlign: {
10
11
  type: String as PropType<'baseline' | 'bottom' | 'middle' | 'text-bottom' | 'text-top' | 'top'>,
11
12
  default: 'top',
@@ -2,7 +2,13 @@ import type { TableHeadTheme } from '../TableHead.vue'
2
2
 
3
3
  const theme: TableHeadTheme = {
4
4
  classes: {
5
- thead: 'align-bottom bg-secondary-50 dark:bg-secondary-700',
5
+ thead: ({ props }) => {
6
+ const classes = ['align-bottom bg-secondary-50 dark:bg-secondary-700']
7
+
8
+ if (props.stickyHeader) classes.push('sticky top-0 z-10')
9
+
10
+ return classes
11
+ },
6
12
  row: 'text-sm text-secondary-600 dark:text-secondary-200 border-b',
7
13
  },
8
14
  }
@@ -2,7 +2,13 @@ import type { TableHeadTheme } from '../TableHead.vue'
2
2
 
3
3
  const theme: TableHeadTheme = {
4
4
  classes: {
5
- thead: 'align-bottom',
5
+ thead: ({ props }) => {
6
+ const classes = ['align-bottom']
7
+
8
+ if (props.stickyHeader) classes.push('sticky top-0 z-10')
9
+
10
+ return classes
11
+ },
6
12
  row: 'text-secondary-900 dark:text-secondary-50',
7
13
  },
8
14
  }
@@ -7,8 +7,6 @@ const theme: TableHeaderTheme = {
7
7
 
8
8
  if (props.sortable) classes.push('cursor-pointer hover:text-secondary-800 dark:hover:text-secondary-300 transition-colors duration-150 ease-in-out')
9
9
 
10
- if (props.stickyHeader) classes.push('sticky top-0')
11
-
12
10
  if (props.textAlign === 'left') classes.push('text-left')
13
11
  if (props.textAlign === 'right') classes.push('text-right')
14
12
  if (props.textAlign === 'center') classes.push('text-center')
@@ -7,8 +7,6 @@ const theme: TableHeaderTheme = {
7
7
 
8
8
  if (props.sortable) classes.push('cursor-pointer hover:bg-secondary-300 dark:hover:bg-secondary-600 transition-colors duration-150 ease-in-out pr-5')
9
9
 
10
- if (props.stickyHeader) classes.push('sticky top-0')
11
-
12
10
  if (props.textAlign === 'left') classes.push('text-left')
13
11
  if (props.textAlign === 'right') classes.push('text-right')
14
12
  if (props.textAlign === 'center') classes.push('text-center')
@@ -5,6 +5,10 @@ const theme: TableRowTheme = {
5
5
  row: ({ props }) => {
6
6
  const classes = []
7
7
 
8
+ if (props.selected) {
9
+ classes.push('shadow-[inset_3px_0] shadow-primary-500')
10
+ }
11
+
8
12
  if (props.striped) {
9
13
  classes.push('even:bg-secondary-50 dark:even:bg-secondary-700')
10
14
  } else {
@@ -5,3 +5,4 @@ export * from './useCSS'
5
5
  export * from './useInputtable'
6
6
  export * from './useInteractive'
7
7
  export * from './useNotifications'
8
+ export * from './useVirtualList'