siesa-ui-kit 1.0.5 → 1.0.6
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/dist/index.cjs +1479 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.js +1479 -0
- package/dist/index.js.map +1 -0
- package/package.json +23 -14
- package/claude/agents/siesa-ui-kit-specialist.md +0 -2401
- package/claude/prompts/component-template.md +0 -121
- package/claude/settings.local.json +0 -61
- package/docs/border-radius.md +0 -1261
- package/docs/colors.md +0 -832
- package/docs/dark-mode-guide.md +0 -1426
- package/docs/filters.md +0 -1243
- package/docs/icons.md +0 -1283
- package/docs/shadows.md +0 -1377
- package/docs/spacing.md +0 -1684
- package/docs/typography.md +0 -1268
- package/postcss.config.cjs +0 -6
- package/src/App.css +0 -42
- package/src/App.tsx +0 -8
- package/src/ButtonTest.tsx +0 -147
- package/src/assets/fonts/README.md +0 -261
- package/src/assets/fonts/SiesaBT/SiesaBT-Bold.otf +0 -0
- package/src/assets/fonts/SiesaBT/SiesaBT-Light.otf +0 -0
- package/src/assets/fonts/SiesaBT/SiesaBT-Regular.otf +0 -0
- package/src/assets/react.svg +0 -1
- package/src/components/Alert/Alert.stories.tsx +0 -332
- package/src/components/Alert/Alert.tsx +0 -106
- package/src/components/Alert/Alert.types.ts +0 -54
- package/src/components/Avatar/Avatar.stories.tsx +0 -494
- package/src/components/Avatar/Avatar.tsx +0 -143
- package/src/components/Avatar/Avatar.types.ts +0 -53
- package/src/components/Badge/Badge.stories.tsx +0 -339
- package/src/components/Badge/Badge.tsx +0 -278
- package/src/components/Badge/Badge.types.ts +0 -58
- package/src/components/Button/Button.stories.tsx +0 -950
- package/src/components/Button/Button.tsx +0 -337
- package/src/components/Button/Button.types.ts +0 -180
- package/src/components/Button/icons.tsx +0 -87
- package/src/components/Button/index.ts +0 -3
- package/src/components/Checkbox/Checkbox.stories.tsx +0 -453
- package/src/components/Checkbox/Checkbox.tsx +0 -208
- package/src/components/Checkbox/Checkbox.types.ts +0 -61
- package/src/components/DescriptionList/DescriptionList.stories.tsx +0 -250
- package/src/components/DescriptionList/DescriptionList.tsx +0 -96
- package/src/components/DescriptionList/DescriptionList.types.ts +0 -29
- package/src/components/Divider/Divider.stories.tsx +0 -263
- package/src/components/Divider/Divider.tsx +0 -80
- package/src/components/Divider/Divider.types.ts +0 -24
- package/src/components/Dropdown/Dropdown.stories.tsx +0 -552
- package/src/components/Dropdown/Dropdown.tsx +0 -422
- package/src/components/Dropdown/Dropdown.types.ts +0 -146
- package/src/components/Dropdown/README.md +0 -266
- package/src/components/Dropdown/icons.tsx +0 -72
- package/src/components/Dropdown/index.ts +0 -8
- package/src/components/Input/Input.stories.tsx +0 -583
- package/src/components/Input/Input.tsx +0 -204
- package/src/components/Input/Input.types.ts +0 -80
- package/src/components/Input/icons.tsx +0 -145
- package/src/components/Input/index.ts +0 -2
- package/src/components/LoginView/LoginView.stories.tsx +0 -148
- package/src/components/LoginView/LoginView.tsx +0 -426
- package/src/components/LoginView/LoginView.types.ts +0 -52
- package/src/components/LoginView/README.md +0 -396
- package/src/components/LoginView/icons.tsx +0 -85
- package/src/components/LoginView/index.ts +0 -3
- package/src/components/Navbar/Navbar.stories.tsx +0 -810
- package/src/components/Navbar/Navbar.tsx +0 -755
- package/src/components/Navbar/Navbar.types.ts +0 -219
- package/src/components/Navbar/README.md +0 -279
- package/src/components/Navbar/icons.tsx +0 -102
- package/src/components/Navbar/index.ts +0 -8
- package/src/components/NavigationBar/NavigationBar.stories.tsx +0 -406
- package/src/components/NavigationBar/NavigationBar.tsx +0 -246
- package/src/components/NavigationBar/NavigationBar.types.ts +0 -74
- package/src/components/NavigationBar/README.md +0 -469
- package/src/components/NavigationBar/index.ts +0 -2
- package/src/components/NavigationRail/NavigationRail.stories.tsx +0 -417
- package/src/components/NavigationRail/NavigationRail.tsx +0 -418
- package/src/components/NavigationRail/NavigationRail.types.ts +0 -109
- package/src/components/NavigationRail/README.md +0 -224
- package/src/components/NavigationRail/index.ts +0 -2
- package/src/components/Notification/Notification.stories.tsx +0 -513
- package/src/components/Notification/Notification.tsx +0 -145
- package/src/components/Notification/Notification.types.ts +0 -142
- package/src/components/Notification/README.md +0 -409
- package/src/components/Notification/index.ts +0 -3
- package/src/components/POSConvention/POSConvention.stories.tsx +0 -235
- package/src/components/POSConvention/POSConvention.tsx +0 -129
- package/src/components/POSConvention/POSConvention.types.ts +0 -38
- package/src/components/POSConvention/README.md +0 -123
- package/src/components/POSConvention/icons.tsx +0 -45
- package/src/components/POSConvention/index.ts +0 -3
- package/src/components/POSLocationButton/POSLocationButton.stories.tsx +0 -531
- package/src/components/POSLocationButton/POSLocationButton.tsx +0 -247
- package/src/components/POSLocationButton/POSLocationButton.types.ts +0 -87
- package/src/components/POSLocationButton/README.md +0 -253
- package/src/components/POSLocationButton/icons.tsx +0 -120
- package/src/components/POSLocationButton/index.ts +0 -14
- package/src/components/POSNumberButton/POSNumberButton.stories.tsx +0 -415
- package/src/components/POSNumberButton/POSNumberButton.tsx +0 -179
- package/src/components/POSNumberButton/POSNumberButton.types.ts +0 -51
- package/src/components/POSNumberButton/README.md +0 -321
- package/src/components/POSNumberButton/index.ts +0 -3
- package/src/components/POSProductButton/POSProductButton.stories.tsx +0 -318
- package/src/components/POSProductButton/POSProductButton.tsx +0 -152
- package/src/components/POSProductButton/POSProductButton.types.ts +0 -46
- package/src/components/POSProductButton/README.md +0 -269
- package/src/components/POSProductButton/index.ts +0 -2
- package/src/components/POSProductCard/POSProductCard.stories.tsx +0 -642
- package/src/components/POSProductCard/POSProductCard.tsx +0 -208
- package/src/components/POSProductCard/POSProductCard.types.ts +0 -76
- package/src/components/POSProductCard/README.md +0 -179
- package/src/components/POSProductCard/icons.tsx +0 -26
- package/src/components/POSProductCard/index.ts +0 -2
- package/src/components/POSProductSidebarItems/POSProductSidebarItems.stories.tsx +0 -753
- package/src/components/POSProductSidebarItems/POSProductSidebarItems.tsx +0 -332
- package/src/components/POSProductSidebarItems/POSProductSidebarItems.types.ts +0 -119
- package/src/components/POSProductSidebarItems/README.md +0 -198
- package/src/components/POSProductSidebarItems/icons.tsx +0 -21
- package/src/components/POSProductSidebarItems/index.ts +0 -3
- package/src/components/POSTable/POSTable.stories.tsx +0 -737
- package/src/components/POSTable/POSTable.tsx +0 -401
- package/src/components/POSTable/POSTable.types.ts +0 -83
- package/src/components/POSTable/README.md +0 -286
- package/src/components/POSTable/index.ts +0 -7
- package/src/components/Pagination/Pagination.stories.tsx +0 -555
- package/src/components/Pagination/Pagination.tsx +0 -286
- package/src/components/Pagination/Pagination.types.ts +0 -93
- package/src/components/Pagination/README.md +0 -298
- package/src/components/Pagination/icons.tsx +0 -47
- package/src/components/Pagination/index.ts +0 -3
- package/src/components/Quantity/Quantity.stories.tsx +0 -457
- package/src/components/Quantity/Quantity.tsx +0 -289
- package/src/components/Quantity/Quantity.types.ts +0 -70
- package/src/components/Radio/Radio.stories.tsx +0 -523
- package/src/components/Radio/Radio.tsx +0 -170
- package/src/components/Radio/Radio.types.ts +0 -122
- package/src/components/Select/README.md +0 -299
- package/src/components/Select/Select.stories.tsx +0 -673
- package/src/components/Select/Select.tsx +0 -454
- package/src/components/Select/Select.types.ts +0 -148
- package/src/components/Select/icons.tsx +0 -50
- package/src/components/Select/index.ts +0 -3
- package/src/components/SignUpView/SignUpView.stories.tsx +0 -129
- package/src/components/SignUpView/SignUpView.tsx +0 -503
- package/src/components/SignUpView/SignUpView.types.ts +0 -58
- package/src/components/SignUpView/icons.tsx +0 -71
- package/src/components/SignUpView/index.ts +0 -3
- package/src/components/Switch/README.md +0 -112
- package/src/components/Switch/Switch.stories.tsx +0 -550
- package/src/components/Switch/Switch.tsx +0 -246
- package/src/components/Switch/Switch.types.ts +0 -67
- package/src/components/Table/README.md +0 -369
- package/src/components/Table/Table.stories.tsx +0 -805
- package/src/components/Table/Table.tsx +0 -688
- package/src/components/Table/Table.types.ts +0 -204
- package/src/components/Table/index.ts +0 -9
- package/src/components/Tabs/README.md +0 -201
- package/src/components/Tabs/Tabs.stories.tsx +0 -580
- package/src/components/Tabs/Tabs.tsx +0 -356
- package/src/components/Tabs/Tabs.types.ts +0 -127
- package/src/components/Tabs/icons.tsx +0 -129
- package/src/components/Tabs/index.ts +0 -11
- package/src/components/Textarea/Textarea.stories.tsx +0 -535
- package/src/components/Textarea/Textarea.tsx +0 -188
- package/src/components/Textarea/Textarea.types.ts +0 -54
- package/src/context/ThemeContext.tsx +0 -99
- package/src/context/index.ts +0 -1
- package/src/index.css +0 -29
- package/src/index.ts +0 -39
- package/src/main.tsx +0 -10
- package/src/views/ProductsView/ProductsView.stories.tsx +0 -344
- package/src/views/ProductsView/ProductsView.tsx +0 -480
- package/src/views/ProductsView/ProductsView.types.ts +0 -238
- package/src/views/ProductsView/README.md +0 -312
- package/src/views/ProductsView/icons.tsx +0 -38
- package/src/views/ProductsView/index.ts +0 -8
- package/src/views/RecoverPasswordView/README.md +0 -269
- package/src/views/RecoverPasswordView/RecoverPasswordView.stories.tsx +0 -131
- package/src/views/RecoverPasswordView/RecoverPasswordView.tsx +0 -376
- package/src/views/RecoverPasswordView/RecoverPasswordView.types.ts +0 -56
- package/src/views/RecoverPasswordView/icons.tsx +0 -17
- package/src/views/RecoverPasswordView/index.ts +0 -2
- package/src/views/TableLayoutView/README.md +0 -268
- package/src/views/TableLayoutView/TableLayoutView.stories.tsx +0 -235
- package/src/views/TableLayoutView/TableLayoutView.tsx +0 -461
- package/src/views/TableLayoutView/TableLayoutView.types.ts +0 -209
- package/src/views/TableLayoutView/icons.tsx +0 -113
- package/src/views/TableLayoutView/index.ts +0 -6
- package/storybook/main.ts +0 -20
- package/storybook/preview.tsx +0 -84
- package/storybook/vitest.setup.ts +0 -7
- package/tailwind.config.js +0 -128
- /package/{public → dist}/,Business Logo.png +0 -0
- /package/{public → dist}/.Siesa Logo.png +0 -0
- /package/{public → dist}/bg_siesa.png +0 -0
- /package/{public → dist}/siesa_logo_mobile.png +0 -0
- /package/{public → dist}/vite.svg +0 -0
|
@@ -1,268 +0,0 @@
|
|
|
1
|
-
# TableLayoutView
|
|
2
|
-
|
|
3
|
-
Vista completa de administración de layout de mesas para restaurantes (sistema POS).
|
|
4
|
-
|
|
5
|
-
## Descripción
|
|
6
|
-
|
|
7
|
-
TableLayoutView es una vista pixel-perfect según especificaciones de Figma que proporciona una interfaz completa para gestionar el layout de mesas de un restaurante. Incluye:
|
|
8
|
-
|
|
9
|
-
- **Navbar superior**: Con información de usuario y acciones
|
|
10
|
-
- **Sidebar izquierdo (245px)**: Lista de salones/ubicaciones con sus estados
|
|
11
|
-
- **Área central (flex)**: Grid de mesas con controles de gestión y leyenda
|
|
12
|
-
- **Sidebar derecho (304px)**: Panel de selección de cantidad de personas (condicional)
|
|
13
|
-
|
|
14
|
-
## Características
|
|
15
|
-
|
|
16
|
-
- ✅ Layout responsive (mobile-first)
|
|
17
|
-
- ✅ Dark mode completo
|
|
18
|
-
- ✅ Múltiples estados visuales para mesas (disponible, ocupada, reservada, fuera de servicio)
|
|
19
|
-
- ✅ Posicionamiento libre de mesas con coordenadas
|
|
20
|
-
- ✅ Panel de teclado numérico para selección de personas
|
|
21
|
-
- ✅ Callbacks para todas las acciones principales
|
|
22
|
-
- ✅ Estados de carga y error
|
|
23
|
-
- ✅ TypeScript strict
|
|
24
|
-
- ✅ Accesibilidad (ARIA labels)
|
|
25
|
-
|
|
26
|
-
## Uso Básico
|
|
27
|
-
|
|
28
|
-
```tsx
|
|
29
|
-
import { TableLayoutView } from './views/TableLayoutView';
|
|
30
|
-
|
|
31
|
-
function App() {
|
|
32
|
-
const [activeLocation, setActiveLocation] = useState('1');
|
|
33
|
-
const [selectedTable, setSelectedTable] = useState<string | null>(null);
|
|
34
|
-
|
|
35
|
-
const locations = [
|
|
36
|
-
{ id: '1', name: 'Antejardín', status: 'available', capacity: { current: 1, total: 8 } },
|
|
37
|
-
{ id: '2', name: 'Terraza', status: 'occupied', capacity: { current: 8, total: 8 } },
|
|
38
|
-
];
|
|
39
|
-
|
|
40
|
-
const tables = [
|
|
41
|
-
{
|
|
42
|
-
tableNumber: '01',
|
|
43
|
-
status: 'available',
|
|
44
|
-
shape: 'square',
|
|
45
|
-
chairs: 8,
|
|
46
|
-
position: { x: 25, y: 30 },
|
|
47
|
-
},
|
|
48
|
-
{
|
|
49
|
-
tableNumber: '02',
|
|
50
|
-
status: 'occupied',
|
|
51
|
-
shape: 'circle',
|
|
52
|
-
chairs: 4,
|
|
53
|
-
position: { x: 50, y: 30 },
|
|
54
|
-
},
|
|
55
|
-
];
|
|
56
|
-
|
|
57
|
-
return (
|
|
58
|
-
<TableLayoutView
|
|
59
|
-
locations={locations}
|
|
60
|
-
activeLocationId={activeLocation}
|
|
61
|
-
tables={tables}
|
|
62
|
-
tablesTitle="Mesas de Antejardín"
|
|
63
|
-
showPeopleCountPanel={!!selectedTable}
|
|
64
|
-
userInfo={{
|
|
65
|
-
avatar: '/path/to/avatar.jpg',
|
|
66
|
-
name: 'Juan Pérez',
|
|
67
|
-
role: 'Administrador',
|
|
68
|
-
}}
|
|
69
|
-
onLocationSelect={setActiveLocation}
|
|
70
|
-
onTableSelect={setSelectedTable}
|
|
71
|
-
onCreateTables={() => console.log('Crear mesas')}
|
|
72
|
-
onAssignTable={() => console.log('Asignar mesa')}
|
|
73
|
-
/>
|
|
74
|
-
);
|
|
75
|
-
}
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
## Props
|
|
79
|
-
|
|
80
|
-
### Datos de Ubicaciones
|
|
81
|
-
|
|
82
|
-
- **locations** (`Location[]`): Lista de salones/ubicaciones
|
|
83
|
-
- **activeLocationId** (`string`): ID de la ubicación actualmente seleccionada
|
|
84
|
-
- **tables** (`TableItem[]`): Lista de mesas en el layout actual
|
|
85
|
-
- **tablesTitle** (`string`): Título del área de mesas (default: "Mesas de Antejardín")
|
|
86
|
-
|
|
87
|
-
### Panel de Personas
|
|
88
|
-
|
|
89
|
-
- **showPeopleCountPanel** (`boolean`): Si se muestra el panel de selección de personas
|
|
90
|
-
- **selectedTable** (`{ locationName: string; tableName: string }`): Info de la mesa seleccionada
|
|
91
|
-
- **peopleCount** (`number`): Cantidad de personas seleccionada
|
|
92
|
-
|
|
93
|
-
### Callbacks de Acciones
|
|
94
|
-
|
|
95
|
-
- **onLocationSelect** (`(locationId: string) => void`): Al seleccionar una ubicación
|
|
96
|
-
- **onTableSelect** (`(tableNumber: string) => void`): Al seleccionar una mesa
|
|
97
|
-
- **onCreateTables** (`() => void`): Al hacer clic en "Crear Mesas"
|
|
98
|
-
- **onMergeTables** (`() => void`): Al hacer clic en "Unir Mesas"
|
|
99
|
-
- **onSplitTables** (`() => void`): Al hacer clic en "Separar Mesas"
|
|
100
|
-
- **onPeopleCountSelect** (`(count: number) => void`): Al seleccionar cantidad de personas
|
|
101
|
-
- **onAssignTable** (`() => void`): Al hacer clic en "Asignar"
|
|
102
|
-
- **onTransferTable** (`() => void`): Al hacer clic en "Transferir"
|
|
103
|
-
- **onSetCutlery** (`() => void`): Al hacer clic en "Cubiertos"
|
|
104
|
-
- **onClosePeoplePanel** (`() => void`): Al cerrar el panel de personas
|
|
105
|
-
- **onTableSwitchChange** (`(checked: boolean) => void`): Al cambiar el switch de mesa
|
|
106
|
-
|
|
107
|
-
### Estados
|
|
108
|
-
|
|
109
|
-
- **isLoading** (`boolean`): Si se está cargando información
|
|
110
|
-
- **errorMessage** (`string`): Mensaje de error (si existe)
|
|
111
|
-
|
|
112
|
-
### Customización
|
|
113
|
-
|
|
114
|
-
- **className** (`string`): Clases CSS adicionales
|
|
115
|
-
- **userInfo** (`{ avatar: string; name: string; role: string }`): Información del usuario para navbar
|
|
116
|
-
|
|
117
|
-
## Tipos de Datos
|
|
118
|
-
|
|
119
|
-
### Location
|
|
120
|
-
|
|
121
|
-
```typescript
|
|
122
|
-
interface Location {
|
|
123
|
-
id: string;
|
|
124
|
-
name: string;
|
|
125
|
-
status: 'available' | 'occupied' | 'reserved' | 'outOfService';
|
|
126
|
-
capacity: {
|
|
127
|
-
current: number;
|
|
128
|
-
total: number;
|
|
129
|
-
};
|
|
130
|
-
}
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
### TableItem
|
|
134
|
-
|
|
135
|
-
```typescript
|
|
136
|
-
interface TableItem {
|
|
137
|
-
tableNumber: string;
|
|
138
|
-
status: 'available' | 'occupied' | 'reserved' | 'outOfService';
|
|
139
|
-
shape: 'square' | 'circle' | 'rectangle' | 'oval';
|
|
140
|
-
chairs: 2 | 4 | 6 | 8;
|
|
141
|
-
isActive?: boolean;
|
|
142
|
-
position?: {
|
|
143
|
-
x: number; // Porcentaje 0-100
|
|
144
|
-
y: number; // Porcentaje 0-100
|
|
145
|
-
};
|
|
146
|
-
}
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
## Ejemplos de Uso
|
|
150
|
-
|
|
151
|
-
### Vista Completa (con panel de personas)
|
|
152
|
-
|
|
153
|
-
```tsx
|
|
154
|
-
<TableLayoutView
|
|
155
|
-
locations={locations}
|
|
156
|
-
activeLocationId="1"
|
|
157
|
-
tables={tables}
|
|
158
|
-
tablesTitle="Mesas de Antejardín"
|
|
159
|
-
showPeopleCountPanel={true}
|
|
160
|
-
selectedTable={{
|
|
161
|
-
locationName: 'Antejardín',
|
|
162
|
-
tableName: 'Mesa 1',
|
|
163
|
-
}}
|
|
164
|
-
userInfo={userInfo}
|
|
165
|
-
onPeopleCountSelect={(count) => console.log('Personas:', count)}
|
|
166
|
-
onAssignTable={() => console.log('Asignar')}
|
|
167
|
-
/>
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
### Vista sin Panel de Personas
|
|
171
|
-
|
|
172
|
-
```tsx
|
|
173
|
-
<TableLayoutView
|
|
174
|
-
locations={locations}
|
|
175
|
-
activeLocationId="1"
|
|
176
|
-
tables={tables}
|
|
177
|
-
showPeopleCountPanel={false}
|
|
178
|
-
userInfo={userInfo}
|
|
179
|
-
/>
|
|
180
|
-
```
|
|
181
|
-
|
|
182
|
-
### Estado de Carga
|
|
183
|
-
|
|
184
|
-
```tsx
|
|
185
|
-
<TableLayoutView
|
|
186
|
-
locations={[]}
|
|
187
|
-
tables={[]}
|
|
188
|
-
isLoading={true}
|
|
189
|
-
userInfo={userInfo}
|
|
190
|
-
/>
|
|
191
|
-
```
|
|
192
|
-
|
|
193
|
-
### Estado de Error
|
|
194
|
-
|
|
195
|
-
```tsx
|
|
196
|
-
<TableLayoutView
|
|
197
|
-
locations={locations}
|
|
198
|
-
activeLocationId="1"
|
|
199
|
-
tables={[]}
|
|
200
|
-
errorMessage="Error al cargar las mesas"
|
|
201
|
-
userInfo={userInfo}
|
|
202
|
-
/>
|
|
203
|
-
```
|
|
204
|
-
|
|
205
|
-
## Posicionamiento de Mesas
|
|
206
|
-
|
|
207
|
-
Las mesas usan un sistema de coordenadas porcentuales (0-100) para posicionamiento libre:
|
|
208
|
-
|
|
209
|
-
```typescript
|
|
210
|
-
const tables: TableItem[] = [
|
|
211
|
-
{
|
|
212
|
-
tableNumber: '01',
|
|
213
|
-
status: 'available',
|
|
214
|
-
shape: 'square',
|
|
215
|
-
chairs: 8,
|
|
216
|
-
position: { x: 25, y: 30 }, // 25% desde izquierda, 30% desde arriba
|
|
217
|
-
},
|
|
218
|
-
{
|
|
219
|
-
tableNumber: '02',
|
|
220
|
-
status: 'occupied',
|
|
221
|
-
shape: 'circle',
|
|
222
|
-
chairs: 4,
|
|
223
|
-
position: { x: 75, y: 70 }, // 75% desde izquierda, 70% desde arriba
|
|
224
|
-
},
|
|
225
|
-
];
|
|
226
|
-
```
|
|
227
|
-
|
|
228
|
-
## Estados Visuales de Mesas
|
|
229
|
-
|
|
230
|
-
- **available** (Disponible): Verde/Lime
|
|
231
|
-
- **occupied** (Ocupada): Naranja/Yellow
|
|
232
|
-
- **reserved** (Reservada): Morado/Purple
|
|
233
|
-
- **outOfService** (Fuera de servicio): Gris/Zinc
|
|
234
|
-
|
|
235
|
-
## Responsive Design
|
|
236
|
-
|
|
237
|
-
La vista es completamente responsive:
|
|
238
|
-
|
|
239
|
-
- **Mobile**: Las tres columnas se apilan verticalmente
|
|
240
|
-
- **Desktop**: Layout de 3 columnas (245px + flex + 304px)
|
|
241
|
-
|
|
242
|
-
## Dark Mode
|
|
243
|
-
|
|
244
|
-
Todos los elementos tienen soporte completo para dark mode con tokens del sistema.
|
|
245
|
-
|
|
246
|
-
## Accesibilidad
|
|
247
|
-
|
|
248
|
-
- ARIA labels en botones y acciones
|
|
249
|
-
- Navegación por teclado en todos los elementos interactivos
|
|
250
|
-
- Estados de focus visibles
|
|
251
|
-
- Contraste de colores según WCAG
|
|
252
|
-
|
|
253
|
-
## Componentes Relacionados
|
|
254
|
-
|
|
255
|
-
- `POSLocationButton`: Botones de salones en sidebar izquierdo
|
|
256
|
-
- `POSTable`: Visualización de mesas con sillas
|
|
257
|
-
- `POSNumberButton`: Teclado numérico para cantidad de personas
|
|
258
|
-
- `POSConvention`: Leyendas de convención de colores
|
|
259
|
-
- `Switch`: Selector de mesa en panel de personas
|
|
260
|
-
- `Button`: Botones de acción
|
|
261
|
-
- `Navbar`: Barra de navegación superior
|
|
262
|
-
|
|
263
|
-
## Notas Técnicas
|
|
264
|
-
|
|
265
|
-
- Diseño pixel-perfect según especificaciones de Figma
|
|
266
|
-
- Usa tokens del sistema para colores, espaciados y tipografía
|
|
267
|
-
- TypeScript strict para type safety
|
|
268
|
-
- Componentes reutilizables del sistema de diseño
|
|
@@ -1,235 +0,0 @@
|
|
|
1
|
-
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
-
import { TableLayoutView } from './TableLayoutView';
|
|
3
|
-
import type { Location, TableItem } from './TableLayoutView.types';
|
|
4
|
-
|
|
5
|
-
const meta = {
|
|
6
|
-
title: 'Siesa UI Kit/Views/TableLayoutView',
|
|
7
|
-
component: TableLayoutView,
|
|
8
|
-
parameters: {
|
|
9
|
-
layout: 'fullscreen',
|
|
10
|
-
docs: {
|
|
11
|
-
description: {
|
|
12
|
-
component:
|
|
13
|
-
'Vista completa de administración de mesas para restaurantes (POS). Incluye lista de salones, grid de mesas con estados visuales, y panel de asignación de personas.',
|
|
14
|
-
},
|
|
15
|
-
},
|
|
16
|
-
},
|
|
17
|
-
tags: ['autodocs'],
|
|
18
|
-
} satisfies Meta<typeof TableLayoutView>;
|
|
19
|
-
|
|
20
|
-
export default meta;
|
|
21
|
-
type Story = StoryObj<typeof meta>;
|
|
22
|
-
|
|
23
|
-
// ===== DATOS DE PRUEBA =====
|
|
24
|
-
const sampleLocations: Location[] = [
|
|
25
|
-
{
|
|
26
|
-
id: '1',
|
|
27
|
-
name: 'Antejardín',
|
|
28
|
-
status: 'available',
|
|
29
|
-
capacity: { current: 1, total: 8 },
|
|
30
|
-
},
|
|
31
|
-
{
|
|
32
|
-
id: '2',
|
|
33
|
-
name: 'Terraza',
|
|
34
|
-
status: 'occupied', // occupied es para Location, busy para TableItem
|
|
35
|
-
capacity: { current: 8, total: 8 },
|
|
36
|
-
},
|
|
37
|
-
{
|
|
38
|
-
id: '3',
|
|
39
|
-
name: 'Bar',
|
|
40
|
-
status: 'outOfService',
|
|
41
|
-
capacity: { current: 0, total: 8 },
|
|
42
|
-
},
|
|
43
|
-
{
|
|
44
|
-
id: '4',
|
|
45
|
-
name: 'Salón 1',
|
|
46
|
-
status: 'available',
|
|
47
|
-
capacity: { current: 1, total: 8 },
|
|
48
|
-
},
|
|
49
|
-
{
|
|
50
|
-
id: '5',
|
|
51
|
-
name: 'Salón 2',
|
|
52
|
-
status: 'available',
|
|
53
|
-
capacity: { current: 3, total: 8 },
|
|
54
|
-
},
|
|
55
|
-
];
|
|
56
|
-
|
|
57
|
-
const sampleTables: TableItem[] = [
|
|
58
|
-
// Fila 1 - Las mesas se organizan automáticamente en grid con gap uniforme
|
|
59
|
-
{ tableNumber: '01', status: 'available', shape: 'square', chairs: 8, isActive: true },
|
|
60
|
-
{ tableNumber: '02', status: 'available', shape: 'circle', chairs: 2 },
|
|
61
|
-
{ tableNumber: '03', status: 'available', shape: 'circle', chairs: 4 },
|
|
62
|
-
{ tableNumber: '04', status: 'available', shape: 'oval', chairs: 6 },
|
|
63
|
-
// Fila 2
|
|
64
|
-
{ tableNumber: '05', status: 'available', shape: 'square', chairs: 4 },
|
|
65
|
-
{ tableNumber: '06', status: 'busy', shape: 'circle', chairs: 2 },
|
|
66
|
-
{ tableNumber: '07', status: 'available', shape: 'rectangle', chairs: 8 },
|
|
67
|
-
{ tableNumber: '08', status: 'reserved', shape: 'circle', chairs: 4 },
|
|
68
|
-
];
|
|
69
|
-
|
|
70
|
-
const sampleUserInfo = {
|
|
71
|
-
avatar: 'https://i.pravatar.cc/150?img=12',
|
|
72
|
-
name: 'Jhonnatan Diaz',
|
|
73
|
-
role: 'Administrador',
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
// ============================================
|
|
77
|
-
// 1. VISTA COMPLETA (Con panel de personas)
|
|
78
|
-
// ============================================
|
|
79
|
-
export const VistaCompleta: Story = {
|
|
80
|
-
render: () => (
|
|
81
|
-
<div className="min-h-screen w-full">
|
|
82
|
-
<TableLayoutView
|
|
83
|
-
locations={sampleLocations}
|
|
84
|
-
activeLocationId="1"
|
|
85
|
-
tables={sampleTables}
|
|
86
|
-
tablesTitle="Mesas de Antejardín"
|
|
87
|
-
showPeopleCountPanel={true}
|
|
88
|
-
selectedTable={{
|
|
89
|
-
locationName: 'Antejardín',
|
|
90
|
-
tableName: 'Mesa 1',
|
|
91
|
-
}}
|
|
92
|
-
userInfo={sampleUserInfo}
|
|
93
|
-
onLocationSelect={(id) => console.log('Ubicación seleccionada:', id)}
|
|
94
|
-
onTableSelect={(table) => console.log('Mesa seleccionada:', table)}
|
|
95
|
-
onCreateTables={() => console.log('Crear mesas')}
|
|
96
|
-
onMergeTables={() => console.log('Unir mesas')}
|
|
97
|
-
onSplitTables={() => console.log('Separar mesas')}
|
|
98
|
-
onPeopleCountSelect={(count) => console.log('Personas:', count)}
|
|
99
|
-
onAssignTable={() => console.log('Asignar mesa')}
|
|
100
|
-
onTransferTable={() => console.log('Transferir mesa')}
|
|
101
|
-
onSetCutlery={() => console.log('Configurar cubiertos')}
|
|
102
|
-
onClosePeoplePanel={() => console.log('Cerrar panel')}
|
|
103
|
-
/>
|
|
104
|
-
</div>
|
|
105
|
-
),
|
|
106
|
-
};
|
|
107
|
-
|
|
108
|
-
// ============================================
|
|
109
|
-
// 2. VISTA SIN PANEL DE PERSONAS
|
|
110
|
-
// ============================================
|
|
111
|
-
export const SinPanelDePersonas: Story = {
|
|
112
|
-
render: () => (
|
|
113
|
-
<div className="min-h-screen w-full">
|
|
114
|
-
<TableLayoutView
|
|
115
|
-
locations={sampleLocations}
|
|
116
|
-
activeLocationId="1"
|
|
117
|
-
tables={sampleTables}
|
|
118
|
-
tablesTitle="Mesas de Antejardín"
|
|
119
|
-
showPeopleCountPanel={false}
|
|
120
|
-
userInfo={sampleUserInfo}
|
|
121
|
-
onLocationSelect={(id) => console.log('Ubicación seleccionada:', id)}
|
|
122
|
-
onTableSelect={(table) => console.log('Mesa seleccionada:', table)}
|
|
123
|
-
onCreateTables={() => console.log('Crear mesas')}
|
|
124
|
-
onMergeTables={() => console.log('Unir mesas')}
|
|
125
|
-
onSplitTables={() => console.log('Separar mesas')}
|
|
126
|
-
/>
|
|
127
|
-
</div>
|
|
128
|
-
),
|
|
129
|
-
};
|
|
130
|
-
|
|
131
|
-
// ============================================
|
|
132
|
-
// 3. ESTADO DE CARGA
|
|
133
|
-
// ============================================
|
|
134
|
-
export const EstadoDeCarga: Story = {
|
|
135
|
-
render: () => (
|
|
136
|
-
<div className="min-h-screen w-full">
|
|
137
|
-
<TableLayoutView
|
|
138
|
-
locations={[]}
|
|
139
|
-
tables={[]}
|
|
140
|
-
isLoading={true}
|
|
141
|
-
userInfo={sampleUserInfo}
|
|
142
|
-
/>
|
|
143
|
-
</div>
|
|
144
|
-
),
|
|
145
|
-
};
|
|
146
|
-
|
|
147
|
-
// ============================================
|
|
148
|
-
// 4. ESTADO DE ERROR
|
|
149
|
-
// ============================================
|
|
150
|
-
export const EstadoDeError: Story = {
|
|
151
|
-
render: () => (
|
|
152
|
-
<div className="min-h-screen w-full">
|
|
153
|
-
<TableLayoutView
|
|
154
|
-
locations={sampleLocations}
|
|
155
|
-
activeLocationId="1"
|
|
156
|
-
tables={[]}
|
|
157
|
-
errorMessage="Error al cargar las mesas. Por favor, intenta nuevamente."
|
|
158
|
-
userInfo={sampleUserInfo}
|
|
159
|
-
/>
|
|
160
|
-
</div>
|
|
161
|
-
),
|
|
162
|
-
};
|
|
163
|
-
|
|
164
|
-
// ============================================
|
|
165
|
-
// 5. SIN MESAS DISPONIBLES
|
|
166
|
-
// ============================================
|
|
167
|
-
export const SinMesasDisponibles: Story = {
|
|
168
|
-
render: () => (
|
|
169
|
-
<div className="min-h-screen w-full">
|
|
170
|
-
<TableLayoutView
|
|
171
|
-
locations={sampleLocations}
|
|
172
|
-
activeLocationId="1"
|
|
173
|
-
tables={[]}
|
|
174
|
-
tablesTitle="Mesas de Bar"
|
|
175
|
-
userInfo={sampleUserInfo}
|
|
176
|
-
/>
|
|
177
|
-
</div>
|
|
178
|
-
),
|
|
179
|
-
};
|
|
180
|
-
|
|
181
|
-
// ============================================
|
|
182
|
-
// 6. TODAS LAS MESAS OCUPADAS
|
|
183
|
-
// ============================================
|
|
184
|
-
export const TodasLasMesasOcupadas: Story = {
|
|
185
|
-
render: () => (
|
|
186
|
-
<div className="min-h-screen w-full">
|
|
187
|
-
<TableLayoutView
|
|
188
|
-
locations={[
|
|
189
|
-
{
|
|
190
|
-
id: '2',
|
|
191
|
-
name: 'Terraza',
|
|
192
|
-
status: 'occupied',
|
|
193
|
-
capacity: { current: 8, total: 8 },
|
|
194
|
-
},
|
|
195
|
-
]}
|
|
196
|
-
activeLocationId="2"
|
|
197
|
-
tables={sampleTables.map((table) => ({ ...table, status: 'busy' as const }))}
|
|
198
|
-
tablesTitle="Mesas de Terraza"
|
|
199
|
-
showPeopleCountPanel={false}
|
|
200
|
-
userInfo={sampleUserInfo}
|
|
201
|
-
/>
|
|
202
|
-
</div>
|
|
203
|
-
),
|
|
204
|
-
};
|
|
205
|
-
|
|
206
|
-
// ============================================
|
|
207
|
-
// 7. MESAS CON MÚLTIPLES ESTADOS
|
|
208
|
-
// ============================================
|
|
209
|
-
export const MesasConMultiplesEstados: Story = {
|
|
210
|
-
render: () => (
|
|
211
|
-
<div className="min-h-screen w-full">
|
|
212
|
-
<TableLayoutView
|
|
213
|
-
locations={sampleLocations}
|
|
214
|
-
activeLocationId="1"
|
|
215
|
-
tables={[
|
|
216
|
-
{ tableNumber: '01', status: 'available', shape: 'square', chairs: 8 },
|
|
217
|
-
{ tableNumber: '02', status: 'available', shape: 'circle', chairs: 2 },
|
|
218
|
-
{ tableNumber: '03', status: 'available', shape: 'circle', chairs: 4 },
|
|
219
|
-
{ tableNumber: '04', status: 'available', shape: 'oval', chairs: 6 },
|
|
220
|
-
{ tableNumber: '05', status: 'available', shape: 'rectangle', chairs: 8 },
|
|
221
|
-
{ tableNumber: '06', status: 'busy', shape: 'square', chairs: 4 },
|
|
222
|
-
{ tableNumber: '07', status: 'busy', shape: 'circle', chairs: 2 },
|
|
223
|
-
{ tableNumber: '08', status: 'reserved', shape: 'circle', chairs: 4 },
|
|
224
|
-
{ tableNumber: '09', status: 'reserved', shape: 'square', chairs: 8 },
|
|
225
|
-
{ tableNumber: '10', status: 'available', shape: 'circle', chairs: 6 },
|
|
226
|
-
{ tableNumber: '11', status: 'available', shape: 'square', chairs: 4 },
|
|
227
|
-
{ tableNumber: '12', status: 'busy', shape: 'oval', chairs: 6 },
|
|
228
|
-
]}
|
|
229
|
-
tablesTitle="Mesas de Antejardín"
|
|
230
|
-
showPeopleCountPanel={false}
|
|
231
|
-
userInfo={sampleUserInfo}
|
|
232
|
-
/>
|
|
233
|
-
</div>
|
|
234
|
-
),
|
|
235
|
-
};
|