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,318 +1,318 @@
|
|
|
1
|
-
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
-
import { POSProductButton } from './POSProductButton';
|
|
3
|
-
|
|
4
|
-
// Imagen de ejemplo (placeholder de Unsplash)
|
|
5
|
-
const exampleImage = 'https://images.unsplash.com/photo-1546069901-ba9599a7e63c?w=300&h=200&fit=crop';
|
|
6
|
-
|
|
7
|
-
const meta = {
|
|
8
|
-
title: 'Siesa UI Kit/POSProductButton',
|
|
9
|
-
component: POSProductButton,
|
|
10
|
-
parameters: {
|
|
11
|
-
layout: 'centered',
|
|
12
|
-
docs: {
|
|
13
|
-
description: {
|
|
14
|
-
component: 'Botón especializado para sistemas POS 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.',
|
|
15
|
-
},
|
|
16
|
-
},
|
|
17
|
-
},
|
|
18
|
-
tags: ['autodocs'],
|
|
19
|
-
argTypes: {
|
|
20
|
-
image: {
|
|
21
|
-
control: 'text',
|
|
22
|
-
description: 'URL de la imagen del producto',
|
|
23
|
-
table: {
|
|
24
|
-
type: { summary: 'string' },
|
|
25
|
-
category: 'Contenido',
|
|
26
|
-
},
|
|
27
|
-
},
|
|
28
|
-
label: {
|
|
29
|
-
control: 'text',
|
|
30
|
-
description: 'Texto del producto (nombre o descripción)',
|
|
31
|
-
table: {
|
|
32
|
-
type: { summary: 'string' },
|
|
33
|
-
category: 'Contenido',
|
|
34
|
-
},
|
|
35
|
-
},
|
|
36
|
-
active: {
|
|
37
|
-
control: 'boolean',
|
|
38
|
-
description: 'Si el botón está en estado activo/seleccionado',
|
|
39
|
-
table: {
|
|
40
|
-
type: { summary: 'boolean' },
|
|
41
|
-
defaultValue: { summary: 'false' },
|
|
42
|
-
category: 'Estado',
|
|
43
|
-
},
|
|
44
|
-
},
|
|
45
|
-
disabled: {
|
|
46
|
-
control: 'boolean',
|
|
47
|
-
description: 'Si el botón está deshabilitado',
|
|
48
|
-
table: {
|
|
49
|
-
type: { summary: 'boolean' },
|
|
50
|
-
defaultValue: { summary: 'false' },
|
|
51
|
-
category: 'Estado',
|
|
52
|
-
},
|
|
53
|
-
},
|
|
54
|
-
onClick: {
|
|
55
|
-
action: 'clicked',
|
|
56
|
-
description: 'Handler para evento click',
|
|
57
|
-
table: {
|
|
58
|
-
type: { summary: '(event: MouseEvent<HTMLButtonElement>) => void' },
|
|
59
|
-
category: 'Comportamiento',
|
|
60
|
-
},
|
|
61
|
-
},
|
|
62
|
-
className: {
|
|
63
|
-
control: 'text',
|
|
64
|
-
description: 'Clases CSS adicionales',
|
|
65
|
-
table: {
|
|
66
|
-
type: { summary: 'string' },
|
|
67
|
-
category: 'Apariencia',
|
|
68
|
-
},
|
|
69
|
-
},
|
|
70
|
-
ariaLabel: {
|
|
71
|
-
control: 'text',
|
|
72
|
-
description: 'Label para accesibilidad (ARIA)',
|
|
73
|
-
table: {
|
|
74
|
-
type: { summary: 'string' },
|
|
75
|
-
category: 'Accesibilidad',
|
|
76
|
-
},
|
|
77
|
-
},
|
|
78
|
-
},
|
|
79
|
-
} satisfies Meta<typeof POSProductButton>;
|
|
80
|
-
|
|
81
|
-
export default meta;
|
|
82
|
-
type Story = StoryObj<typeof meta>;
|
|
83
|
-
|
|
84
|
-
// ============================================
|
|
85
|
-
// 1. PLAYGROUND INTERACTIVO
|
|
86
|
-
// ============================================
|
|
87
|
-
export const Playground: Story = {
|
|
88
|
-
args: {
|
|
89
|
-
image: exampleImage,
|
|
90
|
-
label: 'A la parrilla',
|
|
91
|
-
active: false,
|
|
92
|
-
disabled: false,
|
|
93
|
-
},
|
|
94
|
-
};
|
|
95
|
-
|
|
96
|
-
// ============================================
|
|
97
|
-
// 2. TODOS LOS ESTADOS
|
|
98
|
-
// ============================================
|
|
99
|
-
export const TodosLosEstados: Story = {
|
|
100
|
-
args: {
|
|
101
|
-
image: exampleImage,
|
|
102
|
-
label: 'A la parrilla',
|
|
103
|
-
},
|
|
104
|
-
render: () => (
|
|
105
|
-
<div className="space-y-8 p-6">
|
|
106
|
-
{/* Estado Enabled (Normal) */}
|
|
107
|
-
<div>
|
|
108
|
-
<h3 className="text-sm font-bold mb-4 text-content-primary dark:text-dark-content-primary">
|
|
109
|
-
Enabled (Normal)
|
|
110
|
-
</h3>
|
|
111
|
-
<div className="flex flex-wrap gap-3">
|
|
112
|
-
<POSProductButton
|
|
113
|
-
image={exampleImage}
|
|
114
|
-
label="A la parrilla"
|
|
115
|
-
/>
|
|
116
|
-
</div>
|
|
117
|
-
<p className="text-xs text-content-secondary dark:text-content-secondary mt-2">
|
|
118
|
-
Estado normal del botón, listo para ser clickeado
|
|
119
|
-
</p>
|
|
120
|
-
</div>
|
|
121
|
-
|
|
122
|
-
{/* Estado Actived (Seleccionado) */}
|
|
123
|
-
<div>
|
|
124
|
-
<h3 className="text-sm font-bold mb-4 text-content-primary dark:text-dark-content-primary">
|
|
125
|
-
Actived (Seleccionado)
|
|
126
|
-
</h3>
|
|
127
|
-
<div className="flex flex-wrap gap-3">
|
|
128
|
-
<POSProductButton
|
|
129
|
-
image={exampleImage}
|
|
130
|
-
label="A la parrilla"
|
|
131
|
-
active={true}
|
|
132
|
-
/>
|
|
133
|
-
</div>
|
|
134
|
-
<p className="text-xs text-content-secondary dark:text-content-secondary mt-2">
|
|
135
|
-
Estado activo cuando el producto está seleccionado
|
|
136
|
-
</p>
|
|
137
|
-
</div>
|
|
138
|
-
|
|
139
|
-
{/* Estado Disabled (Deshabilitado) */}
|
|
140
|
-
<div>
|
|
141
|
-
<h3 className="text-sm font-bold mb-4 text-content-primary dark:text-dark-content-primary">
|
|
142
|
-
Disabled (Deshabilitado)
|
|
143
|
-
</h3>
|
|
144
|
-
<div className="flex flex-wrap gap-3">
|
|
145
|
-
<POSProductButton
|
|
146
|
-
image={exampleImage}
|
|
147
|
-
label="A la parrilla"
|
|
148
|
-
disabled={true}
|
|
149
|
-
/>
|
|
150
|
-
</div>
|
|
151
|
-
<p className="text-xs text-content-secondary dark:text-content-secondary mt-2">
|
|
152
|
-
Estado deshabilitado con opacidad reducida
|
|
153
|
-
</p>
|
|
154
|
-
</div>
|
|
155
|
-
|
|
156
|
-
{/* Tips */}
|
|
157
|
-
<div className="mt-6 p-4 bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-lg">
|
|
158
|
-
<p className="text-xs text-content-secondary dark:text-content-secondary">
|
|
159
|
-
<strong>💡 Consejos:</strong>
|
|
160
|
-
<br />• Usa el estado <code className="px-1 bg-white dark:bg-gray-700">active</code> para indicar el producto seleccionado
|
|
161
|
-
<br />• Usa el estado <code className="px-1 bg-white dark:bg-gray-700">disabled</code> para productos no disponibles
|
|
162
|
-
<br />• El botón tiene un aspect ratio de 158:80 para la imagen (según diseño de Figma)
|
|
163
|
-
</p>
|
|
164
|
-
</div>
|
|
165
|
-
</div>
|
|
166
|
-
),
|
|
167
|
-
};
|
|
168
|
-
|
|
169
|
-
// ============================================
|
|
170
|
-
// 3. EJEMPLOS DE USO
|
|
171
|
-
// ============================================
|
|
172
|
-
export const EjemplosDeUso: Story = {
|
|
173
|
-
args: {
|
|
174
|
-
image: exampleImage,
|
|
175
|
-
label: 'A la parrilla',
|
|
176
|
-
},
|
|
177
|
-
render: () => (
|
|
178
|
-
<div className="space-y-8 p-6">
|
|
179
|
-
{/* Grid de productos */}
|
|
180
|
-
<div>
|
|
181
|
-
<h3 className="text-sm font-bold mb-4 text-content-primary dark:text-dark-content-primary">
|
|
182
|
-
Grid de Productos (Típico en POS)
|
|
183
|
-
</h3>
|
|
184
|
-
<div className="grid grid-cols-3 gap-4 max-w-xl">
|
|
185
|
-
<POSProductButton
|
|
186
|
-
image={exampleImage}
|
|
187
|
-
label="A la parrilla"
|
|
188
|
-
active={true}
|
|
189
|
-
/>
|
|
190
|
-
<POSProductButton
|
|
191
|
-
image={exampleImage}
|
|
192
|
-
label="Al horno"
|
|
193
|
-
/>
|
|
194
|
-
<POSProductButton
|
|
195
|
-
image={exampleImage}
|
|
196
|
-
label="Frito"
|
|
197
|
-
/>
|
|
198
|
-
<POSProductButton
|
|
199
|
-
image={exampleImage}
|
|
200
|
-
label="Al vapor"
|
|
201
|
-
/>
|
|
202
|
-
<POSProductButton
|
|
203
|
-
image={exampleImage}
|
|
204
|
-
label="Asado"
|
|
205
|
-
/>
|
|
206
|
-
<POSProductButton
|
|
207
|
-
image={exampleImage}
|
|
208
|
-
label="Agotado"
|
|
209
|
-
disabled={true}
|
|
210
|
-
/>
|
|
211
|
-
</div>
|
|
212
|
-
<p className="text-xs text-content-secondary dark:text-content-secondary mt-2">
|
|
213
|
-
Configuración típica de 3 columnas para pantallas de punto de venta
|
|
214
|
-
</p>
|
|
215
|
-
</div>
|
|
216
|
-
|
|
217
|
-
{/* Lista horizontal */}
|
|
218
|
-
<div>
|
|
219
|
-
<h3 className="text-sm font-bold mb-4 text-content-primary dark:text-dark-content-primary">
|
|
220
|
-
Lista Horizontal (Categorías)
|
|
221
|
-
</h3>
|
|
222
|
-
<div className="flex gap-3 overflow-x-auto pb-2 max-w-2xl">
|
|
223
|
-
<POSProductButton
|
|
224
|
-
image={exampleImage}
|
|
225
|
-
label="Carnes"
|
|
226
|
-
active={true}
|
|
227
|
-
/>
|
|
228
|
-
<POSProductButton
|
|
229
|
-
image={exampleImage}
|
|
230
|
-
label="Pescados"
|
|
231
|
-
/>
|
|
232
|
-
<POSProductButton
|
|
233
|
-
image={exampleImage}
|
|
234
|
-
label="Vegetales"
|
|
235
|
-
/>
|
|
236
|
-
<POSProductButton
|
|
237
|
-
image={exampleImage}
|
|
238
|
-
label="Postres"
|
|
239
|
-
/>
|
|
240
|
-
</div>
|
|
241
|
-
<p className="text-xs text-content-secondary dark:text-content-secondary mt-2">
|
|
242
|
-
Navegación horizontal para categorías de productos
|
|
243
|
-
</p>
|
|
244
|
-
</div>
|
|
245
|
-
|
|
246
|
-
{/* Con handlers */}
|
|
247
|
-
<div>
|
|
248
|
-
<h3 className="text-sm font-bold mb-4 text-content-primary dark:text-dark-content-primary">
|
|
249
|
-
Con Handlers de Click
|
|
250
|
-
</h3>
|
|
251
|
-
<div className="flex gap-3">
|
|
252
|
-
<POSProductButton
|
|
253
|
-
image={exampleImage}
|
|
254
|
-
label="Click aquí"
|
|
255
|
-
onClick={() => alert('Producto seleccionado: A la parrilla')}
|
|
256
|
-
/>
|
|
257
|
-
</div>
|
|
258
|
-
<p className="text-xs text-content-secondary dark:text-content-secondary mt-2">
|
|
259
|
-
Click en el botón para ver la acción
|
|
260
|
-
</p>
|
|
261
|
-
</div>
|
|
262
|
-
</div>
|
|
263
|
-
),
|
|
264
|
-
};
|
|
265
|
-
|
|
266
|
-
// ============================================
|
|
267
|
-
// 4. VARIACIONES DE CONTENIDO
|
|
268
|
-
// ============================================
|
|
269
|
-
export const VariacionesDeContenido: Story = {
|
|
270
|
-
args: {
|
|
271
|
-
image: exampleImage,
|
|
272
|
-
label: 'A la parrilla',
|
|
273
|
-
},
|
|
274
|
-
render: () => (
|
|
275
|
-
<div className="space-y-8 p-6">
|
|
276
|
-
{/* Labels cortos */}
|
|
277
|
-
<div>
|
|
278
|
-
<h3 className="text-sm font-bold mb-4 text-content-primary dark:text-dark-content-primary">
|
|
279
|
-
Labels Cortos
|
|
280
|
-
</h3>
|
|
281
|
-
<div className="flex gap-3">
|
|
282
|
-
<POSProductButton
|
|
283
|
-
image={exampleImage}
|
|
284
|
-
label="Carne"
|
|
285
|
-
/>
|
|
286
|
-
<POSProductButton
|
|
287
|
-
image={exampleImage}
|
|
288
|
-
label="Pollo"
|
|
289
|
-
/>
|
|
290
|
-
<POSProductButton
|
|
291
|
-
image={exampleImage}
|
|
292
|
-
label="Pez"
|
|
293
|
-
/>
|
|
294
|
-
</div>
|
|
295
|
-
</div>
|
|
296
|
-
|
|
297
|
-
{/* Labels largos */}
|
|
298
|
-
<div>
|
|
299
|
-
<h3 className="text-sm font-bold mb-4 text-content-primary dark:text-dark-content-primary">
|
|
300
|
-
Labels Largos
|
|
301
|
-
</h3>
|
|
302
|
-
<div className="flex gap-3">
|
|
303
|
-
<POSProductButton
|
|
304
|
-
image={exampleImage}
|
|
305
|
-
label="Parrillada de res con vegetales"
|
|
306
|
-
/>
|
|
307
|
-
<POSProductButton
|
|
308
|
-
image={exampleImage}
|
|
309
|
-
label="Pescado a la plancha con limón"
|
|
310
|
-
/>
|
|
311
|
-
</div>
|
|
312
|
-
<p className="text-xs text-content-secondary dark:text-content-secondary mt-2">
|
|
313
|
-
Los labels largos se ajustan automáticamente
|
|
314
|
-
</p>
|
|
315
|
-
</div>
|
|
316
|
-
</div>
|
|
317
|
-
),
|
|
318
|
-
};
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { POSProductButton } from './POSProductButton';
|
|
3
|
+
|
|
4
|
+
// Imagen de ejemplo (placeholder de Unsplash)
|
|
5
|
+
const exampleImage = 'https://images.unsplash.com/photo-1546069901-ba9599a7e63c?w=300&h=200&fit=crop';
|
|
6
|
+
|
|
7
|
+
const meta = {
|
|
8
|
+
title: 'Siesa UI Kit/POSProductButton',
|
|
9
|
+
component: POSProductButton,
|
|
10
|
+
parameters: {
|
|
11
|
+
layout: 'centered',
|
|
12
|
+
docs: {
|
|
13
|
+
description: {
|
|
14
|
+
component: 'Botón especializado para sistemas POS 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.',
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
tags: ['autodocs'],
|
|
19
|
+
argTypes: {
|
|
20
|
+
image: {
|
|
21
|
+
control: 'text',
|
|
22
|
+
description: 'URL de la imagen del producto',
|
|
23
|
+
table: {
|
|
24
|
+
type: { summary: 'string' },
|
|
25
|
+
category: 'Contenido',
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
label: {
|
|
29
|
+
control: 'text',
|
|
30
|
+
description: 'Texto del producto (nombre o descripción)',
|
|
31
|
+
table: {
|
|
32
|
+
type: { summary: 'string' },
|
|
33
|
+
category: 'Contenido',
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
active: {
|
|
37
|
+
control: 'boolean',
|
|
38
|
+
description: 'Si el botón está en estado activo/seleccionado',
|
|
39
|
+
table: {
|
|
40
|
+
type: { summary: 'boolean' },
|
|
41
|
+
defaultValue: { summary: 'false' },
|
|
42
|
+
category: 'Estado',
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
disabled: {
|
|
46
|
+
control: 'boolean',
|
|
47
|
+
description: 'Si el botón está deshabilitado',
|
|
48
|
+
table: {
|
|
49
|
+
type: { summary: 'boolean' },
|
|
50
|
+
defaultValue: { summary: 'false' },
|
|
51
|
+
category: 'Estado',
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
onClick: {
|
|
55
|
+
action: 'clicked',
|
|
56
|
+
description: 'Handler para evento click',
|
|
57
|
+
table: {
|
|
58
|
+
type: { summary: '(event: MouseEvent<HTMLButtonElement>) => void' },
|
|
59
|
+
category: 'Comportamiento',
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
className: {
|
|
63
|
+
control: 'text',
|
|
64
|
+
description: 'Clases CSS adicionales',
|
|
65
|
+
table: {
|
|
66
|
+
type: { summary: 'string' },
|
|
67
|
+
category: 'Apariencia',
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
ariaLabel: {
|
|
71
|
+
control: 'text',
|
|
72
|
+
description: 'Label para accesibilidad (ARIA)',
|
|
73
|
+
table: {
|
|
74
|
+
type: { summary: 'string' },
|
|
75
|
+
category: 'Accesibilidad',
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
} satisfies Meta<typeof POSProductButton>;
|
|
80
|
+
|
|
81
|
+
export default meta;
|
|
82
|
+
type Story = StoryObj<typeof meta>;
|
|
83
|
+
|
|
84
|
+
// ============================================
|
|
85
|
+
// 1. PLAYGROUND INTERACTIVO
|
|
86
|
+
// ============================================
|
|
87
|
+
export const Playground: Story = {
|
|
88
|
+
args: {
|
|
89
|
+
image: exampleImage,
|
|
90
|
+
label: 'A la parrilla',
|
|
91
|
+
active: false,
|
|
92
|
+
disabled: false,
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
// ============================================
|
|
97
|
+
// 2. TODOS LOS ESTADOS
|
|
98
|
+
// ============================================
|
|
99
|
+
export const TodosLosEstados: Story = {
|
|
100
|
+
args: {
|
|
101
|
+
image: exampleImage,
|
|
102
|
+
label: 'A la parrilla',
|
|
103
|
+
},
|
|
104
|
+
render: () => (
|
|
105
|
+
<div className="space-y-8 p-6">
|
|
106
|
+
{/* Estado Enabled (Normal) */}
|
|
107
|
+
<div>
|
|
108
|
+
<h3 className="text-sm font-bold mb-4 text-content-primary dark:text-dark-content-primary">
|
|
109
|
+
Enabled (Normal)
|
|
110
|
+
</h3>
|
|
111
|
+
<div className="flex flex-wrap gap-3">
|
|
112
|
+
<POSProductButton
|
|
113
|
+
image={exampleImage}
|
|
114
|
+
label="A la parrilla"
|
|
115
|
+
/>
|
|
116
|
+
</div>
|
|
117
|
+
<p className="text-xs text-content-secondary dark:text-content-secondary mt-2">
|
|
118
|
+
Estado normal del botón, listo para ser clickeado
|
|
119
|
+
</p>
|
|
120
|
+
</div>
|
|
121
|
+
|
|
122
|
+
{/* Estado Actived (Seleccionado) */}
|
|
123
|
+
<div>
|
|
124
|
+
<h3 className="text-sm font-bold mb-4 text-content-primary dark:text-dark-content-primary">
|
|
125
|
+
Actived (Seleccionado)
|
|
126
|
+
</h3>
|
|
127
|
+
<div className="flex flex-wrap gap-3">
|
|
128
|
+
<POSProductButton
|
|
129
|
+
image={exampleImage}
|
|
130
|
+
label="A la parrilla"
|
|
131
|
+
active={true}
|
|
132
|
+
/>
|
|
133
|
+
</div>
|
|
134
|
+
<p className="text-xs text-content-secondary dark:text-content-secondary mt-2">
|
|
135
|
+
Estado activo cuando el producto está seleccionado
|
|
136
|
+
</p>
|
|
137
|
+
</div>
|
|
138
|
+
|
|
139
|
+
{/* Estado Disabled (Deshabilitado) */}
|
|
140
|
+
<div>
|
|
141
|
+
<h3 className="text-sm font-bold mb-4 text-content-primary dark:text-dark-content-primary">
|
|
142
|
+
Disabled (Deshabilitado)
|
|
143
|
+
</h3>
|
|
144
|
+
<div className="flex flex-wrap gap-3">
|
|
145
|
+
<POSProductButton
|
|
146
|
+
image={exampleImage}
|
|
147
|
+
label="A la parrilla"
|
|
148
|
+
disabled={true}
|
|
149
|
+
/>
|
|
150
|
+
</div>
|
|
151
|
+
<p className="text-xs text-content-secondary dark:text-content-secondary mt-2">
|
|
152
|
+
Estado deshabilitado con opacidad reducida
|
|
153
|
+
</p>
|
|
154
|
+
</div>
|
|
155
|
+
|
|
156
|
+
{/* Tips */}
|
|
157
|
+
<div className="mt-6 p-4 bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-lg">
|
|
158
|
+
<p className="text-xs text-content-secondary dark:text-content-secondary">
|
|
159
|
+
<strong>💡 Consejos:</strong>
|
|
160
|
+
<br />• Usa el estado <code className="px-1 bg-white dark:bg-gray-700">active</code> para indicar el producto seleccionado
|
|
161
|
+
<br />• Usa el estado <code className="px-1 bg-white dark:bg-gray-700">disabled</code> para productos no disponibles
|
|
162
|
+
<br />• El botón tiene un aspect ratio de 158:80 para la imagen (según diseño de Figma)
|
|
163
|
+
</p>
|
|
164
|
+
</div>
|
|
165
|
+
</div>
|
|
166
|
+
),
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
// ============================================
|
|
170
|
+
// 3. EJEMPLOS DE USO
|
|
171
|
+
// ============================================
|
|
172
|
+
export const EjemplosDeUso: Story = {
|
|
173
|
+
args: {
|
|
174
|
+
image: exampleImage,
|
|
175
|
+
label: 'A la parrilla',
|
|
176
|
+
},
|
|
177
|
+
render: () => (
|
|
178
|
+
<div className="space-y-8 p-6">
|
|
179
|
+
{/* Grid de productos */}
|
|
180
|
+
<div>
|
|
181
|
+
<h3 className="text-sm font-bold mb-4 text-content-primary dark:text-dark-content-primary">
|
|
182
|
+
Grid de Productos (Típico en POS)
|
|
183
|
+
</h3>
|
|
184
|
+
<div className="grid grid-cols-3 gap-4 max-w-xl">
|
|
185
|
+
<POSProductButton
|
|
186
|
+
image={exampleImage}
|
|
187
|
+
label="A la parrilla"
|
|
188
|
+
active={true}
|
|
189
|
+
/>
|
|
190
|
+
<POSProductButton
|
|
191
|
+
image={exampleImage}
|
|
192
|
+
label="Al horno"
|
|
193
|
+
/>
|
|
194
|
+
<POSProductButton
|
|
195
|
+
image={exampleImage}
|
|
196
|
+
label="Frito"
|
|
197
|
+
/>
|
|
198
|
+
<POSProductButton
|
|
199
|
+
image={exampleImage}
|
|
200
|
+
label="Al vapor"
|
|
201
|
+
/>
|
|
202
|
+
<POSProductButton
|
|
203
|
+
image={exampleImage}
|
|
204
|
+
label="Asado"
|
|
205
|
+
/>
|
|
206
|
+
<POSProductButton
|
|
207
|
+
image={exampleImage}
|
|
208
|
+
label="Agotado"
|
|
209
|
+
disabled={true}
|
|
210
|
+
/>
|
|
211
|
+
</div>
|
|
212
|
+
<p className="text-xs text-content-secondary dark:text-content-secondary mt-2">
|
|
213
|
+
Configuración típica de 3 columnas para pantallas de punto de venta
|
|
214
|
+
</p>
|
|
215
|
+
</div>
|
|
216
|
+
|
|
217
|
+
{/* Lista horizontal */}
|
|
218
|
+
<div>
|
|
219
|
+
<h3 className="text-sm font-bold mb-4 text-content-primary dark:text-dark-content-primary">
|
|
220
|
+
Lista Horizontal (Categorías)
|
|
221
|
+
</h3>
|
|
222
|
+
<div className="flex gap-3 overflow-x-auto pb-2 max-w-2xl">
|
|
223
|
+
<POSProductButton
|
|
224
|
+
image={exampleImage}
|
|
225
|
+
label="Carnes"
|
|
226
|
+
active={true}
|
|
227
|
+
/>
|
|
228
|
+
<POSProductButton
|
|
229
|
+
image={exampleImage}
|
|
230
|
+
label="Pescados"
|
|
231
|
+
/>
|
|
232
|
+
<POSProductButton
|
|
233
|
+
image={exampleImage}
|
|
234
|
+
label="Vegetales"
|
|
235
|
+
/>
|
|
236
|
+
<POSProductButton
|
|
237
|
+
image={exampleImage}
|
|
238
|
+
label="Postres"
|
|
239
|
+
/>
|
|
240
|
+
</div>
|
|
241
|
+
<p className="text-xs text-content-secondary dark:text-content-secondary mt-2">
|
|
242
|
+
Navegación horizontal para categorías de productos
|
|
243
|
+
</p>
|
|
244
|
+
</div>
|
|
245
|
+
|
|
246
|
+
{/* Con handlers */}
|
|
247
|
+
<div>
|
|
248
|
+
<h3 className="text-sm font-bold mb-4 text-content-primary dark:text-dark-content-primary">
|
|
249
|
+
Con Handlers de Click
|
|
250
|
+
</h3>
|
|
251
|
+
<div className="flex gap-3">
|
|
252
|
+
<POSProductButton
|
|
253
|
+
image={exampleImage}
|
|
254
|
+
label="Click aquí"
|
|
255
|
+
onClick={() => alert('Producto seleccionado: A la parrilla')}
|
|
256
|
+
/>
|
|
257
|
+
</div>
|
|
258
|
+
<p className="text-xs text-content-secondary dark:text-content-secondary mt-2">
|
|
259
|
+
Click en el botón para ver la acción
|
|
260
|
+
</p>
|
|
261
|
+
</div>
|
|
262
|
+
</div>
|
|
263
|
+
),
|
|
264
|
+
};
|
|
265
|
+
|
|
266
|
+
// ============================================
|
|
267
|
+
// 4. VARIACIONES DE CONTENIDO
|
|
268
|
+
// ============================================
|
|
269
|
+
export const VariacionesDeContenido: Story = {
|
|
270
|
+
args: {
|
|
271
|
+
image: exampleImage,
|
|
272
|
+
label: 'A la parrilla',
|
|
273
|
+
},
|
|
274
|
+
render: () => (
|
|
275
|
+
<div className="space-y-8 p-6">
|
|
276
|
+
{/* Labels cortos */}
|
|
277
|
+
<div>
|
|
278
|
+
<h3 className="text-sm font-bold mb-4 text-content-primary dark:text-dark-content-primary">
|
|
279
|
+
Labels Cortos
|
|
280
|
+
</h3>
|
|
281
|
+
<div className="flex gap-3">
|
|
282
|
+
<POSProductButton
|
|
283
|
+
image={exampleImage}
|
|
284
|
+
label="Carne"
|
|
285
|
+
/>
|
|
286
|
+
<POSProductButton
|
|
287
|
+
image={exampleImage}
|
|
288
|
+
label="Pollo"
|
|
289
|
+
/>
|
|
290
|
+
<POSProductButton
|
|
291
|
+
image={exampleImage}
|
|
292
|
+
label="Pez"
|
|
293
|
+
/>
|
|
294
|
+
</div>
|
|
295
|
+
</div>
|
|
296
|
+
|
|
297
|
+
{/* Labels largos */}
|
|
298
|
+
<div>
|
|
299
|
+
<h3 className="text-sm font-bold mb-4 text-content-primary dark:text-dark-content-primary">
|
|
300
|
+
Labels Largos
|
|
301
|
+
</h3>
|
|
302
|
+
<div className="flex gap-3">
|
|
303
|
+
<POSProductButton
|
|
304
|
+
image={exampleImage}
|
|
305
|
+
label="Parrillada de res con vegetales"
|
|
306
|
+
/>
|
|
307
|
+
<POSProductButton
|
|
308
|
+
image={exampleImage}
|
|
309
|
+
label="Pescado a la plancha con limón"
|
|
310
|
+
/>
|
|
311
|
+
</div>
|
|
312
|
+
<p className="text-xs text-content-secondary dark:text-content-secondary mt-2">
|
|
313
|
+
Los labels largos se ajustan automáticamente
|
|
314
|
+
</p>
|
|
315
|
+
</div>
|
|
316
|
+
</div>
|
|
317
|
+
),
|
|
318
|
+
};
|