siesa-ui-kit 1.0.2 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +115 -115
- package/bin/install.cjs +502 -502
- package/bin/prepare-publish.cjs +28 -28
- package/bin/restore-folders.cjs +28 -28
- package/claude/agents/siesa-ui-kit-specialist.md +2445 -0
- package/claude/prompts/component-template.md +121 -0
- package/claude/prompts/siesa-ui-kit.md +28 -0
- package/claude/settings.local.json +67 -2
- package/dist/components/Button/icons.d.ts +6 -5
- package/dist/components/Button/icons.d.ts.map +1 -1
- package/dist/components/DropdownItemCollapsible/DropdownItemCollapsible.d.ts.map +1 -1
- package/dist/components/DropdownItemCollapsible/DropdownItemCollapsible.types.d.ts +21 -0
- package/dist/components/DropdownItemCollapsible/DropdownItemCollapsible.types.d.ts.map +1 -1
- package/dist/components/NavigationRailCommercial/NavigationRailCommercial.d.ts +122 -0
- package/dist/components/NavigationRailCommercial/NavigationRailCommercial.d.ts.map +1 -0
- package/dist/components/NavigationRailCommercial/NavigationRailCommercial.types.d.ts +139 -0
- package/dist/components/NavigationRailCommercial/NavigationRailCommercial.types.d.ts.map +1 -0
- package/dist/components/NavigationRailCommercial/icons.d.ts +33 -0
- package/dist/components/NavigationRailCommercial/icons.d.ts.map +1 -0
- package/dist/components/NavigationRailCommercial/index.d.ts +4 -0
- package/dist/components/NavigationRailCommercial/index.d.ts.map +1 -0
- package/dist/components/NavigationRailItem/NavigationRailItem.d.ts.map +1 -1
- package/dist/components/NavigationRailItem/NavigationRailItem.types.d.ts +7 -0
- package/dist/components/NavigationRailItem/NavigationRailItem.types.d.ts.map +1 -1
- package/dist/components/NavigationRailTypes/NavigationRailTypes.d.ts.map +1 -1
- package/dist/components/NavigationRailTypes/NavigationRailTypes.types.d.ts +41 -0
- package/dist/components/NavigationRailTypes/NavigationRailTypes.types.d.ts.map +1 -1
- package/dist/components/NavigationRailTypes/icons.d.ts +15 -29
- package/dist/components/NavigationRailTypes/icons.d.ts.map +1 -1
- package/dist/components/Select/Select.d.ts.map +1 -1
- package/dist/components/Select/icons.d.ts +6 -2
- package/dist/components/Select/icons.d.ts.map +1 -1
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/siesa-ui-kit.cjs +404 -190
- package/dist/siesa-ui-kit.cjs.map +1 -1
- package/dist/siesa-ui-kit.mjs +6590 -1506
- package/dist/siesa-ui-kit.mjs.map +1 -1
- package/dist/views/LayoutCommercial/LayoutCommercial.d.ts +48 -0
- package/dist/views/LayoutCommercial/LayoutCommercial.d.ts.map +1 -0
- package/dist/views/LayoutCommercial/LayoutCommercial.types.d.ts +49 -0
- package/dist/views/LayoutCommercial/LayoutCommercial.types.d.ts.map +1 -0
- package/dist/views/LayoutCommercial/index.d.ts +3 -0
- package/dist/views/LayoutCommercial/index.d.ts.map +1 -0
- package/docs/icons.md +12 -31
- package/package.json +111 -110
- package/src/components/Avatar/Avatar.stories.tsx +494 -494
- package/src/components/Button/Button.stories.tsx +950 -950
- package/src/components/Button/Button.tsx +337 -337
- package/src/components/Button/Button.types.ts +180 -180
- package/src/components/Button/icons.tsx +23 -62
- package/src/components/DescriptionList/DescriptionList.stories.tsx +250 -250
- package/src/components/Divider/Divider.stories.tsx +263 -263
- package/src/components/DropdownItemCollapsible/DropdownItemCollapsible.stories.tsx +317 -317
- package/src/components/DropdownItemCollapsible/DropdownItemCollapsible.tsx +307 -287
- package/src/components/DropdownItemCollapsible/DropdownItemCollapsible.types.ts +136 -111
- package/src/components/DropdownItemCollapsible/README.md +264 -264
- package/src/components/DropdownItemCollapsible/icons.tsx +57 -57
- package/src/components/DropdownItemCollapsible/index.ts +12 -12
- package/src/components/DropdownItemHeading/DropdownItemHeading.stories.tsx +386 -386
- package/src/components/DropdownItemHeading/DropdownItemHeading.tsx +216 -216
- package/src/components/DropdownItemHeading/DropdownItemHeading.types.ts +93 -93
- package/src/components/DropdownItemHeading/README.md +573 -573
- package/src/components/DropdownItemHeading/icons.tsx +125 -125
- package/src/components/DropdownItemHeading/index.ts +3 -3
- package/src/components/Input/Input.stories.tsx +583 -583
- package/src/components/LoginView/LoginView.stories.tsx +148 -148
- package/src/components/LoginView/LoginView.tsx +426 -426
- package/src/components/LoginView/LoginView.types.ts +52 -52
- package/src/components/LoginView/README.md +396 -396
- package/src/components/LoginView/icons.tsx +85 -85
- package/src/components/LoginView/index.ts +3 -3
- package/src/components/Navbar/Navbar.stories.tsx +810 -810
- package/src/components/Navbar/Navbar.tsx +755 -755
- package/src/components/Navbar/Navbar.types.ts +219 -219
- package/src/components/Navbar/README.md +279 -279
- package/src/components/Navbar/index.ts +8 -8
- package/src/components/NavigationRailCommercial/NavigationRailCommercial.stories.tsx +464 -0
- package/src/components/NavigationRailCommercial/NavigationRailCommercial.tsx +301 -0
- package/src/components/NavigationRailCommercial/NavigationRailCommercial.types.ts +162 -0
- package/src/components/NavigationRailCommercial/README.md +251 -0
- package/src/components/NavigationRailCommercial/icons.tsx +54 -0
- package/src/components/NavigationRailCommercial/index.ts +6 -0
- package/src/components/NavigationRailItem/NavigationRailItem.stories.tsx +667 -667
- package/src/components/NavigationRailItem/NavigationRailItem.tsx +314 -313
- package/src/components/NavigationRailItem/NavigationRailItem.types.ts +175 -167
- package/src/components/NavigationRailItem/README.md +476 -476
- package/src/components/NavigationRailItem/index.ts +2 -2
- package/src/components/NavigationRailPanel/NavigationRailPanel.stories.tsx +462 -462
- package/src/components/NavigationRailPanel/NavigationRailPanel.tsx +332 -332
- package/src/components/NavigationRailPanel/NavigationRailPanel.types.ts +178 -178
- package/src/components/NavigationRailPanel/README.md +461 -461
- package/src/components/NavigationRailPanel/index.ts +6 -6
- package/src/components/NavigationRailTypes/NavigationRailTypes.stories.tsx +682 -528
- package/src/components/NavigationRailTypes/NavigationRailTypes.tsx +363 -378
- package/src/components/NavigationRailTypes/NavigationRailTypes.types.ts +178 -130
- package/src/components/NavigationRailTypes/README.md +573 -573
- package/src/components/NavigationRailTypes/icons.tsx +76 -141
- package/src/components/NavigationRailTypes/index.ts +7 -7
- package/src/components/Notification/Notification.stories.tsx +513 -513
- package/src/components/Notification/Notification.tsx +145 -145
- package/src/components/Notification/Notification.types.ts +142 -142
- package/src/components/Notification/README.md +409 -409
- package/src/components/POSConvention/POSConvention.stories.tsx +235 -235
- package/src/components/POSConvention/POSConvention.tsx +129 -129
- package/src/components/POSConvention/POSConvention.types.ts +38 -38
- package/src/components/POSConvention/README.md +123 -123
- package/src/components/POSConvention/icons.tsx +45 -45
- package/src/components/POSConvention/index.ts +3 -3
- package/src/components/POSLocationButton/POSLocationButton.stories.tsx +531 -531
- package/src/components/POSLocationButton/POSLocationButton.tsx +247 -247
- package/src/components/POSLocationButton/POSLocationButton.types.ts +87 -87
- package/src/components/POSLocationButton/README.md +253 -253
- package/src/components/POSLocationButton/icons.tsx +120 -120
- package/src/components/POSLocationButton/index.ts +14 -14
- package/src/components/POSNumberButton/POSNumberButton.stories.tsx +415 -415
- package/src/components/POSNumberButton/POSNumberButton.tsx +179 -179
- package/src/components/POSNumberButton/POSNumberButton.types.ts +51 -51
- package/src/components/POSNumberButton/README.md +321 -321
- package/src/components/POSNumberButton/index.ts +3 -3
- package/src/components/POSProductButton/POSProductButton.stories.tsx +318 -318
- package/src/components/POSProductCard/POSProductCard.stories.tsx +642 -642
- package/src/components/POSProductCard/POSProductCard.tsx +208 -208
- package/src/components/POSProductCard/POSProductCard.types.ts +76 -76
- package/src/components/POSProductCard/README.md +179 -179
- package/src/components/POSProductCard/icons.tsx +26 -26
- package/src/components/POSProductCard/index.ts +2 -2
- package/src/components/POSProductSidebarItems/POSProductSidebarItems.stories.tsx +753 -753
- package/src/components/POSProductSidebarItems/POSProductSidebarItems.tsx +332 -332
- package/src/components/POSProductSidebarItems/POSProductSidebarItems.types.ts +119 -119
- package/src/components/POSProductSidebarItems/README.md +198 -198
- package/src/components/POSProductSidebarItems/icons.tsx +21 -21
- package/src/components/POSProductSidebarItems/index.ts +3 -3
- package/src/components/POSTable/POSTable.stories.tsx +737 -737
- package/src/components/POSTable/POSTable.tsx +401 -401
- package/src/components/POSTable/README.md +286 -286
- package/src/components/Quantity/Quantity.stories.tsx +457 -457
- package/src/components/Radio/Radio.stories.tsx +523 -523
- package/src/components/Radio/Radio.tsx +1 -1
- package/src/components/Select/Select.stories.tsx +32 -0
- package/src/components/Select/Select.tsx +457 -454
- package/src/components/Select/icons.tsx +16 -41
- package/src/components/SignUpView/SignUpView.stories.tsx +129 -129
- package/src/components/SignUpView/SignUpView.tsx +503 -503
- package/src/components/SignUpView/SignUpView.types.ts +58 -58
- package/src/components/SignUpView/icons.tsx +71 -71
- package/src/components/SignUpView/index.ts +3 -3
- package/src/components/Switch/README.md +112 -112
- package/src/components/Switch/Switch.stories.tsx +550 -550
- package/src/components/Switch/Switch.tsx +246 -246
- package/src/components/Switch/Switch.types.ts +67 -67
- package/src/components/Table/Table.stories.tsx +805 -805
- package/src/components/Tabs/README.md +201 -201
- package/src/components/Tabs/Tabs.stories.tsx +580 -580
- package/src/components/Tabs/Tabs.tsx +356 -356
- package/src/components/Tabs/Tabs.types.ts +127 -127
- package/src/components/Tabs/icons.tsx +129 -129
- package/src/components/Tabs/index.ts +11 -11
- package/src/components/Textarea/Textarea.stories.tsx +535 -535
- package/src/index.ts +133 -102
- package/src/views/LayoutCommercial/LayoutCommercial.stories.tsx +374 -0
- package/src/views/LayoutCommercial/LayoutCommercial.tsx +125 -0
- package/src/views/LayoutCommercial/LayoutCommercial.types.ts +54 -0
- package/src/views/LayoutCommercial/README.md +286 -0
- package/src/views/LayoutCommercial/index.ts +2 -0
- package/src/views/ListView/ListView.stories.tsx +329 -329
- package/src/views/ListView/ListView.tsx +570 -570
- package/src/views/ListView/ListView.types.ts +211 -211
- package/src/views/ListView/icons.tsx +282 -282
- package/src/views/ListView/index.ts +11 -11
- package/src/views/LoginView/LoginView.tsx +426 -426
- package/src/views/ProductsView/ProductsView.stories.tsx +344 -344
- package/src/views/ProductsView/ProductsView.tsx +480 -480
- package/src/views/ProductsView/ProductsView.types.ts +238 -238
- package/src/views/ProductsView/README.md +312 -312
- package/src/views/ProductsView/icons.tsx +38 -38
- package/src/views/ProductsView/index.ts +8 -8
- package/src/views/RecoverPasswordView/RecoverPasswordView.tsx +376 -376
- package/src/views/SignUpView/SignUpView.tsx +503 -503
- package/src/views/TableLayoutView/README.md +268 -268
- package/src/views/TableLayoutView/TableLayoutView.stories.tsx +235 -235
- package/src/views/TableLayoutView/TableLayoutView.tsx +461 -461
- package/src/views/TableLayoutView/TableLayoutView.types.ts +209 -209
- package/src/views/TableLayoutView/icons.tsx +113 -113
- package/src/views/TableLayoutView/index.ts +6 -6
- package/storybook/main.ts +19 -19
- package/storybook/preview.tsx +84 -84
- package/storybook/vitest.setup.ts +6 -6
- package/tailwind.config.js +128 -128
|
@@ -1,179 +1,179 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import type { POSNumberButtonProps } from './POSNumberButton.types';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Componente POSNumberButton del sistema de diseño Siesa
|
|
6
|
-
* Botón numérico especializado para sistemas POS (Point of Sale)
|
|
7
|
-
*
|
|
8
|
-
* Basado en especificaciones de Figma con Tailwind CSS
|
|
9
|
-
*
|
|
10
|
-
* **Características principales:**
|
|
11
|
-
* - Diseñado para pantallas táctiles y POS
|
|
12
|
-
* - Tipografía Display Tiny (48px Bold) para números grandes
|
|
13
|
-
* - Tres tamaños: Small (40x40), Medium (65x65), Large (80x80)
|
|
14
|
-
* - Opción de borde visible o sin borde
|
|
15
|
-
* - Estados: Default, Hover, Active, Disabled
|
|
16
|
-
* - Touch-friendly: active:scale-95 para feedback táctil
|
|
17
|
-
*
|
|
18
|
-
* **Variantes:**
|
|
19
|
-
* - `border=false`: Botón sin borde, hover cambia a primary
|
|
20
|
-
* - `border=true`: Botón con borde, hover resalta el borde
|
|
21
|
-
*
|
|
22
|
-
* **Tamaños:**
|
|
23
|
-
* - `s` (40x40px): Compacto, para teclados numéricos pequeños
|
|
24
|
-
* - `m` (65x65px): Mediano, tamaño intermedio
|
|
25
|
-
* - `l` (80x80px): Grande, tamaño por defecto para POS
|
|
26
|
-
*
|
|
27
|
-
* **Mejores prácticas implementadas:**
|
|
28
|
-
* - Orden de modificadores: {responsive}:{dark}:{state}:{utility}
|
|
29
|
-
* - Dark mode con estrategia 'class' (darkMode: 'class')
|
|
30
|
-
* - Tokens de color consistentes con la documentación
|
|
31
|
-
* - Type safety con TypeScript estricto
|
|
32
|
-
* - Accesibilidad con ARIA labels
|
|
33
|
-
* - Feedback visual inmediato con active:scale-95
|
|
34
|
-
*
|
|
35
|
-
* @see docs/colors.md - Sistema de colores
|
|
36
|
-
* @see docs/typography.md - Sistema tipográfico (Display Tiny)
|
|
37
|
-
* @see docs/spacing.md - Sistema de espaciado
|
|
38
|
-
* @see src/components/Button/Button.tsx - Componente Button de referencia
|
|
39
|
-
*
|
|
40
|
-
* @example
|
|
41
|
-
* ```tsx
|
|
42
|
-
* // Botón numérico grande (POS)
|
|
43
|
-
* <POSNumberButton size="l">1</POSNumberButton>
|
|
44
|
-
*
|
|
45
|
-
* // Botón con borde
|
|
46
|
-
* <POSNumberButton size="l" border>2</POSNumberButton>
|
|
47
|
-
*
|
|
48
|
-
* // Botón compacto
|
|
49
|
-
* <POSNumberButton size="s">3</POSNumberButton>
|
|
50
|
-
*
|
|
51
|
-
* // Teclado numérico completo
|
|
52
|
-
* <div className="grid grid-cols-3 gap-2">
|
|
53
|
-
* {[1, 2, 3, 4, 5, 6, 7, 8, 9].map((num) => (
|
|
54
|
-
* <POSNumberButton key={num} size="m" onClick={() => handleInput(num)}>
|
|
55
|
-
* {num}
|
|
56
|
-
* </POSNumberButton>
|
|
57
|
-
* ))}
|
|
58
|
-
* </div>
|
|
59
|
-
* ```
|
|
60
|
-
*/
|
|
61
|
-
export const POSNumberButton: React.FC<POSNumberButtonProps> = ({
|
|
62
|
-
size = 'l',
|
|
63
|
-
border = false,
|
|
64
|
-
children,
|
|
65
|
-
disabled = false,
|
|
66
|
-
className = '',
|
|
67
|
-
onClick,
|
|
68
|
-
ariaLabel,
|
|
69
|
-
htmlType = 'button',
|
|
70
|
-
...rest
|
|
71
|
-
}) => {
|
|
72
|
-
// ===== CLASES DE TAMAÑO =====
|
|
73
|
-
// Basado en especificaciones de Figma: L=80x80, M=65x65, S=40x40
|
|
74
|
-
const sizeClasses = {
|
|
75
|
-
s: 'w-10 h-10', // 40x40px
|
|
76
|
-
m: 'w-[65px] h-[65px]', // 65x65px
|
|
77
|
-
l: 'w-20 h-20', // 80x80px
|
|
78
|
-
};
|
|
79
|
-
|
|
80
|
-
// ===== CLASES DE TEXTO =====
|
|
81
|
-
// Display Tiny (48px Bold) según typography.md → text-5xl
|
|
82
|
-
// Para tamaño small, reducimos a text-2xl (24px)
|
|
83
|
-
const textSizeClasses = {
|
|
84
|
-
s: 'text-2xl', // 24px para botones pequeños
|
|
85
|
-
m: 'text-5xl', // 48px Display Tiny
|
|
86
|
-
l: 'text-5xl', // 48px Display Tiny
|
|
87
|
-
};
|
|
88
|
-
|
|
89
|
-
// ===== CLASES DE ESTADO (Sin Borde) =====
|
|
90
|
-
const noBorderStateClasses = `
|
|
91
|
-
bg-white
|
|
92
|
-
text-content-primary
|
|
93
|
-
hover:bg-primary-custom-600
|
|
94
|
-
hover:text-primary-inverse-content
|
|
95
|
-
active:bg-primary-custom-600
|
|
96
|
-
active:text-primary-inverse-content
|
|
97
|
-
active:scale-95
|
|
98
|
-
dark:bg-dark-bg-primary
|
|
99
|
-
dark:text-dark-content-primary
|
|
100
|
-
dark:hover:bg-dark-bg-inverse
|
|
101
|
-
dark:hover:text-dark-content-inverse
|
|
102
|
-
dark:active:bg-dark-bg-inverse
|
|
103
|
-
dark:active:text-dark-content-inverse
|
|
104
|
-
dark:active:scale-95
|
|
105
|
-
`;
|
|
106
|
-
|
|
107
|
-
// ===== CLASES DE ESTADO (Con Borde) =====
|
|
108
|
-
const withBorderStateClasses = `
|
|
109
|
-
bg-white
|
|
110
|
-
text-content-primary
|
|
111
|
-
border
|
|
112
|
-
border-border-primary
|
|
113
|
-
hover:bg-primary-custom-600
|
|
114
|
-
hover:text-primary-inverse-content
|
|
115
|
-
hover:border-primary-inverse-border
|
|
116
|
-
active:bg-primary-custom-600
|
|
117
|
-
active:text-primary-inverse-content
|
|
118
|
-
active:border-primary-inverse-border
|
|
119
|
-
active:scale-95
|
|
120
|
-
dark:bg-dark-bg-primary
|
|
121
|
-
dark:text-dark-content-primary
|
|
122
|
-
dark:border-dark-border-primary
|
|
123
|
-
dark:hover:bg-dark-bg-inverse
|
|
124
|
-
dark:hover:text-dark-content-inverse
|
|
125
|
-
dark:hover:border-primary-inverse-border
|
|
126
|
-
dark:active:bg-dark-bg-inverse
|
|
127
|
-
dark:active:text-dark-content-inverse
|
|
128
|
-
dark:active:border-primary-inverse-border
|
|
129
|
-
dark:active:scale-95
|
|
130
|
-
`;
|
|
131
|
-
|
|
132
|
-
// ===== CLASES BASE =====
|
|
133
|
-
const baseClasses = `
|
|
134
|
-
inline-flex
|
|
135
|
-
items-center
|
|
136
|
-
justify-center
|
|
137
|
-
rounded-lg
|
|
138
|
-
font-bold
|
|
139
|
-
tracking-tighter
|
|
140
|
-
whitespace-nowrap
|
|
141
|
-
cursor-pointer
|
|
142
|
-
focus:outline-none
|
|
143
|
-
focus:ring-2
|
|
144
|
-
focus:ring-primary-custom-400
|
|
145
|
-
focus:ring-offset-2
|
|
146
|
-
dark:focus:ring-dark-border-custom
|
|
147
|
-
dark:focus:ring-offset-dark-bg-primary
|
|
148
|
-
disabled:opacity-50
|
|
149
|
-
disabled:cursor-not-allowed
|
|
150
|
-
disabled:pointer-events-none
|
|
151
|
-
transition-all
|
|
152
|
-
duration-150
|
|
153
|
-
`;
|
|
154
|
-
|
|
155
|
-
// ===== COMBINAR TODAS LAS CLASES =====
|
|
156
|
-
const buttonClasses = [
|
|
157
|
-
baseClasses,
|
|
158
|
-
sizeClasses[size],
|
|
159
|
-
textSizeClasses[size],
|
|
160
|
-
border ? withBorderStateClasses : noBorderStateClasses,
|
|
161
|
-
className,
|
|
162
|
-
]
|
|
163
|
-
.join(' ')
|
|
164
|
-
.replace(/\s+/g, ' ')
|
|
165
|
-
.trim();
|
|
166
|
-
|
|
167
|
-
return (
|
|
168
|
-
<button
|
|
169
|
-
type={htmlType}
|
|
170
|
-
className={buttonClasses}
|
|
171
|
-
disabled={disabled}
|
|
172
|
-
onClick={onClick}
|
|
173
|
-
aria-label={ariaLabel || `Número ${children}`}
|
|
174
|
-
{...rest}
|
|
175
|
-
>
|
|
176
|
-
{children}
|
|
177
|
-
</button>
|
|
178
|
-
);
|
|
179
|
-
};
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { POSNumberButtonProps } from './POSNumberButton.types';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Componente POSNumberButton del sistema de diseño Siesa
|
|
6
|
+
* Botón numérico especializado para sistemas POS (Point of Sale)
|
|
7
|
+
*
|
|
8
|
+
* Basado en especificaciones de Figma con Tailwind CSS
|
|
9
|
+
*
|
|
10
|
+
* **Características principales:**
|
|
11
|
+
* - Diseñado para pantallas táctiles y POS
|
|
12
|
+
* - Tipografía Display Tiny (48px Bold) para números grandes
|
|
13
|
+
* - Tres tamaños: Small (40x40), Medium (65x65), Large (80x80)
|
|
14
|
+
* - Opción de borde visible o sin borde
|
|
15
|
+
* - Estados: Default, Hover, Active, Disabled
|
|
16
|
+
* - Touch-friendly: active:scale-95 para feedback táctil
|
|
17
|
+
*
|
|
18
|
+
* **Variantes:**
|
|
19
|
+
* - `border=false`: Botón sin borde, hover cambia a primary
|
|
20
|
+
* - `border=true`: Botón con borde, hover resalta el borde
|
|
21
|
+
*
|
|
22
|
+
* **Tamaños:**
|
|
23
|
+
* - `s` (40x40px): Compacto, para teclados numéricos pequeños
|
|
24
|
+
* - `m` (65x65px): Mediano, tamaño intermedio
|
|
25
|
+
* - `l` (80x80px): Grande, tamaño por defecto para POS
|
|
26
|
+
*
|
|
27
|
+
* **Mejores prácticas implementadas:**
|
|
28
|
+
* - Orden de modificadores: {responsive}:{dark}:{state}:{utility}
|
|
29
|
+
* - Dark mode con estrategia 'class' (darkMode: 'class')
|
|
30
|
+
* - Tokens de color consistentes con la documentación
|
|
31
|
+
* - Type safety con TypeScript estricto
|
|
32
|
+
* - Accesibilidad con ARIA labels
|
|
33
|
+
* - Feedback visual inmediato con active:scale-95
|
|
34
|
+
*
|
|
35
|
+
* @see docs/colors.md - Sistema de colores
|
|
36
|
+
* @see docs/typography.md - Sistema tipográfico (Display Tiny)
|
|
37
|
+
* @see docs/spacing.md - Sistema de espaciado
|
|
38
|
+
* @see src/components/Button/Button.tsx - Componente Button de referencia
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```tsx
|
|
42
|
+
* // Botón numérico grande (POS)
|
|
43
|
+
* <POSNumberButton size="l">1</POSNumberButton>
|
|
44
|
+
*
|
|
45
|
+
* // Botón con borde
|
|
46
|
+
* <POSNumberButton size="l" border>2</POSNumberButton>
|
|
47
|
+
*
|
|
48
|
+
* // Botón compacto
|
|
49
|
+
* <POSNumberButton size="s">3</POSNumberButton>
|
|
50
|
+
*
|
|
51
|
+
* // Teclado numérico completo
|
|
52
|
+
* <div className="grid grid-cols-3 gap-2">
|
|
53
|
+
* {[1, 2, 3, 4, 5, 6, 7, 8, 9].map((num) => (
|
|
54
|
+
* <POSNumberButton key={num} size="m" onClick={() => handleInput(num)}>
|
|
55
|
+
* {num}
|
|
56
|
+
* </POSNumberButton>
|
|
57
|
+
* ))}
|
|
58
|
+
* </div>
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
export const POSNumberButton: React.FC<POSNumberButtonProps> = ({
|
|
62
|
+
size = 'l',
|
|
63
|
+
border = false,
|
|
64
|
+
children,
|
|
65
|
+
disabled = false,
|
|
66
|
+
className = '',
|
|
67
|
+
onClick,
|
|
68
|
+
ariaLabel,
|
|
69
|
+
htmlType = 'button',
|
|
70
|
+
...rest
|
|
71
|
+
}) => {
|
|
72
|
+
// ===== CLASES DE TAMAÑO =====
|
|
73
|
+
// Basado en especificaciones de Figma: L=80x80, M=65x65, S=40x40
|
|
74
|
+
const sizeClasses = {
|
|
75
|
+
s: 'w-10 h-10', // 40x40px
|
|
76
|
+
m: 'w-[65px] h-[65px]', // 65x65px
|
|
77
|
+
l: 'w-20 h-20', // 80x80px
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
// ===== CLASES DE TEXTO =====
|
|
81
|
+
// Display Tiny (48px Bold) según typography.md → text-5xl
|
|
82
|
+
// Para tamaño small, reducimos a text-2xl (24px)
|
|
83
|
+
const textSizeClasses = {
|
|
84
|
+
s: 'text-2xl', // 24px para botones pequeños
|
|
85
|
+
m: 'text-5xl', // 48px Display Tiny
|
|
86
|
+
l: 'text-5xl', // 48px Display Tiny
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
// ===== CLASES DE ESTADO (Sin Borde) =====
|
|
90
|
+
const noBorderStateClasses = `
|
|
91
|
+
bg-white
|
|
92
|
+
text-content-primary
|
|
93
|
+
hover:bg-primary-custom-600
|
|
94
|
+
hover:text-primary-inverse-content
|
|
95
|
+
active:bg-primary-custom-600
|
|
96
|
+
active:text-primary-inverse-content
|
|
97
|
+
active:scale-95
|
|
98
|
+
dark:bg-dark-bg-primary
|
|
99
|
+
dark:text-dark-content-primary
|
|
100
|
+
dark:hover:bg-dark-bg-inverse
|
|
101
|
+
dark:hover:text-dark-content-inverse
|
|
102
|
+
dark:active:bg-dark-bg-inverse
|
|
103
|
+
dark:active:text-dark-content-inverse
|
|
104
|
+
dark:active:scale-95
|
|
105
|
+
`;
|
|
106
|
+
|
|
107
|
+
// ===== CLASES DE ESTADO (Con Borde) =====
|
|
108
|
+
const withBorderStateClasses = `
|
|
109
|
+
bg-white
|
|
110
|
+
text-content-primary
|
|
111
|
+
border
|
|
112
|
+
border-border-primary
|
|
113
|
+
hover:bg-primary-custom-600
|
|
114
|
+
hover:text-primary-inverse-content
|
|
115
|
+
hover:border-primary-inverse-border
|
|
116
|
+
active:bg-primary-custom-600
|
|
117
|
+
active:text-primary-inverse-content
|
|
118
|
+
active:border-primary-inverse-border
|
|
119
|
+
active:scale-95
|
|
120
|
+
dark:bg-dark-bg-primary
|
|
121
|
+
dark:text-dark-content-primary
|
|
122
|
+
dark:border-dark-border-primary
|
|
123
|
+
dark:hover:bg-dark-bg-inverse
|
|
124
|
+
dark:hover:text-dark-content-inverse
|
|
125
|
+
dark:hover:border-primary-inverse-border
|
|
126
|
+
dark:active:bg-dark-bg-inverse
|
|
127
|
+
dark:active:text-dark-content-inverse
|
|
128
|
+
dark:active:border-primary-inverse-border
|
|
129
|
+
dark:active:scale-95
|
|
130
|
+
`;
|
|
131
|
+
|
|
132
|
+
// ===== CLASES BASE =====
|
|
133
|
+
const baseClasses = `
|
|
134
|
+
inline-flex
|
|
135
|
+
items-center
|
|
136
|
+
justify-center
|
|
137
|
+
rounded-lg
|
|
138
|
+
font-bold
|
|
139
|
+
tracking-tighter
|
|
140
|
+
whitespace-nowrap
|
|
141
|
+
cursor-pointer
|
|
142
|
+
focus:outline-none
|
|
143
|
+
focus:ring-2
|
|
144
|
+
focus:ring-primary-custom-400
|
|
145
|
+
focus:ring-offset-2
|
|
146
|
+
dark:focus:ring-dark-border-custom
|
|
147
|
+
dark:focus:ring-offset-dark-bg-primary
|
|
148
|
+
disabled:opacity-50
|
|
149
|
+
disabled:cursor-not-allowed
|
|
150
|
+
disabled:pointer-events-none
|
|
151
|
+
transition-all
|
|
152
|
+
duration-150
|
|
153
|
+
`;
|
|
154
|
+
|
|
155
|
+
// ===== COMBINAR TODAS LAS CLASES =====
|
|
156
|
+
const buttonClasses = [
|
|
157
|
+
baseClasses,
|
|
158
|
+
sizeClasses[size],
|
|
159
|
+
textSizeClasses[size],
|
|
160
|
+
border ? withBorderStateClasses : noBorderStateClasses,
|
|
161
|
+
className,
|
|
162
|
+
]
|
|
163
|
+
.join(' ')
|
|
164
|
+
.replace(/\s+/g, ' ')
|
|
165
|
+
.trim();
|
|
166
|
+
|
|
167
|
+
return (
|
|
168
|
+
<button
|
|
169
|
+
type={htmlType}
|
|
170
|
+
className={buttonClasses}
|
|
171
|
+
disabled={disabled}
|
|
172
|
+
onClick={onClick}
|
|
173
|
+
aria-label={ariaLabel || `Número ${children}`}
|
|
174
|
+
{...rest}
|
|
175
|
+
>
|
|
176
|
+
{children}
|
|
177
|
+
</button>
|
|
178
|
+
);
|
|
179
|
+
};
|
|
@@ -1,51 +1,51 @@
|
|
|
1
|
-
// POSNumberButton.types.ts
|
|
2
|
-
import type { ReactNode, MouseEvent } from 'react';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Props del componente POSNumberButton
|
|
6
|
-
*/
|
|
7
|
-
export interface POSNumberButtonProps {
|
|
8
|
-
/**
|
|
9
|
-
* Tamaño del botón
|
|
10
|
-
* @default 'l'
|
|
11
|
-
*/
|
|
12
|
-
size?: 's' | 'm' | 'l';
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Si el botón tiene borde visible
|
|
16
|
-
* @default false
|
|
17
|
-
*/
|
|
18
|
-
border?: boolean;
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Contenido del botón (número o texto)
|
|
22
|
-
*/
|
|
23
|
-
children: ReactNode;
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Si el botón está deshabilitado
|
|
27
|
-
* @default false
|
|
28
|
-
*/
|
|
29
|
-
disabled?: boolean;
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Clases CSS adicionales
|
|
33
|
-
*/
|
|
34
|
-
className?: string;
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Handler para evento click
|
|
38
|
-
*/
|
|
39
|
-
onClick?: (event: MouseEvent<HTMLButtonElement>) => void;
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Label para accesibilidad (ARIA)
|
|
43
|
-
*/
|
|
44
|
-
ariaLabel?: string;
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Tipo del botón HTML
|
|
48
|
-
* @default 'button'
|
|
49
|
-
*/
|
|
50
|
-
htmlType?: 'button' | 'submit' | 'reset';
|
|
51
|
-
}
|
|
1
|
+
// POSNumberButton.types.ts
|
|
2
|
+
import type { ReactNode, MouseEvent } from 'react';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Props del componente POSNumberButton
|
|
6
|
+
*/
|
|
7
|
+
export interface POSNumberButtonProps {
|
|
8
|
+
/**
|
|
9
|
+
* Tamaño del botón
|
|
10
|
+
* @default 'l'
|
|
11
|
+
*/
|
|
12
|
+
size?: 's' | 'm' | 'l';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Si el botón tiene borde visible
|
|
16
|
+
* @default false
|
|
17
|
+
*/
|
|
18
|
+
border?: boolean;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Contenido del botón (número o texto)
|
|
22
|
+
*/
|
|
23
|
+
children: ReactNode;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Si el botón está deshabilitado
|
|
27
|
+
* @default false
|
|
28
|
+
*/
|
|
29
|
+
disabled?: boolean;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Clases CSS adicionales
|
|
33
|
+
*/
|
|
34
|
+
className?: string;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Handler para evento click
|
|
38
|
+
*/
|
|
39
|
+
onClick?: (event: MouseEvent<HTMLButtonElement>) => void;
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Label para accesibilidad (ARIA)
|
|
43
|
+
*/
|
|
44
|
+
ariaLabel?: string;
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Tipo del botón HTML
|
|
48
|
+
* @default 'button'
|
|
49
|
+
*/
|
|
50
|
+
htmlType?: 'button' | 'submit' | 'reset';
|
|
51
|
+
}
|