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.
Files changed (189) hide show
  1. package/README.md +115 -115
  2. package/bin/install.cjs +502 -502
  3. package/bin/prepare-publish.cjs +28 -28
  4. package/bin/restore-folders.cjs +28 -28
  5. package/claude/agents/siesa-ui-kit-specialist.md +2445 -0
  6. package/claude/prompts/component-template.md +121 -0
  7. package/claude/prompts/siesa-ui-kit.md +28 -0
  8. package/claude/settings.local.json +67 -2
  9. package/dist/components/Button/icons.d.ts +6 -5
  10. package/dist/components/Button/icons.d.ts.map +1 -1
  11. package/dist/components/DropdownItemCollapsible/DropdownItemCollapsible.d.ts.map +1 -1
  12. package/dist/components/DropdownItemCollapsible/DropdownItemCollapsible.types.d.ts +21 -0
  13. package/dist/components/DropdownItemCollapsible/DropdownItemCollapsible.types.d.ts.map +1 -1
  14. package/dist/components/NavigationRailCommercial/NavigationRailCommercial.d.ts +122 -0
  15. package/dist/components/NavigationRailCommercial/NavigationRailCommercial.d.ts.map +1 -0
  16. package/dist/components/NavigationRailCommercial/NavigationRailCommercial.types.d.ts +139 -0
  17. package/dist/components/NavigationRailCommercial/NavigationRailCommercial.types.d.ts.map +1 -0
  18. package/dist/components/NavigationRailCommercial/icons.d.ts +33 -0
  19. package/dist/components/NavigationRailCommercial/icons.d.ts.map +1 -0
  20. package/dist/components/NavigationRailCommercial/index.d.ts +4 -0
  21. package/dist/components/NavigationRailCommercial/index.d.ts.map +1 -0
  22. package/dist/components/NavigationRailItem/NavigationRailItem.d.ts.map +1 -1
  23. package/dist/components/NavigationRailItem/NavigationRailItem.types.d.ts +7 -0
  24. package/dist/components/NavigationRailItem/NavigationRailItem.types.d.ts.map +1 -1
  25. package/dist/components/NavigationRailTypes/NavigationRailTypes.d.ts.map +1 -1
  26. package/dist/components/NavigationRailTypes/NavigationRailTypes.types.d.ts +41 -0
  27. package/dist/components/NavigationRailTypes/NavigationRailTypes.types.d.ts.map +1 -1
  28. package/dist/components/NavigationRailTypes/icons.d.ts +15 -29
  29. package/dist/components/NavigationRailTypes/icons.d.ts.map +1 -1
  30. package/dist/components/Select/Select.d.ts.map +1 -1
  31. package/dist/components/Select/icons.d.ts +6 -2
  32. package/dist/components/Select/icons.d.ts.map +1 -1
  33. package/dist/index.d.ts +32 -0
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/siesa-ui-kit.cjs +404 -190
  36. package/dist/siesa-ui-kit.cjs.map +1 -1
  37. package/dist/siesa-ui-kit.mjs +6590 -1506
  38. package/dist/siesa-ui-kit.mjs.map +1 -1
  39. package/dist/views/LayoutCommercial/LayoutCommercial.d.ts +48 -0
  40. package/dist/views/LayoutCommercial/LayoutCommercial.d.ts.map +1 -0
  41. package/dist/views/LayoutCommercial/LayoutCommercial.types.d.ts +49 -0
  42. package/dist/views/LayoutCommercial/LayoutCommercial.types.d.ts.map +1 -0
  43. package/dist/views/LayoutCommercial/index.d.ts +3 -0
  44. package/dist/views/LayoutCommercial/index.d.ts.map +1 -0
  45. package/docs/icons.md +12 -31
  46. package/package.json +111 -110
  47. package/src/components/Avatar/Avatar.stories.tsx +494 -494
  48. package/src/components/Button/Button.stories.tsx +950 -950
  49. package/src/components/Button/Button.tsx +337 -337
  50. package/src/components/Button/Button.types.ts +180 -180
  51. package/src/components/Button/icons.tsx +23 -62
  52. package/src/components/DescriptionList/DescriptionList.stories.tsx +250 -250
  53. package/src/components/Divider/Divider.stories.tsx +263 -263
  54. package/src/components/DropdownItemCollapsible/DropdownItemCollapsible.stories.tsx +317 -317
  55. package/src/components/DropdownItemCollapsible/DropdownItemCollapsible.tsx +307 -287
  56. package/src/components/DropdownItemCollapsible/DropdownItemCollapsible.types.ts +136 -111
  57. package/src/components/DropdownItemCollapsible/README.md +264 -264
  58. package/src/components/DropdownItemCollapsible/icons.tsx +57 -57
  59. package/src/components/DropdownItemCollapsible/index.ts +12 -12
  60. package/src/components/DropdownItemHeading/DropdownItemHeading.stories.tsx +386 -386
  61. package/src/components/DropdownItemHeading/DropdownItemHeading.tsx +216 -216
  62. package/src/components/DropdownItemHeading/DropdownItemHeading.types.ts +93 -93
  63. package/src/components/DropdownItemHeading/README.md +573 -573
  64. package/src/components/DropdownItemHeading/icons.tsx +125 -125
  65. package/src/components/DropdownItemHeading/index.ts +3 -3
  66. package/src/components/Input/Input.stories.tsx +583 -583
  67. package/src/components/LoginView/LoginView.stories.tsx +148 -148
  68. package/src/components/LoginView/LoginView.tsx +426 -426
  69. package/src/components/LoginView/LoginView.types.ts +52 -52
  70. package/src/components/LoginView/README.md +396 -396
  71. package/src/components/LoginView/icons.tsx +85 -85
  72. package/src/components/LoginView/index.ts +3 -3
  73. package/src/components/Navbar/Navbar.stories.tsx +810 -810
  74. package/src/components/Navbar/Navbar.tsx +755 -755
  75. package/src/components/Navbar/Navbar.types.ts +219 -219
  76. package/src/components/Navbar/README.md +279 -279
  77. package/src/components/Navbar/index.ts +8 -8
  78. package/src/components/NavigationRailCommercial/NavigationRailCommercial.stories.tsx +464 -0
  79. package/src/components/NavigationRailCommercial/NavigationRailCommercial.tsx +301 -0
  80. package/src/components/NavigationRailCommercial/NavigationRailCommercial.types.ts +162 -0
  81. package/src/components/NavigationRailCommercial/README.md +251 -0
  82. package/src/components/NavigationRailCommercial/icons.tsx +54 -0
  83. package/src/components/NavigationRailCommercial/index.ts +6 -0
  84. package/src/components/NavigationRailItem/NavigationRailItem.stories.tsx +667 -667
  85. package/src/components/NavigationRailItem/NavigationRailItem.tsx +314 -313
  86. package/src/components/NavigationRailItem/NavigationRailItem.types.ts +175 -167
  87. package/src/components/NavigationRailItem/README.md +476 -476
  88. package/src/components/NavigationRailItem/index.ts +2 -2
  89. package/src/components/NavigationRailPanel/NavigationRailPanel.stories.tsx +462 -462
  90. package/src/components/NavigationRailPanel/NavigationRailPanel.tsx +332 -332
  91. package/src/components/NavigationRailPanel/NavigationRailPanel.types.ts +178 -178
  92. package/src/components/NavigationRailPanel/README.md +461 -461
  93. package/src/components/NavigationRailPanel/index.ts +6 -6
  94. package/src/components/NavigationRailTypes/NavigationRailTypes.stories.tsx +682 -528
  95. package/src/components/NavigationRailTypes/NavigationRailTypes.tsx +363 -378
  96. package/src/components/NavigationRailTypes/NavigationRailTypes.types.ts +178 -130
  97. package/src/components/NavigationRailTypes/README.md +573 -573
  98. package/src/components/NavigationRailTypes/icons.tsx +76 -141
  99. package/src/components/NavigationRailTypes/index.ts +7 -7
  100. package/src/components/Notification/Notification.stories.tsx +513 -513
  101. package/src/components/Notification/Notification.tsx +145 -145
  102. package/src/components/Notification/Notification.types.ts +142 -142
  103. package/src/components/Notification/README.md +409 -409
  104. package/src/components/POSConvention/POSConvention.stories.tsx +235 -235
  105. package/src/components/POSConvention/POSConvention.tsx +129 -129
  106. package/src/components/POSConvention/POSConvention.types.ts +38 -38
  107. package/src/components/POSConvention/README.md +123 -123
  108. package/src/components/POSConvention/icons.tsx +45 -45
  109. package/src/components/POSConvention/index.ts +3 -3
  110. package/src/components/POSLocationButton/POSLocationButton.stories.tsx +531 -531
  111. package/src/components/POSLocationButton/POSLocationButton.tsx +247 -247
  112. package/src/components/POSLocationButton/POSLocationButton.types.ts +87 -87
  113. package/src/components/POSLocationButton/README.md +253 -253
  114. package/src/components/POSLocationButton/icons.tsx +120 -120
  115. package/src/components/POSLocationButton/index.ts +14 -14
  116. package/src/components/POSNumberButton/POSNumberButton.stories.tsx +415 -415
  117. package/src/components/POSNumberButton/POSNumberButton.tsx +179 -179
  118. package/src/components/POSNumberButton/POSNumberButton.types.ts +51 -51
  119. package/src/components/POSNumberButton/README.md +321 -321
  120. package/src/components/POSNumberButton/index.ts +3 -3
  121. package/src/components/POSProductButton/POSProductButton.stories.tsx +318 -318
  122. package/src/components/POSProductCard/POSProductCard.stories.tsx +642 -642
  123. package/src/components/POSProductCard/POSProductCard.tsx +208 -208
  124. package/src/components/POSProductCard/POSProductCard.types.ts +76 -76
  125. package/src/components/POSProductCard/README.md +179 -179
  126. package/src/components/POSProductCard/icons.tsx +26 -26
  127. package/src/components/POSProductCard/index.ts +2 -2
  128. package/src/components/POSProductSidebarItems/POSProductSidebarItems.stories.tsx +753 -753
  129. package/src/components/POSProductSidebarItems/POSProductSidebarItems.tsx +332 -332
  130. package/src/components/POSProductSidebarItems/POSProductSidebarItems.types.ts +119 -119
  131. package/src/components/POSProductSidebarItems/README.md +198 -198
  132. package/src/components/POSProductSidebarItems/icons.tsx +21 -21
  133. package/src/components/POSProductSidebarItems/index.ts +3 -3
  134. package/src/components/POSTable/POSTable.stories.tsx +737 -737
  135. package/src/components/POSTable/POSTable.tsx +401 -401
  136. package/src/components/POSTable/README.md +286 -286
  137. package/src/components/Quantity/Quantity.stories.tsx +457 -457
  138. package/src/components/Radio/Radio.stories.tsx +523 -523
  139. package/src/components/Radio/Radio.tsx +1 -1
  140. package/src/components/Select/Select.stories.tsx +32 -0
  141. package/src/components/Select/Select.tsx +457 -454
  142. package/src/components/Select/icons.tsx +16 -41
  143. package/src/components/SignUpView/SignUpView.stories.tsx +129 -129
  144. package/src/components/SignUpView/SignUpView.tsx +503 -503
  145. package/src/components/SignUpView/SignUpView.types.ts +58 -58
  146. package/src/components/SignUpView/icons.tsx +71 -71
  147. package/src/components/SignUpView/index.ts +3 -3
  148. package/src/components/Switch/README.md +112 -112
  149. package/src/components/Switch/Switch.stories.tsx +550 -550
  150. package/src/components/Switch/Switch.tsx +246 -246
  151. package/src/components/Switch/Switch.types.ts +67 -67
  152. package/src/components/Table/Table.stories.tsx +805 -805
  153. package/src/components/Tabs/README.md +201 -201
  154. package/src/components/Tabs/Tabs.stories.tsx +580 -580
  155. package/src/components/Tabs/Tabs.tsx +356 -356
  156. package/src/components/Tabs/Tabs.types.ts +127 -127
  157. package/src/components/Tabs/icons.tsx +129 -129
  158. package/src/components/Tabs/index.ts +11 -11
  159. package/src/components/Textarea/Textarea.stories.tsx +535 -535
  160. package/src/index.ts +133 -102
  161. package/src/views/LayoutCommercial/LayoutCommercial.stories.tsx +374 -0
  162. package/src/views/LayoutCommercial/LayoutCommercial.tsx +125 -0
  163. package/src/views/LayoutCommercial/LayoutCommercial.types.ts +54 -0
  164. package/src/views/LayoutCommercial/README.md +286 -0
  165. package/src/views/LayoutCommercial/index.ts +2 -0
  166. package/src/views/ListView/ListView.stories.tsx +329 -329
  167. package/src/views/ListView/ListView.tsx +570 -570
  168. package/src/views/ListView/ListView.types.ts +211 -211
  169. package/src/views/ListView/icons.tsx +282 -282
  170. package/src/views/ListView/index.ts +11 -11
  171. package/src/views/LoginView/LoginView.tsx +426 -426
  172. package/src/views/ProductsView/ProductsView.stories.tsx +344 -344
  173. package/src/views/ProductsView/ProductsView.tsx +480 -480
  174. package/src/views/ProductsView/ProductsView.types.ts +238 -238
  175. package/src/views/ProductsView/README.md +312 -312
  176. package/src/views/ProductsView/icons.tsx +38 -38
  177. package/src/views/ProductsView/index.ts +8 -8
  178. package/src/views/RecoverPasswordView/RecoverPasswordView.tsx +376 -376
  179. package/src/views/SignUpView/SignUpView.tsx +503 -503
  180. package/src/views/TableLayoutView/README.md +268 -268
  181. package/src/views/TableLayoutView/TableLayoutView.stories.tsx +235 -235
  182. package/src/views/TableLayoutView/TableLayoutView.tsx +461 -461
  183. package/src/views/TableLayoutView/TableLayoutView.types.ts +209 -209
  184. package/src/views/TableLayoutView/icons.tsx +113 -113
  185. package/src/views/TableLayoutView/index.ts +6 -6
  186. package/storybook/main.ts +19 -19
  187. package/storybook/preview.tsx +84 -84
  188. package/storybook/vitest.setup.ts +6 -6
  189. package/tailwind.config.js +128 -128
@@ -1,268 +1,268 @@
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
+ # 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