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,332 +1,332 @@
1
- import React from 'react';
2
- import type { POSProductSidebarItemsProps } from './POSProductSidebarItems.types';
3
- import { Quantity } from '../Quantity/Quantity';
4
- import { TrashIcon } from './icons';
5
-
6
- /**
7
- * POSProductSidebarItems - Componente de item de producto para sidebar POS
8
- *
9
- * Componente pixel-perfect basado en Figma (node 4507-28013) para mostrar
10
- * productos en el sidebar de un sistema POS con soporte completo para dark mode.
11
- *
12
- * **Características:**
13
- * - Badge de categoría con 19 colores configurables
14
- * - Referencia del producto (text-[10px]/leading-3)
15
- * - Precio total (text-xs/font-bold)
16
- * - Nombre del producto (text-xs/font-bold)
17
- * - Descripción con items opcionales (fondo terciario)
18
- * - Control de cantidad integrado (Quantity component)
19
- * - Botón de eliminar con color de error
20
- *
21
- * **Especificaciones de Figma:**
22
- * - Ancho base: 272px
23
- * - Spacing: gap-1 (4px) entre elementos del producto, gap-2 (8px) entre secciones
24
- * - Badge: rounded-md (6px), px-1.5, py-1, text-xs/leading-4
25
- * - Description section: bg-background-tertiary, p-2, rounded-lg
26
- * - Delete icon: 24x24px, color red-700
27
- *
28
- * **Dark Mode:**
29
- * Los colores se adaptan automáticamente en dark mode:
30
- * - Textos principales: text-content-primary → dark:text-dark-content-primary
31
- * - Description background: bg-background-tertiary → dark:bg-zinc-700
32
- * - Badge colores: Mantienen contraste en ambos modos
33
- * - Delete button: text-red-700 → dark:text-red-500
34
- *
35
- * **Orden de modificadores:** {responsive}:{dark}:{state}:{utility}
36
- *
37
- * @see docs/colors.md - Sistema de colores
38
- * @see docs/typography.md - Sistema tipográfico
39
- * @see docs/spacing.md - Sistema de espaciado
40
- * @see https://www.figma.com/design/5XNqf2YTxvwemxwo1LMQ6j/Siesa-UI-Kit?node-id=4507-28013 - Diseño Figma
41
- *
42
- * @example
43
- * ```tsx
44
- * <POSProductSidebarItems
45
- * categoryLabel="Entradas"
46
- * productRef="00147258369"
47
- * price="$ 40,000.00"
48
- * productName="Nombre producto"
49
- * descriptionItems={[
50
- * { description: "Papas limón mediana", price: "$ 40,000.00" },
51
- * { description: "Papas limón mediana", price: "$ 40,000.00" },
52
- * ]}
53
- * quantity={0}
54
- * onQuantityChange={(qty) => console.log(qty)}
55
- * onDelete={() => console.log('Eliminar')}
56
- * />
57
- * ```
58
- */
59
- export const POSProductSidebarItems: React.FC<POSProductSidebarItemsProps> = ({
60
- categoryLabel,
61
- categoryColor = 'lime',
62
- productRef,
63
- price,
64
- productName,
65
- descriptionItems = [],
66
- showDescription = true,
67
- quantity = 0,
68
- minQuantity = 0,
69
- maxQuantity,
70
- onQuantityChange,
71
- onDelete,
72
- disabled = false,
73
- className = '',
74
- deleteIcon,
75
- }) => {
76
- // ===== MAPA DE COLORES PARA BADGES =====
77
- // Basado en Figma node 4507-28432: bg lime-100 (#ecfccb) y text lime-700 (#4d7c0f)
78
- // Orden de modificadores: {responsive}:{dark}:{state}:{utility}
79
- const categoryColorClasses: Record<string, { bg: string; text: string }> = {
80
- lime: {
81
- bg: 'bg-lime-100 dark:bg-lime-900/40',
82
- text: 'text-lime-700 dark:text-lime-300'
83
- },
84
- red: {
85
- bg: 'bg-red-100 dark:bg-red-900/40',
86
- text: 'text-red-700 dark:text-red-300'
87
- },
88
- orange: {
89
- bg: 'bg-orange-100 dark:bg-orange-900/40',
90
- text: 'text-orange-700 dark:text-orange-300'
91
- },
92
- amber: {
93
- bg: 'bg-amber-100 dark:bg-amber-900/40',
94
- text: 'text-amber-700 dark:text-amber-300'
95
- },
96
- yellow: {
97
- bg: 'bg-yellow-100 dark:bg-yellow-900/40',
98
- text: 'text-yellow-700 dark:text-yellow-300'
99
- },
100
- green: {
101
- bg: 'bg-green-100 dark:bg-green-900/40',
102
- text: 'text-green-700 dark:text-green-300'
103
- },
104
- emerald: {
105
- bg: 'bg-emerald-100 dark:bg-emerald-900/40',
106
- text: 'text-emerald-700 dark:text-emerald-300'
107
- },
108
- teal: {
109
- bg: 'bg-teal-100 dark:bg-teal-900/40',
110
- text: 'text-teal-700 dark:text-teal-300'
111
- },
112
- cyan: {
113
- bg: 'bg-cyan-100 dark:bg-cyan-900/40',
114
- text: 'text-cyan-700 dark:text-cyan-300'
115
- },
116
- sky: {
117
- bg: 'bg-sky-100 dark:bg-sky-900/40',
118
- text: 'text-sky-700 dark:text-sky-300'
119
- },
120
- blue: {
121
- bg: 'bg-blue-100 dark:bg-blue-900/40',
122
- text: 'text-blue-700 dark:text-blue-300'
123
- },
124
- indigo: {
125
- bg: 'bg-indigo-100 dark:bg-indigo-900/40',
126
- text: 'text-indigo-700 dark:text-indigo-300'
127
- },
128
- violet: {
129
- bg: 'bg-violet-100 dark:bg-violet-900/40',
130
- text: 'text-violet-700 dark:text-violet-300'
131
- },
132
- purple: {
133
- bg: 'bg-purple-100 dark:bg-purple-900/40',
134
- text: 'text-purple-700 dark:text-purple-300'
135
- },
136
- fuchsia: {
137
- bg: 'bg-fuchsia-100 dark:bg-fuchsia-900/40',
138
- text: 'text-fuchsia-700 dark:text-fuchsia-300'
139
- },
140
- pink: {
141
- bg: 'bg-pink-100 dark:bg-pink-900/40',
142
- text: 'text-pink-700 dark:text-pink-300'
143
- },
144
- rose: {
145
- bg: 'bg-rose-100 dark:bg-rose-900/40',
146
- text: 'text-rose-700 dark:text-rose-300'
147
- },
148
- zinc: {
149
- bg: 'bg-zinc-100 dark:bg-zinc-800/50',
150
- text: 'text-zinc-600 dark:text-zinc-300'
151
- },
152
- primary: {
153
- bg: 'bg-primary-custom-100 dark:bg-primary-custom-600/30',
154
- text: 'text-primary-custom-600 dark:text-primary-custom-300'
155
- },
156
- };
157
-
158
- const colors = categoryColorClasses[categoryColor] || categoryColorClasses.lime;
159
-
160
- // Handler para cambio de cantidad
161
- const handleQuantityChange = (newQuantity: number) => {
162
- if (!disabled && onQuantityChange) {
163
- onQuantityChange(newQuantity);
164
- }
165
- };
166
-
167
- // Handler para eliminar
168
- const handleDelete = () => {
169
- if (!disabled && onDelete) {
170
- onDelete();
171
- }
172
- };
173
-
174
- return (
175
- <div
176
- className={`
177
- flex
178
- flex-col
179
- gap-2
180
- w-full
181
- ${disabled ? 'opacity-50 pointer-events-none' : ''}
182
- ${className}
183
- `.trim().replace(/\s+/g, ' ')}
184
- data-component="POSProductSidebarItems"
185
- >
186
- {/* ===== BODY SECTION ===== */}
187
- <div className="flex flex-col gap-2 w-full">
188
- {/* ===== PRODUCT INFO ===== */}
189
- <div className="flex flex-col gap-1 w-full">
190
- {/* Row: Badge + Ref + Price - Figma node 4507:28398 */}
191
- <div className="flex items-center gap-1 w-full">
192
- {/* Col: Badge + Ref - Figma node 4507:28399 */}
193
- <div className="flex items-center gap-2 flex-1 min-w-0">
194
- {/* Category Badge - Figma node 4507:28432 */}
195
- <div
196
- className={`
197
- inline-flex
198
- items-center
199
- px-1.5
200
- py-1
201
- rounded-md
202
- transition-colors
203
- duration-150
204
- ${colors.bg}
205
- `.trim().replace(/\s+/g, ' ')}
206
- >
207
- <span
208
- className={`
209
- text-xs
210
- leading-4
211
- font-normal
212
- text-center
213
- whitespace-nowrap
214
- ${colors.text}
215
- `.trim().replace(/\s+/g, ' ')}
216
- >
217
- {categoryLabel}
218
- </span>
219
- </div>
220
-
221
- {/* Product Reference - Figma node 4507:28401 - Paragraph/XXSmall 10px */}
222
- <span className="text-[10px] leading-3 font-normal text-content-primary dark:text-dark-content-primary whitespace-nowrap">
223
- {productRef}
224
- </span>
225
- </div>
226
-
227
- {/* Col: Price - Figma node 4507:28450 - Label/Tiny 12px Bold */}
228
- <div className="flex items-center shrink-0">
229
- <span className="text-xs leading-4 font-bold text-content-primary dark:text-dark-content-primary whitespace-nowrap text-right">
230
- {price}
231
- </span>
232
- </div>
233
- </div>
234
-
235
- {/* Row: Product Name - Figma node 4507:28404 - Label/Tiny 12px Bold */}
236
- <div className="flex items-start w-full">
237
- <span className="text-xs leading-4 font-bold text-content-primary dark:text-dark-content-primary flex-1 min-w-0">
238
- {productName}
239
- </span>
240
- </div>
241
- </div>
242
-
243
- {/* ===== DESCRIPTION SECTION ===== */}
244
- {/* Figma node 4507:28405 - Background tertiary con items de descripción */}
245
- {showDescription && descriptionItems.length > 0 && (
246
- <div
247
- className={`
248
- flex
249
- flex-col
250
- gap-2
251
- p-2
252
- rounded-lg
253
- bg-background-secondary
254
- dark:bg-zinc-700
255
- w-full
256
- transition-colors
257
- duration-150
258
- `.trim().replace(/\s+/g, ' ')}
259
- >
260
- {descriptionItems.map((item, index) => (
261
- <div
262
- key={index}
263
- className="flex items-center gap-1 w-full"
264
- >
265
- {/* Description text - Figma Body/Small 12px Regular */}
266
- <span className="flex-1 min-w-0 text-xs leading-3 font-normal text-content-primary dark:text-dark-content-primary">
267
- {item.description}
268
- </span>
269
- {/* Price - Figma Body/Small Bold 12px */}
270
- <span className="text-xs leading-3 font-bold text-content-primary dark:text-dark-content-primary whitespace-nowrap text-right shrink-0">
271
- {item.price}
272
- </span>
273
- </div>
274
- ))}
275
- </div>
276
- )}
277
- </div>
278
-
279
- {/* ===== ACTIONS SECTION ===== */}
280
- {/* Figma node 4507:28412 - Quantity control + Delete button */}
281
- <div className="flex items-center justify-between w-full">
282
- {/* Quantity Control - Figma width: 118px */}
283
- <div className="w-[118px]">
284
- <Quantity
285
- value={quantity}
286
- min={minQuantity}
287
- max={maxQuantity}
288
- onChange={handleQuantityChange}
289
- disabled={disabled}
290
- />
291
- </div>
292
-
293
- {/* Delete Button - Figma node 4514:28258 - 24x24px, color red-700 (#b91c1c) */}
294
- <button
295
- type="button"
296
- onClick={handleDelete}
297
- disabled={disabled}
298
- className={`
299
- flex
300
- items-center
301
- justify-center
302
- w-6
303
- h-6
304
- rounded-md
305
- text-red-700
306
- dark:text-red-500
307
- hover:text-red-800
308
- dark:hover:text-red-400
309
- hover:bg-red-50
310
- dark:hover:bg-red-900/20
311
- focus:outline-none
312
- focus:ring-2
313
- focus:ring-red-500/50
314
- dark:focus:ring-red-400/50
315
- focus:ring-offset-1
316
- focus:ring-offset-white
317
- dark:focus:ring-offset-dark-bg-primary
318
- active:scale-95
319
- transition-all
320
- duration-150
321
- ${disabled ? 'cursor-not-allowed opacity-50' : 'cursor-pointer'}
322
- `.trim().replace(/\s+/g, ' ')}
323
- aria-label="Eliminar producto"
324
- >
325
- {deleteIcon || <TrashIcon className="w-[18px] h-[21px]" />}
326
- </button>
327
- </div>
328
- </div>
329
- );
330
- };
331
-
332
- POSProductSidebarItems.displayName = 'POSProductSidebarItems';
1
+ import React from 'react';
2
+ import type { POSProductSidebarItemsProps } from './POSProductSidebarItems.types';
3
+ import { Quantity } from '../Quantity/Quantity';
4
+ import { TrashIcon } from './icons';
5
+
6
+ /**
7
+ * POSProductSidebarItems - Componente de item de producto para sidebar POS
8
+ *
9
+ * Componente pixel-perfect basado en Figma (node 4507-28013) para mostrar
10
+ * productos en el sidebar de un sistema POS con soporte completo para dark mode.
11
+ *
12
+ * **Características:**
13
+ * - Badge de categoría con 19 colores configurables
14
+ * - Referencia del producto (text-[10px]/leading-3)
15
+ * - Precio total (text-xs/font-bold)
16
+ * - Nombre del producto (text-xs/font-bold)
17
+ * - Descripción con items opcionales (fondo terciario)
18
+ * - Control de cantidad integrado (Quantity component)
19
+ * - Botón de eliminar con color de error
20
+ *
21
+ * **Especificaciones de Figma:**
22
+ * - Ancho base: 272px
23
+ * - Spacing: gap-1 (4px) entre elementos del producto, gap-2 (8px) entre secciones
24
+ * - Badge: rounded-md (6px), px-1.5, py-1, text-xs/leading-4
25
+ * - Description section: bg-background-tertiary, p-2, rounded-lg
26
+ * - Delete icon: 24x24px, color red-700
27
+ *
28
+ * **Dark Mode:**
29
+ * Los colores se adaptan automáticamente en dark mode:
30
+ * - Textos principales: text-content-primary → dark:text-dark-content-primary
31
+ * - Description background: bg-background-tertiary → dark:bg-zinc-700
32
+ * - Badge colores: Mantienen contraste en ambos modos
33
+ * - Delete button: text-red-700 → dark:text-red-500
34
+ *
35
+ * **Orden de modificadores:** {responsive}:{dark}:{state}:{utility}
36
+ *
37
+ * @see docs/colors.md - Sistema de colores
38
+ * @see docs/typography.md - Sistema tipográfico
39
+ * @see docs/spacing.md - Sistema de espaciado
40
+ * @see https://www.figma.com/design/5XNqf2YTxvwemxwo1LMQ6j/Siesa-UI-Kit?node-id=4507-28013 - Diseño Figma
41
+ *
42
+ * @example
43
+ * ```tsx
44
+ * <POSProductSidebarItems
45
+ * categoryLabel="Entradas"
46
+ * productRef="00147258369"
47
+ * price="$ 40,000.00"
48
+ * productName="Nombre producto"
49
+ * descriptionItems={[
50
+ * { description: "Papas limón mediana", price: "$ 40,000.00" },
51
+ * { description: "Papas limón mediana", price: "$ 40,000.00" },
52
+ * ]}
53
+ * quantity={0}
54
+ * onQuantityChange={(qty) => console.log(qty)}
55
+ * onDelete={() => console.log('Eliminar')}
56
+ * />
57
+ * ```
58
+ */
59
+ export const POSProductSidebarItems: React.FC<POSProductSidebarItemsProps> = ({
60
+ categoryLabel,
61
+ categoryColor = 'lime',
62
+ productRef,
63
+ price,
64
+ productName,
65
+ descriptionItems = [],
66
+ showDescription = true,
67
+ quantity = 0,
68
+ minQuantity = 0,
69
+ maxQuantity,
70
+ onQuantityChange,
71
+ onDelete,
72
+ disabled = false,
73
+ className = '',
74
+ deleteIcon,
75
+ }) => {
76
+ // ===== MAPA DE COLORES PARA BADGES =====
77
+ // Basado en Figma node 4507-28432: bg lime-100 (#ecfccb) y text lime-700 (#4d7c0f)
78
+ // Orden de modificadores: {responsive}:{dark}:{state}:{utility}
79
+ const categoryColorClasses: Record<string, { bg: string; text: string }> = {
80
+ lime: {
81
+ bg: 'bg-lime-100 dark:bg-lime-900/40',
82
+ text: 'text-lime-700 dark:text-lime-300'
83
+ },
84
+ red: {
85
+ bg: 'bg-red-100 dark:bg-red-900/40',
86
+ text: 'text-red-700 dark:text-red-300'
87
+ },
88
+ orange: {
89
+ bg: 'bg-orange-100 dark:bg-orange-900/40',
90
+ text: 'text-orange-700 dark:text-orange-300'
91
+ },
92
+ amber: {
93
+ bg: 'bg-amber-100 dark:bg-amber-900/40',
94
+ text: 'text-amber-700 dark:text-amber-300'
95
+ },
96
+ yellow: {
97
+ bg: 'bg-yellow-100 dark:bg-yellow-900/40',
98
+ text: 'text-yellow-700 dark:text-yellow-300'
99
+ },
100
+ green: {
101
+ bg: 'bg-green-100 dark:bg-green-900/40',
102
+ text: 'text-green-700 dark:text-green-300'
103
+ },
104
+ emerald: {
105
+ bg: 'bg-emerald-100 dark:bg-emerald-900/40',
106
+ text: 'text-emerald-700 dark:text-emerald-300'
107
+ },
108
+ teal: {
109
+ bg: 'bg-teal-100 dark:bg-teal-900/40',
110
+ text: 'text-teal-700 dark:text-teal-300'
111
+ },
112
+ cyan: {
113
+ bg: 'bg-cyan-100 dark:bg-cyan-900/40',
114
+ text: 'text-cyan-700 dark:text-cyan-300'
115
+ },
116
+ sky: {
117
+ bg: 'bg-sky-100 dark:bg-sky-900/40',
118
+ text: 'text-sky-700 dark:text-sky-300'
119
+ },
120
+ blue: {
121
+ bg: 'bg-blue-100 dark:bg-blue-900/40',
122
+ text: 'text-blue-700 dark:text-blue-300'
123
+ },
124
+ indigo: {
125
+ bg: 'bg-indigo-100 dark:bg-indigo-900/40',
126
+ text: 'text-indigo-700 dark:text-indigo-300'
127
+ },
128
+ violet: {
129
+ bg: 'bg-violet-100 dark:bg-violet-900/40',
130
+ text: 'text-violet-700 dark:text-violet-300'
131
+ },
132
+ purple: {
133
+ bg: 'bg-purple-100 dark:bg-purple-900/40',
134
+ text: 'text-purple-700 dark:text-purple-300'
135
+ },
136
+ fuchsia: {
137
+ bg: 'bg-fuchsia-100 dark:bg-fuchsia-900/40',
138
+ text: 'text-fuchsia-700 dark:text-fuchsia-300'
139
+ },
140
+ pink: {
141
+ bg: 'bg-pink-100 dark:bg-pink-900/40',
142
+ text: 'text-pink-700 dark:text-pink-300'
143
+ },
144
+ rose: {
145
+ bg: 'bg-rose-100 dark:bg-rose-900/40',
146
+ text: 'text-rose-700 dark:text-rose-300'
147
+ },
148
+ zinc: {
149
+ bg: 'bg-zinc-100 dark:bg-zinc-800/50',
150
+ text: 'text-zinc-600 dark:text-zinc-300'
151
+ },
152
+ primary: {
153
+ bg: 'bg-primary-custom-100 dark:bg-primary-custom-600/30',
154
+ text: 'text-primary-custom-600 dark:text-primary-custom-300'
155
+ },
156
+ };
157
+
158
+ const colors = categoryColorClasses[categoryColor] || categoryColorClasses.lime;
159
+
160
+ // Handler para cambio de cantidad
161
+ const handleQuantityChange = (newQuantity: number) => {
162
+ if (!disabled && onQuantityChange) {
163
+ onQuantityChange(newQuantity);
164
+ }
165
+ };
166
+
167
+ // Handler para eliminar
168
+ const handleDelete = () => {
169
+ if (!disabled && onDelete) {
170
+ onDelete();
171
+ }
172
+ };
173
+
174
+ return (
175
+ <div
176
+ className={`
177
+ flex
178
+ flex-col
179
+ gap-2
180
+ w-full
181
+ ${disabled ? 'opacity-50 pointer-events-none' : ''}
182
+ ${className}
183
+ `.trim().replace(/\s+/g, ' ')}
184
+ data-component="POSProductSidebarItems"
185
+ >
186
+ {/* ===== BODY SECTION ===== */}
187
+ <div className="flex flex-col gap-2 w-full">
188
+ {/* ===== PRODUCT INFO ===== */}
189
+ <div className="flex flex-col gap-1 w-full">
190
+ {/* Row: Badge + Ref + Price - Figma node 4507:28398 */}
191
+ <div className="flex items-center gap-1 w-full">
192
+ {/* Col: Badge + Ref - Figma node 4507:28399 */}
193
+ <div className="flex items-center gap-2 flex-1 min-w-0">
194
+ {/* Category Badge - Figma node 4507:28432 */}
195
+ <div
196
+ className={`
197
+ inline-flex
198
+ items-center
199
+ px-1.5
200
+ py-1
201
+ rounded-md
202
+ transition-colors
203
+ duration-150
204
+ ${colors.bg}
205
+ `.trim().replace(/\s+/g, ' ')}
206
+ >
207
+ <span
208
+ className={`
209
+ text-xs
210
+ leading-4
211
+ font-normal
212
+ text-center
213
+ whitespace-nowrap
214
+ ${colors.text}
215
+ `.trim().replace(/\s+/g, ' ')}
216
+ >
217
+ {categoryLabel}
218
+ </span>
219
+ </div>
220
+
221
+ {/* Product Reference - Figma node 4507:28401 - Paragraph/XXSmall 10px */}
222
+ <span className="text-[10px] leading-3 font-normal text-content-primary dark:text-dark-content-primary whitespace-nowrap">
223
+ {productRef}
224
+ </span>
225
+ </div>
226
+
227
+ {/* Col: Price - Figma node 4507:28450 - Label/Tiny 12px Bold */}
228
+ <div className="flex items-center shrink-0">
229
+ <span className="text-xs leading-4 font-bold text-content-primary dark:text-dark-content-primary whitespace-nowrap text-right">
230
+ {price}
231
+ </span>
232
+ </div>
233
+ </div>
234
+
235
+ {/* Row: Product Name - Figma node 4507:28404 - Label/Tiny 12px Bold */}
236
+ <div className="flex items-start w-full">
237
+ <span className="text-xs leading-4 font-bold text-content-primary dark:text-dark-content-primary flex-1 min-w-0">
238
+ {productName}
239
+ </span>
240
+ </div>
241
+ </div>
242
+
243
+ {/* ===== DESCRIPTION SECTION ===== */}
244
+ {/* Figma node 4507:28405 - Background tertiary con items de descripción */}
245
+ {showDescription && descriptionItems.length > 0 && (
246
+ <div
247
+ className={`
248
+ flex
249
+ flex-col
250
+ gap-2
251
+ p-2
252
+ rounded-lg
253
+ bg-background-secondary
254
+ dark:bg-zinc-700
255
+ w-full
256
+ transition-colors
257
+ duration-150
258
+ `.trim().replace(/\s+/g, ' ')}
259
+ >
260
+ {descriptionItems.map((item, index) => (
261
+ <div
262
+ key={index}
263
+ className="flex items-center gap-1 w-full"
264
+ >
265
+ {/* Description text - Figma Body/Small 12px Regular */}
266
+ <span className="flex-1 min-w-0 text-xs leading-3 font-normal text-content-primary dark:text-dark-content-primary">
267
+ {item.description}
268
+ </span>
269
+ {/* Price - Figma Body/Small Bold 12px */}
270
+ <span className="text-xs leading-3 font-bold text-content-primary dark:text-dark-content-primary whitespace-nowrap text-right shrink-0">
271
+ {item.price}
272
+ </span>
273
+ </div>
274
+ ))}
275
+ </div>
276
+ )}
277
+ </div>
278
+
279
+ {/* ===== ACTIONS SECTION ===== */}
280
+ {/* Figma node 4507:28412 - Quantity control + Delete button */}
281
+ <div className="flex items-center justify-between w-full">
282
+ {/* Quantity Control - Figma width: 118px */}
283
+ <div className="w-[118px]">
284
+ <Quantity
285
+ value={quantity}
286
+ min={minQuantity}
287
+ max={maxQuantity}
288
+ onChange={handleQuantityChange}
289
+ disabled={disabled}
290
+ />
291
+ </div>
292
+
293
+ {/* Delete Button - Figma node 4514:28258 - 24x24px, color red-700 (#b91c1c) */}
294
+ <button
295
+ type="button"
296
+ onClick={handleDelete}
297
+ disabled={disabled}
298
+ className={`
299
+ flex
300
+ items-center
301
+ justify-center
302
+ w-6
303
+ h-6
304
+ rounded-md
305
+ text-red-700
306
+ dark:text-red-500
307
+ hover:text-red-800
308
+ dark:hover:text-red-400
309
+ hover:bg-red-50
310
+ dark:hover:bg-red-900/20
311
+ focus:outline-none
312
+ focus:ring-2
313
+ focus:ring-red-500/50
314
+ dark:focus:ring-red-400/50
315
+ focus:ring-offset-1
316
+ focus:ring-offset-white
317
+ dark:focus:ring-offset-dark-bg-primary
318
+ active:scale-95
319
+ transition-all
320
+ duration-150
321
+ ${disabled ? 'cursor-not-allowed opacity-50' : 'cursor-pointer'}
322
+ `.trim().replace(/\s+/g, ' ')}
323
+ aria-label="Eliminar producto"
324
+ >
325
+ {deleteIcon || <TrashIcon className="w-[18px] h-[21px]" />}
326
+ </button>
327
+ </div>
328
+ </div>
329
+ );
330
+ };
331
+
332
+ POSProductSidebarItems.displayName = 'POSProductSidebarItems';