ywana-core8 0.1.103 → 0.2.1
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.css +4941 -324
- package/dist/index.js +42338 -0
- package/dist/index.js.map +1 -0
- package/dist/index.modern.js +37458 -31678
- package/dist/index.modern.js.map +1 -1
- package/dist/index.umd.js +39634 -34010
- package/dist/index.umd.js.map +1 -1
- package/package.json +26 -29
- package/src/Test.stories.jsx +28 -0
- package/src/desktop/Desktop.stories.jsx +110 -0
- package/src/desktop/WindowContext.js +135 -0
- package/src/desktop/WindowManager.js +355 -0
- package/src/desktop/desktop.css +55 -4
- package/src/desktop/desktop.js +312 -6
- package/src/desktop/index.js +7 -0
- package/src/desktop/window.css +229 -36
- package/src/desktop/window.js +254 -20
- package/src/desktop.backup/desktop.css +6 -0
- package/src/desktop.backup/desktop.js +13 -0
- package/src/desktop.backup/window.css +58 -0
- package/src/desktop.backup/window.js +27 -0
- package/src/html/Accordion.stories.jsx +178 -0
- package/src/html/Button.stories.jsx +175 -0
- package/src/html/Checkbox.stories.jsx +131 -0
- package/src/html/Chip.stories.jsx +189 -0
- package/src/html/Color.stories.jsx +234 -0
- package/src/html/Form.stories.jsx +271 -0
- package/src/html/Icon.stories.jsx +233 -0
- package/src/html/Progress.stories.jsx +247 -0
- package/src/html/Radio.stories.jsx +289 -0
- package/src/html/StyleTest.stories.jsx +81 -0
- package/src/html/Switch.stories.jsx +329 -0
- package/src/html/Tab.stories.jsx +239 -0
- package/src/html/Table.stories.jsx +188 -0
- package/src/html/Table2.stories.jsx +238 -0
- package/src/html/TextField2.stories.jsx +337 -0
- package/src/html/Tree.stories.jsx +285 -0
- package/src/html/accordion.example.js +0 -74
- package/src/html/accordion.js +1 -6
- package/src/html/button.js +2 -13
- package/src/html/checkbox.js +1 -9
- package/src/html/chip.js +2 -19
- package/src/html/color.js +1 -14
- package/src/html/form.js +4 -15
- package/src/html/header2.js +1 -12
- package/src/html/icon.js +1 -7
- package/src/html/index.js +1 -1
- package/src/html/list.js +1 -19
- package/src/html/menu.js +9 -5
- package/src/html/progress.js +5 -53
- package/src/html/property.js +9 -25
- package/src/html/radio.js +2 -16
- package/src/html/section.js +1 -6
- package/src/html/selector.js +2 -19
- package/src/html/switch.css +134 -100
- package/src/html/switch.example.js +46 -36
- package/src/html/switch.js +43 -192
- package/src/html/tab.js +3 -24
- package/src/html/text.js +1 -12
- package/src/html/textfield2.js +5 -42
- package/src/html/thumbnail.js +1 -12
- package/src/html/tokenfield.js +2 -21
- package/src/html/tree.js +3 -35
- package/src/index.js +1 -0
- package/__previewjs__/Wrapper.tsx +0 -14
- package/build-doc.sh +0 -10
- package/db/db.json +0 -89
- package/db/routes.json +0 -0
- package/dist/index.cjs +0 -36722
- package/dist/index.cjs.map +0 -1
- package/dist/index.css.map +0 -1
- package/doc/README.md +0 -196
- package/doc/evalulations/ACCORDION_EVALUATION.md +0 -583
- package/doc/evalulations/CHECKBOX_EVALUATION.md +0 -273
- package/doc/evalulations/CHIP_EVALUATION.md +0 -542
- package/doc/evalulations/COLOR_EVALUATION.md +0 -524
- package/doc/evalulations/COMPONENTS_EVALUATION.md +0 -477
- package/doc/evalulations/FORM_EVALUATION.md +0 -459
- package/doc/evalulations/HEADER_EVALUATION.md +0 -436
- package/doc/evalulations/ICON_EVALUATION.md +0 -254
- package/doc/evalulations/LIST_EVALUATION.md +0 -574
- package/doc/evalulations/PROGRESS_EVALUATION.md +0 -450
- package/doc/evalulations/RADIO_EVALUATION.md +0 -439
- package/doc/evalulations/RADIO_VISUAL_FIX.md +0 -183
- package/doc/evalulations/SECTION_IMPROVEMENTS.md +0 -153
- package/doc/evalulations/SWITCH_EVALUATION.md +0 -335
- package/doc/evalulations/SWITCH_VISUAL_FIX.md +0 -232
- package/doc/evalulations/TAB_EVALUATION.md +0 -626
- package/doc/evalulations/TEXTFIELD_EVALUATION.md +0 -747
- package/doc/evalulations/TOOLTIP_FIX.md +0 -157
- package/doc/evalulations/TREE_EVALUATION.md +0 -708
- package/doc/index.html +0 -0
- package/doc/package-lock.json +0 -17298
- package/doc/package.json +0 -34
- package/doc/public/index.html +0 -24
- package/doc/scripts/generate-examples.js +0 -129
- package/doc/src/App.css +0 -171
- package/doc/src/App.js +0 -114
- package/doc/src/components/ExamplePage.js +0 -129
- package/doc/src/components/WelcomePage.js +0 -84
- package/doc/src/index.css +0 -246
- package/doc/src/index.js +0 -17
- package/doc/src/theme.css +0 -256
- package/jest.config.js +0 -24
- package/preview.config.js +0 -38
- package/publish.sh +0 -6
- package/src/desktop/dektop.test.js +0 -11
- package/src/domain/CollectionAPI.test.js +0 -19
- package/src/domain/ContentEditor.test.js +0 -52
- package/src/domain2/CollectionAPI.test.js +0 -19
- package/src/domain2/CollectionContext.test.js +0 -71
- package/src/domain2/CollectionPage.test.js +0 -112
- package/src/domain2/DynamicForm.test.js +0 -47
- package/src/html/accordion.test.js +0 -37
- package/src/html/accordion.unit.test.js +0 -334
- package/src/html/button.example.new.js +0 -416
- package/src/html/button.test.js +0 -422
- package/src/html/checkbox.test.js +0 -285
- package/src/html/chip.test.js +0 -425
- package/src/html/color.example.js.backup +0 -527
- package/src/html/color.test.js +0 -377
- package/src/html/components.example.js.backup +0 -492
- package/src/html/components_enhanced.test.js +0 -581
- package/src/html/form.example.js.backup +0 -385
- package/src/html/form.test.js +0 -369
- package/src/html/header2.example.js.backup +0 -411
- package/src/html/header2.test.js +0 -377
- package/src/html/icon.example.js.backup +0 -268
- package/src/html/icon.test.js +0 -231
- package/src/html/label.test.js +0 -0
- package/src/html/list.example.js.backup +0 -404
- package/src/html/list.test.js +0 -383
- package/src/html/progress.example.js.backup +0 -424
- package/src/html/progress.test.js +0 -313
- package/src/html/property.example.js.backup +0 -553
- package/src/html/property.test.js +0 -371
- package/src/html/radio.example.js.backup +0 -389
- package/src/html/radio.test.js +0 -318
- package/src/html/section.example.js.backup +0 -99
- package/src/html/section.test.js +0 -131
- package/src/html/selector.test.js +0 -20
- package/src/html/switch.example.js.backup +0 -461
- package/src/html/switch.test.js +0 -355
- package/src/html/tab.example.js.backup +0 -446
- package/src/html/tab.test.js +0 -25
- package/src/html/tab_enhanced.test.js +0 -504
- package/src/html/table.test.js +0 -70
- package/src/html/table2.test.js +0 -582
- package/src/html/text.test.js +0 -15
- package/src/html/textfield.test.js +0 -51
- package/src/html/textfield2.example.js.backup +0 -1370
- package/src/html/textfield2.test.js +0 -950
- package/src/html/tokenfield.example.js.backup +0 -503
- package/src/html/tokenfield.test.js +0 -423
- package/src/html/tree.example.js.backup +0 -475
- package/src/html/tree.test.js +0 -43
- package/src/html/tree_enhanced.test.js +0 -495
- package/src/http/token.test.js +0 -50
- package/src/incubator/pdfViewer.js +0 -33
- package/src/incubator/wizard.test.js +0 -127
- package/src/site/site.test.js +0 -230
- package/src/site/view.test.js +0 -41
- package/src/widgets/calendar/Calendar.test.js +0 -28
- package/src/widgets/explorer/Explorer.test.js +0 -121
- package/src/widgets/ide/editor.test.js +0 -33
- package/src/widgets/kanban/Kanban.test.js +0 -78
- package/src/widgets/login/LoginBox.test.js +0 -12
- package/src/widgets/login/ResetPasswordBox.test.js +0 -34
- package/src/widgets/login/validations.test.js +0 -51
- package/src/widgets/planner/Planner.test.js +0 -60
- package/src/widgets/upload/Upload.test.js +0 -32
- package/table2.test.js +0 -454
@@ -0,0 +1,289 @@
|
|
1
|
+
import React, { useState } from 'react'
|
2
|
+
import { RadioButton, RadioGroup } from './radio.js'
|
3
|
+
|
4
|
+
/**
|
5
|
+
* RadioButtons individuales
|
6
|
+
*/
|
7
|
+
export const IndividualRadioButtons = () => {
|
8
|
+
const [theme, setTheme] = useState('light')
|
9
|
+
|
10
|
+
const handleChange = (id, value) => {
|
11
|
+
setTheme(value)
|
12
|
+
}
|
13
|
+
|
14
|
+
return (
|
15
|
+
<div style={{ padding: '20px' }}>
|
16
|
+
<h3>RadioButtons Individuales</h3>
|
17
|
+
<div style={{
|
18
|
+
background: '#fff',
|
19
|
+
padding: '1.5rem',
|
20
|
+
borderRadius: '8px',
|
21
|
+
border: '1px solid #ddd'
|
22
|
+
}}>
|
23
|
+
<p><strong>Tema de la aplicación:</strong></p>
|
24
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>
|
25
|
+
<RadioButton
|
26
|
+
id="theme-light"
|
27
|
+
name="theme"
|
28
|
+
label="Tema claro"
|
29
|
+
value="light"
|
30
|
+
checked={theme === 'light'}
|
31
|
+
onChange={handleChange}
|
32
|
+
/>
|
33
|
+
<RadioButton
|
34
|
+
id="theme-dark"
|
35
|
+
name="theme"
|
36
|
+
label="Tema oscuro"
|
37
|
+
value="dark"
|
38
|
+
checked={theme === 'dark'}
|
39
|
+
onChange={handleChange}
|
40
|
+
/>
|
41
|
+
<RadioButton
|
42
|
+
id="theme-auto"
|
43
|
+
name="theme"
|
44
|
+
label="Automático (según sistema)"
|
45
|
+
value="auto"
|
46
|
+
checked={theme === 'auto'}
|
47
|
+
onChange={handleChange}
|
48
|
+
/>
|
49
|
+
</div>
|
50
|
+
<p style={{ marginTop: '1rem', color: '#666' }}>
|
51
|
+
Seleccionado: <strong>{theme}</strong>
|
52
|
+
</p>
|
53
|
+
</div>
|
54
|
+
</div>
|
55
|
+
)
|
56
|
+
}
|
57
|
+
|
58
|
+
/**
|
59
|
+
* RadioGroups básicos
|
60
|
+
*/
|
61
|
+
export const BasicRadioGroups = () => {
|
62
|
+
const [settings, setSettings] = useState({
|
63
|
+
language: 'es',
|
64
|
+
notifications: 'email'
|
65
|
+
})
|
66
|
+
|
67
|
+
const handleChange = (id, value) => {
|
68
|
+
setSettings(prev => ({ ...prev, [id]: value }))
|
69
|
+
}
|
70
|
+
|
71
|
+
return (
|
72
|
+
<div style={{ padding: '20px' }}>
|
73
|
+
<h3>RadioGroups Básicos</h3>
|
74
|
+
|
75
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: '2rem' }}>
|
76
|
+
<div style={{
|
77
|
+
background: '#fff',
|
78
|
+
padding: '1.5rem',
|
79
|
+
borderRadius: '8px',
|
80
|
+
border: '1px solid #ddd'
|
81
|
+
}}>
|
82
|
+
<RadioGroup
|
83
|
+
id="language"
|
84
|
+
label="Idioma de la interfaz"
|
85
|
+
value={settings.language}
|
86
|
+
onChange={handleChange}
|
87
|
+
options={[
|
88
|
+
{ id: 'es', label: 'Español', value: 'es' },
|
89
|
+
{ id: 'en', label: 'English', value: 'en' },
|
90
|
+
{ id: 'fr', label: 'Français', value: 'fr' },
|
91
|
+
{ id: 'de', label: 'Deutsch', value: 'de' }
|
92
|
+
]}
|
93
|
+
/>
|
94
|
+
</div>
|
95
|
+
|
96
|
+
<div style={{
|
97
|
+
background: '#fff',
|
98
|
+
padding: '1.5rem',
|
99
|
+
borderRadius: '8px',
|
100
|
+
border: '1px solid #ddd'
|
101
|
+
}}>
|
102
|
+
<RadioGroup
|
103
|
+
id="notifications"
|
104
|
+
label="Método de notificaciones"
|
105
|
+
value={settings.notifications}
|
106
|
+
onChange={handleChange}
|
107
|
+
required={true}
|
108
|
+
options={[
|
109
|
+
{ id: 'email', label: 'Email', value: 'email' },
|
110
|
+
{ id: 'sms', label: 'SMS', value: 'sms' },
|
111
|
+
{ id: 'push', label: 'Notificaciones push', value: 'push' },
|
112
|
+
{ id: 'none', label: 'Sin notificaciones', value: 'none' }
|
113
|
+
]}
|
114
|
+
/>
|
115
|
+
</div>
|
116
|
+
</div>
|
117
|
+
|
118
|
+
<div style={{ marginTop: '1rem', padding: '1rem', background: '#f8f9fa', borderRadius: '4px' }}>
|
119
|
+
<strong>Estado actual:</strong>
|
120
|
+
<pre>{JSON.stringify(settings, null, 2)}</pre>
|
121
|
+
</div>
|
122
|
+
</div>
|
123
|
+
)
|
124
|
+
}
|
125
|
+
|
126
|
+
/**
|
127
|
+
* Estados especiales
|
128
|
+
*/
|
129
|
+
export const SpecialStates = () => (
|
130
|
+
<div style={{ padding: '20px' }}>
|
131
|
+
<h3>Estados Especiales</h3>
|
132
|
+
<div style={{
|
133
|
+
background: '#fff',
|
134
|
+
padding: '1.5rem',
|
135
|
+
borderRadius: '8px',
|
136
|
+
border: '1px solid #ddd'
|
137
|
+
}}>
|
138
|
+
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(300px, 1fr))', gap: '2rem' }}>
|
139
|
+
{/* Disabled */}
|
140
|
+
<div>
|
141
|
+
<h4>RadioGroup Deshabilitado</h4>
|
142
|
+
<RadioGroup
|
143
|
+
id="disabled-example"
|
144
|
+
label="Configuración avanzada"
|
145
|
+
value="option1"
|
146
|
+
disabled={true}
|
147
|
+
options={[
|
148
|
+
{ id: 'opt1', label: 'Opción 1', value: 'option1' },
|
149
|
+
{ id: 'opt2', label: 'Opción 2', value: 'option2' }
|
150
|
+
]}
|
151
|
+
/>
|
152
|
+
</div>
|
153
|
+
|
154
|
+
{/* ReadOnly */}
|
155
|
+
<div>
|
156
|
+
<h4>RadioGroup Solo Lectura</h4>
|
157
|
+
<RadioGroup
|
158
|
+
id="readonly-example"
|
159
|
+
label="Configuración del sistema"
|
160
|
+
value="option2"
|
161
|
+
readOnly={true}
|
162
|
+
options={[
|
163
|
+
{ id: 'opt1', label: 'Opción 1', value: 'option1' },
|
164
|
+
{ id: 'opt2', label: 'Opción 2', value: 'option2' }
|
165
|
+
]}
|
166
|
+
/>
|
167
|
+
</div>
|
168
|
+
|
169
|
+
{/* Con Error */}
|
170
|
+
<div>
|
171
|
+
<h4>RadioGroup con Error</h4>
|
172
|
+
<RadioGroup
|
173
|
+
id="error-example"
|
174
|
+
label="Configuración requerida"
|
175
|
+
value=""
|
176
|
+
error="Debe seleccionar una opción"
|
177
|
+
options={[
|
178
|
+
{ id: 'opt1', label: 'Opción 1', value: 'option1' },
|
179
|
+
{ id: 'opt2', label: 'Opción 2', value: 'option2' }
|
180
|
+
]}
|
181
|
+
/>
|
182
|
+
</div>
|
183
|
+
</div>
|
184
|
+
</div>
|
185
|
+
</div>
|
186
|
+
)
|
187
|
+
|
188
|
+
/**
|
189
|
+
* Configuración compleja
|
190
|
+
*/
|
191
|
+
export const ComplexConfiguration = () => {
|
192
|
+
const [settings, setSettings] = useState({
|
193
|
+
privacy: 'friends',
|
194
|
+
size: 'medium'
|
195
|
+
})
|
196
|
+
|
197
|
+
const handleChange = (id, value) => {
|
198
|
+
setSettings(prev => ({ ...prev, [id]: value }))
|
199
|
+
}
|
200
|
+
|
201
|
+
return (
|
202
|
+
<div style={{ padding: '20px' }}>
|
203
|
+
<h3>Configuración Compleja</h3>
|
204
|
+
<div style={{
|
205
|
+
background: '#fff',
|
206
|
+
padding: '1.5rem',
|
207
|
+
borderRadius: '8px',
|
208
|
+
border: '1px solid #ddd'
|
209
|
+
}}>
|
210
|
+
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(300px, 1fr))', gap: '2rem' }}>
|
211
|
+
<RadioGroup
|
212
|
+
id="privacy"
|
213
|
+
label="Configuración de privacidad"
|
214
|
+
value={settings.privacy}
|
215
|
+
onChange={handleChange}
|
216
|
+
required={true}
|
217
|
+
options={[
|
218
|
+
{ id: 'public', label: 'Público', value: 'public' },
|
219
|
+
{ id: 'friends', label: 'Solo amigos', value: 'friends' },
|
220
|
+
{ id: 'private', label: 'Privado', value: 'private' }
|
221
|
+
]}
|
222
|
+
/>
|
223
|
+
|
224
|
+
<RadioGroup
|
225
|
+
id="size"
|
226
|
+
label="Tamaño de la interfaz"
|
227
|
+
value={settings.size}
|
228
|
+
onChange={handleChange}
|
229
|
+
options={[
|
230
|
+
{ id: 'small', label: 'Pequeño', value: 'small' },
|
231
|
+
{ id: 'medium', label: 'Mediano', value: 'medium' },
|
232
|
+
{ id: 'large', label: 'Grande', value: 'large' }
|
233
|
+
]}
|
234
|
+
/>
|
235
|
+
</div>
|
236
|
+
</div>
|
237
|
+
</div>
|
238
|
+
)
|
239
|
+
}
|
240
|
+
|
241
|
+
/**
|
242
|
+
* Accesibilidad
|
243
|
+
*/
|
244
|
+
export const AccessibilityDemo = () => (
|
245
|
+
<div style={{ padding: '20px' }}>
|
246
|
+
<h3>Demostración de Accesibilidad</h3>
|
247
|
+
<div style={{
|
248
|
+
background: '#fff',
|
249
|
+
padding: '1.5rem',
|
250
|
+
borderRadius: '8px',
|
251
|
+
border: '1px solid #ddd'
|
252
|
+
}}>
|
253
|
+
<div style={{ marginBottom: '1rem', padding: '1rem', background: '#e3f2fd', borderRadius: '4px' }}>
|
254
|
+
<h4>Instrucciones de navegación:</h4>
|
255
|
+
<ol>
|
256
|
+
<li>Usa <kbd>Tab</kbd> para navegar entre grupos</li>
|
257
|
+
<li>Usa las flechas <kbd>↑</kbd> <kbd>↓</kbd> para navegar dentro de un grupo</li>
|
258
|
+
<li>Observa los indicadores de focus</li>
|
259
|
+
<li>Los lectores de pantalla anunciarán el estado y etiquetas</li>
|
260
|
+
</ol>
|
261
|
+
</div>
|
262
|
+
|
263
|
+
<RadioGroup
|
264
|
+
id="accessibility-demo"
|
265
|
+
label="Demostración de accesibilidad"
|
266
|
+
value="option1"
|
267
|
+
onChange={() => {}}
|
268
|
+
options={[
|
269
|
+
{ id: 'opt1', label: 'Primera opción accesible', value: 'option1' },
|
270
|
+
{ id: 'opt2', label: 'Segunda opción accesible', value: 'option2' },
|
271
|
+
{ id: 'opt3', label: 'Tercera opción accesible', value: 'option3' }
|
272
|
+
]}
|
273
|
+
/>
|
274
|
+
</div>
|
275
|
+
</div>
|
276
|
+
)
|
277
|
+
|
278
|
+
/**
|
279
|
+
* Todos los ejemplos
|
280
|
+
*/
|
281
|
+
export const AllExamples = () => (
|
282
|
+
<div>
|
283
|
+
<IndividualRadioButtons />
|
284
|
+
<BasicRadioGroups />
|
285
|
+
<SpecialStates />
|
286
|
+
<ComplexConfiguration />
|
287
|
+
<AccessibilityDemo />
|
288
|
+
</div>
|
289
|
+
)
|
@@ -0,0 +1,81 @@
|
|
1
|
+
import React from 'react'
|
2
|
+
|
3
|
+
/**
|
4
|
+
* Test de estilos CSS
|
5
|
+
*/
|
6
|
+
export const StyleTest = () => (
|
7
|
+
<div style={{ padding: '20px' }}>
|
8
|
+
<h2>🎨 Test de Estilos CSS</h2>
|
9
|
+
|
10
|
+
<div style={{ marginBottom: '20px' }}>
|
11
|
+
<h3>Botones HTML puros:</h3>
|
12
|
+
<button className="button">Botón Normal</button>
|
13
|
+
<button className="button button--primary">Botón Primary</button>
|
14
|
+
<button className="button button--secondary">Botón Secondary</button>
|
15
|
+
</div>
|
16
|
+
|
17
|
+
<div style={{ marginBottom: '20px' }}>
|
18
|
+
<h3>Checkbox HTML puro:</h3>
|
19
|
+
<label className="checkbox">
|
20
|
+
<input type="checkbox" className="checkbox__input" />
|
21
|
+
<span className="checkbox__checkmark"></span>
|
22
|
+
<span className="checkbox__label">Checkbox con estilos</span>
|
23
|
+
</label>
|
24
|
+
</div>
|
25
|
+
|
26
|
+
<div style={{ marginBottom: '20px' }}>
|
27
|
+
<h3>Iconos Material:</h3>
|
28
|
+
<i className="material-icons">home</i>
|
29
|
+
<i className="material-icons">settings</i>
|
30
|
+
<i className="material-icons">favorite</i>
|
31
|
+
</div>
|
32
|
+
|
33
|
+
<div style={{ marginBottom: '20px' }}>
|
34
|
+
<h3>Variables CSS:</h3>
|
35
|
+
<div style={{
|
36
|
+
background: 'var(--primary-color, #1976d2)',
|
37
|
+
color: 'white',
|
38
|
+
padding: '10px',
|
39
|
+
borderRadius: '4px'
|
40
|
+
}}>
|
41
|
+
Usando variable --primary-color
|
42
|
+
</div>
|
43
|
+
</div>
|
44
|
+
|
45
|
+
<div style={{ marginBottom: '20px' }}>
|
46
|
+
<h3>Clases de texto:</h3>
|
47
|
+
<p className="text">Texto normal</p>
|
48
|
+
<p className="text text--bold">Texto bold</p>
|
49
|
+
<p className="text text--muted">Texto muted</p>
|
50
|
+
</div>
|
51
|
+
</div>
|
52
|
+
)
|
53
|
+
|
54
|
+
/**
|
55
|
+
* Test de componentes con clases específicas
|
56
|
+
*/
|
57
|
+
export const ComponentClassTest = () => (
|
58
|
+
<div style={{ padding: '20px' }}>
|
59
|
+
<h2>🧩 Test de Clases de Componentes</h2>
|
60
|
+
|
61
|
+
<div style={{ marginBottom: '20px' }}>
|
62
|
+
<h3>Estructura de botón:</h3>
|
63
|
+
<div className="button-container">
|
64
|
+
<button className="btn btn-primary">
|
65
|
+
<i className="material-icons">add</i>
|
66
|
+
Botón con icono
|
67
|
+
</button>
|
68
|
+
</div>
|
69
|
+
</div>
|
70
|
+
|
71
|
+
<div style={{ marginBottom: '20px' }}>
|
72
|
+
<h3>Estructura de checkbox:</h3>
|
73
|
+
<div className="form-group">
|
74
|
+
<div className="checkbox-wrapper">
|
75
|
+
<input type="checkbox" id="test-checkbox" />
|
76
|
+
<label htmlFor="test-checkbox">Checkbox estructurado</label>
|
77
|
+
</div>
|
78
|
+
</div>
|
79
|
+
</div>
|
80
|
+
</div>
|
81
|
+
)
|
@@ -0,0 +1,329 @@
|
|
1
|
+
import React, { useState } from 'react'
|
2
|
+
import { Switch } from './switch.js'
|
3
|
+
|
4
|
+
/**
|
5
|
+
* Switches básicos
|
6
|
+
*/
|
7
|
+
export const BasicSwitches = () => {
|
8
|
+
const [settings, setSettings] = useState({
|
9
|
+
notifications: true,
|
10
|
+
darkMode: false,
|
11
|
+
autoSave: true
|
12
|
+
})
|
13
|
+
|
14
|
+
const handleChange = (id, checked) => {
|
15
|
+
setSettings(prev => ({ ...prev, [id]: checked }))
|
16
|
+
}
|
17
|
+
|
18
|
+
return (
|
19
|
+
<div style={{ padding: '20px' }}>
|
20
|
+
<h3>Switches Básicos</h3>
|
21
|
+
|
22
|
+
<div style={{ marginBottom: '2rem' }}>
|
23
|
+
<h4>Estados básicos:</h4>
|
24
|
+
<div style={{ display: 'flex', alignItems: 'center', gap: '2rem', flexWrap: 'wrap' }}>
|
25
|
+
<div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>
|
26
|
+
<span>OFF:</span>
|
27
|
+
<Switch checked={false} onChange={() => {}} />
|
28
|
+
</div>
|
29
|
+
<div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>
|
30
|
+
<span>ON:</span>
|
31
|
+
<Switch checked={true} onChange={() => {}} />
|
32
|
+
</div>
|
33
|
+
<div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>
|
34
|
+
<span>Disabled:</span>
|
35
|
+
<Switch checked={true} disabled={true} onChange={() => {}} />
|
36
|
+
</div>
|
37
|
+
</div>
|
38
|
+
</div>
|
39
|
+
|
40
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>
|
41
|
+
<Switch
|
42
|
+
id="notifications"
|
43
|
+
label="Notificaciones push"
|
44
|
+
checked={settings.notifications}
|
45
|
+
onChange={handleChange}
|
46
|
+
/>
|
47
|
+
<Switch
|
48
|
+
id="darkMode"
|
49
|
+
label="Modo oscuro"
|
50
|
+
checked={settings.darkMode}
|
51
|
+
onChange={handleChange}
|
52
|
+
/>
|
53
|
+
<Switch
|
54
|
+
id="autoSave"
|
55
|
+
label="Guardado automático"
|
56
|
+
checked={settings.autoSave}
|
57
|
+
onChange={handleChange}
|
58
|
+
/>
|
59
|
+
</div>
|
60
|
+
</div>
|
61
|
+
)
|
62
|
+
}
|
63
|
+
|
64
|
+
/**
|
65
|
+
* Switch con colores personalizados
|
66
|
+
*/
|
67
|
+
export const CustomColorSwitches = () => {
|
68
|
+
const [settings, setSettings] = useState({
|
69
|
+
analytics: true,
|
70
|
+
marketing: false,
|
71
|
+
location: true
|
72
|
+
})
|
73
|
+
|
74
|
+
const handleChange = (id, checked) => {
|
75
|
+
setSettings(prev => ({ ...prev, [id]: checked }))
|
76
|
+
}
|
77
|
+
|
78
|
+
return (
|
79
|
+
<div style={{ padding: '20px' }}>
|
80
|
+
<h3>Switch con Colores Personalizados</h3>
|
81
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>
|
82
|
+
<Switch
|
83
|
+
id="analytics"
|
84
|
+
label="Análisis de uso"
|
85
|
+
checked={settings.analytics}
|
86
|
+
onChange={handleChange}
|
87
|
+
onColor="#28a745"
|
88
|
+
/>
|
89
|
+
<Switch
|
90
|
+
id="marketing"
|
91
|
+
label="Comunicaciones de marketing"
|
92
|
+
checked={settings.marketing}
|
93
|
+
onChange={handleChange}
|
94
|
+
onColor="#fd7e14"
|
95
|
+
/>
|
96
|
+
<Switch
|
97
|
+
id="location"
|
98
|
+
label="Servicios de ubicación"
|
99
|
+
checked={settings.location}
|
100
|
+
onChange={handleChange}
|
101
|
+
onColor="#6f42c1"
|
102
|
+
/>
|
103
|
+
</div>
|
104
|
+
</div>
|
105
|
+
)
|
106
|
+
}
|
107
|
+
|
108
|
+
/**
|
109
|
+
* Tamaños y colores
|
110
|
+
*/
|
111
|
+
export const SwitchSizesAndColors = () => (
|
112
|
+
<div style={{ padding: '20px' }}>
|
113
|
+
<h3>Diferentes Tamaños</h3>
|
114
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: '1rem', marginBottom: '2rem' }}>
|
115
|
+
<div style={{ display: 'flex', alignItems: 'center', gap: '1rem' }}>
|
116
|
+
<span style={{ minWidth: '100px' }}>Small:</span>
|
117
|
+
<Switch
|
118
|
+
id="size-small"
|
119
|
+
size="small"
|
120
|
+
checked={true}
|
121
|
+
onChange={() => {}}
|
122
|
+
/>
|
123
|
+
<Switch
|
124
|
+
id="size-small-2"
|
125
|
+
size="small"
|
126
|
+
checked={true}
|
127
|
+
onChange={() => {}}
|
128
|
+
onColor="#28a745"
|
129
|
+
/>
|
130
|
+
</div>
|
131
|
+
<div style={{ display: 'flex', alignItems: 'center', gap: '1rem' }}>
|
132
|
+
<span style={{ minWidth: '100px' }}>Normal:</span>
|
133
|
+
<Switch
|
134
|
+
id="size-normal"
|
135
|
+
size="normal"
|
136
|
+
checked={true}
|
137
|
+
onChange={() => {}}
|
138
|
+
/>
|
139
|
+
<Switch
|
140
|
+
id="size-normal-2"
|
141
|
+
size="normal"
|
142
|
+
checked={true}
|
143
|
+
onChange={() => {}}
|
144
|
+
onColor="#fd7e14"
|
145
|
+
/>
|
146
|
+
</div>
|
147
|
+
<div style={{ display: 'flex', alignItems: 'center', gap: '1rem' }}>
|
148
|
+
<span style={{ minWidth: '100px' }}>Large:</span>
|
149
|
+
<Switch
|
150
|
+
id="size-large"
|
151
|
+
size="large"
|
152
|
+
checked={true}
|
153
|
+
onChange={() => {}}
|
154
|
+
/>
|
155
|
+
<Switch
|
156
|
+
id="size-large-2"
|
157
|
+
size="large"
|
158
|
+
checked={true}
|
159
|
+
onChange={() => {}}
|
160
|
+
onColor="#6f42c1"
|
161
|
+
/>
|
162
|
+
</div>
|
163
|
+
</div>
|
164
|
+
|
165
|
+
<h3>Colores Personalizados</h3>
|
166
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>
|
167
|
+
<Switch
|
168
|
+
id="custom1"
|
169
|
+
label="Switch verde"
|
170
|
+
checked={true}
|
171
|
+
onColor="#28a745"
|
172
|
+
onChange={() => {}}
|
173
|
+
/>
|
174
|
+
<Switch
|
175
|
+
id="custom2"
|
176
|
+
label="Switch naranja"
|
177
|
+
checked={true}
|
178
|
+
onColor="#fd7e14"
|
179
|
+
onChange={() => {}}
|
180
|
+
/>
|
181
|
+
<Switch
|
182
|
+
id="custom3"
|
183
|
+
label="Switch púrpura"
|
184
|
+
checked={true}
|
185
|
+
onColor="#6f42c1"
|
186
|
+
onChange={() => {}}
|
187
|
+
/>
|
188
|
+
</div>
|
189
|
+
</div>
|
190
|
+
)
|
191
|
+
|
192
|
+
/**
|
193
|
+
* Estados especiales
|
194
|
+
*/
|
195
|
+
export const SpecialStates = () => {
|
196
|
+
const [settings, setSettings] = useState({
|
197
|
+
notifications: false,
|
198
|
+
analytics: true
|
199
|
+
})
|
200
|
+
|
201
|
+
const [validationErrors, setValidationErrors] = useState({
|
202
|
+
notifications: 'Las notificaciones son requeridas',
|
203
|
+
analytics: null
|
204
|
+
})
|
205
|
+
|
206
|
+
const handleChange = (id, checked) => {
|
207
|
+
setSettings(prev => ({ ...prev, [id]: checked }))
|
208
|
+
// Limpiar error si se activa
|
209
|
+
if (checked && validationErrors[id]) {
|
210
|
+
setValidationErrors(prev => ({ ...prev, [id]: null }))
|
211
|
+
}
|
212
|
+
}
|
213
|
+
|
214
|
+
return (
|
215
|
+
<div style={{ padding: '20px' }}>
|
216
|
+
<h3>Estados Especiales</h3>
|
217
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>
|
218
|
+
<Switch
|
219
|
+
id="disabled"
|
220
|
+
label="Switch deshabilitado"
|
221
|
+
checked={true}
|
222
|
+
disabled={true}
|
223
|
+
onChange={handleChange}
|
224
|
+
/>
|
225
|
+
<Switch
|
226
|
+
id="readonly"
|
227
|
+
label="Switch solo lectura"
|
228
|
+
checked={true}
|
229
|
+
readOnly={true}
|
230
|
+
onChange={handleChange}
|
231
|
+
/>
|
232
|
+
<Switch
|
233
|
+
id="error-switch"
|
234
|
+
label="Switch con error"
|
235
|
+
checked={settings.notifications}
|
236
|
+
error={validationErrors.notifications}
|
237
|
+
onChange={handleChange}
|
238
|
+
/>
|
239
|
+
<Switch
|
240
|
+
id="error-switch2"
|
241
|
+
label="Switch con error personalizado"
|
242
|
+
checked={settings.analytics}
|
243
|
+
error={validationErrors.analytics}
|
244
|
+
onChange={handleChange}
|
245
|
+
onColor="#dc3545"
|
246
|
+
/>
|
247
|
+
</div>
|
248
|
+
</div>
|
249
|
+
)
|
250
|
+
}
|
251
|
+
|
252
|
+
/**
|
253
|
+
* Panel de configuración
|
254
|
+
*/
|
255
|
+
export const ConfigurationPanel = () => {
|
256
|
+
const [settings, setSettings] = useState({
|
257
|
+
wifi: true,
|
258
|
+
bluetooth: false,
|
259
|
+
notifications: true,
|
260
|
+
analytics: false
|
261
|
+
})
|
262
|
+
|
263
|
+
const handleChange = (id, checked) => {
|
264
|
+
setSettings(prev => ({ ...prev, [id]: checked }))
|
265
|
+
}
|
266
|
+
|
267
|
+
return (
|
268
|
+
<div style={{ padding: '20px' }}>
|
269
|
+
<h3>Panel de Configuración</h3>
|
270
|
+
<div style={{
|
271
|
+
background: '#fff',
|
272
|
+
padding: '1.5rem',
|
273
|
+
borderRadius: '8px',
|
274
|
+
border: '1px solid #ddd'
|
275
|
+
}}>
|
276
|
+
<h4>Conectividad</h4>
|
277
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: '1rem', marginBottom: '1.5rem' }}>
|
278
|
+
<Switch
|
279
|
+
id="wifi"
|
280
|
+
label="Wi-Fi"
|
281
|
+
checked={settings.wifi}
|
282
|
+
onChange={handleChange}
|
283
|
+
ariaLabel="Activar o desactivar conexión Wi-Fi"
|
284
|
+
onColor="#28a745"
|
285
|
+
/>
|
286
|
+
<Switch
|
287
|
+
id="bluetooth"
|
288
|
+
label="Bluetooth"
|
289
|
+
checked={settings.bluetooth}
|
290
|
+
onChange={handleChange}
|
291
|
+
ariaLabel="Activar o desactivar Bluetooth"
|
292
|
+
onColor="#17a2b8"
|
293
|
+
/>
|
294
|
+
</div>
|
295
|
+
|
296
|
+
<h4>Privacidad</h4>
|
297
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>
|
298
|
+
<Switch
|
299
|
+
id="notifications"
|
300
|
+
label="Notificaciones"
|
301
|
+
checked={settings.notifications}
|
302
|
+
onChange={handleChange}
|
303
|
+
onColor="#ffc107"
|
304
|
+
/>
|
305
|
+
<Switch
|
306
|
+
id="analytics"
|
307
|
+
label="Análisis de uso"
|
308
|
+
checked={settings.analytics}
|
309
|
+
onChange={handleChange}
|
310
|
+
onColor="#6f42c1"
|
311
|
+
/>
|
312
|
+
</div>
|
313
|
+
</div>
|
314
|
+
</div>
|
315
|
+
)
|
316
|
+
}
|
317
|
+
|
318
|
+
/**
|
319
|
+
* Todos los ejemplos
|
320
|
+
*/
|
321
|
+
export const AllExamples = () => (
|
322
|
+
<div>
|
323
|
+
<BasicSwitches />
|
324
|
+
<CustomColorSwitches />
|
325
|
+
<SwitchSizesAndColors />
|
326
|
+
<SpecialStates />
|
327
|
+
<ConfigurationPanel />
|
328
|
+
</div>
|
329
|
+
)
|