@innertia-solutions/nuxt-theme-spark 0.1.87 → 0.1.88
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.
- package/components/Admin/Base.vue +58 -81
- package/components/Admin/Header.vue +32 -0
- package/components/Admin/Page.vue +2 -68
- package/components/App/PageLoadingSpinner.vue +1 -1
- package/components/Layout/Admin.vue +2 -51
- package/components/Nav/Tabs.vue +3 -18
- package/components/Table/Database.vue +5 -9
- package/components/Table/DownloadDropdown.vue +4 -4
- package/components/Table/FilterDropdown.vue +3 -3
- package/components/Table/Grid.vue +5 -9
- package/components/Table/Kanban.vue +3 -20
- package/components/Table/List.vue +4 -9
- package/components/Table/Standard.vue +26 -26
- package/components/Table.vue +21 -41
- package/components/TableExportable.vue +127 -147
- package/package.json +1 -1
- package/spark.css +20 -25
- package/public/favicon.png +0 -0
- package/public/icon.png +0 -0
- package/public/isologo-dark.png +0 -0
- package/public/isologo-light.png +0 -0
|
@@ -2,10 +2,9 @@
|
|
|
2
2
|
import { IconSearch, IconAdjustmentsHorizontal, IconLayoutColumns, IconGripVertical } from '@tabler/icons-vue'
|
|
3
3
|
|
|
4
4
|
const props = defineProps({
|
|
5
|
-
|
|
6
|
-
endpoint: { type: String, default: undefined },
|
|
5
|
+
endpoint: { type: String, required: true },
|
|
7
6
|
columns: { type: Array, required: true },
|
|
8
|
-
name: { type: String,
|
|
7
|
+
name: { type: String, required: true },
|
|
9
8
|
params: { type: Object, default: () => ({}) },
|
|
10
9
|
checkable: { type: Boolean, default: false },
|
|
11
10
|
cached: { type: Boolean, default: true },
|
|
@@ -19,10 +18,7 @@ const props = defineProps({
|
|
|
19
18
|
splitRatio: { type: Number, default: 60 },
|
|
20
19
|
})
|
|
21
20
|
|
|
22
|
-
const emit = defineEmits(['row-click', 'loaded'
|
|
23
|
-
|
|
24
|
-
const resolvedEndpoint = computed(() => props.table?.endpoint ?? props.endpoint)
|
|
25
|
-
const resolvedName = computed(() => props.table?.name ?? props.name)
|
|
21
|
+
const emit = defineEmits(['row-click', 'loaded'])
|
|
26
22
|
const slots = useSlots()
|
|
27
23
|
const forwardedSlots = computed(() => {
|
|
28
24
|
const excluded = new Set(['toolbar', 'preview'])
|
|
@@ -60,13 +56,12 @@ const paginationHeight = ref(0)
|
|
|
60
56
|
|
|
61
57
|
const previewCacheKey = computed(() => `table-preview-${props.name}`)
|
|
62
58
|
|
|
59
|
+
const previewFromCache = ref(false)
|
|
63
60
|
const closePreview = () => { previewRow.value = null }
|
|
64
61
|
|
|
65
62
|
const handleRowClick = (row) => {
|
|
66
63
|
if (previewEnabled.value) {
|
|
67
|
-
|
|
68
|
-
previewRow.value = toggled
|
|
69
|
-
if (toggled) emit('preview', toggled)
|
|
64
|
+
previewRow.value = previewRow.value?.id === row.id ? null : row
|
|
70
65
|
} else {
|
|
71
66
|
emit('row-click', row)
|
|
72
67
|
}
|
|
@@ -121,11 +116,16 @@ const onEsc = (e) => { if (e.key === 'Escape' && previewRow.value) closePreview(
|
|
|
121
116
|
onMounted(() => {
|
|
122
117
|
previewEnabled.value = !!slots.preview
|
|
123
118
|
window.addEventListener('keydown', onEsc)
|
|
124
|
-
// Restore preview from session cache
|
|
119
|
+
// Restore preview from session cache — mark as from-cache to skip enter animation
|
|
125
120
|
if (props.cached && previewEnabled.value) {
|
|
126
121
|
try {
|
|
127
122
|
const raw = sessionStorage.getItem(previewCacheKey.value)
|
|
128
|
-
if (raw)
|
|
123
|
+
if (raw) {
|
|
124
|
+
previewFromCache.value = true
|
|
125
|
+
previewRow.value = JSON.parse(raw)
|
|
126
|
+
await nextTick()
|
|
127
|
+
previewFromCache.value = false
|
|
128
|
+
}
|
|
129
129
|
} catch {}
|
|
130
130
|
}
|
|
131
131
|
})
|
|
@@ -191,17 +191,17 @@ const reload = () => tableRef.value?.reload()
|
|
|
191
191
|
const clearCache = () => tableRef.value?.clearCache()
|
|
192
192
|
const exportTable = (format, allPages, filteredRows) => tableRef.value?.exportTable(format, allPages, filteredRows)
|
|
193
193
|
|
|
194
|
-
defineExpose({ getSelectedRows, reload, clearCache, exportTable, tableRef
|
|
194
|
+
defineExpose({ getSelectedRows, reload, clearCache, exportTable, tableRef })
|
|
195
195
|
</script>
|
|
196
196
|
|
|
197
197
|
<template>
|
|
198
198
|
<div class="relative" ref="containerRef">
|
|
199
199
|
|
|
200
200
|
<!-- Card único -->
|
|
201
|
-
<div class="bg-white dark:bg-slate-
|
|
201
|
+
<div class="bg-white dark:bg-slate-800 border border-slate-200 dark:border-slate-700 rounded-2xl shadow-sm overflow-hidden">
|
|
202
202
|
|
|
203
203
|
<!-- Toolbar -->
|
|
204
|
-
<div class="flex flex-wrap items-center gap-3 px-4 py-3 border-b border-slate-200 dark:border-slate-
|
|
204
|
+
<div class="flex flex-wrap items-center gap-3 px-4 py-3 border-b border-slate-200 dark:border-slate-700">
|
|
205
205
|
<div v-if="showSearch" class="flex-1 min-w-48">
|
|
206
206
|
<Forms.Input v-model="search" type="search" :placeholder="searchPlaceholder" :icon-left="IconSearch" />
|
|
207
207
|
</div>
|
|
@@ -214,7 +214,7 @@ defineExpose({ getSelectedRows, reload, clearCache, exportTable, tableRef, close
|
|
|
214
214
|
'py-1.5 px-3 inline-flex items-center gap-2 text-sm font-medium rounded-lg border transition-colors',
|
|
215
215
|
showFilterPanel || activeFilterCount > 0
|
|
216
216
|
? 'border-blue-500 bg-blue-50 text-blue-700 dark:bg-blue-900/20 dark:border-blue-500 dark:text-blue-300'
|
|
217
|
-
: 'border-slate-200 dark:border-slate-
|
|
217
|
+
: 'border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-800 text-slate-600 dark:text-slate-300 hover:bg-slate-50 dark:hover:bg-slate-700'
|
|
218
218
|
]"
|
|
219
219
|
>
|
|
220
220
|
<IconAdjustmentsHorizontal class="size-4" stroke="1.5" />
|
|
@@ -233,7 +233,7 @@ defineExpose({ getSelectedRows, reload, clearCache, exportTable, tableRef, close
|
|
|
233
233
|
<div
|
|
234
234
|
v-if="showFilterPanel"
|
|
235
235
|
ref="filterPanelRef"
|
|
236
|
-
class="absolute top-full left-0 z-50 mt-1.5 bg-white dark:bg-slate-
|
|
236
|
+
class="absolute top-full left-0 z-50 mt-1.5 bg-white dark:bg-slate-800 border border-slate-200 dark:border-slate-700 rounded-xl shadow-2xl p-3 min-w-56 max-h-96 overflow-y-auto"
|
|
237
237
|
>
|
|
238
238
|
<p class="text-[10px] font-bold text-slate-400 dark:text-slate-500 uppercase tracking-widest mb-3 px-1">Filtros</p>
|
|
239
239
|
<TableFilter v-model="activeFilters" :columns="filtersConfig" />
|
|
@@ -250,14 +250,14 @@ defineExpose({ getSelectedRows, reload, clearCache, exportTable, tableRef, close
|
|
|
250
250
|
'py-1.5 px-3 inline-flex items-center gap-2 text-sm font-medium rounded-lg border transition-colors',
|
|
251
251
|
showColumnPanel
|
|
252
252
|
? 'border-blue-500 bg-blue-50 text-blue-700 dark:bg-blue-900/20 dark:border-blue-500 dark:text-blue-300'
|
|
253
|
-
: 'border-slate-200 dark:border-slate-
|
|
253
|
+
: 'border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-800 text-slate-600 dark:text-slate-300 hover:bg-slate-50 dark:hover:bg-slate-700'
|
|
254
254
|
]"
|
|
255
255
|
>
|
|
256
256
|
<IconLayoutColumns class="size-4" />
|
|
257
257
|
Columnas
|
|
258
258
|
</button>
|
|
259
259
|
|
|
260
|
-
<TableExportable v-if="showExport" :table-ref="tableRef" :name="
|
|
260
|
+
<TableExportable v-if="showExport" :table-ref="tableRef" :name="name" :columns="columns" />
|
|
261
261
|
</div>
|
|
262
262
|
|
|
263
263
|
<!-- Contenido: tabla siempre full width + preview overlay -->
|
|
@@ -266,9 +266,9 @@ defineExpose({ getSelectedRows, reload, clearCache, exportTable, tableRef, close
|
|
|
266
266
|
<!-- Tabla -->
|
|
267
267
|
<Table
|
|
268
268
|
ref="tableRef"
|
|
269
|
-
:endpoint="
|
|
269
|
+
:endpoint="endpoint"
|
|
270
270
|
:columns="columns"
|
|
271
|
-
:name="
|
|
271
|
+
:name="name"
|
|
272
272
|
:params="mergedParams"
|
|
273
273
|
:search="search"
|
|
274
274
|
:checkable="checkable"
|
|
@@ -289,16 +289,16 @@ defineExpose({ getSelectedRows, reload, clearCache, exportTable, tableRef, close
|
|
|
289
289
|
|
|
290
290
|
<!-- Preview panel overlay — slides in from right, tapa la tabla -->
|
|
291
291
|
<Transition
|
|
292
|
-
enter-active-class="transition ease-out duration-200"
|
|
293
|
-
enter-from-class="opacity-0 translate-x-6"
|
|
294
|
-
enter-to-class="opacity-100 translate-x-0"
|
|
292
|
+
:enter-active-class="previewFromCache ? '' : 'transition ease-out duration-200'"
|
|
293
|
+
:enter-from-class="previewFromCache ? '' : 'opacity-0 translate-x-6'"
|
|
294
|
+
:enter-to-class="previewFromCache ? '' : 'opacity-100 translate-x-0'"
|
|
295
295
|
leave-active-class="transition ease-in duration-150"
|
|
296
296
|
leave-from-class="opacity-100 translate-x-0"
|
|
297
297
|
leave-to-class="opacity-0 translate-x-6"
|
|
298
298
|
>
|
|
299
299
|
<div
|
|
300
300
|
v-if="previewRow && previewEnabled"
|
|
301
|
-
class="absolute top-0 right-0 z-30 flex bg-white dark:bg-slate-
|
|
301
|
+
class="absolute top-0 right-0 z-30 flex bg-white dark:bg-slate-800 border-l border-slate-200 dark:border-slate-700 shadow-[-4px_0_16px_rgba(0,0,0,0.06)]"
|
|
302
302
|
:style="{ width: (100 - currentRatio) + '%', bottom: paginationHeight + 'px' }"
|
|
303
303
|
>
|
|
304
304
|
<!-- Resize handle -->
|
|
@@ -328,7 +328,7 @@ defineExpose({ getSelectedRows, reload, clearCache, exportTable, tableRef, close
|
|
|
328
328
|
<div
|
|
329
329
|
v-if="showColumnPanel"
|
|
330
330
|
ref="columnPanelRef"
|
|
331
|
-
class="absolute top-12 right-0 z-50 bg-white dark:bg-slate-
|
|
331
|
+
class="absolute top-12 right-0 z-50 bg-white dark:bg-slate-800 border border-slate-200 dark:border-slate-700 rounded-xl shadow-2xl p-3 min-w-56 max-h-80 overflow-y-auto"
|
|
332
332
|
>
|
|
333
333
|
<p class="text-[10px] font-bold text-slate-400 dark:text-slate-500 uppercase tracking-widest mb-2 px-1">
|
|
334
334
|
Columnas visibles
|
package/components/Table.vue
CHANGED
|
@@ -309,26 +309,6 @@ onBeforeUnmount(() => {
|
|
|
309
309
|
if (props.cached && tableData.value.length > 0) saveToCache()
|
|
310
310
|
})
|
|
311
311
|
|
|
312
|
-
// ─── TanStack Query invalidation signal ───────────────────────────────────────
|
|
313
|
-
// A lightweight query keyed by table name. Calling invalidateQueries(['table', name])
|
|
314
|
-
// from anywhere triggers clearCache + scheduleFetch without a full refactor.
|
|
315
|
-
const queryClient = useQueryClient()
|
|
316
|
-
const { data: _invalidateSignal } = useQuery({
|
|
317
|
-
queryKey: computed(() => ['table', props.name]),
|
|
318
|
-
queryFn: () => Date.now(),
|
|
319
|
-
initialData: 0,
|
|
320
|
-
staleTime: Infinity,
|
|
321
|
-
refetchOnWindowFocus: false,
|
|
322
|
-
refetchOnMount: false,
|
|
323
|
-
})
|
|
324
|
-
let _signalReady = false
|
|
325
|
-
onMounted(() => { _signalReady = true })
|
|
326
|
-
watch(_invalidateSignal, () => {
|
|
327
|
-
if (!_signalReady) return
|
|
328
|
-
clearCache()
|
|
329
|
-
scheduleFetch(0)
|
|
330
|
-
})
|
|
331
|
-
|
|
332
312
|
// ─── Column settings panel ────────────────────────────────────────────────────
|
|
333
313
|
const setColumnOrder = (order) => { columnOrder.value = order }
|
|
334
314
|
|
|
@@ -504,7 +484,7 @@ defineExpose({
|
|
|
504
484
|
<!-- Table view -->
|
|
505
485
|
<div v-if="!isGridView" class="overflow-x-auto relative">
|
|
506
486
|
<table
|
|
507
|
-
class="relative divide-y divide-gray-200 dark:divide-slate-
|
|
487
|
+
class="relative divide-y divide-gray-200 dark:divide-slate-700"
|
|
508
488
|
:style="{ tableLayout: 'fixed', width: table.getTotalSize() + 'px', minWidth: '100%' }"
|
|
509
489
|
>
|
|
510
490
|
<colgroup>
|
|
@@ -514,11 +494,11 @@ defineExpose({
|
|
|
514
494
|
:style="{ width: col.getSize() + 'px' }"
|
|
515
495
|
>
|
|
516
496
|
</colgroup>
|
|
517
|
-
<thead class="relative z-20 bg-white dark:bg-slate-
|
|
497
|
+
<thead class="relative z-20 bg-white dark:bg-slate-800">
|
|
518
498
|
<template v-for="headerGroup in table.getHeaderGroups()" :key="headerGroup.id">
|
|
519
499
|
<!-- Main header row -->
|
|
520
500
|
<tr
|
|
521
|
-
class="divide-x divide-slate-200 dark:divide-slate-
|
|
501
|
+
class="divide-x divide-slate-200 dark:divide-slate-700"
|
|
522
502
|
>
|
|
523
503
|
<th
|
|
524
504
|
v-for="header in headerGroup.headers"
|
|
@@ -544,7 +524,7 @@ defineExpose({
|
|
|
544
524
|
:checked="table.getIsAllRowsSelected()"
|
|
545
525
|
:indeterminate="table.getIsSomeRowsSelected()"
|
|
546
526
|
@change="table.getToggleAllRowsSelectedHandler()($event)"
|
|
547
|
-
class="mx-2 shrink-0 border-gray-300 rounded-sm text-blue-900 focus:ring-0 focus:ring-offset-0 dark:bg-slate-
|
|
527
|
+
class="mx-2 shrink-0 border-gray-300 rounded-sm text-blue-900 focus:ring-0 focus:ring-offset-0 dark:bg-slate-800 dark:border-slate-600"
|
|
548
528
|
/>
|
|
549
529
|
</template>
|
|
550
530
|
<!-- Regular column header -->
|
|
@@ -583,7 +563,7 @@ defineExpose({
|
|
|
583
563
|
<!-- Column filter row -->
|
|
584
564
|
<tr
|
|
585
565
|
v-if="hasFilterableColumns"
|
|
586
|
-
class="divide-x divide-gray-200 dark:divide-slate-
|
|
566
|
+
class="divide-x divide-gray-200 dark:divide-slate-700 border-b border-gray-200 dark:border-slate-700 bg-slate-50/50 dark:bg-slate-800/50"
|
|
587
567
|
>
|
|
588
568
|
<th
|
|
589
569
|
v-for="header in headerGroup.headers"
|
|
@@ -595,20 +575,20 @@ defineExpose({
|
|
|
595
575
|
:value="header.column.getFilterValue() ?? ''"
|
|
596
576
|
@input="(e) => header.column.setFilterValue(e.target.value || undefined)"
|
|
597
577
|
:placeholder="`Filtrar ${header.column.columnDef.meta?.label ?? ''}...`"
|
|
598
|
-
class="w-full bg-white dark:bg-slate-
|
|
578
|
+
class="w-full bg-white dark:bg-slate-800 border border-slate-200 dark:border-slate-700 rounded-lg text-xs text-slate-600 dark:text-slate-300 px-2.5 py-1 focus:ring-2 focus:ring-indigo-500/20 focus:border-indigo-400 dark:focus:border-indigo-500 outline-none transition-all"
|
|
599
579
|
/>
|
|
600
580
|
</th>
|
|
601
581
|
</tr>
|
|
602
582
|
</template>
|
|
603
583
|
</thead>
|
|
604
584
|
|
|
605
|
-
<tbody ref="tableBodyRef" class="divide-y divide-gray-200 dark:divide-slate-
|
|
585
|
+
<tbody ref="tableBodyRef" class="divide-y divide-gray-200 dark:divide-slate-700">
|
|
606
586
|
<!-- Loading skeleton rows -->
|
|
607
587
|
<tr
|
|
608
588
|
v-if="loading"
|
|
609
589
|
v-for="(_, i) in skeletonRows"
|
|
610
590
|
:key="'sk-' + i"
|
|
611
|
-
class="animate-pulse divide-x divide-gray-200 dark:divide-slate-
|
|
591
|
+
class="animate-pulse divide-x divide-gray-200 dark:divide-slate-700 bg-white dark:bg-slate-800"
|
|
612
592
|
>
|
|
613
593
|
<td
|
|
614
594
|
v-for="header in (table.getHeaderGroups()[0]?.headers ?? [])"
|
|
@@ -626,7 +606,7 @@ defineExpose({
|
|
|
626
606
|
v-if="loading && skeletonRows.length < pagination.pageSize"
|
|
627
607
|
v-for="i in (pagination.pageSize - skeletonRows.length)"
|
|
628
608
|
:key="'lf-' + i"
|
|
629
|
-
class="divide-x divide-gray-200 dark:divide-slate-
|
|
609
|
+
class="divide-x divide-gray-200 dark:divide-slate-700 bg-white dark:bg-slate-800"
|
|
630
610
|
>
|
|
631
611
|
<td
|
|
632
612
|
v-for="header in (table.getHeaderGroups()[0]?.headers ?? [])"
|
|
@@ -640,7 +620,7 @@ defineExpose({
|
|
|
640
620
|
v-if="!loading && tableData.length === 0"
|
|
641
621
|
v-for="i in pagination.pageSize"
|
|
642
622
|
:key="'esk-' + i"
|
|
643
|
-
class="divide-x divide-gray-200 dark:divide-slate-
|
|
623
|
+
class="divide-x divide-gray-200 dark:divide-slate-700 bg-white dark:bg-slate-800"
|
|
644
624
|
>
|
|
645
625
|
<td
|
|
646
626
|
v-for="header in (table.getHeaderGroups()[0]?.headers ?? [])"
|
|
@@ -658,7 +638,7 @@ defineExpose({
|
|
|
658
638
|
@click="(e) => handleRowClick(row, e)"
|
|
659
639
|
@keydown="(e) => handleRowKeydown(row, e)"
|
|
660
640
|
:tabindex="isRowClickEnabled ? 0 : undefined"
|
|
661
|
-
class="divide-x divide-gray-200 dark:divide-slate-
|
|
641
|
+
class="divide-x divide-gray-200 dark:divide-slate-700 bg-white hover:bg-gray-50 dark:bg-slate-800 dark:hover:bg-slate-900 transition-colors"
|
|
662
642
|
:class="{
|
|
663
643
|
'cursor-pointer': isRowClickEnabled,
|
|
664
644
|
'bg-indigo-50/40 dark:bg-indigo-900/10 hover:bg-indigo-50/60': row.getIsSelected(),
|
|
@@ -684,7 +664,7 @@ defineExpose({
|
|
|
684
664
|
:checked="row.getIsSelected()"
|
|
685
665
|
:disabled="!row.getCanSelect()"
|
|
686
666
|
@change="row.getToggleSelectedHandler()($event)"
|
|
687
|
-
class="rounded border-gray-300 focus:ring-0 focus:ring-offset-0 dark:bg-slate-
|
|
667
|
+
class="rounded border-gray-300 focus:ring-0 focus:ring-offset-0 dark:bg-slate-800 dark:border-slate-600"
|
|
688
668
|
/>
|
|
689
669
|
</div>
|
|
690
670
|
</template>
|
|
@@ -702,7 +682,7 @@ defineExpose({
|
|
|
702
682
|
v-if="!loading && tableData.length > 0 && tableData.length < pagination.pageSize"
|
|
703
683
|
v-for="i in (pagination.pageSize - tableData.length)"
|
|
704
684
|
:key="'fill-' + i"
|
|
705
|
-
class="divide-x divide-gray-200 dark:divide-slate-
|
|
685
|
+
class="divide-x divide-gray-200 dark:divide-slate-700 bg-white dark:bg-slate-800"
|
|
706
686
|
>
|
|
707
687
|
<td
|
|
708
688
|
v-for="header in (table.getHeaderGroups()[0]?.headers ?? [])"
|
|
@@ -716,7 +696,7 @@ defineExpose({
|
|
|
716
696
|
<!-- Empty state overlays -->
|
|
717
697
|
<div
|
|
718
698
|
v-if="!loading && tableData.length === 0 && !search && !columnFilters.length"
|
|
719
|
-
class="absolute inset-0 z-10 pointer-events-none flex items-center justify-center backdrop-blur-sm bg-white/60 dark:bg-slate-
|
|
699
|
+
class="absolute inset-0 z-10 pointer-events-none flex items-center justify-center backdrop-blur-sm bg-white/60 dark:bg-slate-800/60 rounded-xl"
|
|
720
700
|
>
|
|
721
701
|
<slot name="empty">
|
|
722
702
|
<p class="text-slate-400 dark:text-slate-500 text-lg font-medium italic">No hay registros</p>
|
|
@@ -725,7 +705,7 @@ defineExpose({
|
|
|
725
705
|
|
|
726
706
|
<div
|
|
727
707
|
v-if="!loading && tableData.length === 0 && (search || columnFilters.length)"
|
|
728
|
-
class="absolute inset-0 z-10 pointer-events-none flex items-center justify-center backdrop-blur-sm bg-white/60 dark:bg-slate-
|
|
708
|
+
class="absolute inset-0 z-10 pointer-events-none flex items-center justify-center backdrop-blur-sm bg-white/60 dark:bg-slate-800/60 rounded-xl"
|
|
729
709
|
>
|
|
730
710
|
<slot name="empty-search">
|
|
731
711
|
<p class="text-slate-400 dark:text-slate-500 text-lg font-medium italic">No hay registros en la búsqueda</p>
|
|
@@ -738,7 +718,7 @@ defineExpose({
|
|
|
738
718
|
<div v-if="loading" :class="gridClass">
|
|
739
719
|
<div v-for="(_, i) in skeletonRows" :key="'gsk-' + i" class="animate-pulse">
|
|
740
720
|
<slot name="grid-skeleton">
|
|
741
|
-
<div class="bg-white dark:bg-slate-
|
|
721
|
+
<div class="bg-white dark:bg-slate-800 rounded-lg border border-gray-200 dark:border-slate-700 p-4">
|
|
742
722
|
<div class="space-y-3">
|
|
743
723
|
<div class="h-4 bg-gray-200 dark:bg-slate-600 rounded w-3/4"></div>
|
|
744
724
|
<div class="h-4 bg-gray-200 dark:bg-slate-600 rounded w-1/2"></div>
|
|
@@ -760,11 +740,11 @@ defineExpose({
|
|
|
760
740
|
:checkable="checkable"
|
|
761
741
|
:toggle-row="() => row.toggleSelected()"
|
|
762
742
|
>
|
|
763
|
-
<div class="bg-white dark:bg-slate-
|
|
743
|
+
<div class="bg-white dark:bg-slate-800 rounded-lg border border-gray-200 dark:border-slate-700 p-4 hover:shadow-md transition-shadow relative"
|
|
764
744
|
:class="{ 'ring-2 ring-indigo-400 dark:ring-indigo-600': row.getIsSelected() }">
|
|
765
745
|
<div v-if="checkable" class="absolute top-2 left-2 z-10">
|
|
766
746
|
<input type="checkbox" :checked="row.getIsSelected()" @change="row.toggleSelected()"
|
|
767
|
-
class="rounded border-gray-300 dark:bg-slate-
|
|
747
|
+
class="rounded border-gray-300 dark:bg-slate-800 dark:border-slate-600" />
|
|
768
748
|
</div>
|
|
769
749
|
<div class="space-y-2" :class="{ 'pt-6': checkable }">
|
|
770
750
|
<div v-for="cell in row.getVisibleCells().filter(c => c.column.id !== 'select')" :key="cell.id" class="flex justify-between">
|
|
@@ -789,7 +769,7 @@ defineExpose({
|
|
|
789
769
|
</div>
|
|
790
770
|
|
|
791
771
|
<!-- Pagination & controls bar -->
|
|
792
|
-
<div ref="paginationBarRef" class="flex flex-col sm:flex-row items-center justify-between gap-y-4 sm:gap-y-0 px-4 py-3 border-t border-slate-200 dark:border-slate-
|
|
772
|
+
<div ref="paginationBarRef" class="flex flex-col sm:flex-row items-center justify-between gap-y-4 sm:gap-y-0 px-4 py-3 border-t border-slate-200 dark:border-slate-700">
|
|
793
773
|
<!-- Left: reload, total, cache, columns button -->
|
|
794
774
|
<div class="flex items-center gap-x-4 flex-wrap gap-y-2">
|
|
795
775
|
<!-- Reload button -->
|
|
@@ -836,7 +816,7 @@ defineExpose({
|
|
|
836
816
|
v-if="!isCustomPerPage"
|
|
837
817
|
:value="pagination.pageSize"
|
|
838
818
|
@change="(e) => handlePerPageChange(e.target.value)"
|
|
839
|
-
class="bg-slate-100 dark:bg-slate-
|
|
819
|
+
class="bg-slate-100 dark:bg-slate-800 border-none text-[11px] font-bold text-slate-600 dark:text-slate-300 rounded-lg focus:ring-0 cursor-pointer py-1 pl-2 pr-8"
|
|
840
820
|
>
|
|
841
821
|
<option :value="10">10</option>
|
|
842
822
|
<option :value="25">25</option>
|
|
@@ -850,7 +830,7 @@ defineExpose({
|
|
|
850
830
|
:value="pagination.pageSize"
|
|
851
831
|
@change="(e) => table.setPageSize(parseInt(e.target.value) || 10)"
|
|
852
832
|
min="1" max="500"
|
|
853
|
-
class="w-14 bg-slate-100 dark:bg-slate-
|
|
833
|
+
class="w-14 bg-slate-100 dark:bg-slate-800 border-none text-[11px] font-bold text-slate-600 dark:text-slate-300 rounded-lg focus:ring-2 focus:ring-indigo-500/20 py-1 px-2"
|
|
854
834
|
/>
|
|
855
835
|
<button @click="resetPerPage" class="text-[10px] text-indigo-500 font-bold hover:underline">Volver</button>
|
|
856
836
|
</div>
|