siesa-ui-kit 1.0.2 → 1.0.4
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/README.md +115 -115
- package/bin/install.cjs +502 -502
- package/bin/prepare-publish.cjs +28 -28
- package/bin/restore-folders.cjs +28 -28
- package/claude/agents/siesa-ui-kit-specialist.md +2445 -0
- package/claude/prompts/component-template.md +121 -0
- package/claude/prompts/siesa-ui-kit.md +28 -0
- package/claude/settings.local.json +67 -2
- package/dist/components/Button/icons.d.ts +6 -5
- package/dist/components/Button/icons.d.ts.map +1 -1
- package/dist/components/DropdownItemCollapsible/DropdownItemCollapsible.d.ts.map +1 -1
- package/dist/components/DropdownItemCollapsible/DropdownItemCollapsible.types.d.ts +21 -0
- package/dist/components/DropdownItemCollapsible/DropdownItemCollapsible.types.d.ts.map +1 -1
- package/dist/components/NavigationRailCommercial/NavigationRailCommercial.d.ts +122 -0
- package/dist/components/NavigationRailCommercial/NavigationRailCommercial.d.ts.map +1 -0
- package/dist/components/NavigationRailCommercial/NavigationRailCommercial.types.d.ts +139 -0
- package/dist/components/NavigationRailCommercial/NavigationRailCommercial.types.d.ts.map +1 -0
- package/dist/components/NavigationRailCommercial/icons.d.ts +33 -0
- package/dist/components/NavigationRailCommercial/icons.d.ts.map +1 -0
- package/dist/components/NavigationRailCommercial/index.d.ts +4 -0
- package/dist/components/NavigationRailCommercial/index.d.ts.map +1 -0
- package/dist/components/NavigationRailItem/NavigationRailItem.d.ts.map +1 -1
- package/dist/components/NavigationRailItem/NavigationRailItem.types.d.ts +7 -0
- package/dist/components/NavigationRailItem/NavigationRailItem.types.d.ts.map +1 -1
- package/dist/components/NavigationRailTypes/NavigationRailTypes.d.ts.map +1 -1
- package/dist/components/NavigationRailTypes/NavigationRailTypes.types.d.ts +41 -0
- package/dist/components/NavigationRailTypes/NavigationRailTypes.types.d.ts.map +1 -1
- package/dist/components/NavigationRailTypes/icons.d.ts +15 -29
- package/dist/components/NavigationRailTypes/icons.d.ts.map +1 -1
- package/dist/components/Select/Select.d.ts.map +1 -1
- package/dist/components/Select/icons.d.ts +6 -2
- package/dist/components/Select/icons.d.ts.map +1 -1
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/siesa-ui-kit.cjs +404 -190
- package/dist/siesa-ui-kit.cjs.map +1 -1
- package/dist/siesa-ui-kit.mjs +6590 -1506
- package/dist/siesa-ui-kit.mjs.map +1 -1
- package/dist/views/LayoutCommercial/LayoutCommercial.d.ts +48 -0
- package/dist/views/LayoutCommercial/LayoutCommercial.d.ts.map +1 -0
- package/dist/views/LayoutCommercial/LayoutCommercial.types.d.ts +49 -0
- package/dist/views/LayoutCommercial/LayoutCommercial.types.d.ts.map +1 -0
- package/dist/views/LayoutCommercial/index.d.ts +3 -0
- package/dist/views/LayoutCommercial/index.d.ts.map +1 -0
- package/docs/icons.md +12 -31
- package/package.json +111 -110
- package/src/components/Avatar/Avatar.stories.tsx +494 -494
- package/src/components/Button/Button.stories.tsx +950 -950
- package/src/components/Button/Button.tsx +337 -337
- package/src/components/Button/Button.types.ts +180 -180
- package/src/components/Button/icons.tsx +23 -62
- package/src/components/DescriptionList/DescriptionList.stories.tsx +250 -250
- package/src/components/Divider/Divider.stories.tsx +263 -263
- package/src/components/DropdownItemCollapsible/DropdownItemCollapsible.stories.tsx +317 -317
- package/src/components/DropdownItemCollapsible/DropdownItemCollapsible.tsx +307 -287
- package/src/components/DropdownItemCollapsible/DropdownItemCollapsible.types.ts +136 -111
- package/src/components/DropdownItemCollapsible/README.md +264 -264
- package/src/components/DropdownItemCollapsible/icons.tsx +57 -57
- package/src/components/DropdownItemCollapsible/index.ts +12 -12
- package/src/components/DropdownItemHeading/DropdownItemHeading.stories.tsx +386 -386
- package/src/components/DropdownItemHeading/DropdownItemHeading.tsx +216 -216
- package/src/components/DropdownItemHeading/DropdownItemHeading.types.ts +93 -93
- package/src/components/DropdownItemHeading/README.md +573 -573
- package/src/components/DropdownItemHeading/icons.tsx +125 -125
- package/src/components/DropdownItemHeading/index.ts +3 -3
- package/src/components/Input/Input.stories.tsx +583 -583
- package/src/components/LoginView/LoginView.stories.tsx +148 -148
- package/src/components/LoginView/LoginView.tsx +426 -426
- package/src/components/LoginView/LoginView.types.ts +52 -52
- package/src/components/LoginView/README.md +396 -396
- package/src/components/LoginView/icons.tsx +85 -85
- package/src/components/LoginView/index.ts +3 -3
- package/src/components/Navbar/Navbar.stories.tsx +810 -810
- package/src/components/Navbar/Navbar.tsx +755 -755
- package/src/components/Navbar/Navbar.types.ts +219 -219
- package/src/components/Navbar/README.md +279 -279
- package/src/components/Navbar/index.ts +8 -8
- package/src/components/NavigationRailCommercial/NavigationRailCommercial.stories.tsx +464 -0
- package/src/components/NavigationRailCommercial/NavigationRailCommercial.tsx +301 -0
- package/src/components/NavigationRailCommercial/NavigationRailCommercial.types.ts +162 -0
- package/src/components/NavigationRailCommercial/README.md +251 -0
- package/src/components/NavigationRailCommercial/icons.tsx +54 -0
- package/src/components/NavigationRailCommercial/index.ts +6 -0
- package/src/components/NavigationRailItem/NavigationRailItem.stories.tsx +667 -667
- package/src/components/NavigationRailItem/NavigationRailItem.tsx +314 -313
- package/src/components/NavigationRailItem/NavigationRailItem.types.ts +175 -167
- package/src/components/NavigationRailItem/README.md +476 -476
- package/src/components/NavigationRailItem/index.ts +2 -2
- package/src/components/NavigationRailPanel/NavigationRailPanel.stories.tsx +462 -462
- package/src/components/NavigationRailPanel/NavigationRailPanel.tsx +332 -332
- package/src/components/NavigationRailPanel/NavigationRailPanel.types.ts +178 -178
- package/src/components/NavigationRailPanel/README.md +461 -461
- package/src/components/NavigationRailPanel/index.ts +6 -6
- package/src/components/NavigationRailTypes/NavigationRailTypes.stories.tsx +682 -528
- package/src/components/NavigationRailTypes/NavigationRailTypes.tsx +363 -378
- package/src/components/NavigationRailTypes/NavigationRailTypes.types.ts +178 -130
- package/src/components/NavigationRailTypes/README.md +573 -573
- package/src/components/NavigationRailTypes/icons.tsx +76 -141
- package/src/components/NavigationRailTypes/index.ts +7 -7
- package/src/components/Notification/Notification.stories.tsx +513 -513
- package/src/components/Notification/Notification.tsx +145 -145
- package/src/components/Notification/Notification.types.ts +142 -142
- package/src/components/Notification/README.md +409 -409
- package/src/components/POSConvention/POSConvention.stories.tsx +235 -235
- package/src/components/POSConvention/POSConvention.tsx +129 -129
- package/src/components/POSConvention/POSConvention.types.ts +38 -38
- package/src/components/POSConvention/README.md +123 -123
- package/src/components/POSConvention/icons.tsx +45 -45
- package/src/components/POSConvention/index.ts +3 -3
- package/src/components/POSLocationButton/POSLocationButton.stories.tsx +531 -531
- package/src/components/POSLocationButton/POSLocationButton.tsx +247 -247
- package/src/components/POSLocationButton/POSLocationButton.types.ts +87 -87
- package/src/components/POSLocationButton/README.md +253 -253
- package/src/components/POSLocationButton/icons.tsx +120 -120
- package/src/components/POSLocationButton/index.ts +14 -14
- package/src/components/POSNumberButton/POSNumberButton.stories.tsx +415 -415
- package/src/components/POSNumberButton/POSNumberButton.tsx +179 -179
- package/src/components/POSNumberButton/POSNumberButton.types.ts +51 -51
- package/src/components/POSNumberButton/README.md +321 -321
- package/src/components/POSNumberButton/index.ts +3 -3
- package/src/components/POSProductButton/POSProductButton.stories.tsx +318 -318
- package/src/components/POSProductCard/POSProductCard.stories.tsx +642 -642
- package/src/components/POSProductCard/POSProductCard.tsx +208 -208
- package/src/components/POSProductCard/POSProductCard.types.ts +76 -76
- package/src/components/POSProductCard/README.md +179 -179
- package/src/components/POSProductCard/icons.tsx +26 -26
- package/src/components/POSProductCard/index.ts +2 -2
- package/src/components/POSProductSidebarItems/POSProductSidebarItems.stories.tsx +753 -753
- package/src/components/POSProductSidebarItems/POSProductSidebarItems.tsx +332 -332
- package/src/components/POSProductSidebarItems/POSProductSidebarItems.types.ts +119 -119
- package/src/components/POSProductSidebarItems/README.md +198 -198
- package/src/components/POSProductSidebarItems/icons.tsx +21 -21
- package/src/components/POSProductSidebarItems/index.ts +3 -3
- package/src/components/POSTable/POSTable.stories.tsx +737 -737
- package/src/components/POSTable/POSTable.tsx +401 -401
- package/src/components/POSTable/README.md +286 -286
- package/src/components/Quantity/Quantity.stories.tsx +457 -457
- package/src/components/Radio/Radio.stories.tsx +523 -523
- package/src/components/Radio/Radio.tsx +1 -1
- package/src/components/Select/Select.stories.tsx +32 -0
- package/src/components/Select/Select.tsx +457 -454
- package/src/components/Select/icons.tsx +16 -41
- package/src/components/SignUpView/SignUpView.stories.tsx +129 -129
- package/src/components/SignUpView/SignUpView.tsx +503 -503
- package/src/components/SignUpView/SignUpView.types.ts +58 -58
- package/src/components/SignUpView/icons.tsx +71 -71
- package/src/components/SignUpView/index.ts +3 -3
- package/src/components/Switch/README.md +112 -112
- package/src/components/Switch/Switch.stories.tsx +550 -550
- package/src/components/Switch/Switch.tsx +246 -246
- package/src/components/Switch/Switch.types.ts +67 -67
- package/src/components/Table/Table.stories.tsx +805 -805
- package/src/components/Tabs/README.md +201 -201
- package/src/components/Tabs/Tabs.stories.tsx +580 -580
- package/src/components/Tabs/Tabs.tsx +356 -356
- package/src/components/Tabs/Tabs.types.ts +127 -127
- package/src/components/Tabs/icons.tsx +129 -129
- package/src/components/Tabs/index.ts +11 -11
- package/src/components/Textarea/Textarea.stories.tsx +535 -535
- package/src/index.ts +133 -102
- package/src/views/LayoutCommercial/LayoutCommercial.stories.tsx +374 -0
- package/src/views/LayoutCommercial/LayoutCommercial.tsx +125 -0
- package/src/views/LayoutCommercial/LayoutCommercial.types.ts +54 -0
- package/src/views/LayoutCommercial/README.md +286 -0
- package/src/views/LayoutCommercial/index.ts +2 -0
- package/src/views/ListView/ListView.stories.tsx +329 -329
- package/src/views/ListView/ListView.tsx +570 -570
- package/src/views/ListView/ListView.types.ts +211 -211
- package/src/views/ListView/icons.tsx +282 -282
- package/src/views/ListView/index.ts +11 -11
- package/src/views/LoginView/LoginView.tsx +426 -426
- package/src/views/ProductsView/ProductsView.stories.tsx +344 -344
- package/src/views/ProductsView/ProductsView.tsx +480 -480
- package/src/views/ProductsView/ProductsView.types.ts +238 -238
- package/src/views/ProductsView/README.md +312 -312
- package/src/views/ProductsView/icons.tsx +38 -38
- package/src/views/ProductsView/index.ts +8 -8
- package/src/views/RecoverPasswordView/RecoverPasswordView.tsx +376 -376
- package/src/views/SignUpView/SignUpView.tsx +503 -503
- package/src/views/TableLayoutView/README.md +268 -268
- package/src/views/TableLayoutView/TableLayoutView.stories.tsx +235 -235
- package/src/views/TableLayoutView/TableLayoutView.tsx +461 -461
- package/src/views/TableLayoutView/TableLayoutView.types.ts +209 -209
- package/src/views/TableLayoutView/icons.tsx +113 -113
- package/src/views/TableLayoutView/index.ts +6 -6
- package/storybook/main.ts +19 -19
- package/storybook/preview.tsx +84 -84
- package/storybook/vitest.setup.ts +6 -6
- package/tailwind.config.js +128 -128
|
@@ -1,805 +1,805 @@
|
|
|
1
|
-
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
-
import { useState } from 'react';
|
|
3
|
-
import { Table } from './Table';
|
|
4
|
-
import type { TableColumn } from './Table.types';
|
|
5
|
-
|
|
6
|
-
// Datos de ejemplo
|
|
7
|
-
interface Usuario {
|
|
8
|
-
id: number;
|
|
9
|
-
nombre: string;
|
|
10
|
-
email: string;
|
|
11
|
-
usuario: string;
|
|
12
|
-
rol: string;
|
|
13
|
-
estado: 'activo' | 'inactivo';
|
|
14
|
-
avatar?: string;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
const usuariosEjemplo: Usuario[] = [
|
|
18
|
-
{
|
|
19
|
-
id: 1,
|
|
20
|
-
nombre: 'Jhonnatan Diaz',
|
|
21
|
-
email: 'jhonnatan.diaz@siesa.com',
|
|
22
|
-
usuario: 'jhonnatan.diaz',
|
|
23
|
-
rol: 'Administrador',
|
|
24
|
-
estado: 'activo',
|
|
25
|
-
avatar: 'https://i.pravatar.cc/150?img=1',
|
|
26
|
-
},
|
|
27
|
-
{
|
|
28
|
-
id: 2,
|
|
29
|
-
nombre: 'Santiago Sanchez',
|
|
30
|
-
email: 'santiago.sanchez@siesa.com',
|
|
31
|
-
usuario: 'santiago.sanchez',
|
|
32
|
-
rol: 'Desarrollador',
|
|
33
|
-
estado: 'activo',
|
|
34
|
-
avatar: 'https://i.pravatar.cc/150?img=2',
|
|
35
|
-
},
|
|
36
|
-
{
|
|
37
|
-
id: 3,
|
|
38
|
-
nombre: 'Daniel Mesa',
|
|
39
|
-
email: 'daniel.mesa@siesa.com',
|
|
40
|
-
usuario: 'daniel.mesa',
|
|
41
|
-
rol: 'Diseñador',
|
|
42
|
-
estado: 'activo',
|
|
43
|
-
avatar: 'https://i.pravatar.cc/150?img=3',
|
|
44
|
-
},
|
|
45
|
-
{
|
|
46
|
-
id: 4,
|
|
47
|
-
nombre: 'Juan David Guevara',
|
|
48
|
-
email: 'juan.guevara@siesa.com',
|
|
49
|
-
usuario: 'juan.guevara',
|
|
50
|
-
rol: 'QA',
|
|
51
|
-
estado: 'inactivo',
|
|
52
|
-
avatar: 'https://i.pravatar.cc/150?img=4',
|
|
53
|
-
},
|
|
54
|
-
{
|
|
55
|
-
id: 5,
|
|
56
|
-
nombre: 'Guillermo Duran',
|
|
57
|
-
email: 'guillermo.duran@siesa.com',
|
|
58
|
-
usuario: 'guillermo.duran',
|
|
59
|
-
rol: 'Product Manager',
|
|
60
|
-
estado: 'activo',
|
|
61
|
-
avatar: 'https://i.pravatar.cc/150?img=5',
|
|
62
|
-
},
|
|
63
|
-
];
|
|
64
|
-
|
|
65
|
-
const meta = {
|
|
66
|
-
title: 'Siesa UI Kit/Table',
|
|
67
|
-
component: Table,
|
|
68
|
-
parameters: {
|
|
69
|
-
layout: 'padded',
|
|
70
|
-
docs: {
|
|
71
|
-
description: {
|
|
72
|
-
component:
|
|
73
|
-
'Componente de tabla flexible con soporte para sorting, variantes visuales y dark mode completo.',
|
|
74
|
-
},
|
|
75
|
-
},
|
|
76
|
-
},
|
|
77
|
-
tags: ['autodocs'],
|
|
78
|
-
argTypes: {
|
|
79
|
-
title: {
|
|
80
|
-
control: 'text',
|
|
81
|
-
description: 'Título opcional de la tabla',
|
|
82
|
-
table: {
|
|
83
|
-
type: { summary: 'string' },
|
|
84
|
-
category: 'Contenido',
|
|
85
|
-
},
|
|
86
|
-
},
|
|
87
|
-
variant: {
|
|
88
|
-
control: 'select',
|
|
89
|
-
options: ['basic', 'fullWidth', 'striped', 'grid'],
|
|
90
|
-
description: 'Variante visual de la tabla',
|
|
91
|
-
table: {
|
|
92
|
-
type: { summary: 'string' },
|
|
93
|
-
defaultValue: { summary: 'basic' },
|
|
94
|
-
category: 'Apariencia',
|
|
95
|
-
},
|
|
96
|
-
},
|
|
97
|
-
showBorder: {
|
|
98
|
-
control: 'boolean',
|
|
99
|
-
description: 'Si se muestra el borde del container',
|
|
100
|
-
table: {
|
|
101
|
-
type: { summary: 'boolean' },
|
|
102
|
-
defaultValue: { summary: 'true' },
|
|
103
|
-
category: 'Apariencia',
|
|
104
|
-
},
|
|
105
|
-
},
|
|
106
|
-
showShadow: {
|
|
107
|
-
control: 'boolean',
|
|
108
|
-
description: 'Si se muestra la sombra del container',
|
|
109
|
-
table: {
|
|
110
|
-
type: { summary: 'boolean' },
|
|
111
|
-
defaultValue: { summary: 'true' },
|
|
112
|
-
category: 'Apariencia',
|
|
113
|
-
},
|
|
114
|
-
},
|
|
115
|
-
fullWidth: {
|
|
116
|
-
control: 'boolean',
|
|
117
|
-
description: 'Si la tabla debe ocupar todo el ancho disponible',
|
|
118
|
-
table: {
|
|
119
|
-
type: { summary: 'boolean' },
|
|
120
|
-
defaultValue: { summary: 'false' },
|
|
121
|
-
category: 'Apariencia',
|
|
122
|
-
},
|
|
123
|
-
},
|
|
124
|
-
loading: {
|
|
125
|
-
control: 'boolean',
|
|
126
|
-
description: 'Si se está cargando la información',
|
|
127
|
-
table: {
|
|
128
|
-
type: { summary: 'boolean' },
|
|
129
|
-
defaultValue: { summary: 'false' },
|
|
130
|
-
category: 'Estado',
|
|
131
|
-
},
|
|
132
|
-
},
|
|
133
|
-
emptyMessage: {
|
|
134
|
-
control: 'text',
|
|
135
|
-
description: 'Texto a mostrar cuando no hay datos',
|
|
136
|
-
table: {
|
|
137
|
-
type: { summary: 'string' },
|
|
138
|
-
defaultValue: { summary: 'No hay datos disponibles' },
|
|
139
|
-
category: 'Contenido',
|
|
140
|
-
},
|
|
141
|
-
},
|
|
142
|
-
},
|
|
143
|
-
} satisfies Meta<typeof Table>;
|
|
144
|
-
|
|
145
|
-
export default meta;
|
|
146
|
-
type Story = StoryObj<typeof meta>;
|
|
147
|
-
|
|
148
|
-
// ============================================
|
|
149
|
-
// 1. PLAYGROUND INTERACTIVO
|
|
150
|
-
// ============================================
|
|
151
|
-
export const Playground: Story = {
|
|
152
|
-
args: {
|
|
153
|
-
title: 'Usuarios',
|
|
154
|
-
columns: [
|
|
155
|
-
{ header: 'Nombre', accessor: 'nombre', sortable: true },
|
|
156
|
-
{ header: 'Email', accessor: 'email' },
|
|
157
|
-
{ header: 'Usuario', accessor: 'usuario' },
|
|
158
|
-
],
|
|
159
|
-
data: usuariosEjemplo,
|
|
160
|
-
variant: 'basic',
|
|
161
|
-
showBorder: true,
|
|
162
|
-
showShadow: true,
|
|
163
|
-
fullWidth: false,
|
|
164
|
-
},
|
|
165
|
-
};
|
|
166
|
-
|
|
167
|
-
// ============================================
|
|
168
|
-
// 2. VARIANTE BÁSICA
|
|
169
|
-
// ============================================
|
|
170
|
-
export const Basica: Story = {
|
|
171
|
-
args: { columns: [], data: [] },
|
|
172
|
-
render: () => {
|
|
173
|
-
const columns: TableColumn<Usuario>[] = [
|
|
174
|
-
{
|
|
175
|
-
header: 'Nombre',
|
|
176
|
-
accessor: 'nombre',
|
|
177
|
-
sortable: true,
|
|
178
|
-
},
|
|
179
|
-
{
|
|
180
|
-
header: 'Email',
|
|
181
|
-
accessor: 'email',
|
|
182
|
-
},
|
|
183
|
-
{
|
|
184
|
-
header: 'Usuario',
|
|
185
|
-
accessor: 'usuario',
|
|
186
|
-
},
|
|
187
|
-
];
|
|
188
|
-
|
|
189
|
-
return (
|
|
190
|
-
<div className="max-w-4xl">
|
|
191
|
-
<Table title="Usuarios" columns={columns} data={usuariosEjemplo} variant="basic" />
|
|
192
|
-
</div>
|
|
193
|
-
);
|
|
194
|
-
},
|
|
195
|
-
};
|
|
196
|
-
|
|
197
|
-
// ============================================
|
|
198
|
-
// 3. VARIANTE FULL WIDTH
|
|
199
|
-
// ============================================
|
|
200
|
-
export const AnchoCompleto: Story = {
|
|
201
|
-
args: { columns: [], data: [] },
|
|
202
|
-
render: () => {
|
|
203
|
-
const columns: TableColumn<Usuario>[] = [
|
|
204
|
-
{
|
|
205
|
-
header: 'Nombre',
|
|
206
|
-
accessor: 'nombre',
|
|
207
|
-
sortable: true,
|
|
208
|
-
},
|
|
209
|
-
{
|
|
210
|
-
header: 'Email',
|
|
211
|
-
accessor: 'email',
|
|
212
|
-
},
|
|
213
|
-
{
|
|
214
|
-
header: 'Usuario',
|
|
215
|
-
accessor: 'usuario',
|
|
216
|
-
},
|
|
217
|
-
];
|
|
218
|
-
|
|
219
|
-
return (
|
|
220
|
-
<div className="w-full">
|
|
221
|
-
<Table
|
|
222
|
-
title="Usuarios - Ancho Completo"
|
|
223
|
-
columns={columns}
|
|
224
|
-
data={usuariosEjemplo}
|
|
225
|
-
variant="fullWidth"
|
|
226
|
-
/>
|
|
227
|
-
</div>
|
|
228
|
-
);
|
|
229
|
-
},
|
|
230
|
-
};
|
|
231
|
-
|
|
232
|
-
// ============================================
|
|
233
|
-
// 4. VARIANTE STRIPED (FILAS ALTERNAS)
|
|
234
|
-
// ============================================
|
|
235
|
-
export const FilasAlternas: Story = {
|
|
236
|
-
args: { columns: [], data: [] },
|
|
237
|
-
render: () => {
|
|
238
|
-
const columns: TableColumn<Usuario>[] = [
|
|
239
|
-
{
|
|
240
|
-
header: 'Nombre',
|
|
241
|
-
accessor: 'nombre',
|
|
242
|
-
sortable: true,
|
|
243
|
-
},
|
|
244
|
-
{
|
|
245
|
-
header: 'Email',
|
|
246
|
-
accessor: 'email',
|
|
247
|
-
},
|
|
248
|
-
{
|
|
249
|
-
header: 'Usuario',
|
|
250
|
-
accessor: 'usuario',
|
|
251
|
-
},
|
|
252
|
-
];
|
|
253
|
-
|
|
254
|
-
return (
|
|
255
|
-
<div className="max-w-4xl">
|
|
256
|
-
<Table
|
|
257
|
-
title="Usuarios - Filas Alternas"
|
|
258
|
-
columns={columns}
|
|
259
|
-
data={usuariosEjemplo}
|
|
260
|
-
variant="striped"
|
|
261
|
-
/>
|
|
262
|
-
</div>
|
|
263
|
-
);
|
|
264
|
-
},
|
|
265
|
-
};
|
|
266
|
-
|
|
267
|
-
// ============================================
|
|
268
|
-
// 5. VARIANTE CON GRID (BORDES)
|
|
269
|
-
// ============================================
|
|
270
|
-
export const ConBordes: Story = {
|
|
271
|
-
args: { columns: [], data: [] },
|
|
272
|
-
render: () => {
|
|
273
|
-
const columns: TableColumn<Usuario>[] = [
|
|
274
|
-
{
|
|
275
|
-
header: 'Nombre',
|
|
276
|
-
accessor: 'nombre',
|
|
277
|
-
sortable: true,
|
|
278
|
-
},
|
|
279
|
-
{
|
|
280
|
-
header: 'Email',
|
|
281
|
-
accessor: 'email',
|
|
282
|
-
},
|
|
283
|
-
{
|
|
284
|
-
header: 'Usuario',
|
|
285
|
-
accessor: 'usuario',
|
|
286
|
-
},
|
|
287
|
-
];
|
|
288
|
-
|
|
289
|
-
return (
|
|
290
|
-
<div className="max-w-4xl">
|
|
291
|
-
<Table title="Usuarios - Con Bordes" columns={columns} data={usuariosEjemplo} variant="grid" />
|
|
292
|
-
</div>
|
|
293
|
-
);
|
|
294
|
-
},
|
|
295
|
-
};
|
|
296
|
-
|
|
297
|
-
// ============================================
|
|
298
|
-
// 6. CON SORTING
|
|
299
|
-
// ============================================
|
|
300
|
-
export const ConOrdenamiento: Story = {
|
|
301
|
-
args: { columns: [], data: [] },
|
|
302
|
-
render: () => {
|
|
303
|
-
const columns: TableColumn<Usuario>[] = [
|
|
304
|
-
{
|
|
305
|
-
header: 'Nombre',
|
|
306
|
-
accessor: 'nombre',
|
|
307
|
-
sortable: true,
|
|
308
|
-
},
|
|
309
|
-
{
|
|
310
|
-
header: 'Email',
|
|
311
|
-
accessor: 'email',
|
|
312
|
-
sortable: true,
|
|
313
|
-
},
|
|
314
|
-
{
|
|
315
|
-
header: 'Rol',
|
|
316
|
-
accessor: 'rol',
|
|
317
|
-
sortable: true,
|
|
318
|
-
},
|
|
319
|
-
];
|
|
320
|
-
|
|
321
|
-
return (
|
|
322
|
-
<div className="max-w-4xl">
|
|
323
|
-
<div className="mb-4 p-4 bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-lg">
|
|
324
|
-
<p className="text-sm text-gray-600 dark:text-gray-300">
|
|
325
|
-
<strong>💡 Consejo:</strong> Haz clic en los headers con el icono de ordenamiento para
|
|
326
|
-
ordenar las columnas.
|
|
327
|
-
</p>
|
|
328
|
-
</div>
|
|
329
|
-
<Table
|
|
330
|
-
title="Usuarios - Con Ordenamiento"
|
|
331
|
-
columns={columns}
|
|
332
|
-
data={usuariosEjemplo}
|
|
333
|
-
variant="basic"
|
|
334
|
-
/>
|
|
335
|
-
</div>
|
|
336
|
-
);
|
|
337
|
-
},
|
|
338
|
-
};
|
|
339
|
-
|
|
340
|
-
// ============================================
|
|
341
|
-
// 7. CON RENDER CUSTOM
|
|
342
|
-
// ============================================
|
|
343
|
-
export const ConRenderPersonalizado: Story = {
|
|
344
|
-
args: { columns: [], data: [] },
|
|
345
|
-
render: () => {
|
|
346
|
-
const columns: TableColumn<Usuario>[] = [
|
|
347
|
-
{
|
|
348
|
-
header: 'Nombre',
|
|
349
|
-
accessor: 'nombre',
|
|
350
|
-
},
|
|
351
|
-
{
|
|
352
|
-
header: 'Email',
|
|
353
|
-
accessor: 'email',
|
|
354
|
-
},
|
|
355
|
-
{
|
|
356
|
-
header: 'Estado',
|
|
357
|
-
accessor: 'estado',
|
|
358
|
-
render: (value) => (
|
|
359
|
-
<span
|
|
360
|
-
className={`
|
|
361
|
-
inline-flex
|
|
362
|
-
items-center
|
|
363
|
-
px-2
|
|
364
|
-
py-1
|
|
365
|
-
rounded-md
|
|
366
|
-
text-xs
|
|
367
|
-
font-bold
|
|
368
|
-
${
|
|
369
|
-
value === 'activo'
|
|
370
|
-
? 'bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-400'
|
|
371
|
-
: 'bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-400'
|
|
372
|
-
}
|
|
373
|
-
`}
|
|
374
|
-
>
|
|
375
|
-
{value === 'activo' ? 'Activo' : 'Inactivo'}
|
|
376
|
-
</span>
|
|
377
|
-
),
|
|
378
|
-
},
|
|
379
|
-
];
|
|
380
|
-
|
|
381
|
-
return (
|
|
382
|
-
<div className="max-w-4xl">
|
|
383
|
-
<Table
|
|
384
|
-
title="Usuarios - Con Badge de Estado"
|
|
385
|
-
columns={columns}
|
|
386
|
-
data={usuariosEjemplo}
|
|
387
|
-
variant="basic"
|
|
388
|
-
/>
|
|
389
|
-
</div>
|
|
390
|
-
);
|
|
391
|
-
},
|
|
392
|
-
};
|
|
393
|
-
|
|
394
|
-
// ============================================
|
|
395
|
-
// 8. ESTADO DE CARGA
|
|
396
|
-
// ============================================
|
|
397
|
-
export const EstadoDeCarga: Story = {
|
|
398
|
-
args: { columns: [], data: [] },
|
|
399
|
-
render: () => {
|
|
400
|
-
const columns: TableColumn<Usuario>[] = [
|
|
401
|
-
{
|
|
402
|
-
header: 'Nombre',
|
|
403
|
-
accessor: 'nombre',
|
|
404
|
-
},
|
|
405
|
-
{
|
|
406
|
-
header: 'Email',
|
|
407
|
-
accessor: 'email',
|
|
408
|
-
},
|
|
409
|
-
{
|
|
410
|
-
header: 'Usuario',
|
|
411
|
-
accessor: 'usuario',
|
|
412
|
-
},
|
|
413
|
-
];
|
|
414
|
-
|
|
415
|
-
return (
|
|
416
|
-
<div className="max-w-4xl">
|
|
417
|
-
<Table
|
|
418
|
-
title="Usuarios - Cargando..."
|
|
419
|
-
columns={columns}
|
|
420
|
-
data={[]}
|
|
421
|
-
variant="basic"
|
|
422
|
-
loading={true}
|
|
423
|
-
loadingRows={5}
|
|
424
|
-
/>
|
|
425
|
-
</div>
|
|
426
|
-
);
|
|
427
|
-
},
|
|
428
|
-
};
|
|
429
|
-
|
|
430
|
-
// ============================================
|
|
431
|
-
// 9. SIN DATOS
|
|
432
|
-
// ============================================
|
|
433
|
-
export const SinDatos: Story = {
|
|
434
|
-
args: { columns: [], data: [] },
|
|
435
|
-
render: () => {
|
|
436
|
-
const columns: TableColumn<Usuario>[] = [
|
|
437
|
-
{
|
|
438
|
-
header: 'Nombre',
|
|
439
|
-
accessor: 'nombre',
|
|
440
|
-
},
|
|
441
|
-
{
|
|
442
|
-
header: 'Email',
|
|
443
|
-
accessor: 'email',
|
|
444
|
-
},
|
|
445
|
-
{
|
|
446
|
-
header: 'Usuario',
|
|
447
|
-
accessor: 'usuario',
|
|
448
|
-
},
|
|
449
|
-
];
|
|
450
|
-
|
|
451
|
-
return (
|
|
452
|
-
<div className="max-w-4xl">
|
|
453
|
-
<Table
|
|
454
|
-
title="Usuarios - Sin Datos"
|
|
455
|
-
columns={columns}
|
|
456
|
-
data={[]}
|
|
457
|
-
variant="basic"
|
|
458
|
-
emptyMessage="No hay usuarios registrados"
|
|
459
|
-
/>
|
|
460
|
-
</div>
|
|
461
|
-
);
|
|
462
|
-
},
|
|
463
|
-
};
|
|
464
|
-
|
|
465
|
-
// ============================================
|
|
466
|
-
// 10. CON TODAS LAS COLUMNAS
|
|
467
|
-
// ============================================
|
|
468
|
-
export const TablaCompleta: Story = {
|
|
469
|
-
args: { columns: [], data: [] },
|
|
470
|
-
render: () => {
|
|
471
|
-
const columns: TableColumn<Usuario>[] = [
|
|
472
|
-
{
|
|
473
|
-
header: 'ID',
|
|
474
|
-
accessor: 'id',
|
|
475
|
-
width: '80px',
|
|
476
|
-
align: 'center',
|
|
477
|
-
},
|
|
478
|
-
{
|
|
479
|
-
header: 'Nombre',
|
|
480
|
-
accessor: 'nombre',
|
|
481
|
-
sortable: true,
|
|
482
|
-
},
|
|
483
|
-
{
|
|
484
|
-
header: 'Email',
|
|
485
|
-
accessor: 'email',
|
|
486
|
-
sortable: true,
|
|
487
|
-
},
|
|
488
|
-
{
|
|
489
|
-
header: 'Usuario',
|
|
490
|
-
accessor: 'usuario',
|
|
491
|
-
},
|
|
492
|
-
{
|
|
493
|
-
header: 'Rol',
|
|
494
|
-
accessor: 'rol',
|
|
495
|
-
sortable: true,
|
|
496
|
-
},
|
|
497
|
-
{
|
|
498
|
-
header: 'Estado',
|
|
499
|
-
accessor: 'estado',
|
|
500
|
-
align: 'center',
|
|
501
|
-
render: (value) => (
|
|
502
|
-
<span
|
|
503
|
-
className={`
|
|
504
|
-
inline-flex
|
|
505
|
-
items-center
|
|
506
|
-
px-2
|
|
507
|
-
py-1
|
|
508
|
-
rounded-md
|
|
509
|
-
text-xs
|
|
510
|
-
font-bold
|
|
511
|
-
${
|
|
512
|
-
value === 'activo'
|
|
513
|
-
? 'bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-400'
|
|
514
|
-
: 'bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-400'
|
|
515
|
-
}
|
|
516
|
-
`}
|
|
517
|
-
>
|
|
518
|
-
{value === 'activo' ? '✓ Activo' : '✗ Inactivo'}
|
|
519
|
-
</span>
|
|
520
|
-
),
|
|
521
|
-
},
|
|
522
|
-
];
|
|
523
|
-
|
|
524
|
-
return (
|
|
525
|
-
<div className="w-full">
|
|
526
|
-
<Table
|
|
527
|
-
title="Gestión de Usuarios"
|
|
528
|
-
columns={columns}
|
|
529
|
-
data={usuariosEjemplo}
|
|
530
|
-
variant="fullWidth"
|
|
531
|
-
/>
|
|
532
|
-
</div>
|
|
533
|
-
);
|
|
534
|
-
},
|
|
535
|
-
};
|
|
536
|
-
|
|
537
|
-
// ============================================
|
|
538
|
-
// 11. CON AVATARES
|
|
539
|
-
// ============================================
|
|
540
|
-
export const ConAvatares: Story = {
|
|
541
|
-
args: { columns: [], data: [] },
|
|
542
|
-
render: () => {
|
|
543
|
-
const columns: TableColumn<Usuario>[] = [
|
|
544
|
-
{
|
|
545
|
-
header: 'Nombre',
|
|
546
|
-
accessor: 'nombre',
|
|
547
|
-
render: (_value, row) => (
|
|
548
|
-
<div className="flex items-center gap-2">
|
|
549
|
-
{/* Avatar */}
|
|
550
|
-
<img
|
|
551
|
-
src={row.avatar || 'https://i.pravatar.cc/150?img=0'}
|
|
552
|
-
alt={row.nombre}
|
|
553
|
-
className="w-8 h-8 rounded-full object-cover"
|
|
554
|
-
/>
|
|
555
|
-
{/* Texto */}
|
|
556
|
-
<div className="flex flex-col">
|
|
557
|
-
<span className="text-sm font-normal text-content-primary dark:text-dark-content-primary">
|
|
558
|
-
{row.nombre}
|
|
559
|
-
</span>
|
|
560
|
-
<span className="text-xs font-normal text-content-secondary dark:text-content-secondary">
|
|
561
|
-
{row.email}
|
|
562
|
-
</span>
|
|
563
|
-
</div>
|
|
564
|
-
</div>
|
|
565
|
-
),
|
|
566
|
-
},
|
|
567
|
-
{
|
|
568
|
-
header: 'Rol',
|
|
569
|
-
accessor: 'rol',
|
|
570
|
-
},
|
|
571
|
-
{
|
|
572
|
-
header: 'Estado',
|
|
573
|
-
accessor: 'estado',
|
|
574
|
-
align: 'center',
|
|
575
|
-
width: '96px',
|
|
576
|
-
render: (value) => (
|
|
577
|
-
<span
|
|
578
|
-
className={`
|
|
579
|
-
inline-flex
|
|
580
|
-
items-center
|
|
581
|
-
px-1.5
|
|
582
|
-
py-1
|
|
583
|
-
rounded-md
|
|
584
|
-
text-xs
|
|
585
|
-
font-normal
|
|
586
|
-
${
|
|
587
|
-
value === 'activo'
|
|
588
|
-
? 'bg-lime-100 text-lime-700 dark:bg-lime-900/30 dark:text-lime-400'
|
|
589
|
-
: 'bg-zinc-100 text-zinc-600 dark:bg-zinc-800/30 dark:text-zinc-400'
|
|
590
|
-
}
|
|
591
|
-
`}
|
|
592
|
-
>
|
|
593
|
-
{value === 'activo' ? 'Online' : 'Offline'}
|
|
594
|
-
</span>
|
|
595
|
-
),
|
|
596
|
-
},
|
|
597
|
-
];
|
|
598
|
-
|
|
599
|
-
return (
|
|
600
|
-
<div className="max-w-4xl">
|
|
601
|
-
<Table title="Usuarios" columns={columns} data={usuariosEjemplo} variant="basic" />
|
|
602
|
-
</div>
|
|
603
|
-
);
|
|
604
|
-
},
|
|
605
|
-
};
|
|
606
|
-
|
|
607
|
-
// ============================================
|
|
608
|
-
// 12. CON PAGINACIÓN
|
|
609
|
-
// ============================================
|
|
610
|
-
export const ConPaginacion: Story = {
|
|
611
|
-
args: { columns: [], data: [] },
|
|
612
|
-
render: () => {
|
|
613
|
-
const [currentPage, setCurrentPage] = useState(3);
|
|
614
|
-
const totalPages = 66;
|
|
615
|
-
|
|
616
|
-
const columns: TableColumn<Usuario>[] = [
|
|
617
|
-
{
|
|
618
|
-
header: 'Nombre',
|
|
619
|
-
accessor: 'nombre',
|
|
620
|
-
sortable: true,
|
|
621
|
-
},
|
|
622
|
-
{
|
|
623
|
-
header: 'Email',
|
|
624
|
-
accessor: 'email',
|
|
625
|
-
},
|
|
626
|
-
{
|
|
627
|
-
header: 'Usuario',
|
|
628
|
-
accessor: 'usuario',
|
|
629
|
-
},
|
|
630
|
-
];
|
|
631
|
-
|
|
632
|
-
return (
|
|
633
|
-
<div className="max-w-4xl">
|
|
634
|
-
<Table
|
|
635
|
-
title="Usuarios"
|
|
636
|
-
columns={columns}
|
|
637
|
-
data={usuariosEjemplo}
|
|
638
|
-
variant="striped"
|
|
639
|
-
pagination={{
|
|
640
|
-
currentPage,
|
|
641
|
-
totalPages,
|
|
642
|
-
onPageChange: setCurrentPage,
|
|
643
|
-
}}
|
|
644
|
-
/>
|
|
645
|
-
</div>
|
|
646
|
-
);
|
|
647
|
-
},
|
|
648
|
-
};
|
|
649
|
-
|
|
650
|
-
// ============================================
|
|
651
|
-
// 13. CON AVATARES Y PAGINACIÓN (COMPLETO)
|
|
652
|
-
// ============================================
|
|
653
|
-
export const ConAvatarYPaginacion: Story = {
|
|
654
|
-
args: { columns: [], data: [] },
|
|
655
|
-
render: () => {
|
|
656
|
-
const [currentPage, setCurrentPage] = useState(3);
|
|
657
|
-
const totalPages = 66;
|
|
658
|
-
|
|
659
|
-
const columns: TableColumn<Usuario>[] = [
|
|
660
|
-
{
|
|
661
|
-
header: 'Nombre',
|
|
662
|
-
accessor: 'nombre',
|
|
663
|
-
render: (_value, row) => (
|
|
664
|
-
<div className="flex items-center gap-2">
|
|
665
|
-
{/* Avatar */}
|
|
666
|
-
<img
|
|
667
|
-
src={row.avatar || 'https://i.pravatar.cc/150?img=0'}
|
|
668
|
-
alt={row.nombre}
|
|
669
|
-
className="w-8 h-8 rounded-full object-cover"
|
|
670
|
-
/>
|
|
671
|
-
{/* Texto */}
|
|
672
|
-
<div className="flex flex-col">
|
|
673
|
-
<span className="text-sm font-normal text-content-primary dark:text-dark-content-primary">
|
|
674
|
-
{row.nombre}
|
|
675
|
-
</span>
|
|
676
|
-
<span className="text-xs font-normal text-content-secondary dark:text-content-secondary">
|
|
677
|
-
{row.email}
|
|
678
|
-
</span>
|
|
679
|
-
</div>
|
|
680
|
-
</div>
|
|
681
|
-
),
|
|
682
|
-
},
|
|
683
|
-
{
|
|
684
|
-
header: 'Rol',
|
|
685
|
-
accessor: 'rol',
|
|
686
|
-
},
|
|
687
|
-
{
|
|
688
|
-
header: 'Estado',
|
|
689
|
-
accessor: 'estado',
|
|
690
|
-
align: 'center',
|
|
691
|
-
width: '96px',
|
|
692
|
-
render: (value) => (
|
|
693
|
-
<span
|
|
694
|
-
className={`
|
|
695
|
-
inline-flex
|
|
696
|
-
items-center
|
|
697
|
-
px-1.5
|
|
698
|
-
py-1
|
|
699
|
-
rounded-md
|
|
700
|
-
text-xs
|
|
701
|
-
font-normal
|
|
702
|
-
${
|
|
703
|
-
value === 'activo'
|
|
704
|
-
? 'bg-lime-100 text-lime-700 dark:bg-lime-900/30 dark:text-lime-400'
|
|
705
|
-
: 'bg-zinc-100 text-zinc-600 dark:bg-zinc-800/30 dark:text-zinc-400'
|
|
706
|
-
}
|
|
707
|
-
`}
|
|
708
|
-
>
|
|
709
|
-
{value === 'activo' ? 'Online' : 'Offline'}
|
|
710
|
-
</span>
|
|
711
|
-
),
|
|
712
|
-
},
|
|
713
|
-
];
|
|
714
|
-
|
|
715
|
-
return (
|
|
716
|
-
<div className="max-w-4xl">
|
|
717
|
-
<Table
|
|
718
|
-
title="Usuarios"
|
|
719
|
-
columns={columns}
|
|
720
|
-
data={usuariosEjemplo}
|
|
721
|
-
variant="basic"
|
|
722
|
-
pagination={{
|
|
723
|
-
currentPage,
|
|
724
|
-
totalPages,
|
|
725
|
-
onPageChange: setCurrentPage,
|
|
726
|
-
}}
|
|
727
|
-
/>
|
|
728
|
-
</div>
|
|
729
|
-
);
|
|
730
|
-
},
|
|
731
|
-
};
|
|
732
|
-
|
|
733
|
-
// ============================================
|
|
734
|
-
// 14. TODAS LAS VARIANTES
|
|
735
|
-
// ============================================
|
|
736
|
-
export const TodasLasVariantes: Story = {
|
|
737
|
-
args: {
|
|
738
|
-
columns: [
|
|
739
|
-
{ header: 'Nombre', accessor: 'nombre' },
|
|
740
|
-
{ header: 'Email', accessor: 'email' },
|
|
741
|
-
{ header: 'Usuario', accessor: 'usuario' },
|
|
742
|
-
],
|
|
743
|
-
data: usuariosEjemplo.slice(0, 3),
|
|
744
|
-
},
|
|
745
|
-
render: (args) => (
|
|
746
|
-
<div className="space-y-8 p-6">
|
|
747
|
-
{/* Básica */}
|
|
748
|
-
<div>
|
|
749
|
-
<h3 className="text-sm font-bold mb-4 text-gray-700 dark:text-white">Básica</h3>
|
|
750
|
-
<div className="max-w-4xl">
|
|
751
|
-
<Table {...args} title="Usuarios" variant="basic" />
|
|
752
|
-
</div>
|
|
753
|
-
<p className="text-xs text-gray-500 dark:text-gray-300 mt-2">
|
|
754
|
-
Variante básica con padding y spacing estándar
|
|
755
|
-
</p>
|
|
756
|
-
</div>
|
|
757
|
-
|
|
758
|
-
{/* Ancho Completo */}
|
|
759
|
-
<div>
|
|
760
|
-
<h3 className="text-sm font-bold mb-4 text-gray-700 dark:text-white">Ancho Completo</h3>
|
|
761
|
-
<Table {...args} title="Usuarios - Full Width" variant="fullWidth" />
|
|
762
|
-
<p className="text-xs text-gray-500 dark:text-gray-300 mt-2">
|
|
763
|
-
Tabla que ocupa todo el ancho disponible
|
|
764
|
-
</p>
|
|
765
|
-
</div>
|
|
766
|
-
|
|
767
|
-
{/* Filas Alternas */}
|
|
768
|
-
<div>
|
|
769
|
-
<h3 className="text-sm font-bold mb-4 text-gray-700 dark:text-white">Filas Alternas</h3>
|
|
770
|
-
<div className="max-w-4xl">
|
|
771
|
-
<Table {...args} title="Usuarios - Striped" variant="striped" />
|
|
772
|
-
</div>
|
|
773
|
-
<p className="text-xs text-gray-500 dark:text-gray-300 mt-2">
|
|
774
|
-
Filas con fondo alternado para mejor legibilidad
|
|
775
|
-
</p>
|
|
776
|
-
</div>
|
|
777
|
-
|
|
778
|
-
{/* Con Bordes */}
|
|
779
|
-
<div>
|
|
780
|
-
<h3 className="text-sm font-bold mb-4 text-gray-700 dark:text-white">Con Bordes</h3>
|
|
781
|
-
<div className="max-w-4xl">
|
|
782
|
-
<Table {...args} title="Usuarios - Grid" variant="grid" />
|
|
783
|
-
</div>
|
|
784
|
-
<p className="text-xs text-gray-500 dark:text-gray-300 mt-2">
|
|
785
|
-
Tabla con bordes alrededor de las celdas
|
|
786
|
-
</p>
|
|
787
|
-
</div>
|
|
788
|
-
|
|
789
|
-
{/* Consejos */}
|
|
790
|
-
<div className="mt-6 p-4 bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-lg">
|
|
791
|
-
<p className="text-xs text-gray-600 dark:text-gray-300">
|
|
792
|
-
<strong>💡 Consejos:</strong>
|
|
793
|
-
<br />• Usa <code className="px-1 bg-white dark:bg-gray-700">basic</code> para tablas con
|
|
794
|
-
contenido estándar
|
|
795
|
-
<br />• Usa <code className="px-1 bg-white dark:bg-gray-700">fullWidth</code> para
|
|
796
|
-
dashboards y layouts completos
|
|
797
|
-
<br />• Usa <code className="px-1 bg-white dark:bg-gray-700">striped</code> para tablas
|
|
798
|
-
con muchas filas
|
|
799
|
-
<br />• Usa <code className="px-1 bg-white dark:bg-gray-700">grid</code> para separar
|
|
800
|
-
visualmente las celdas
|
|
801
|
-
</p>
|
|
802
|
-
</div>
|
|
803
|
-
</div>
|
|
804
|
-
),
|
|
805
|
-
};
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { Table } from './Table';
|
|
4
|
+
import type { TableColumn } from './Table.types';
|
|
5
|
+
|
|
6
|
+
// Datos de ejemplo
|
|
7
|
+
interface Usuario {
|
|
8
|
+
id: number;
|
|
9
|
+
nombre: string;
|
|
10
|
+
email: string;
|
|
11
|
+
usuario: string;
|
|
12
|
+
rol: string;
|
|
13
|
+
estado: 'activo' | 'inactivo';
|
|
14
|
+
avatar?: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const usuariosEjemplo: Usuario[] = [
|
|
18
|
+
{
|
|
19
|
+
id: 1,
|
|
20
|
+
nombre: 'Jhonnatan Diaz',
|
|
21
|
+
email: 'jhonnatan.diaz@siesa.com',
|
|
22
|
+
usuario: 'jhonnatan.diaz',
|
|
23
|
+
rol: 'Administrador',
|
|
24
|
+
estado: 'activo',
|
|
25
|
+
avatar: 'https://i.pravatar.cc/150?img=1',
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
id: 2,
|
|
29
|
+
nombre: 'Santiago Sanchez',
|
|
30
|
+
email: 'santiago.sanchez@siesa.com',
|
|
31
|
+
usuario: 'santiago.sanchez',
|
|
32
|
+
rol: 'Desarrollador',
|
|
33
|
+
estado: 'activo',
|
|
34
|
+
avatar: 'https://i.pravatar.cc/150?img=2',
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
id: 3,
|
|
38
|
+
nombre: 'Daniel Mesa',
|
|
39
|
+
email: 'daniel.mesa@siesa.com',
|
|
40
|
+
usuario: 'daniel.mesa',
|
|
41
|
+
rol: 'Diseñador',
|
|
42
|
+
estado: 'activo',
|
|
43
|
+
avatar: 'https://i.pravatar.cc/150?img=3',
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
id: 4,
|
|
47
|
+
nombre: 'Juan David Guevara',
|
|
48
|
+
email: 'juan.guevara@siesa.com',
|
|
49
|
+
usuario: 'juan.guevara',
|
|
50
|
+
rol: 'QA',
|
|
51
|
+
estado: 'inactivo',
|
|
52
|
+
avatar: 'https://i.pravatar.cc/150?img=4',
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
id: 5,
|
|
56
|
+
nombre: 'Guillermo Duran',
|
|
57
|
+
email: 'guillermo.duran@siesa.com',
|
|
58
|
+
usuario: 'guillermo.duran',
|
|
59
|
+
rol: 'Product Manager',
|
|
60
|
+
estado: 'activo',
|
|
61
|
+
avatar: 'https://i.pravatar.cc/150?img=5',
|
|
62
|
+
},
|
|
63
|
+
];
|
|
64
|
+
|
|
65
|
+
const meta = {
|
|
66
|
+
title: 'Siesa UI Kit/Table',
|
|
67
|
+
component: Table,
|
|
68
|
+
parameters: {
|
|
69
|
+
layout: 'padded',
|
|
70
|
+
docs: {
|
|
71
|
+
description: {
|
|
72
|
+
component:
|
|
73
|
+
'Componente de tabla flexible con soporte para sorting, variantes visuales y dark mode completo.',
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
tags: ['autodocs'],
|
|
78
|
+
argTypes: {
|
|
79
|
+
title: {
|
|
80
|
+
control: 'text',
|
|
81
|
+
description: 'Título opcional de la tabla',
|
|
82
|
+
table: {
|
|
83
|
+
type: { summary: 'string' },
|
|
84
|
+
category: 'Contenido',
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
variant: {
|
|
88
|
+
control: 'select',
|
|
89
|
+
options: ['basic', 'fullWidth', 'striped', 'grid'],
|
|
90
|
+
description: 'Variante visual de la tabla',
|
|
91
|
+
table: {
|
|
92
|
+
type: { summary: 'string' },
|
|
93
|
+
defaultValue: { summary: 'basic' },
|
|
94
|
+
category: 'Apariencia',
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
showBorder: {
|
|
98
|
+
control: 'boolean',
|
|
99
|
+
description: 'Si se muestra el borde del container',
|
|
100
|
+
table: {
|
|
101
|
+
type: { summary: 'boolean' },
|
|
102
|
+
defaultValue: { summary: 'true' },
|
|
103
|
+
category: 'Apariencia',
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
showShadow: {
|
|
107
|
+
control: 'boolean',
|
|
108
|
+
description: 'Si se muestra la sombra del container',
|
|
109
|
+
table: {
|
|
110
|
+
type: { summary: 'boolean' },
|
|
111
|
+
defaultValue: { summary: 'true' },
|
|
112
|
+
category: 'Apariencia',
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
fullWidth: {
|
|
116
|
+
control: 'boolean',
|
|
117
|
+
description: 'Si la tabla debe ocupar todo el ancho disponible',
|
|
118
|
+
table: {
|
|
119
|
+
type: { summary: 'boolean' },
|
|
120
|
+
defaultValue: { summary: 'false' },
|
|
121
|
+
category: 'Apariencia',
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
loading: {
|
|
125
|
+
control: 'boolean',
|
|
126
|
+
description: 'Si se está cargando la información',
|
|
127
|
+
table: {
|
|
128
|
+
type: { summary: 'boolean' },
|
|
129
|
+
defaultValue: { summary: 'false' },
|
|
130
|
+
category: 'Estado',
|
|
131
|
+
},
|
|
132
|
+
},
|
|
133
|
+
emptyMessage: {
|
|
134
|
+
control: 'text',
|
|
135
|
+
description: 'Texto a mostrar cuando no hay datos',
|
|
136
|
+
table: {
|
|
137
|
+
type: { summary: 'string' },
|
|
138
|
+
defaultValue: { summary: 'No hay datos disponibles' },
|
|
139
|
+
category: 'Contenido',
|
|
140
|
+
},
|
|
141
|
+
},
|
|
142
|
+
},
|
|
143
|
+
} satisfies Meta<typeof Table>;
|
|
144
|
+
|
|
145
|
+
export default meta;
|
|
146
|
+
type Story = StoryObj<typeof meta>;
|
|
147
|
+
|
|
148
|
+
// ============================================
|
|
149
|
+
// 1. PLAYGROUND INTERACTIVO
|
|
150
|
+
// ============================================
|
|
151
|
+
export const Playground: Story = {
|
|
152
|
+
args: {
|
|
153
|
+
title: 'Usuarios',
|
|
154
|
+
columns: [
|
|
155
|
+
{ header: 'Nombre', accessor: 'nombre', sortable: true },
|
|
156
|
+
{ header: 'Email', accessor: 'email' },
|
|
157
|
+
{ header: 'Usuario', accessor: 'usuario' },
|
|
158
|
+
],
|
|
159
|
+
data: usuariosEjemplo,
|
|
160
|
+
variant: 'basic',
|
|
161
|
+
showBorder: true,
|
|
162
|
+
showShadow: true,
|
|
163
|
+
fullWidth: false,
|
|
164
|
+
},
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
// ============================================
|
|
168
|
+
// 2. VARIANTE BÁSICA
|
|
169
|
+
// ============================================
|
|
170
|
+
export const Basica: Story = {
|
|
171
|
+
args: { columns: [], data: [] },
|
|
172
|
+
render: () => {
|
|
173
|
+
const columns: TableColumn<Usuario>[] = [
|
|
174
|
+
{
|
|
175
|
+
header: 'Nombre',
|
|
176
|
+
accessor: 'nombre',
|
|
177
|
+
sortable: true,
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
header: 'Email',
|
|
181
|
+
accessor: 'email',
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
header: 'Usuario',
|
|
185
|
+
accessor: 'usuario',
|
|
186
|
+
},
|
|
187
|
+
];
|
|
188
|
+
|
|
189
|
+
return (
|
|
190
|
+
<div className="max-w-4xl">
|
|
191
|
+
<Table title="Usuarios" columns={columns} data={usuariosEjemplo} variant="basic" />
|
|
192
|
+
</div>
|
|
193
|
+
);
|
|
194
|
+
},
|
|
195
|
+
};
|
|
196
|
+
|
|
197
|
+
// ============================================
|
|
198
|
+
// 3. VARIANTE FULL WIDTH
|
|
199
|
+
// ============================================
|
|
200
|
+
export const AnchoCompleto: Story = {
|
|
201
|
+
args: { columns: [], data: [] },
|
|
202
|
+
render: () => {
|
|
203
|
+
const columns: TableColumn<Usuario>[] = [
|
|
204
|
+
{
|
|
205
|
+
header: 'Nombre',
|
|
206
|
+
accessor: 'nombre',
|
|
207
|
+
sortable: true,
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
header: 'Email',
|
|
211
|
+
accessor: 'email',
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
header: 'Usuario',
|
|
215
|
+
accessor: 'usuario',
|
|
216
|
+
},
|
|
217
|
+
];
|
|
218
|
+
|
|
219
|
+
return (
|
|
220
|
+
<div className="w-full">
|
|
221
|
+
<Table
|
|
222
|
+
title="Usuarios - Ancho Completo"
|
|
223
|
+
columns={columns}
|
|
224
|
+
data={usuariosEjemplo}
|
|
225
|
+
variant="fullWidth"
|
|
226
|
+
/>
|
|
227
|
+
</div>
|
|
228
|
+
);
|
|
229
|
+
},
|
|
230
|
+
};
|
|
231
|
+
|
|
232
|
+
// ============================================
|
|
233
|
+
// 4. VARIANTE STRIPED (FILAS ALTERNAS)
|
|
234
|
+
// ============================================
|
|
235
|
+
export const FilasAlternas: Story = {
|
|
236
|
+
args: { columns: [], data: [] },
|
|
237
|
+
render: () => {
|
|
238
|
+
const columns: TableColumn<Usuario>[] = [
|
|
239
|
+
{
|
|
240
|
+
header: 'Nombre',
|
|
241
|
+
accessor: 'nombre',
|
|
242
|
+
sortable: true,
|
|
243
|
+
},
|
|
244
|
+
{
|
|
245
|
+
header: 'Email',
|
|
246
|
+
accessor: 'email',
|
|
247
|
+
},
|
|
248
|
+
{
|
|
249
|
+
header: 'Usuario',
|
|
250
|
+
accessor: 'usuario',
|
|
251
|
+
},
|
|
252
|
+
];
|
|
253
|
+
|
|
254
|
+
return (
|
|
255
|
+
<div className="max-w-4xl">
|
|
256
|
+
<Table
|
|
257
|
+
title="Usuarios - Filas Alternas"
|
|
258
|
+
columns={columns}
|
|
259
|
+
data={usuariosEjemplo}
|
|
260
|
+
variant="striped"
|
|
261
|
+
/>
|
|
262
|
+
</div>
|
|
263
|
+
);
|
|
264
|
+
},
|
|
265
|
+
};
|
|
266
|
+
|
|
267
|
+
// ============================================
|
|
268
|
+
// 5. VARIANTE CON GRID (BORDES)
|
|
269
|
+
// ============================================
|
|
270
|
+
export const ConBordes: Story = {
|
|
271
|
+
args: { columns: [], data: [] },
|
|
272
|
+
render: () => {
|
|
273
|
+
const columns: TableColumn<Usuario>[] = [
|
|
274
|
+
{
|
|
275
|
+
header: 'Nombre',
|
|
276
|
+
accessor: 'nombre',
|
|
277
|
+
sortable: true,
|
|
278
|
+
},
|
|
279
|
+
{
|
|
280
|
+
header: 'Email',
|
|
281
|
+
accessor: 'email',
|
|
282
|
+
},
|
|
283
|
+
{
|
|
284
|
+
header: 'Usuario',
|
|
285
|
+
accessor: 'usuario',
|
|
286
|
+
},
|
|
287
|
+
];
|
|
288
|
+
|
|
289
|
+
return (
|
|
290
|
+
<div className="max-w-4xl">
|
|
291
|
+
<Table title="Usuarios - Con Bordes" columns={columns} data={usuariosEjemplo} variant="grid" />
|
|
292
|
+
</div>
|
|
293
|
+
);
|
|
294
|
+
},
|
|
295
|
+
};
|
|
296
|
+
|
|
297
|
+
// ============================================
|
|
298
|
+
// 6. CON SORTING
|
|
299
|
+
// ============================================
|
|
300
|
+
export const ConOrdenamiento: Story = {
|
|
301
|
+
args: { columns: [], data: [] },
|
|
302
|
+
render: () => {
|
|
303
|
+
const columns: TableColumn<Usuario>[] = [
|
|
304
|
+
{
|
|
305
|
+
header: 'Nombre',
|
|
306
|
+
accessor: 'nombre',
|
|
307
|
+
sortable: true,
|
|
308
|
+
},
|
|
309
|
+
{
|
|
310
|
+
header: 'Email',
|
|
311
|
+
accessor: 'email',
|
|
312
|
+
sortable: true,
|
|
313
|
+
},
|
|
314
|
+
{
|
|
315
|
+
header: 'Rol',
|
|
316
|
+
accessor: 'rol',
|
|
317
|
+
sortable: true,
|
|
318
|
+
},
|
|
319
|
+
];
|
|
320
|
+
|
|
321
|
+
return (
|
|
322
|
+
<div className="max-w-4xl">
|
|
323
|
+
<div className="mb-4 p-4 bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-lg">
|
|
324
|
+
<p className="text-sm text-gray-600 dark:text-gray-300">
|
|
325
|
+
<strong>💡 Consejo:</strong> Haz clic en los headers con el icono de ordenamiento para
|
|
326
|
+
ordenar las columnas.
|
|
327
|
+
</p>
|
|
328
|
+
</div>
|
|
329
|
+
<Table
|
|
330
|
+
title="Usuarios - Con Ordenamiento"
|
|
331
|
+
columns={columns}
|
|
332
|
+
data={usuariosEjemplo}
|
|
333
|
+
variant="basic"
|
|
334
|
+
/>
|
|
335
|
+
</div>
|
|
336
|
+
);
|
|
337
|
+
},
|
|
338
|
+
};
|
|
339
|
+
|
|
340
|
+
// ============================================
|
|
341
|
+
// 7. CON RENDER CUSTOM
|
|
342
|
+
// ============================================
|
|
343
|
+
export const ConRenderPersonalizado: Story = {
|
|
344
|
+
args: { columns: [], data: [] },
|
|
345
|
+
render: () => {
|
|
346
|
+
const columns: TableColumn<Usuario>[] = [
|
|
347
|
+
{
|
|
348
|
+
header: 'Nombre',
|
|
349
|
+
accessor: 'nombre',
|
|
350
|
+
},
|
|
351
|
+
{
|
|
352
|
+
header: 'Email',
|
|
353
|
+
accessor: 'email',
|
|
354
|
+
},
|
|
355
|
+
{
|
|
356
|
+
header: 'Estado',
|
|
357
|
+
accessor: 'estado',
|
|
358
|
+
render: (value) => (
|
|
359
|
+
<span
|
|
360
|
+
className={`
|
|
361
|
+
inline-flex
|
|
362
|
+
items-center
|
|
363
|
+
px-2
|
|
364
|
+
py-1
|
|
365
|
+
rounded-md
|
|
366
|
+
text-xs
|
|
367
|
+
font-bold
|
|
368
|
+
${
|
|
369
|
+
value === 'activo'
|
|
370
|
+
? 'bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-400'
|
|
371
|
+
: 'bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-400'
|
|
372
|
+
}
|
|
373
|
+
`}
|
|
374
|
+
>
|
|
375
|
+
{value === 'activo' ? 'Activo' : 'Inactivo'}
|
|
376
|
+
</span>
|
|
377
|
+
),
|
|
378
|
+
},
|
|
379
|
+
];
|
|
380
|
+
|
|
381
|
+
return (
|
|
382
|
+
<div className="max-w-4xl">
|
|
383
|
+
<Table
|
|
384
|
+
title="Usuarios - Con Badge de Estado"
|
|
385
|
+
columns={columns}
|
|
386
|
+
data={usuariosEjemplo}
|
|
387
|
+
variant="basic"
|
|
388
|
+
/>
|
|
389
|
+
</div>
|
|
390
|
+
);
|
|
391
|
+
},
|
|
392
|
+
};
|
|
393
|
+
|
|
394
|
+
// ============================================
|
|
395
|
+
// 8. ESTADO DE CARGA
|
|
396
|
+
// ============================================
|
|
397
|
+
export const EstadoDeCarga: Story = {
|
|
398
|
+
args: { columns: [], data: [] },
|
|
399
|
+
render: () => {
|
|
400
|
+
const columns: TableColumn<Usuario>[] = [
|
|
401
|
+
{
|
|
402
|
+
header: 'Nombre',
|
|
403
|
+
accessor: 'nombre',
|
|
404
|
+
},
|
|
405
|
+
{
|
|
406
|
+
header: 'Email',
|
|
407
|
+
accessor: 'email',
|
|
408
|
+
},
|
|
409
|
+
{
|
|
410
|
+
header: 'Usuario',
|
|
411
|
+
accessor: 'usuario',
|
|
412
|
+
},
|
|
413
|
+
];
|
|
414
|
+
|
|
415
|
+
return (
|
|
416
|
+
<div className="max-w-4xl">
|
|
417
|
+
<Table
|
|
418
|
+
title="Usuarios - Cargando..."
|
|
419
|
+
columns={columns}
|
|
420
|
+
data={[]}
|
|
421
|
+
variant="basic"
|
|
422
|
+
loading={true}
|
|
423
|
+
loadingRows={5}
|
|
424
|
+
/>
|
|
425
|
+
</div>
|
|
426
|
+
);
|
|
427
|
+
},
|
|
428
|
+
};
|
|
429
|
+
|
|
430
|
+
// ============================================
|
|
431
|
+
// 9. SIN DATOS
|
|
432
|
+
// ============================================
|
|
433
|
+
export const SinDatos: Story = {
|
|
434
|
+
args: { columns: [], data: [] },
|
|
435
|
+
render: () => {
|
|
436
|
+
const columns: TableColumn<Usuario>[] = [
|
|
437
|
+
{
|
|
438
|
+
header: 'Nombre',
|
|
439
|
+
accessor: 'nombre',
|
|
440
|
+
},
|
|
441
|
+
{
|
|
442
|
+
header: 'Email',
|
|
443
|
+
accessor: 'email',
|
|
444
|
+
},
|
|
445
|
+
{
|
|
446
|
+
header: 'Usuario',
|
|
447
|
+
accessor: 'usuario',
|
|
448
|
+
},
|
|
449
|
+
];
|
|
450
|
+
|
|
451
|
+
return (
|
|
452
|
+
<div className="max-w-4xl">
|
|
453
|
+
<Table
|
|
454
|
+
title="Usuarios - Sin Datos"
|
|
455
|
+
columns={columns}
|
|
456
|
+
data={[]}
|
|
457
|
+
variant="basic"
|
|
458
|
+
emptyMessage="No hay usuarios registrados"
|
|
459
|
+
/>
|
|
460
|
+
</div>
|
|
461
|
+
);
|
|
462
|
+
},
|
|
463
|
+
};
|
|
464
|
+
|
|
465
|
+
// ============================================
|
|
466
|
+
// 10. CON TODAS LAS COLUMNAS
|
|
467
|
+
// ============================================
|
|
468
|
+
export const TablaCompleta: Story = {
|
|
469
|
+
args: { columns: [], data: [] },
|
|
470
|
+
render: () => {
|
|
471
|
+
const columns: TableColumn<Usuario>[] = [
|
|
472
|
+
{
|
|
473
|
+
header: 'ID',
|
|
474
|
+
accessor: 'id',
|
|
475
|
+
width: '80px',
|
|
476
|
+
align: 'center',
|
|
477
|
+
},
|
|
478
|
+
{
|
|
479
|
+
header: 'Nombre',
|
|
480
|
+
accessor: 'nombre',
|
|
481
|
+
sortable: true,
|
|
482
|
+
},
|
|
483
|
+
{
|
|
484
|
+
header: 'Email',
|
|
485
|
+
accessor: 'email',
|
|
486
|
+
sortable: true,
|
|
487
|
+
},
|
|
488
|
+
{
|
|
489
|
+
header: 'Usuario',
|
|
490
|
+
accessor: 'usuario',
|
|
491
|
+
},
|
|
492
|
+
{
|
|
493
|
+
header: 'Rol',
|
|
494
|
+
accessor: 'rol',
|
|
495
|
+
sortable: true,
|
|
496
|
+
},
|
|
497
|
+
{
|
|
498
|
+
header: 'Estado',
|
|
499
|
+
accessor: 'estado',
|
|
500
|
+
align: 'center',
|
|
501
|
+
render: (value) => (
|
|
502
|
+
<span
|
|
503
|
+
className={`
|
|
504
|
+
inline-flex
|
|
505
|
+
items-center
|
|
506
|
+
px-2
|
|
507
|
+
py-1
|
|
508
|
+
rounded-md
|
|
509
|
+
text-xs
|
|
510
|
+
font-bold
|
|
511
|
+
${
|
|
512
|
+
value === 'activo'
|
|
513
|
+
? 'bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-400'
|
|
514
|
+
: 'bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-400'
|
|
515
|
+
}
|
|
516
|
+
`}
|
|
517
|
+
>
|
|
518
|
+
{value === 'activo' ? '✓ Activo' : '✗ Inactivo'}
|
|
519
|
+
</span>
|
|
520
|
+
),
|
|
521
|
+
},
|
|
522
|
+
];
|
|
523
|
+
|
|
524
|
+
return (
|
|
525
|
+
<div className="w-full">
|
|
526
|
+
<Table
|
|
527
|
+
title="Gestión de Usuarios"
|
|
528
|
+
columns={columns}
|
|
529
|
+
data={usuariosEjemplo}
|
|
530
|
+
variant="fullWidth"
|
|
531
|
+
/>
|
|
532
|
+
</div>
|
|
533
|
+
);
|
|
534
|
+
},
|
|
535
|
+
};
|
|
536
|
+
|
|
537
|
+
// ============================================
|
|
538
|
+
// 11. CON AVATARES
|
|
539
|
+
// ============================================
|
|
540
|
+
export const ConAvatares: Story = {
|
|
541
|
+
args: { columns: [], data: [] },
|
|
542
|
+
render: () => {
|
|
543
|
+
const columns: TableColumn<Usuario>[] = [
|
|
544
|
+
{
|
|
545
|
+
header: 'Nombre',
|
|
546
|
+
accessor: 'nombre',
|
|
547
|
+
render: (_value, row) => (
|
|
548
|
+
<div className="flex items-center gap-2">
|
|
549
|
+
{/* Avatar */}
|
|
550
|
+
<img
|
|
551
|
+
src={row.avatar || 'https://i.pravatar.cc/150?img=0'}
|
|
552
|
+
alt={row.nombre}
|
|
553
|
+
className="w-8 h-8 rounded-full object-cover"
|
|
554
|
+
/>
|
|
555
|
+
{/* Texto */}
|
|
556
|
+
<div className="flex flex-col">
|
|
557
|
+
<span className="text-sm font-normal text-content-primary dark:text-dark-content-primary">
|
|
558
|
+
{row.nombre}
|
|
559
|
+
</span>
|
|
560
|
+
<span className="text-xs font-normal text-content-secondary dark:text-content-secondary">
|
|
561
|
+
{row.email}
|
|
562
|
+
</span>
|
|
563
|
+
</div>
|
|
564
|
+
</div>
|
|
565
|
+
),
|
|
566
|
+
},
|
|
567
|
+
{
|
|
568
|
+
header: 'Rol',
|
|
569
|
+
accessor: 'rol',
|
|
570
|
+
},
|
|
571
|
+
{
|
|
572
|
+
header: 'Estado',
|
|
573
|
+
accessor: 'estado',
|
|
574
|
+
align: 'center',
|
|
575
|
+
width: '96px',
|
|
576
|
+
render: (value) => (
|
|
577
|
+
<span
|
|
578
|
+
className={`
|
|
579
|
+
inline-flex
|
|
580
|
+
items-center
|
|
581
|
+
px-1.5
|
|
582
|
+
py-1
|
|
583
|
+
rounded-md
|
|
584
|
+
text-xs
|
|
585
|
+
font-normal
|
|
586
|
+
${
|
|
587
|
+
value === 'activo'
|
|
588
|
+
? 'bg-lime-100 text-lime-700 dark:bg-lime-900/30 dark:text-lime-400'
|
|
589
|
+
: 'bg-zinc-100 text-zinc-600 dark:bg-zinc-800/30 dark:text-zinc-400'
|
|
590
|
+
}
|
|
591
|
+
`}
|
|
592
|
+
>
|
|
593
|
+
{value === 'activo' ? 'Online' : 'Offline'}
|
|
594
|
+
</span>
|
|
595
|
+
),
|
|
596
|
+
},
|
|
597
|
+
];
|
|
598
|
+
|
|
599
|
+
return (
|
|
600
|
+
<div className="max-w-4xl">
|
|
601
|
+
<Table title="Usuarios" columns={columns} data={usuariosEjemplo} variant="basic" />
|
|
602
|
+
</div>
|
|
603
|
+
);
|
|
604
|
+
},
|
|
605
|
+
};
|
|
606
|
+
|
|
607
|
+
// ============================================
|
|
608
|
+
// 12. CON PAGINACIÓN
|
|
609
|
+
// ============================================
|
|
610
|
+
export const ConPaginacion: Story = {
|
|
611
|
+
args: { columns: [], data: [] },
|
|
612
|
+
render: () => {
|
|
613
|
+
const [currentPage, setCurrentPage] = useState(3);
|
|
614
|
+
const totalPages = 66;
|
|
615
|
+
|
|
616
|
+
const columns: TableColumn<Usuario>[] = [
|
|
617
|
+
{
|
|
618
|
+
header: 'Nombre',
|
|
619
|
+
accessor: 'nombre',
|
|
620
|
+
sortable: true,
|
|
621
|
+
},
|
|
622
|
+
{
|
|
623
|
+
header: 'Email',
|
|
624
|
+
accessor: 'email',
|
|
625
|
+
},
|
|
626
|
+
{
|
|
627
|
+
header: 'Usuario',
|
|
628
|
+
accessor: 'usuario',
|
|
629
|
+
},
|
|
630
|
+
];
|
|
631
|
+
|
|
632
|
+
return (
|
|
633
|
+
<div className="max-w-4xl">
|
|
634
|
+
<Table
|
|
635
|
+
title="Usuarios"
|
|
636
|
+
columns={columns}
|
|
637
|
+
data={usuariosEjemplo}
|
|
638
|
+
variant="striped"
|
|
639
|
+
pagination={{
|
|
640
|
+
currentPage,
|
|
641
|
+
totalPages,
|
|
642
|
+
onPageChange: setCurrentPage,
|
|
643
|
+
}}
|
|
644
|
+
/>
|
|
645
|
+
</div>
|
|
646
|
+
);
|
|
647
|
+
},
|
|
648
|
+
};
|
|
649
|
+
|
|
650
|
+
// ============================================
|
|
651
|
+
// 13. CON AVATARES Y PAGINACIÓN (COMPLETO)
|
|
652
|
+
// ============================================
|
|
653
|
+
export const ConAvatarYPaginacion: Story = {
|
|
654
|
+
args: { columns: [], data: [] },
|
|
655
|
+
render: () => {
|
|
656
|
+
const [currentPage, setCurrentPage] = useState(3);
|
|
657
|
+
const totalPages = 66;
|
|
658
|
+
|
|
659
|
+
const columns: TableColumn<Usuario>[] = [
|
|
660
|
+
{
|
|
661
|
+
header: 'Nombre',
|
|
662
|
+
accessor: 'nombre',
|
|
663
|
+
render: (_value, row) => (
|
|
664
|
+
<div className="flex items-center gap-2">
|
|
665
|
+
{/* Avatar */}
|
|
666
|
+
<img
|
|
667
|
+
src={row.avatar || 'https://i.pravatar.cc/150?img=0'}
|
|
668
|
+
alt={row.nombre}
|
|
669
|
+
className="w-8 h-8 rounded-full object-cover"
|
|
670
|
+
/>
|
|
671
|
+
{/* Texto */}
|
|
672
|
+
<div className="flex flex-col">
|
|
673
|
+
<span className="text-sm font-normal text-content-primary dark:text-dark-content-primary">
|
|
674
|
+
{row.nombre}
|
|
675
|
+
</span>
|
|
676
|
+
<span className="text-xs font-normal text-content-secondary dark:text-content-secondary">
|
|
677
|
+
{row.email}
|
|
678
|
+
</span>
|
|
679
|
+
</div>
|
|
680
|
+
</div>
|
|
681
|
+
),
|
|
682
|
+
},
|
|
683
|
+
{
|
|
684
|
+
header: 'Rol',
|
|
685
|
+
accessor: 'rol',
|
|
686
|
+
},
|
|
687
|
+
{
|
|
688
|
+
header: 'Estado',
|
|
689
|
+
accessor: 'estado',
|
|
690
|
+
align: 'center',
|
|
691
|
+
width: '96px',
|
|
692
|
+
render: (value) => (
|
|
693
|
+
<span
|
|
694
|
+
className={`
|
|
695
|
+
inline-flex
|
|
696
|
+
items-center
|
|
697
|
+
px-1.5
|
|
698
|
+
py-1
|
|
699
|
+
rounded-md
|
|
700
|
+
text-xs
|
|
701
|
+
font-normal
|
|
702
|
+
${
|
|
703
|
+
value === 'activo'
|
|
704
|
+
? 'bg-lime-100 text-lime-700 dark:bg-lime-900/30 dark:text-lime-400'
|
|
705
|
+
: 'bg-zinc-100 text-zinc-600 dark:bg-zinc-800/30 dark:text-zinc-400'
|
|
706
|
+
}
|
|
707
|
+
`}
|
|
708
|
+
>
|
|
709
|
+
{value === 'activo' ? 'Online' : 'Offline'}
|
|
710
|
+
</span>
|
|
711
|
+
),
|
|
712
|
+
},
|
|
713
|
+
];
|
|
714
|
+
|
|
715
|
+
return (
|
|
716
|
+
<div className="max-w-4xl">
|
|
717
|
+
<Table
|
|
718
|
+
title="Usuarios"
|
|
719
|
+
columns={columns}
|
|
720
|
+
data={usuariosEjemplo}
|
|
721
|
+
variant="basic"
|
|
722
|
+
pagination={{
|
|
723
|
+
currentPage,
|
|
724
|
+
totalPages,
|
|
725
|
+
onPageChange: setCurrentPage,
|
|
726
|
+
}}
|
|
727
|
+
/>
|
|
728
|
+
</div>
|
|
729
|
+
);
|
|
730
|
+
},
|
|
731
|
+
};
|
|
732
|
+
|
|
733
|
+
// ============================================
|
|
734
|
+
// 14. TODAS LAS VARIANTES
|
|
735
|
+
// ============================================
|
|
736
|
+
export const TodasLasVariantes: Story = {
|
|
737
|
+
args: {
|
|
738
|
+
columns: [
|
|
739
|
+
{ header: 'Nombre', accessor: 'nombre' },
|
|
740
|
+
{ header: 'Email', accessor: 'email' },
|
|
741
|
+
{ header: 'Usuario', accessor: 'usuario' },
|
|
742
|
+
],
|
|
743
|
+
data: usuariosEjemplo.slice(0, 3),
|
|
744
|
+
},
|
|
745
|
+
render: (args) => (
|
|
746
|
+
<div className="space-y-8 p-6">
|
|
747
|
+
{/* Básica */}
|
|
748
|
+
<div>
|
|
749
|
+
<h3 className="text-sm font-bold mb-4 text-gray-700 dark:text-white">Básica</h3>
|
|
750
|
+
<div className="max-w-4xl">
|
|
751
|
+
<Table {...args} title="Usuarios" variant="basic" />
|
|
752
|
+
</div>
|
|
753
|
+
<p className="text-xs text-gray-500 dark:text-gray-300 mt-2">
|
|
754
|
+
Variante básica con padding y spacing estándar
|
|
755
|
+
</p>
|
|
756
|
+
</div>
|
|
757
|
+
|
|
758
|
+
{/* Ancho Completo */}
|
|
759
|
+
<div>
|
|
760
|
+
<h3 className="text-sm font-bold mb-4 text-gray-700 dark:text-white">Ancho Completo</h3>
|
|
761
|
+
<Table {...args} title="Usuarios - Full Width" variant="fullWidth" />
|
|
762
|
+
<p className="text-xs text-gray-500 dark:text-gray-300 mt-2">
|
|
763
|
+
Tabla que ocupa todo el ancho disponible
|
|
764
|
+
</p>
|
|
765
|
+
</div>
|
|
766
|
+
|
|
767
|
+
{/* Filas Alternas */}
|
|
768
|
+
<div>
|
|
769
|
+
<h3 className="text-sm font-bold mb-4 text-gray-700 dark:text-white">Filas Alternas</h3>
|
|
770
|
+
<div className="max-w-4xl">
|
|
771
|
+
<Table {...args} title="Usuarios - Striped" variant="striped" />
|
|
772
|
+
</div>
|
|
773
|
+
<p className="text-xs text-gray-500 dark:text-gray-300 mt-2">
|
|
774
|
+
Filas con fondo alternado para mejor legibilidad
|
|
775
|
+
</p>
|
|
776
|
+
</div>
|
|
777
|
+
|
|
778
|
+
{/* Con Bordes */}
|
|
779
|
+
<div>
|
|
780
|
+
<h3 className="text-sm font-bold mb-4 text-gray-700 dark:text-white">Con Bordes</h3>
|
|
781
|
+
<div className="max-w-4xl">
|
|
782
|
+
<Table {...args} title="Usuarios - Grid" variant="grid" />
|
|
783
|
+
</div>
|
|
784
|
+
<p className="text-xs text-gray-500 dark:text-gray-300 mt-2">
|
|
785
|
+
Tabla con bordes alrededor de las celdas
|
|
786
|
+
</p>
|
|
787
|
+
</div>
|
|
788
|
+
|
|
789
|
+
{/* Consejos */}
|
|
790
|
+
<div className="mt-6 p-4 bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-lg">
|
|
791
|
+
<p className="text-xs text-gray-600 dark:text-gray-300">
|
|
792
|
+
<strong>💡 Consejos:</strong>
|
|
793
|
+
<br />• Usa <code className="px-1 bg-white dark:bg-gray-700">basic</code> para tablas con
|
|
794
|
+
contenido estándar
|
|
795
|
+
<br />• Usa <code className="px-1 bg-white dark:bg-gray-700">fullWidth</code> para
|
|
796
|
+
dashboards y layouts completos
|
|
797
|
+
<br />• Usa <code className="px-1 bg-white dark:bg-gray-700">striped</code> para tablas
|
|
798
|
+
con muchas filas
|
|
799
|
+
<br />• Usa <code className="px-1 bg-white dark:bg-gray-700">grid</code> para separar
|
|
800
|
+
visualmente las celdas
|
|
801
|
+
</p>
|
|
802
|
+
</div>
|
|
803
|
+
</div>
|
|
804
|
+
),
|
|
805
|
+
};
|