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,14 +0,0 @@
|
|
|
1
|
-
export { POSLocationButton } from './POSLocationButton';
|
|
2
|
-
export type {
|
|
3
|
-
POSLocationButtonProps,
|
|
4
|
-
POSLocationStatus,
|
|
5
|
-
POSLocationState,
|
|
6
|
-
POSLocationCapacity,
|
|
7
|
-
} from './POSLocationButton.types';
|
|
8
|
-
export {
|
|
9
|
-
CheckIcon,
|
|
10
|
-
XMarkIcon,
|
|
11
|
-
CalendarIcon,
|
|
12
|
-
NoSymbolIcon,
|
|
13
|
-
UsersIcon,
|
|
14
|
-
} from './icons';
|
|
@@ -1,415 +0,0 @@
|
|
|
1
|
-
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
-
import { POSNumberButton } from './POSNumberButton';
|
|
3
|
-
|
|
4
|
-
const meta = {
|
|
5
|
-
title: 'Siesa UI Kit/POSNumberButton',
|
|
6
|
-
component: POSNumberButton,
|
|
7
|
-
parameters: {
|
|
8
|
-
layout: 'centered',
|
|
9
|
-
docs: {
|
|
10
|
-
description: {
|
|
11
|
-
component: 'Botón numérico especializado para sistemas POS (Point of Sale) con tipografía grande y estados touch-friendly.',
|
|
12
|
-
},
|
|
13
|
-
},
|
|
14
|
-
},
|
|
15
|
-
tags: ['autodocs'],
|
|
16
|
-
argTypes: {
|
|
17
|
-
size: {
|
|
18
|
-
control: 'select',
|
|
19
|
-
options: ['s', 'm', 'l'],
|
|
20
|
-
description: 'Tamaño del botón (s=40x40, m=65x65, l=80x80)',
|
|
21
|
-
table: {
|
|
22
|
-
type: { summary: 'string' },
|
|
23
|
-
category: 'Apariencia',
|
|
24
|
-
defaultValue: { summary: 'l' },
|
|
25
|
-
},
|
|
26
|
-
},
|
|
27
|
-
border: {
|
|
28
|
-
control: 'boolean',
|
|
29
|
-
description: 'Si el botón tiene borde visible',
|
|
30
|
-
table: {
|
|
31
|
-
type: { summary: 'boolean' },
|
|
32
|
-
category: 'Apariencia',
|
|
33
|
-
defaultValue: { summary: 'false' },
|
|
34
|
-
},
|
|
35
|
-
},
|
|
36
|
-
children: {
|
|
37
|
-
control: 'text',
|
|
38
|
-
description: 'Contenido del botón (número o texto)',
|
|
39
|
-
table: {
|
|
40
|
-
type: { summary: 'ReactNode' },
|
|
41
|
-
category: 'Contenido',
|
|
42
|
-
},
|
|
43
|
-
},
|
|
44
|
-
disabled: {
|
|
45
|
-
control: 'boolean',
|
|
46
|
-
description: 'Si el botón está deshabilitado',
|
|
47
|
-
table: {
|
|
48
|
-
type: { summary: 'boolean' },
|
|
49
|
-
category: 'Estado',
|
|
50
|
-
defaultValue: { summary: 'false' },
|
|
51
|
-
},
|
|
52
|
-
},
|
|
53
|
-
onClick: {
|
|
54
|
-
action: 'clicked',
|
|
55
|
-
description: 'Handler para evento click',
|
|
56
|
-
table: {
|
|
57
|
-
type: { summary: 'function' },
|
|
58
|
-
category: 'Eventos',
|
|
59
|
-
},
|
|
60
|
-
},
|
|
61
|
-
},
|
|
62
|
-
} satisfies Meta<typeof POSNumberButton>;
|
|
63
|
-
|
|
64
|
-
export default meta;
|
|
65
|
-
type Story = StoryObj<typeof meta>;
|
|
66
|
-
|
|
67
|
-
// ============================================
|
|
68
|
-
// 1. PLAYGROUND INTERACTIVO
|
|
69
|
-
// ============================================
|
|
70
|
-
export const Playground: Story = {
|
|
71
|
-
args: {
|
|
72
|
-
size: 'l',
|
|
73
|
-
border: false,
|
|
74
|
-
children: '1',
|
|
75
|
-
disabled: false,
|
|
76
|
-
},
|
|
77
|
-
};
|
|
78
|
-
|
|
79
|
-
// ============================================
|
|
80
|
-
// 2. TODAS LAS VARIANTES
|
|
81
|
-
// ============================================
|
|
82
|
-
export const TodasLasVariantes: Story = {
|
|
83
|
-
args: { children: '1' },
|
|
84
|
-
render: () => (
|
|
85
|
-
<div className="space-y-8 p-6">
|
|
86
|
-
{/* Tamaño Large */}
|
|
87
|
-
<div>
|
|
88
|
-
<h3 className="text-sm font-bold mb-4 text-content-primary dark:text-dark-content-primary">
|
|
89
|
-
Tamaño Large (80x80px)
|
|
90
|
-
</h3>
|
|
91
|
-
<div className="flex flex-wrap gap-3">
|
|
92
|
-
<div className="space-y-2">
|
|
93
|
-
<p className="text-xs text-content-secondary dark:text-content-secondary">Sin Borde</p>
|
|
94
|
-
<POSNumberButton size="l" border={false}>1</POSNumberButton>
|
|
95
|
-
</div>
|
|
96
|
-
<div className="space-y-2">
|
|
97
|
-
<p className="text-xs text-content-secondary dark:text-content-secondary">Con Borde</p>
|
|
98
|
-
<POSNumberButton size="l" border={true}>2</POSNumberButton>
|
|
99
|
-
</div>
|
|
100
|
-
</div>
|
|
101
|
-
<p className="text-xs text-content-secondary dark:text-content-secondary mt-2">
|
|
102
|
-
Tamaño por defecto para sistemas POS
|
|
103
|
-
</p>
|
|
104
|
-
</div>
|
|
105
|
-
|
|
106
|
-
{/* Tamaño Medium */}
|
|
107
|
-
<div>
|
|
108
|
-
<h3 className="text-sm font-bold mb-4 text-content-primary dark:text-dark-content-primary">
|
|
109
|
-
Tamaño Medium (65x65px)
|
|
110
|
-
</h3>
|
|
111
|
-
<div className="flex flex-wrap gap-3">
|
|
112
|
-
<div className="space-y-2">
|
|
113
|
-
<p className="text-xs text-content-secondary dark:text-content-secondary">Sin Borde</p>
|
|
114
|
-
<POSNumberButton size="m" border={false}>3</POSNumberButton>
|
|
115
|
-
</div>
|
|
116
|
-
<div className="space-y-2">
|
|
117
|
-
<p className="text-xs text-content-secondary dark:text-content-secondary">Con Borde</p>
|
|
118
|
-
<POSNumberButton size="m" border={true}>4</POSNumberButton>
|
|
119
|
-
</div>
|
|
120
|
-
</div>
|
|
121
|
-
<p className="text-xs text-content-secondary dark:text-content-secondary mt-2">
|
|
122
|
-
Tamaño intermedio para interfaces más compactas
|
|
123
|
-
</p>
|
|
124
|
-
</div>
|
|
125
|
-
|
|
126
|
-
{/* Tamaño Small */}
|
|
127
|
-
<div>
|
|
128
|
-
<h3 className="text-sm font-bold mb-4 text-content-primary dark:text-dark-content-primary">
|
|
129
|
-
Tamaño Small (40x40px)
|
|
130
|
-
</h3>
|
|
131
|
-
<div className="flex flex-wrap gap-3">
|
|
132
|
-
<div className="space-y-2">
|
|
133
|
-
<p className="text-xs text-content-secondary dark:text-content-secondary">Sin Borde</p>
|
|
134
|
-
<POSNumberButton size="s" border={false}>5</POSNumberButton>
|
|
135
|
-
</div>
|
|
136
|
-
<div className="space-y-2">
|
|
137
|
-
<p className="text-xs text-content-secondary dark:text-content-secondary">Con Borde</p>
|
|
138
|
-
<POSNumberButton size="s" border={true}>6</POSNumberButton>
|
|
139
|
-
</div>
|
|
140
|
-
</div>
|
|
141
|
-
<p className="text-xs text-content-secondary dark:text-content-secondary mt-2">
|
|
142
|
-
Tamaño compacto para teclados numéricos pequeños
|
|
143
|
-
</p>
|
|
144
|
-
</div>
|
|
145
|
-
|
|
146
|
-
{/* Tips */}
|
|
147
|
-
<div className="mt-6 p-4 bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-lg">
|
|
148
|
-
<p className="text-xs text-content-primary dark:text-dark-content-primary">
|
|
149
|
-
<strong>💡 Consejos:</strong>
|
|
150
|
-
<br />• Usa <code className="px-1 bg-white dark:bg-gray-700">size="l"</code> para pantallas táctiles POS
|
|
151
|
-
<br />• Usa <code className="px-1 bg-white dark:bg-gray-700">border=true</code> para mejor separación visual
|
|
152
|
-
<br />• Los botones tienen feedback táctil con <code className="px-1 bg-white dark:bg-gray-700">active:scale-95</code>
|
|
153
|
-
<br />• Tipografía Display Tiny (48px Bold) optimizada para legibilidad
|
|
154
|
-
</p>
|
|
155
|
-
</div>
|
|
156
|
-
</div>
|
|
157
|
-
),
|
|
158
|
-
};
|
|
159
|
-
|
|
160
|
-
// ============================================
|
|
161
|
-
// 3. TECLADO NUMÉRICO COMPLETO
|
|
162
|
-
// ============================================
|
|
163
|
-
export const TecladoNumerico: Story = {
|
|
164
|
-
args: { children: '1' },
|
|
165
|
-
render: () => (
|
|
166
|
-
<div className="space-y-6 p-6">
|
|
167
|
-
<h3 className="text-sm font-bold text-content-primary dark:text-dark-content-primary">
|
|
168
|
-
Teclado Numérico POS
|
|
169
|
-
</h3>
|
|
170
|
-
<div className="grid grid-cols-3 gap-2 max-w-[260px]">
|
|
171
|
-
{[1, 2, 3, 4, 5, 6, 7, 8, 9].map((num) => (
|
|
172
|
-
<POSNumberButton
|
|
173
|
-
key={num}
|
|
174
|
-
size="l"
|
|
175
|
-
border={true}
|
|
176
|
-
onClick={() => console.log(`Número ${num} presionado`)}
|
|
177
|
-
>
|
|
178
|
-
{num}
|
|
179
|
-
</POSNumberButton>
|
|
180
|
-
))}
|
|
181
|
-
<POSNumberButton size="l" border={true}>
|
|
182
|
-
.
|
|
183
|
-
</POSNumberButton>
|
|
184
|
-
<POSNumberButton size="l" border={true}>
|
|
185
|
-
0
|
|
186
|
-
</POSNumberButton>
|
|
187
|
-
<POSNumberButton size="l" border={true}>
|
|
188
|
-
←
|
|
189
|
-
</POSNumberButton>
|
|
190
|
-
</div>
|
|
191
|
-
<p className="text-xs text-content-secondary dark:text-content-secondary">
|
|
192
|
-
Ejemplo de teclado numérico completo para sistema POS
|
|
193
|
-
</p>
|
|
194
|
-
</div>
|
|
195
|
-
),
|
|
196
|
-
};
|
|
197
|
-
|
|
198
|
-
// ============================================
|
|
199
|
-
// 4. ESTADOS
|
|
200
|
-
// ============================================
|
|
201
|
-
export const Estados: Story = {
|
|
202
|
-
args: { children: '1' },
|
|
203
|
-
render: () => (
|
|
204
|
-
<div className="space-y-8 p-6">
|
|
205
|
-
<div>
|
|
206
|
-
<h3 className="text-sm font-bold mb-4 text-content-primary dark:text-dark-content-primary">
|
|
207
|
-
Normal
|
|
208
|
-
</h3>
|
|
209
|
-
<div className="flex gap-3">
|
|
210
|
-
<POSNumberButton size="l">1</POSNumberButton>
|
|
211
|
-
<POSNumberButton size="l" border>2</POSNumberButton>
|
|
212
|
-
</div>
|
|
213
|
-
</div>
|
|
214
|
-
|
|
215
|
-
<div>
|
|
216
|
-
<h3 className="text-sm font-bold mb-4 text-content-primary dark:text-dark-content-primary">
|
|
217
|
-
Hover
|
|
218
|
-
</h3>
|
|
219
|
-
<p className="text-xs text-content-secondary dark:text-content-secondary mb-2">
|
|
220
|
-
Pasa el mouse sobre los botones para ver el efecto hover
|
|
221
|
-
</p>
|
|
222
|
-
<div className="flex gap-3">
|
|
223
|
-
<POSNumberButton size="l">3</POSNumberButton>
|
|
224
|
-
<POSNumberButton size="l" border>4</POSNumberButton>
|
|
225
|
-
</div>
|
|
226
|
-
</div>
|
|
227
|
-
|
|
228
|
-
<div>
|
|
229
|
-
<h3 className="text-sm font-bold mb-4 text-content-primary dark:text-dark-content-primary">
|
|
230
|
-
Active (Presionado)
|
|
231
|
-
</h3>
|
|
232
|
-
<p className="text-xs text-content-secondary dark:text-content-secondary mb-2">
|
|
233
|
-
Presiona los botones para ver el efecto active con scale-95
|
|
234
|
-
</p>
|
|
235
|
-
<div className="flex gap-3">
|
|
236
|
-
<POSNumberButton size="l">5</POSNumberButton>
|
|
237
|
-
<POSNumberButton size="l" border>6</POSNumberButton>
|
|
238
|
-
</div>
|
|
239
|
-
</div>
|
|
240
|
-
|
|
241
|
-
<div>
|
|
242
|
-
<h3 className="text-sm font-bold mb-4 text-content-primary dark:text-dark-content-primary">
|
|
243
|
-
Deshabilitado
|
|
244
|
-
</h3>
|
|
245
|
-
<div className="flex gap-3">
|
|
246
|
-
<POSNumberButton size="l" disabled>7</POSNumberButton>
|
|
247
|
-
<POSNumberButton size="l" border disabled>8</POSNumberButton>
|
|
248
|
-
</div>
|
|
249
|
-
</div>
|
|
250
|
-
|
|
251
|
-
<div>
|
|
252
|
-
<h3 className="text-sm font-bold mb-4 text-content-primary dark:text-dark-content-primary">
|
|
253
|
-
Focus
|
|
254
|
-
</h3>
|
|
255
|
-
<p className="text-xs text-content-secondary dark:text-content-secondary mb-2">
|
|
256
|
-
Usa Tab para navegar y ver el focus ring
|
|
257
|
-
</p>
|
|
258
|
-
<div className="flex gap-3">
|
|
259
|
-
<POSNumberButton size="l">9</POSNumberButton>
|
|
260
|
-
<POSNumberButton size="l" border>0</POSNumberButton>
|
|
261
|
-
</div>
|
|
262
|
-
</div>
|
|
263
|
-
</div>
|
|
264
|
-
),
|
|
265
|
-
};
|
|
266
|
-
|
|
267
|
-
// ============================================
|
|
268
|
-
// 5. COMPARACIÓN DE TAMAÑOS
|
|
269
|
-
// ============================================
|
|
270
|
-
export const ComparacionDeTamanos: Story = {
|
|
271
|
-
args: { children: '1' },
|
|
272
|
-
render: () => (
|
|
273
|
-
<div className="space-y-6 p-6">
|
|
274
|
-
<h3 className="text-sm font-bold text-content-primary dark:text-dark-content-primary">
|
|
275
|
-
Todos los Tamaños - Sin Borde
|
|
276
|
-
</h3>
|
|
277
|
-
<div className="flex items-end gap-4">
|
|
278
|
-
<div className="space-y-2 text-center">
|
|
279
|
-
<POSNumberButton size="s" border={false}>1</POSNumberButton>
|
|
280
|
-
<p className="text-xs text-content-secondary dark:text-content-secondary">Small<br />40x40px</p>
|
|
281
|
-
</div>
|
|
282
|
-
<div className="space-y-2 text-center">
|
|
283
|
-
<POSNumberButton size="m" border={false}>2</POSNumberButton>
|
|
284
|
-
<p className="text-xs text-content-secondary dark:text-content-secondary">Medium<br />65x65px</p>
|
|
285
|
-
</div>
|
|
286
|
-
<div className="space-y-2 text-center">
|
|
287
|
-
<POSNumberButton size="l" border={false}>3</POSNumberButton>
|
|
288
|
-
<p className="text-xs text-content-secondary dark:text-content-secondary">Large<br />80x80px</p>
|
|
289
|
-
</div>
|
|
290
|
-
</div>
|
|
291
|
-
|
|
292
|
-
<h3 className="text-sm font-bold text-content-primary dark:text-dark-content-primary mt-8">
|
|
293
|
-
Todos los Tamaños - Con Borde
|
|
294
|
-
</h3>
|
|
295
|
-
<div className="flex items-end gap-4">
|
|
296
|
-
<div className="space-y-2 text-center">
|
|
297
|
-
<POSNumberButton size="s" border={true}>4</POSNumberButton>
|
|
298
|
-
<p className="text-xs text-content-secondary dark:text-content-secondary">Small<br />40x40px</p>
|
|
299
|
-
</div>
|
|
300
|
-
<div className="space-y-2 text-center">
|
|
301
|
-
<POSNumberButton size="m" border={true}>5</POSNumberButton>
|
|
302
|
-
<p className="text-xs text-content-secondary dark:text-content-secondary">Medium<br />65x65px</p>
|
|
303
|
-
</div>
|
|
304
|
-
<div className="space-y-2 text-center">
|
|
305
|
-
<POSNumberButton size="l" border={true}>6</POSNumberButton>
|
|
306
|
-
<p className="text-xs text-content-secondary dark:text-content-secondary">Large<br />80x80px</p>
|
|
307
|
-
</div>
|
|
308
|
-
</div>
|
|
309
|
-
</div>
|
|
310
|
-
),
|
|
311
|
-
};
|
|
312
|
-
|
|
313
|
-
// ============================================
|
|
314
|
-
// 6. TECLADO COMPACTO
|
|
315
|
-
// ============================================
|
|
316
|
-
export const TecladoCompacto: Story = {
|
|
317
|
-
args: { children: '1' },
|
|
318
|
-
render: () => (
|
|
319
|
-
<div className="space-y-6 p-6">
|
|
320
|
-
<h3 className="text-sm font-bold text-content-primary dark:text-dark-content-primary">
|
|
321
|
-
Teclado Numérico Compacto (Medium)
|
|
322
|
-
</h3>
|
|
323
|
-
<div className="grid grid-cols-3 gap-2 max-w-[211px]">
|
|
324
|
-
{[1, 2, 3, 4, 5, 6, 7, 8, 9, '.', 0, '←'].map((num, idx) => (
|
|
325
|
-
<POSNumberButton
|
|
326
|
-
key={idx}
|
|
327
|
-
size="m"
|
|
328
|
-
border={false}
|
|
329
|
-
onClick={() => console.log(`Tecla ${num} presionada`)}
|
|
330
|
-
>
|
|
331
|
-
{num}
|
|
332
|
-
</POSNumberButton>
|
|
333
|
-
))}
|
|
334
|
-
</div>
|
|
335
|
-
<p className="text-xs text-content-secondary dark:text-content-secondary">
|
|
336
|
-
Versión compacta ideal para tablets y pantallas medianas
|
|
337
|
-
</p>
|
|
338
|
-
</div>
|
|
339
|
-
),
|
|
340
|
-
};
|
|
341
|
-
|
|
342
|
-
// ============================================
|
|
343
|
-
// 7. TECLADO MINI
|
|
344
|
-
// ============================================
|
|
345
|
-
export const TecladoMini: Story = {
|
|
346
|
-
args: { children: '1' },
|
|
347
|
-
render: () => (
|
|
348
|
-
<div className="space-y-6 p-6">
|
|
349
|
-
<h3 className="text-sm font-bold text-content-primary dark:text-dark-content-primary">
|
|
350
|
-
Teclado Numérico Mini (Small)
|
|
351
|
-
</h3>
|
|
352
|
-
<div className="grid grid-cols-3 gap-2 max-w-[136px]">
|
|
353
|
-
{[1, 2, 3, 4, 5, 6, 7, 8, 9, '.', 0, '←'].map((num, idx) => (
|
|
354
|
-
<POSNumberButton
|
|
355
|
-
key={idx}
|
|
356
|
-
size="s"
|
|
357
|
-
border={true}
|
|
358
|
-
onClick={() => console.log(`Tecla ${num} presionada`)}
|
|
359
|
-
>
|
|
360
|
-
{num}
|
|
361
|
-
</POSNumberButton>
|
|
362
|
-
))}
|
|
363
|
-
</div>
|
|
364
|
-
<p className="text-xs text-content-secondary dark:text-content-secondary">
|
|
365
|
-
Versión mini ideal para espacios reducidos o calculadoras
|
|
366
|
-
</p>
|
|
367
|
-
</div>
|
|
368
|
-
),
|
|
369
|
-
};
|
|
370
|
-
|
|
371
|
-
// ============================================
|
|
372
|
-
// 8. OPERACIONES MATEMÁTICAS
|
|
373
|
-
// ============================================
|
|
374
|
-
export const OperacionesMatematicas: Story = {
|
|
375
|
-
args: { children: '1' },
|
|
376
|
-
render: () => (
|
|
377
|
-
<div className="space-y-6 p-6">
|
|
378
|
-
<h3 className="text-sm font-bold text-content-primary dark:text-dark-content-primary">
|
|
379
|
-
Calculadora POS
|
|
380
|
-
</h3>
|
|
381
|
-
<div className="flex gap-4">
|
|
382
|
-
{/* Números */}
|
|
383
|
-
<div className="grid grid-cols-3 gap-2">
|
|
384
|
-
{[7, 8, 9, 4, 5, 6, 1, 2, 3, 0].map((num) => (
|
|
385
|
-
<POSNumberButton
|
|
386
|
-
key={num}
|
|
387
|
-
size="m"
|
|
388
|
-
border={true}
|
|
389
|
-
onClick={() => console.log(`Número ${num}`)}
|
|
390
|
-
>
|
|
391
|
-
{num}
|
|
392
|
-
</POSNumberButton>
|
|
393
|
-
))}
|
|
394
|
-
</div>
|
|
395
|
-
|
|
396
|
-
{/* Operadores */}
|
|
397
|
-
<div className="grid grid-cols-1 gap-2">
|
|
398
|
-
{['+', '-', '×', '÷', '='].map((op) => (
|
|
399
|
-
<POSNumberButton
|
|
400
|
-
key={op}
|
|
401
|
-
size="m"
|
|
402
|
-
border={true}
|
|
403
|
-
onClick={() => console.log(`Operador ${op}`)}
|
|
404
|
-
>
|
|
405
|
-
{op}
|
|
406
|
-
</POSNumberButton>
|
|
407
|
-
))}
|
|
408
|
-
</div>
|
|
409
|
-
</div>
|
|
410
|
-
<p className="text-xs text-content-secondary dark:text-content-secondary">
|
|
411
|
-
Ejemplo de calculadora POS con números y operadores
|
|
412
|
-
</p>
|
|
413
|
-
</div>
|
|
414
|
-
),
|
|
415
|
-
};
|
|
@@ -1,179 +0,0 @@
|
|
|
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 +0,0 @@
|
|
|
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
|
-
}
|