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,329 +1,329 @@
|
|
|
1
|
-
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
-
import { ListView } from './ListView';
|
|
3
|
-
import { Badge } from '../../components/Badge/Badge';
|
|
4
|
-
import { Avatar } from '../../components/Avatar/Avatar';
|
|
5
|
-
import type { ListViewQuickFilter } from './ListView.types';
|
|
6
|
-
import {
|
|
7
|
-
EllipsisHorizontalIcon,
|
|
8
|
-
DocumentCheckIcon,
|
|
9
|
-
DocumentMinusIcon,
|
|
10
|
-
DocumentArrowUpIcon,
|
|
11
|
-
} from './icons';
|
|
12
|
-
|
|
13
|
-
// ===== TIPOS PARA LA DATA DE EJEMPLO =====
|
|
14
|
-
interface User {
|
|
15
|
-
id: string;
|
|
16
|
-
name: string;
|
|
17
|
-
email: string;
|
|
18
|
-
role: string;
|
|
19
|
-
status: 'active' | 'inactive';
|
|
20
|
-
avatar?: string;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
// ===== DATA DE EJEMPLO =====
|
|
24
|
-
const sampleUsers: User[] = [
|
|
25
|
-
{ id: '1', name: 'Jhonnatan Diaz', email: 'jhonnatan.diaz@siesa.com', role: 'Administrador', status: 'active' },
|
|
26
|
-
{ id: '2', name: 'Santiago Sanchez', email: 'santiago.sanchez@siesa.com', role: 'Editor', status: 'active' },
|
|
27
|
-
{ id: '3', name: 'Daniel Mesa', email: 'daniel.mesa@siesa.com', role: 'Editor', status: 'active' },
|
|
28
|
-
{ id: '4', name: 'Juan David Guevara', email: 'juan.guevara@siesa.com', role: 'Editor', status: 'active' },
|
|
29
|
-
{ id: '5', name: 'Francisco Gonzalez', email: 'francisco.gonzalez@siesa.com', role: 'Editor', status: 'active' },
|
|
30
|
-
{ id: '6', name: 'Francisco Gonzalez', email: 'francisco.gonzalez@siesa.com', role: 'Editor', status: 'inactive' },
|
|
31
|
-
{ id: '7', name: 'Brayan Perdomo', email: 'brayan.perdomo@siesa.com', role: 'Editor', status: 'active' },
|
|
32
|
-
{ id: '8', name: 'Brayan Quiñones', email: 'brayan.quinones@siesa.com', role: 'Editor', status: 'active' },
|
|
33
|
-
];
|
|
34
|
-
|
|
35
|
-
// ===== COLUMNAS DE EJEMPLO =====
|
|
36
|
-
const columns = [
|
|
37
|
-
{
|
|
38
|
-
header: 'Nombre',
|
|
39
|
-
accessor: 'name' as const,
|
|
40
|
-
sortable: true,
|
|
41
|
-
render: (value: string, row: User) => (
|
|
42
|
-
<div className="flex items-center gap-2">
|
|
43
|
-
<Avatar
|
|
44
|
-
src={row.avatar || `https://i.pravatar.cc/150?u=${row.id}`}
|
|
45
|
-
alt={value}
|
|
46
|
-
size="8"
|
|
47
|
-
type="circular"
|
|
48
|
-
/>
|
|
49
|
-
<div className="flex flex-col gap-1">
|
|
50
|
-
<span className="text-sm font-normal text-content-primary dark:text-dark-content-primary">
|
|
51
|
-
{value}
|
|
52
|
-
</span>
|
|
53
|
-
<a
|
|
54
|
-
href={`mailto:${row.email}`}
|
|
55
|
-
className="text-[10px] leading-3 text-content-secondary dark:text-content-secondary hover:underline"
|
|
56
|
-
>
|
|
57
|
-
{row.email}
|
|
58
|
-
</a>
|
|
59
|
-
</div>
|
|
60
|
-
</div>
|
|
61
|
-
),
|
|
62
|
-
},
|
|
63
|
-
{
|
|
64
|
-
header: 'Rol',
|
|
65
|
-
accessor: 'role' as const,
|
|
66
|
-
sortable: true,
|
|
67
|
-
render: (value: string) => (
|
|
68
|
-
<span className="text-sm text-content-primary dark:text-dark-content-primary">
|
|
69
|
-
{value}
|
|
70
|
-
</span>
|
|
71
|
-
),
|
|
72
|
-
},
|
|
73
|
-
{
|
|
74
|
-
header: 'Estado',
|
|
75
|
-
accessor: 'status' as const,
|
|
76
|
-
sortable: false,
|
|
77
|
-
width: '96px',
|
|
78
|
-
render: (value: 'active' | 'inactive') => (
|
|
79
|
-
<Badge
|
|
80
|
-
color={value === 'active' ? 'lime' : 'zinc'}
|
|
81
|
-
label={value === 'active' ? 'Activo' : 'Inactivo'}
|
|
82
|
-
/>
|
|
83
|
-
),
|
|
84
|
-
},
|
|
85
|
-
{
|
|
86
|
-
header: '',
|
|
87
|
-
accessor: 'id' as const,
|
|
88
|
-
sortable: false,
|
|
89
|
-
width: '84px',
|
|
90
|
-
render: () => (
|
|
91
|
-
<button className="flex items-center justify-center p-2.5 rounded-lg shadow-sm hover:bg-bg-secondary dark:hover:bg-dark-bg-secondary transition-colors">
|
|
92
|
-
<EllipsisHorizontalIcon className="w-4 h-4 text-content-secondary dark:text-content-secondary" />
|
|
93
|
-
</button>
|
|
94
|
-
),
|
|
95
|
-
},
|
|
96
|
-
];
|
|
97
|
-
|
|
98
|
-
// ===== FILTROS RÁPIDOS DE EJEMPLO =====
|
|
99
|
-
const quickFilters: ListViewQuickFilter[] = [
|
|
100
|
-
{
|
|
101
|
-
id: 'paid',
|
|
102
|
-
label: 'Facturas Pagadas',
|
|
103
|
-
color: 'lime',
|
|
104
|
-
icon: <DocumentCheckIcon className="w-3 h-3" />,
|
|
105
|
-
},
|
|
106
|
-
{
|
|
107
|
-
id: 'pending',
|
|
108
|
-
label: 'facturas Pendientes por Pago',
|
|
109
|
-
color: 'rose',
|
|
110
|
-
icon: <DocumentMinusIcon className="w-3 h-3" />,
|
|
111
|
-
},
|
|
112
|
-
{
|
|
113
|
-
id: 'orders',
|
|
114
|
-
label: 'Ordenes de Compra',
|
|
115
|
-
color: 'sky',
|
|
116
|
-
icon: <DocumentArrowUpIcon className="w-3 h-3" />,
|
|
117
|
-
},
|
|
118
|
-
];
|
|
119
|
-
|
|
120
|
-
// ===== USER INFO =====
|
|
121
|
-
const sampleUserInfo = {
|
|
122
|
-
avatar: 'https://i.pravatar.cc/150?img=12',
|
|
123
|
-
name: 'Jhonnatan Diaz',
|
|
124
|
-
role: 'Administrador',
|
|
125
|
-
};
|
|
126
|
-
|
|
127
|
-
// ===== META =====
|
|
128
|
-
const meta: Meta<typeof ListView> = {
|
|
129
|
-
title: 'Siesa UI Kit/Views/ListView',
|
|
130
|
-
component: ListView,
|
|
131
|
-
parameters: {
|
|
132
|
-
layout: 'fullscreen',
|
|
133
|
-
docs: {
|
|
134
|
-
description: {
|
|
135
|
-
component: `
|
|
136
|
-
Vista de lista completa del sistema de diseño Siesa.
|
|
137
|
-
|
|
138
|
-
Incluye:
|
|
139
|
-
- Navigation Rail lateral con FAB
|
|
140
|
-
- Navbar superior con logo, título y dropdown de usuario
|
|
141
|
-
- Barra de filtros rápidos con badges de colores
|
|
142
|
-
- Tabla de datos con cabecera, cuerpo y paginación
|
|
143
|
-
- Botones de acción (Crear, Auditoría, Filtrar)
|
|
144
|
-
- Buscador integrado
|
|
145
|
-
- Dropdown de opciones de vista
|
|
146
|
-
`,
|
|
147
|
-
},
|
|
148
|
-
},
|
|
149
|
-
},
|
|
150
|
-
tags: ['autodocs'],
|
|
151
|
-
};
|
|
152
|
-
|
|
153
|
-
export default meta;
|
|
154
|
-
type Story = StoryObj<typeof ListView>;
|
|
155
|
-
|
|
156
|
-
// ============================================
|
|
157
|
-
// 1. DEFAULT - Vista completa por defecto
|
|
158
|
-
// ============================================
|
|
159
|
-
export const Default: Story = {
|
|
160
|
-
render: () => (
|
|
161
|
-
<div className="min-h-screen w-full">
|
|
162
|
-
<ListView
|
|
163
|
-
title="List View"
|
|
164
|
-
navbarTitle="List View"
|
|
165
|
-
tableTitle="Usuarios"
|
|
166
|
-
columns={columns}
|
|
167
|
-
data={sampleUsers}
|
|
168
|
-
quickFilters={quickFilters}
|
|
169
|
-
selectedNavId="home"
|
|
170
|
-
userDropdown={sampleUserInfo}
|
|
171
|
-
notifications={{
|
|
172
|
-
bell: true,
|
|
173
|
-
cart: 5,
|
|
174
|
-
}}
|
|
175
|
-
pagination={{
|
|
176
|
-
currentPage: 3,
|
|
177
|
-
totalPages: 66,
|
|
178
|
-
onPageChange: (page) => console.log('Page:', page),
|
|
179
|
-
previousLabel: 'Atrás',
|
|
180
|
-
nextLabel: 'Siguiente',
|
|
181
|
-
}}
|
|
182
|
-
onSearch={(query) => console.log('Search:', query)}
|
|
183
|
-
onFabClick={() => console.log('FAB clicked')}
|
|
184
|
-
onNavSelect={(id) => console.log('Nav selected:', id)}
|
|
185
|
-
/>
|
|
186
|
-
</div>
|
|
187
|
-
),
|
|
188
|
-
};
|
|
189
|
-
|
|
190
|
-
// ============================================
|
|
191
|
-
// 2. LOADING - Estado de carga
|
|
192
|
-
// ============================================
|
|
193
|
-
export const Loading: Story = {
|
|
194
|
-
render: () => (
|
|
195
|
-
<div className="min-h-screen w-full">
|
|
196
|
-
<ListView
|
|
197
|
-
title="List View"
|
|
198
|
-
navbarTitle="List View"
|
|
199
|
-
tableTitle="Usuarios"
|
|
200
|
-
columns={columns}
|
|
201
|
-
data={[]}
|
|
202
|
-
loading={true}
|
|
203
|
-
loadingRows={8}
|
|
204
|
-
quickFilters={quickFilters}
|
|
205
|
-
selectedNavId="home"
|
|
206
|
-
userDropdown={sampleUserInfo}
|
|
207
|
-
pagination={{
|
|
208
|
-
currentPage: 1,
|
|
209
|
-
totalPages: 10,
|
|
210
|
-
onPageChange: () => {},
|
|
211
|
-
}}
|
|
212
|
-
/>
|
|
213
|
-
</div>
|
|
214
|
-
),
|
|
215
|
-
};
|
|
216
|
-
|
|
217
|
-
// ============================================
|
|
218
|
-
// 3. EMPTY - Sin datos
|
|
219
|
-
// ============================================
|
|
220
|
-
export const Empty: Story = {
|
|
221
|
-
render: () => (
|
|
222
|
-
<div className="min-h-screen w-full">
|
|
223
|
-
<ListView
|
|
224
|
-
title="List View"
|
|
225
|
-
navbarTitle="List View"
|
|
226
|
-
tableTitle="Usuarios"
|
|
227
|
-
columns={columns}
|
|
228
|
-
data={[]}
|
|
229
|
-
emptyMessage="No se encontraron usuarios"
|
|
230
|
-
quickFilters={quickFilters}
|
|
231
|
-
selectedNavId="home"
|
|
232
|
-
userDropdown={sampleUserInfo}
|
|
233
|
-
/>
|
|
234
|
-
</div>
|
|
235
|
-
),
|
|
236
|
-
};
|
|
237
|
-
|
|
238
|
-
// ============================================
|
|
239
|
-
// 4. CON OPCIONES DE VISTA
|
|
240
|
-
// ============================================
|
|
241
|
-
export const WithViewOptions: Story = {
|
|
242
|
-
render: () => (
|
|
243
|
-
<div className="min-h-screen w-full">
|
|
244
|
-
<ListView
|
|
245
|
-
title="List View"
|
|
246
|
-
navbarTitle="List View"
|
|
247
|
-
tableTitle="Usuarios"
|
|
248
|
-
columns={columns}
|
|
249
|
-
data={sampleUsers}
|
|
250
|
-
quickFilters={quickFilters}
|
|
251
|
-
selectedNavId="home"
|
|
252
|
-
userDropdown={sampleUserInfo}
|
|
253
|
-
pagination={{
|
|
254
|
-
currentPage: 1,
|
|
255
|
-
totalPages: 66,
|
|
256
|
-
onPageChange: () => {},
|
|
257
|
-
}}
|
|
258
|
-
viewOptions={[
|
|
259
|
-
{ id: 'all', label: 'Todos' },
|
|
260
|
-
{ id: 'active', label: 'Activos' },
|
|
261
|
-
{ id: 'inactive', label: 'Inactivos' },
|
|
262
|
-
]}
|
|
263
|
-
selectedViewOption="all"
|
|
264
|
-
onViewOptionChange={(id) => console.log('View option:', id)}
|
|
265
|
-
/>
|
|
266
|
-
</div>
|
|
267
|
-
),
|
|
268
|
-
};
|
|
269
|
-
|
|
270
|
-
// ============================================
|
|
271
|
-
// 5. MINIMAL - Sin elementos opcionales
|
|
272
|
-
// ============================================
|
|
273
|
-
export const Minimal: Story = {
|
|
274
|
-
render: () => (
|
|
275
|
-
<div className="min-h-screen w-full">
|
|
276
|
-
<ListView
|
|
277
|
-
title="Lista Simple"
|
|
278
|
-
navbarTitle="Lista Simple"
|
|
279
|
-
tableTitle="Datos"
|
|
280
|
-
columns={[
|
|
281
|
-
{ header: 'Nombre', accessor: 'name' as const },
|
|
282
|
-
{ header: 'Email', accessor: 'email' as const },
|
|
283
|
-
]}
|
|
284
|
-
data={sampleUsers.slice(0, 3)}
|
|
285
|
-
showFab={false}
|
|
286
|
-
selectedNavId="home"
|
|
287
|
-
/>
|
|
288
|
-
</div>
|
|
289
|
-
),
|
|
290
|
-
};
|
|
291
|
-
|
|
292
|
-
// ============================================
|
|
293
|
-
// 6. CON BOTONES DE ACCIÓN PERSONALIZADOS
|
|
294
|
-
// ============================================
|
|
295
|
-
export const WithCustomActions: Story = {
|
|
296
|
-
render: () => (
|
|
297
|
-
<div className="min-h-screen w-full">
|
|
298
|
-
<ListView
|
|
299
|
-
title="List View"
|
|
300
|
-
navbarTitle="List View"
|
|
301
|
-
tableTitle="Usuarios"
|
|
302
|
-
columns={columns}
|
|
303
|
-
data={sampleUsers}
|
|
304
|
-
quickFilters={quickFilters}
|
|
305
|
-
selectedNavId="home"
|
|
306
|
-
userDropdown={sampleUserInfo}
|
|
307
|
-
pagination={{
|
|
308
|
-
currentPage: 1,
|
|
309
|
-
totalPages: 10,
|
|
310
|
-
onPageChange: () => {},
|
|
311
|
-
}}
|
|
312
|
-
actionButtons={[
|
|
313
|
-
{
|
|
314
|
-
id: 'create',
|
|
315
|
-
label: 'Crear Usuario',
|
|
316
|
-
variant: 'primary',
|
|
317
|
-
onClick: () => alert('Crear usuario'),
|
|
318
|
-
},
|
|
319
|
-
{
|
|
320
|
-
id: 'export',
|
|
321
|
-
label: 'Exportar',
|
|
322
|
-
variant: 'secondary',
|
|
323
|
-
onClick: () => alert('Exportar'),
|
|
324
|
-
},
|
|
325
|
-
]}
|
|
326
|
-
/>
|
|
327
|
-
</div>
|
|
328
|
-
),
|
|
329
|
-
};
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { ListView } from './ListView';
|
|
3
|
+
import { Badge } from '../../components/Badge/Badge';
|
|
4
|
+
import { Avatar } from '../../components/Avatar/Avatar';
|
|
5
|
+
import type { ListViewQuickFilter } from './ListView.types';
|
|
6
|
+
import {
|
|
7
|
+
EllipsisHorizontalIcon,
|
|
8
|
+
DocumentCheckIcon,
|
|
9
|
+
DocumentMinusIcon,
|
|
10
|
+
DocumentArrowUpIcon,
|
|
11
|
+
} from './icons';
|
|
12
|
+
|
|
13
|
+
// ===== TIPOS PARA LA DATA DE EJEMPLO =====
|
|
14
|
+
interface User {
|
|
15
|
+
id: string;
|
|
16
|
+
name: string;
|
|
17
|
+
email: string;
|
|
18
|
+
role: string;
|
|
19
|
+
status: 'active' | 'inactive';
|
|
20
|
+
avatar?: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// ===== DATA DE EJEMPLO =====
|
|
24
|
+
const sampleUsers: User[] = [
|
|
25
|
+
{ id: '1', name: 'Jhonnatan Diaz', email: 'jhonnatan.diaz@siesa.com', role: 'Administrador', status: 'active' },
|
|
26
|
+
{ id: '2', name: 'Santiago Sanchez', email: 'santiago.sanchez@siesa.com', role: 'Editor', status: 'active' },
|
|
27
|
+
{ id: '3', name: 'Daniel Mesa', email: 'daniel.mesa@siesa.com', role: 'Editor', status: 'active' },
|
|
28
|
+
{ id: '4', name: 'Juan David Guevara', email: 'juan.guevara@siesa.com', role: 'Editor', status: 'active' },
|
|
29
|
+
{ id: '5', name: 'Francisco Gonzalez', email: 'francisco.gonzalez@siesa.com', role: 'Editor', status: 'active' },
|
|
30
|
+
{ id: '6', name: 'Francisco Gonzalez', email: 'francisco.gonzalez@siesa.com', role: 'Editor', status: 'inactive' },
|
|
31
|
+
{ id: '7', name: 'Brayan Perdomo', email: 'brayan.perdomo@siesa.com', role: 'Editor', status: 'active' },
|
|
32
|
+
{ id: '8', name: 'Brayan Quiñones', email: 'brayan.quinones@siesa.com', role: 'Editor', status: 'active' },
|
|
33
|
+
];
|
|
34
|
+
|
|
35
|
+
// ===== COLUMNAS DE EJEMPLO =====
|
|
36
|
+
const columns = [
|
|
37
|
+
{
|
|
38
|
+
header: 'Nombre',
|
|
39
|
+
accessor: 'name' as const,
|
|
40
|
+
sortable: true,
|
|
41
|
+
render: (value: string, row: User) => (
|
|
42
|
+
<div className="flex items-center gap-2">
|
|
43
|
+
<Avatar
|
|
44
|
+
src={row.avatar || `https://i.pravatar.cc/150?u=${row.id}`}
|
|
45
|
+
alt={value}
|
|
46
|
+
size="8"
|
|
47
|
+
type="circular"
|
|
48
|
+
/>
|
|
49
|
+
<div className="flex flex-col gap-1">
|
|
50
|
+
<span className="text-sm font-normal text-content-primary dark:text-dark-content-primary">
|
|
51
|
+
{value}
|
|
52
|
+
</span>
|
|
53
|
+
<a
|
|
54
|
+
href={`mailto:${row.email}`}
|
|
55
|
+
className="text-[10px] leading-3 text-content-secondary dark:text-content-secondary hover:underline"
|
|
56
|
+
>
|
|
57
|
+
{row.email}
|
|
58
|
+
</a>
|
|
59
|
+
</div>
|
|
60
|
+
</div>
|
|
61
|
+
),
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
header: 'Rol',
|
|
65
|
+
accessor: 'role' as const,
|
|
66
|
+
sortable: true,
|
|
67
|
+
render: (value: string) => (
|
|
68
|
+
<span className="text-sm text-content-primary dark:text-dark-content-primary">
|
|
69
|
+
{value}
|
|
70
|
+
</span>
|
|
71
|
+
),
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
header: 'Estado',
|
|
75
|
+
accessor: 'status' as const,
|
|
76
|
+
sortable: false,
|
|
77
|
+
width: '96px',
|
|
78
|
+
render: (value: 'active' | 'inactive') => (
|
|
79
|
+
<Badge
|
|
80
|
+
color={value === 'active' ? 'lime' : 'zinc'}
|
|
81
|
+
label={value === 'active' ? 'Activo' : 'Inactivo'}
|
|
82
|
+
/>
|
|
83
|
+
),
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
header: '',
|
|
87
|
+
accessor: 'id' as const,
|
|
88
|
+
sortable: false,
|
|
89
|
+
width: '84px',
|
|
90
|
+
render: () => (
|
|
91
|
+
<button className="flex items-center justify-center p-2.5 rounded-lg shadow-sm hover:bg-bg-secondary dark:hover:bg-dark-bg-secondary transition-colors">
|
|
92
|
+
<EllipsisHorizontalIcon className="w-4 h-4 text-content-secondary dark:text-content-secondary" />
|
|
93
|
+
</button>
|
|
94
|
+
),
|
|
95
|
+
},
|
|
96
|
+
];
|
|
97
|
+
|
|
98
|
+
// ===== FILTROS RÁPIDOS DE EJEMPLO =====
|
|
99
|
+
const quickFilters: ListViewQuickFilter[] = [
|
|
100
|
+
{
|
|
101
|
+
id: 'paid',
|
|
102
|
+
label: 'Facturas Pagadas',
|
|
103
|
+
color: 'lime',
|
|
104
|
+
icon: <DocumentCheckIcon className="w-3 h-3" />,
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
id: 'pending',
|
|
108
|
+
label: 'facturas Pendientes por Pago',
|
|
109
|
+
color: 'rose',
|
|
110
|
+
icon: <DocumentMinusIcon className="w-3 h-3" />,
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
id: 'orders',
|
|
114
|
+
label: 'Ordenes de Compra',
|
|
115
|
+
color: 'sky',
|
|
116
|
+
icon: <DocumentArrowUpIcon className="w-3 h-3" />,
|
|
117
|
+
},
|
|
118
|
+
];
|
|
119
|
+
|
|
120
|
+
// ===== USER INFO =====
|
|
121
|
+
const sampleUserInfo = {
|
|
122
|
+
avatar: 'https://i.pravatar.cc/150?img=12',
|
|
123
|
+
name: 'Jhonnatan Diaz',
|
|
124
|
+
role: 'Administrador',
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
// ===== META =====
|
|
128
|
+
const meta: Meta<typeof ListView> = {
|
|
129
|
+
title: 'Siesa UI Kit/Views/ListView',
|
|
130
|
+
component: ListView,
|
|
131
|
+
parameters: {
|
|
132
|
+
layout: 'fullscreen',
|
|
133
|
+
docs: {
|
|
134
|
+
description: {
|
|
135
|
+
component: `
|
|
136
|
+
Vista de lista completa del sistema de diseño Siesa.
|
|
137
|
+
|
|
138
|
+
Incluye:
|
|
139
|
+
- Navigation Rail lateral con FAB
|
|
140
|
+
- Navbar superior con logo, título y dropdown de usuario
|
|
141
|
+
- Barra de filtros rápidos con badges de colores
|
|
142
|
+
- Tabla de datos con cabecera, cuerpo y paginación
|
|
143
|
+
- Botones de acción (Crear, Auditoría, Filtrar)
|
|
144
|
+
- Buscador integrado
|
|
145
|
+
- Dropdown de opciones de vista
|
|
146
|
+
`,
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
},
|
|
150
|
+
tags: ['autodocs'],
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
export default meta;
|
|
154
|
+
type Story = StoryObj<typeof ListView>;
|
|
155
|
+
|
|
156
|
+
// ============================================
|
|
157
|
+
// 1. DEFAULT - Vista completa por defecto
|
|
158
|
+
// ============================================
|
|
159
|
+
export const Default: Story = {
|
|
160
|
+
render: () => (
|
|
161
|
+
<div className="min-h-screen w-full">
|
|
162
|
+
<ListView
|
|
163
|
+
title="List View"
|
|
164
|
+
navbarTitle="List View"
|
|
165
|
+
tableTitle="Usuarios"
|
|
166
|
+
columns={columns}
|
|
167
|
+
data={sampleUsers}
|
|
168
|
+
quickFilters={quickFilters}
|
|
169
|
+
selectedNavId="home"
|
|
170
|
+
userDropdown={sampleUserInfo}
|
|
171
|
+
notifications={{
|
|
172
|
+
bell: true,
|
|
173
|
+
cart: 5,
|
|
174
|
+
}}
|
|
175
|
+
pagination={{
|
|
176
|
+
currentPage: 3,
|
|
177
|
+
totalPages: 66,
|
|
178
|
+
onPageChange: (page) => console.log('Page:', page),
|
|
179
|
+
previousLabel: 'Atrás',
|
|
180
|
+
nextLabel: 'Siguiente',
|
|
181
|
+
}}
|
|
182
|
+
onSearch={(query) => console.log('Search:', query)}
|
|
183
|
+
onFabClick={() => console.log('FAB clicked')}
|
|
184
|
+
onNavSelect={(id) => console.log('Nav selected:', id)}
|
|
185
|
+
/>
|
|
186
|
+
</div>
|
|
187
|
+
),
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
// ============================================
|
|
191
|
+
// 2. LOADING - Estado de carga
|
|
192
|
+
// ============================================
|
|
193
|
+
export const Loading: Story = {
|
|
194
|
+
render: () => (
|
|
195
|
+
<div className="min-h-screen w-full">
|
|
196
|
+
<ListView
|
|
197
|
+
title="List View"
|
|
198
|
+
navbarTitle="List View"
|
|
199
|
+
tableTitle="Usuarios"
|
|
200
|
+
columns={columns}
|
|
201
|
+
data={[]}
|
|
202
|
+
loading={true}
|
|
203
|
+
loadingRows={8}
|
|
204
|
+
quickFilters={quickFilters}
|
|
205
|
+
selectedNavId="home"
|
|
206
|
+
userDropdown={sampleUserInfo}
|
|
207
|
+
pagination={{
|
|
208
|
+
currentPage: 1,
|
|
209
|
+
totalPages: 10,
|
|
210
|
+
onPageChange: () => {},
|
|
211
|
+
}}
|
|
212
|
+
/>
|
|
213
|
+
</div>
|
|
214
|
+
),
|
|
215
|
+
};
|
|
216
|
+
|
|
217
|
+
// ============================================
|
|
218
|
+
// 3. EMPTY - Sin datos
|
|
219
|
+
// ============================================
|
|
220
|
+
export const Empty: Story = {
|
|
221
|
+
render: () => (
|
|
222
|
+
<div className="min-h-screen w-full">
|
|
223
|
+
<ListView
|
|
224
|
+
title="List View"
|
|
225
|
+
navbarTitle="List View"
|
|
226
|
+
tableTitle="Usuarios"
|
|
227
|
+
columns={columns}
|
|
228
|
+
data={[]}
|
|
229
|
+
emptyMessage="No se encontraron usuarios"
|
|
230
|
+
quickFilters={quickFilters}
|
|
231
|
+
selectedNavId="home"
|
|
232
|
+
userDropdown={sampleUserInfo}
|
|
233
|
+
/>
|
|
234
|
+
</div>
|
|
235
|
+
),
|
|
236
|
+
};
|
|
237
|
+
|
|
238
|
+
// ============================================
|
|
239
|
+
// 4. CON OPCIONES DE VISTA
|
|
240
|
+
// ============================================
|
|
241
|
+
export const WithViewOptions: Story = {
|
|
242
|
+
render: () => (
|
|
243
|
+
<div className="min-h-screen w-full">
|
|
244
|
+
<ListView
|
|
245
|
+
title="List View"
|
|
246
|
+
navbarTitle="List View"
|
|
247
|
+
tableTitle="Usuarios"
|
|
248
|
+
columns={columns}
|
|
249
|
+
data={sampleUsers}
|
|
250
|
+
quickFilters={quickFilters}
|
|
251
|
+
selectedNavId="home"
|
|
252
|
+
userDropdown={sampleUserInfo}
|
|
253
|
+
pagination={{
|
|
254
|
+
currentPage: 1,
|
|
255
|
+
totalPages: 66,
|
|
256
|
+
onPageChange: () => {},
|
|
257
|
+
}}
|
|
258
|
+
viewOptions={[
|
|
259
|
+
{ id: 'all', label: 'Todos' },
|
|
260
|
+
{ id: 'active', label: 'Activos' },
|
|
261
|
+
{ id: 'inactive', label: 'Inactivos' },
|
|
262
|
+
]}
|
|
263
|
+
selectedViewOption="all"
|
|
264
|
+
onViewOptionChange={(id) => console.log('View option:', id)}
|
|
265
|
+
/>
|
|
266
|
+
</div>
|
|
267
|
+
),
|
|
268
|
+
};
|
|
269
|
+
|
|
270
|
+
// ============================================
|
|
271
|
+
// 5. MINIMAL - Sin elementos opcionales
|
|
272
|
+
// ============================================
|
|
273
|
+
export const Minimal: Story = {
|
|
274
|
+
render: () => (
|
|
275
|
+
<div className="min-h-screen w-full">
|
|
276
|
+
<ListView
|
|
277
|
+
title="Lista Simple"
|
|
278
|
+
navbarTitle="Lista Simple"
|
|
279
|
+
tableTitle="Datos"
|
|
280
|
+
columns={[
|
|
281
|
+
{ header: 'Nombre', accessor: 'name' as const },
|
|
282
|
+
{ header: 'Email', accessor: 'email' as const },
|
|
283
|
+
]}
|
|
284
|
+
data={sampleUsers.slice(0, 3)}
|
|
285
|
+
showFab={false}
|
|
286
|
+
selectedNavId="home"
|
|
287
|
+
/>
|
|
288
|
+
</div>
|
|
289
|
+
),
|
|
290
|
+
};
|
|
291
|
+
|
|
292
|
+
// ============================================
|
|
293
|
+
// 6. CON BOTONES DE ACCIÓN PERSONALIZADOS
|
|
294
|
+
// ============================================
|
|
295
|
+
export const WithCustomActions: Story = {
|
|
296
|
+
render: () => (
|
|
297
|
+
<div className="min-h-screen w-full">
|
|
298
|
+
<ListView
|
|
299
|
+
title="List View"
|
|
300
|
+
navbarTitle="List View"
|
|
301
|
+
tableTitle="Usuarios"
|
|
302
|
+
columns={columns}
|
|
303
|
+
data={sampleUsers}
|
|
304
|
+
quickFilters={quickFilters}
|
|
305
|
+
selectedNavId="home"
|
|
306
|
+
userDropdown={sampleUserInfo}
|
|
307
|
+
pagination={{
|
|
308
|
+
currentPage: 1,
|
|
309
|
+
totalPages: 10,
|
|
310
|
+
onPageChange: () => {},
|
|
311
|
+
}}
|
|
312
|
+
actionButtons={[
|
|
313
|
+
{
|
|
314
|
+
id: 'create',
|
|
315
|
+
label: 'Crear Usuario',
|
|
316
|
+
variant: 'primary',
|
|
317
|
+
onClick: () => alert('Crear usuario'),
|
|
318
|
+
},
|
|
319
|
+
{
|
|
320
|
+
id: 'export',
|
|
321
|
+
label: 'Exportar',
|
|
322
|
+
variant: 'secondary',
|
|
323
|
+
onClick: () => alert('Exportar'),
|
|
324
|
+
},
|
|
325
|
+
]}
|
|
326
|
+
/>
|
|
327
|
+
</div>
|
|
328
|
+
),
|
|
329
|
+
};
|