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,152 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import type { POSProductButtonProps } from './POSProductButton.types';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Componente POSProductButton del sistema de diseño Siesa
|
|
6
|
-
*
|
|
7
|
-
* Botón especializado para sistemas POS que combina una imagen de producto
|
|
8
|
-
* con un label descriptivo. Diseñado para selección rápida de productos.
|
|
9
|
-
*
|
|
10
|
-
* **Estados disponibles:**
|
|
11
|
-
* - `default`: Estado normal con fondo blanco
|
|
12
|
-
* - `active`: Estado seleccionado con fondo azul claro y texto azul
|
|
13
|
-
* - `disabled`: Estado deshabilitado con opacidad reducida
|
|
14
|
-
*
|
|
15
|
-
* **Características:**
|
|
16
|
-
* - Imagen con aspect ratio 158:80 (proporción de Figma)
|
|
17
|
-
* - Label con tipografía Label Small (14px Bold)
|
|
18
|
-
* - Soporte completo de dark mode
|
|
19
|
-
* - Estados hover, active y focus
|
|
20
|
-
* - Transiciones suaves
|
|
21
|
-
*
|
|
22
|
-
* **Mejores prácticas implementadas:**
|
|
23
|
-
* - Orden de modificadores: {responsive}:{dark}:{state}:{utility}
|
|
24
|
-
* - Dark mode con estrategia 'class' (darkMode: 'class')
|
|
25
|
-
* - Focus rings adaptativos para light y dark mode
|
|
26
|
-
* - Tokens de color consistentes con la documentación
|
|
27
|
-
* - Estados hover y active completos
|
|
28
|
-
* - Tipografía Label Small (14px Bold) según sistema de diseño
|
|
29
|
-
*
|
|
30
|
-
* @see docs/colors.md - Sistema de colores
|
|
31
|
-
* @see docs/typography.md - Sistema tipográfico (Label)
|
|
32
|
-
* @see docs/spacing.md - Sistema de espaciado
|
|
33
|
-
* @see docs/border-radius.md - Border radius
|
|
34
|
-
*
|
|
35
|
-
* @example
|
|
36
|
-
* ```tsx
|
|
37
|
-
* // Botón de producto normal
|
|
38
|
-
* <POSProductButton
|
|
39
|
-
* image="/images/parrilla.jpg"
|
|
40
|
-
* label="A la parrilla"
|
|
41
|
-
* onClick={() => console.log('Producto seleccionado')}
|
|
42
|
-
* />
|
|
43
|
-
*
|
|
44
|
-
* // Botón de producto activo/seleccionado
|
|
45
|
-
* <POSProductButton
|
|
46
|
-
* image="/images/parrilla.jpg"
|
|
47
|
-
* label="A la parrilla"
|
|
48
|
-
* active={true}
|
|
49
|
-
* />
|
|
50
|
-
*
|
|
51
|
-
* // Botón de producto deshabilitado
|
|
52
|
-
* <POSProductButton
|
|
53
|
-
* image="/images/parrilla.jpg"
|
|
54
|
-
* label="A la parrilla"
|
|
55
|
-
* disabled={true}
|
|
56
|
-
* />
|
|
57
|
-
* ```
|
|
58
|
-
*/
|
|
59
|
-
export const POSProductButton: React.FC<POSProductButtonProps> = ({
|
|
60
|
-
image,
|
|
61
|
-
label,
|
|
62
|
-
active = false,
|
|
63
|
-
disabled = false,
|
|
64
|
-
onClick,
|
|
65
|
-
className = '',
|
|
66
|
-
ariaLabel,
|
|
67
|
-
}) => {
|
|
68
|
-
// ===== CLASES BASE =====
|
|
69
|
-
const baseClasses = `
|
|
70
|
-
flex
|
|
71
|
-
flex-col
|
|
72
|
-
gap-2
|
|
73
|
-
p-3
|
|
74
|
-
rounded-lg
|
|
75
|
-
font-bold
|
|
76
|
-
text-sm
|
|
77
|
-
transition-all
|
|
78
|
-
duration-150
|
|
79
|
-
focus:outline-none
|
|
80
|
-
focus:ring-2
|
|
81
|
-
focus:ring-primary-custom-400
|
|
82
|
-
focus:ring-offset-2
|
|
83
|
-
dark:focus:ring-dark-border-custom
|
|
84
|
-
dark:focus:ring-offset-dark-bg-primary
|
|
85
|
-
`;
|
|
86
|
-
|
|
87
|
-
// ===== CLASES DE ESTADO =====
|
|
88
|
-
const stateClasses = disabled
|
|
89
|
-
? `
|
|
90
|
-
bg-white
|
|
91
|
-
text-content-primary
|
|
92
|
-
opacity-55
|
|
93
|
-
cursor-not-allowed
|
|
94
|
-
pointer-events-none
|
|
95
|
-
dark:bg-dark-bg-primary
|
|
96
|
-
dark:text-dark-content-primary
|
|
97
|
-
`
|
|
98
|
-
: active
|
|
99
|
-
? `
|
|
100
|
-
bg-primary-custom-100
|
|
101
|
-
text-primary-custom-600
|
|
102
|
-
cursor-pointer
|
|
103
|
-
hover:bg-primary-custom-100
|
|
104
|
-
active:scale-95
|
|
105
|
-
dark:bg-primary-custom-100/20
|
|
106
|
-
dark:text-primary-custom-600
|
|
107
|
-
dark:hover:bg-primary-custom-100/30
|
|
108
|
-
dark:active:scale-95
|
|
109
|
-
`
|
|
110
|
-
: `
|
|
111
|
-
bg-white
|
|
112
|
-
text-content-primary
|
|
113
|
-
cursor-pointer
|
|
114
|
-
hover:bg-background-secondary
|
|
115
|
-
active:scale-95
|
|
116
|
-
dark:bg-dark-bg-primary
|
|
117
|
-
dark:text-dark-content-primary
|
|
118
|
-
dark:hover:bg-dark-bg-primary/80
|
|
119
|
-
dark:active:scale-95
|
|
120
|
-
`;
|
|
121
|
-
|
|
122
|
-
// ===== COMBINAR TODAS LAS CLASES =====
|
|
123
|
-
const buttonClasses = [baseClasses, stateClasses, className]
|
|
124
|
-
.join(' ')
|
|
125
|
-
.replace(/\s+/g, ' ')
|
|
126
|
-
.trim();
|
|
127
|
-
|
|
128
|
-
return (
|
|
129
|
-
<button
|
|
130
|
-
type="button"
|
|
131
|
-
className={buttonClasses}
|
|
132
|
-
disabled={disabled}
|
|
133
|
-
onClick={onClick}
|
|
134
|
-
aria-label={ariaLabel || label}
|
|
135
|
-
aria-pressed={active}
|
|
136
|
-
>
|
|
137
|
-
{/* Imagen del producto */}
|
|
138
|
-
<div className="aspect-[158/80] w-full rounded-lg overflow-hidden">
|
|
139
|
-
<img
|
|
140
|
-
src={image}
|
|
141
|
-
alt={label}
|
|
142
|
-
className="w-full h-full object-cover"
|
|
143
|
-
/>
|
|
144
|
-
</div>
|
|
145
|
-
|
|
146
|
-
{/* Label del producto */}
|
|
147
|
-
<div className="w-full text-left leading-5">
|
|
148
|
-
{label}
|
|
149
|
-
</div>
|
|
150
|
-
</button>
|
|
151
|
-
);
|
|
152
|
-
};
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import type { MouseEvent } from 'react';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Props del componente POSProductButton
|
|
5
|
-
*
|
|
6
|
-
* Botón de producto para sistemas POS con imagen y label
|
|
7
|
-
*/
|
|
8
|
-
export interface POSProductButtonProps {
|
|
9
|
-
/**
|
|
10
|
-
* URL de la imagen del producto
|
|
11
|
-
*/
|
|
12
|
-
image: string;
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Texto del producto (nombre o descripción)
|
|
16
|
-
* @example "A la parrilla"
|
|
17
|
-
*/
|
|
18
|
-
label: string;
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Si el botón está en estado activo/seleccionado
|
|
22
|
-
* @default false
|
|
23
|
-
*/
|
|
24
|
-
active?: boolean;
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Si el botón está deshabilitado
|
|
28
|
-
* @default false
|
|
29
|
-
*/
|
|
30
|
-
disabled?: boolean;
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Handler para evento click
|
|
34
|
-
*/
|
|
35
|
-
onClick?: (event: MouseEvent<HTMLButtonElement>) => void;
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Clases CSS adicionales
|
|
39
|
-
*/
|
|
40
|
-
className?: string;
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Label para accesibilidad (ARIA)
|
|
44
|
-
*/
|
|
45
|
-
ariaLabel?: string;
|
|
46
|
-
}
|
|
@@ -1,269 +0,0 @@
|
|
|
1
|
-
# POSProductButton
|
|
2
|
-
|
|
3
|
-
Botón especializado para sistemas POS (Point of Sale) que combina una imagen de producto con un label descriptivo. Diseñado para selección rápida de productos en interfaces de punto de venta.
|
|
4
|
-
|
|
5
|
-
## 📦 Instalación
|
|
6
|
-
|
|
7
|
-
```tsx
|
|
8
|
-
import { POSProductButton } from '@/components/POSProductButton';
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
## 🎯 Uso Básico
|
|
12
|
-
|
|
13
|
-
```tsx
|
|
14
|
-
// Botón de producto normal
|
|
15
|
-
<POSProductButton
|
|
16
|
-
image="/images/producto.jpg"
|
|
17
|
-
label="A la parrilla"
|
|
18
|
-
onClick={() => handleProductSelect('parrilla')}
|
|
19
|
-
/>
|
|
20
|
-
|
|
21
|
-
// Botón de producto seleccionado
|
|
22
|
-
<POSProductButton
|
|
23
|
-
image="/images/producto.jpg"
|
|
24
|
-
label="A la parrilla"
|
|
25
|
-
active={true}
|
|
26
|
-
/>
|
|
27
|
-
|
|
28
|
-
// Botón de producto deshabilitado
|
|
29
|
-
<POSProductButton
|
|
30
|
-
image="/images/producto.jpg"
|
|
31
|
-
label="A la parrilla"
|
|
32
|
-
disabled={true}
|
|
33
|
-
/>
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
## 📋 Props
|
|
37
|
-
|
|
38
|
-
| Prop | Tipo | Default | Descripción |
|
|
39
|
-
|------|------|---------|-------------|
|
|
40
|
-
| `image` | `string` | **Required** | URL de la imagen del producto |
|
|
41
|
-
| `label` | `string` | **Required** | Texto del producto (nombre o descripción) |
|
|
42
|
-
| `active` | `boolean` | `false` | Si el botón está en estado activo/seleccionado |
|
|
43
|
-
| `disabled` | `boolean` | `false` | Si el botón está deshabilitado |
|
|
44
|
-
| `onClick` | `(event: MouseEvent<HTMLButtonElement>) => void` | - | Handler para evento click |
|
|
45
|
-
| `className` | `string` | `''` | Clases CSS adicionales |
|
|
46
|
-
| `ariaLabel` | `string` | - | Label para accesibilidad (ARIA) |
|
|
47
|
-
|
|
48
|
-
## 🎨 Estados
|
|
49
|
-
|
|
50
|
-
### Enabled (Normal)
|
|
51
|
-
Estado por defecto del botón, listo para ser clickeado.
|
|
52
|
-
|
|
53
|
-
```tsx
|
|
54
|
-
<POSProductButton
|
|
55
|
-
image="/images/producto.jpg"
|
|
56
|
-
label="A la parrilla"
|
|
57
|
-
/>
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
**Características:**
|
|
61
|
-
- Fondo blanco (`bg-white` / `dark:bg-dark-bg-primary`)
|
|
62
|
-
- Texto principal (`text-content-primary` / `dark:text-dark-content-primary`)
|
|
63
|
-
- Hover con fondo secundario
|
|
64
|
-
- Efecto de escala en active
|
|
65
|
-
|
|
66
|
-
### Actived (Seleccionado)
|
|
67
|
-
Estado cuando el producto está seleccionado.
|
|
68
|
-
|
|
69
|
-
```tsx
|
|
70
|
-
<POSProductButton
|
|
71
|
-
image="/images/producto.jpg"
|
|
72
|
-
label="A la parrilla"
|
|
73
|
-
active={true}
|
|
74
|
-
/>
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
**Características:**
|
|
78
|
-
- Fondo azul claro (`bg-primary-custom-100` / `dark:bg-primary-custom-100/20`)
|
|
79
|
-
- Texto azul (`text-primary-custom-600`)
|
|
80
|
-
- Indica selección visual clara
|
|
81
|
-
|
|
82
|
-
### Disabled (Deshabilitado)
|
|
83
|
-
Estado para productos no disponibles.
|
|
84
|
-
|
|
85
|
-
```tsx
|
|
86
|
-
<POSProductButton
|
|
87
|
-
image="/images/producto.jpg"
|
|
88
|
-
label="A la parrilla"
|
|
89
|
-
disabled={true}
|
|
90
|
-
/>
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
**Características:**
|
|
94
|
-
- Opacidad reducida (`opacity-55`)
|
|
95
|
-
- Cursor no permitido (`cursor-not-allowed`)
|
|
96
|
-
- No clickeable (`pointer-events-none`)
|
|
97
|
-
|
|
98
|
-
## 💡 Ejemplos de Uso
|
|
99
|
-
|
|
100
|
-
### Grid de Productos (Típico en POS)
|
|
101
|
-
|
|
102
|
-
```tsx
|
|
103
|
-
<div className="grid grid-cols-3 gap-4">
|
|
104
|
-
<POSProductButton
|
|
105
|
-
image="/images/parrilla.jpg"
|
|
106
|
-
label="A la parrilla"
|
|
107
|
-
active={selectedProduct === 'parrilla'}
|
|
108
|
-
onClick={() => setSelectedProduct('parrilla')}
|
|
109
|
-
/>
|
|
110
|
-
<POSProductButton
|
|
111
|
-
image="/images/horno.jpg"
|
|
112
|
-
label="Al horno"
|
|
113
|
-
active={selectedProduct === 'horno'}
|
|
114
|
-
onClick={() => setSelectedProduct('horno')}
|
|
115
|
-
/>
|
|
116
|
-
<POSProductButton
|
|
117
|
-
image="/images/frito.jpg"
|
|
118
|
-
label="Frito"
|
|
119
|
-
active={selectedProduct === 'frito'}
|
|
120
|
-
onClick={() => setSelectedProduct('frito')}
|
|
121
|
-
/>
|
|
122
|
-
{/* Producto agotado */}
|
|
123
|
-
<POSProductButton
|
|
124
|
-
image="/images/vapor.jpg"
|
|
125
|
-
label="Al vapor"
|
|
126
|
-
disabled={true}
|
|
127
|
-
/>
|
|
128
|
-
</div>
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
### Lista Horizontal (Categorías)
|
|
132
|
-
|
|
133
|
-
```tsx
|
|
134
|
-
<div className="flex gap-3 overflow-x-auto">
|
|
135
|
-
<POSProductButton
|
|
136
|
-
image="/images/carnes.jpg"
|
|
137
|
-
label="Carnes"
|
|
138
|
-
active={category === 'carnes'}
|
|
139
|
-
onClick={() => setCategory('carnes')}
|
|
140
|
-
/>
|
|
141
|
-
<POSProductButton
|
|
142
|
-
image="/images/pescados.jpg"
|
|
143
|
-
label="Pescados"
|
|
144
|
-
active={category === 'pescados'}
|
|
145
|
-
onClick={() => setCategory('pescados')}
|
|
146
|
-
/>
|
|
147
|
-
<POSProductButton
|
|
148
|
-
image="/images/vegetales.jpg"
|
|
149
|
-
label="Vegetales"
|
|
150
|
-
active={category === 'vegetales'}
|
|
151
|
-
onClick={() => setCategory('vegetales')}
|
|
152
|
-
/>
|
|
153
|
-
</div>
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
### Con Estado de React
|
|
157
|
-
|
|
158
|
-
```tsx
|
|
159
|
-
import { useState } from 'react';
|
|
160
|
-
|
|
161
|
-
function POSMenu() {
|
|
162
|
-
const [selectedProduct, setSelectedProduct] = useState<string | null>(null);
|
|
163
|
-
|
|
164
|
-
const products = [
|
|
165
|
-
{ id: 'parrilla', name: 'A la parrilla', image: '/images/parrilla.jpg' },
|
|
166
|
-
{ id: 'horno', name: 'Al horno', image: '/images/horno.jpg' },
|
|
167
|
-
{ id: 'frito', name: 'Frito', image: '/images/frito.jpg', available: false },
|
|
168
|
-
];
|
|
169
|
-
|
|
170
|
-
return (
|
|
171
|
-
<div className="grid grid-cols-3 gap-4">
|
|
172
|
-
{products.map((product) => (
|
|
173
|
-
<POSProductButton
|
|
174
|
-
key={product.id}
|
|
175
|
-
image={product.image}
|
|
176
|
-
label={product.name}
|
|
177
|
-
active={selectedProduct === product.id}
|
|
178
|
-
disabled={!product.available}
|
|
179
|
-
onClick={() => setSelectedProduct(product.id)}
|
|
180
|
-
/>
|
|
181
|
-
))}
|
|
182
|
-
</div>
|
|
183
|
-
);
|
|
184
|
-
}
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
## 🎨 Especificaciones de Diseño
|
|
188
|
-
|
|
189
|
-
### Dimensiones
|
|
190
|
-
- **Padding**: 12px (`p-3`)
|
|
191
|
-
- **Gap**: 8px (`gap-2`) entre imagen y label
|
|
192
|
-
- **Border radius**: 8px (`rounded-lg`)
|
|
193
|
-
- **Aspect ratio de imagen**: 158:80 (según diseño de Figma)
|
|
194
|
-
|
|
195
|
-
### Tipografía
|
|
196
|
-
- **Font family**: SiesaBT
|
|
197
|
-
- **Font size**: 14px (`text-sm`)
|
|
198
|
-
- **Font weight**: Bold 700 (`font-bold`)
|
|
199
|
-
- **Line height**: 20px (`leading-5`)
|
|
200
|
-
- **Categoría**: Label Small (según sistema tipográfico)
|
|
201
|
-
|
|
202
|
-
### Colores
|
|
203
|
-
|
|
204
|
-
#### Light Mode
|
|
205
|
-
| Estado | Background | Text |
|
|
206
|
-
|--------|-----------|------|
|
|
207
|
-
| Enabled | `#ffffff` (white) | `#18181b` (content-primary) |
|
|
208
|
-
| Actived | `#dbeefe` (primary-custom-100) | `#0e79fd` (primary-custom-600) |
|
|
209
|
-
| Disabled | `#ffffff` (white) | `#18181b` (content-primary) con opacity 0.55 |
|
|
210
|
-
|
|
211
|
-
#### Dark Mode
|
|
212
|
-
| Estado | Background | Text |
|
|
213
|
-
|--------|-----------|------|
|
|
214
|
-
| Enabled | `#18181b` (dark-bg-primary) | `#ffffff` (dark-content-primary) |
|
|
215
|
-
| Actived | `#dbeefe` con opacity 0.2 | `#0e79fd` (primary-custom-600) |
|
|
216
|
-
| Disabled | `#18181b` (dark-bg-primary) | `#ffffff` (dark-content-primary) con opacity 0.55 |
|
|
217
|
-
|
|
218
|
-
## ♿ Accesibilidad
|
|
219
|
-
|
|
220
|
-
- **ARIA Labels**: Usa `ariaLabel` para proveer contexto adicional
|
|
221
|
-
- **aria-pressed**: El estado `active` se refleja en `aria-pressed`
|
|
222
|
-
- **Keyboard Navigation**: Totalmente navegable por teclado
|
|
223
|
-
- **Focus Indicators**: Focus rings visibles en light y dark mode
|
|
224
|
-
|
|
225
|
-
```tsx
|
|
226
|
-
<POSProductButton
|
|
227
|
-
image="/images/producto.jpg"
|
|
228
|
-
label="A la parrilla"
|
|
229
|
-
ariaLabel="Seleccionar método de cocción: A la parrilla"
|
|
230
|
-
active={selected}
|
|
231
|
-
onClick={handleSelect}
|
|
232
|
-
/>
|
|
233
|
-
```
|
|
234
|
-
|
|
235
|
-
## 🌓 Dark Mode
|
|
236
|
-
|
|
237
|
-
El componente soporta dark mode automáticamente usando la estrategia `class` de Tailwind CSS.
|
|
238
|
-
|
|
239
|
-
```tsx
|
|
240
|
-
// El componente se adapta automáticamente
|
|
241
|
-
<POSProductButton
|
|
242
|
-
image="/images/producto.jpg"
|
|
243
|
-
label="A la parrilla"
|
|
244
|
-
/>
|
|
245
|
-
```
|
|
246
|
-
|
|
247
|
-
**Colores que se adaptan:**
|
|
248
|
-
- Fondos: `bg-white` → `dark:bg-dark-bg-primary`
|
|
249
|
-
- Textos: `text-content-primary` → `dark:text-dark-content-primary`
|
|
250
|
-
- Hover: `hover:bg-background-secondary` → `dark:hover:bg-dark-bg-primary/80`
|
|
251
|
-
|
|
252
|
-
## 📚 Referencias
|
|
253
|
-
|
|
254
|
-
- **Figma**: [POS Product Button](https://www.figma.com/design/5XNqf2YTxvwemxwo1LMQ6j/Siesa-UI-Kit?node-id=4366-26919&m=dev)
|
|
255
|
-
- **Código**: `src/components/POSProductButton/POSProductButton.tsx`
|
|
256
|
-
- **Stories**: `src/components/POSProductButton/POSProductButton.stories.tsx`
|
|
257
|
-
- **Sistema de colores**: `docs/colors.md`
|
|
258
|
-
- **Sistema tipográfico**: `docs/typography.md`
|
|
259
|
-
|
|
260
|
-
## 🔄 Historial de Cambios
|
|
261
|
-
|
|
262
|
-
| Versión | Fecha | Cambios |
|
|
263
|
-
|---------|-------|---------|
|
|
264
|
-
| 1.0.0 | 2025-11-24 | Implementación inicial con soporte dark mode completo |
|
|
265
|
-
|
|
266
|
-
---
|
|
267
|
-
|
|
268
|
-
**Última actualización**: 2025-11-24
|
|
269
|
-
**Mantenido por**: Equipo Siesa UI Kit
|