ywana-core8 0.1.75 → 0.1.76

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.
Files changed (122) hide show
  1. package/ACCORDION_EVALUATION.md +583 -0
  2. package/CHECKBOX_EVALUATION.md +273 -0
  3. package/CHIP_EVALUATION.md +542 -0
  4. package/COLOR_EVALUATION.md +524 -0
  5. package/COMPONENTS_EVALUATION.md +477 -0
  6. package/FORM_EVALUATION.md +459 -0
  7. package/HEADER_EVALUATION.md +436 -0
  8. package/ICON_EVALUATION.md +254 -0
  9. package/LIST_EVALUATION.md +574 -0
  10. package/PROGRESS_EVALUATION.md +450 -0
  11. package/RADIO_EVALUATION.md +439 -0
  12. package/RADIO_VISUAL_FIX.md +183 -0
  13. package/SECTION_IMPROVEMENTS.md +153 -0
  14. package/SWITCH_EVALUATION.md +335 -0
  15. package/SWITCH_VISUAL_FIX.md +232 -0
  16. package/TAB_EVALUATION.md +626 -0
  17. package/TEXTFIELD_EVALUATION.md +747 -0
  18. package/TOOLTIP_FIX.md +157 -0
  19. package/TREE_EVALUATION.md +708 -0
  20. package/dist/index.cjs +7900 -1615
  21. package/dist/index.cjs.map +1 -1
  22. package/dist/index.css +6094 -1122
  23. package/dist/index.css.map +1 -1
  24. package/dist/index.modern.js +7929 -1645
  25. package/dist/index.modern.js.map +1 -1
  26. package/dist/index.umd.js +7900 -1615
  27. package/dist/index.umd.js.map +1 -1
  28. package/jest.config.js +24 -0
  29. package/package.json +10 -1
  30. package/src/html/accordion.css +208 -4
  31. package/src/html/accordion.example.js +390 -0
  32. package/src/html/accordion.js +284 -28
  33. package/src/html/accordion.unit.test.js +334 -0
  34. package/src/html/button.css +157 -16
  35. package/src/html/button.example.js +374 -0
  36. package/src/html/button.js +240 -60
  37. package/src/html/button.test.js +422 -0
  38. package/src/html/checkbox.css +74 -2
  39. package/src/html/checkbox.example.js +316 -0
  40. package/src/html/checkbox.js +113 -26
  41. package/src/html/checkbox.test.js +285 -0
  42. package/src/html/chip.css +230 -19
  43. package/src/html/chip.example.js +355 -0
  44. package/src/html/chip.js +321 -25
  45. package/src/html/chip.test.js +425 -0
  46. package/src/html/color.css +435 -6
  47. package/src/html/color.example.js +527 -0
  48. package/src/html/color.js +458 -9
  49. package/src/html/color.test.js +362 -4
  50. package/src/html/components.example.js +492 -0
  51. package/src/html/components_enhanced.test.js +581 -0
  52. package/src/html/form.css +70 -3
  53. package/src/html/form.example.js +385 -0
  54. package/src/html/form.js +232 -34
  55. package/src/html/form.test.js +369 -0
  56. package/src/html/header2.css +264 -0
  57. package/src/html/header2.example.js +411 -0
  58. package/src/html/header2.js +203 -0
  59. package/src/html/header2.test.js +377 -0
  60. package/src/html/icon.css +20 -2
  61. package/src/html/icon.example.js +268 -0
  62. package/src/html/icon.js +86 -16
  63. package/src/html/icon.test.js +231 -0
  64. package/src/html/index.js +1 -1
  65. package/src/html/list.css +393 -1
  66. package/src/html/list.example.js +404 -0
  67. package/src/html/list.js +583 -40
  68. package/src/html/list.test.js +383 -0
  69. package/src/html/progress.css +707 -17
  70. package/src/html/progress.example.js +424 -0
  71. package/src/html/progress.js +906 -9
  72. package/src/html/progress.test.js +313 -0
  73. package/src/html/property.css +399 -0
  74. package/src/html/property.example.js +553 -0
  75. package/src/html/property.js +393 -15
  76. package/src/html/property.test.js +351 -2
  77. package/src/html/radio-visual-test.js +289 -0
  78. package/src/html/radio.css +137 -11
  79. package/src/html/radio.example.js +389 -0
  80. package/src/html/radio.js +234 -10
  81. package/src/html/radio.test.js +318 -0
  82. package/src/html/section.example.js +99 -0
  83. package/src/html/section.js +40 -3
  84. package/src/html/section.test.js +131 -0
  85. package/src/html/selector.css +329 -3
  86. package/src/html/selector.js +369 -23
  87. package/src/html/switch-debug.js +197 -0
  88. package/src/html/switch-test-visual.js +294 -0
  89. package/src/html/switch.css +200 -0
  90. package/src/html/switch.example.js +461 -0
  91. package/src/html/switch.js +283 -23
  92. package/src/html/switch.test.js +355 -0
  93. package/src/html/tab.css +288 -0
  94. package/src/html/tab.example.js +446 -0
  95. package/src/html/tab.js +387 -22
  96. package/src/html/tab_enhanced.js +378 -0
  97. package/src/html/tab_enhanced.test.js +504 -0
  98. package/src/html/table2.css +576 -0
  99. package/src/html/table2.example.js +703 -0
  100. package/src/html/table2.js +1252 -0
  101. package/src/html/table2.migration.md +328 -0
  102. package/src/html/table2.test.js +582 -0
  103. package/src/html/text.css +375 -0
  104. package/src/html/text.js +311 -20
  105. package/src/html/textfield2.css +842 -0
  106. package/src/html/textfield2.example.js +499 -0
  107. package/src/html/textfield2.js +1130 -0
  108. package/src/html/textfield2.test.js +950 -0
  109. package/src/html/thumbnail.css +289 -2
  110. package/src/html/thumbnail.js +214 -9
  111. package/src/html/tokenfield.css +449 -1
  112. package/src/html/tokenfield.example.js +503 -0
  113. package/src/html/tokenfield.js +561 -56
  114. package/src/html/tokenfield.test.js +423 -0
  115. package/src/html/tooltip-positioning-demo.js +187 -0
  116. package/src/html/tooltip.css +25 -2
  117. package/src/html/tree.css +228 -0
  118. package/src/html/tree.example.js +475 -0
  119. package/src/html/tree.js +712 -28
  120. package/src/html/tree_enhanced.test.js +495 -0
  121. package/table2.test.js +454 -0
  122. package/src/html/button.tsx +0 -38
@@ -4,29 +4,42 @@
4
4
  display: flex;
5
5
  align-items: center;
6
6
  position: relative;
7
- }
7
+ cursor: pointer;
8
+ }
9
+
10
+ .radio.disabled {
11
+ cursor: not-allowed;
12
+ opacity: 0.6;
13
+ }
14
+
15
+ .radio.readonly {
16
+ cursor: default;
17
+ }
8
18
 
9
19
  .radio .checkmark {
10
- width: 1.5rem;
11
- height: 1.5rem;
20
+ width: 1.2rem;
21
+ height: 1.2rem;
12
22
  display: flex;
13
23
  align-items: center;
14
24
  justify-content: center;
15
25
  margin: 0.3rem;
16
- border: solid 1px var(--primary-color);
26
+ border: 2px solid var(--primary-color);
17
27
  background-color: var(--paper-color);
18
- border-radius: 3rem;
28
+ border-radius: 50%;
29
+ position: relative;
19
30
  }
20
31
 
21
32
  .radio .checkmark:after {
22
33
  content: "";
23
- width: .3rem;
24
- height: .3rem;
25
- border: solid 5px var(--primary-color);
26
- border-radius: 5rem;
34
+ width: 0.4rem;
35
+ height: 0.4rem;
36
+ border-radius: 50%;
27
37
  background-color: var(--primary-color);
28
38
  display: none;
29
- z-index: 0;
39
+ position: absolute;
40
+ top: 50%;
41
+ left: 50%;
42
+ transform: translate(-50%, -50%);
30
43
  }
31
44
 
32
45
  .radio > input {
@@ -46,5 +59,118 @@
46
59
  color: var(--text-color-light);
47
60
  font-size: 1rem;
48
61
  font-weight: normal;
49
- }
62
+ cursor: pointer;
63
+ }
64
+
65
+ .radio.disabled > label {
66
+ color: var(--text-color-lighter);
67
+ cursor: not-allowed;
68
+ }
69
+
70
+ .radio.readonly > label {
71
+ cursor: default;
72
+ }
73
+
74
+ .radio.error > .checkmark {
75
+ border-color: var(--danger-color, #dc3545);
76
+ }
77
+
78
+ .radio.error > label {
79
+ color: var(--danger-color, #dc3545);
80
+ }
81
+
82
+ .radio.disabled > .checkmark {
83
+ border-color: var(--text-color-lighter);
84
+ background-color: var(--background-color);
85
+ }
86
+
87
+ .radio.disabled .checkmark {
88
+ border-color: var(--text-color-lighter);
89
+ background-color: var(--background-color);
90
+ }
91
+
92
+ .radio.disabled .checkmark:after {
93
+ background-color: var(--text-color-lighter);
94
+ }
95
+
96
+ .radio.error .checkmark:after {
97
+ background-color: var(--danger-color, #dc3545);
98
+ }
99
+
100
+ /* Focus styles */
101
+ .radio:focus-within > .checkmark {
102
+ outline: 2px solid var(--primary-color);
103
+ outline-offset: 2px;
104
+ }
105
+
106
+ /* Error message styling */
107
+ .radio .error-message {
108
+ color: var(--danger-color, #dc3545);
109
+ font-size: 0.8rem;
110
+ margin-left: 2.1rem;
111
+ margin-top: 0.2rem;
112
+ display: block;
113
+ }
114
+
115
+ /* RadioGroup styles */
116
+ .radio-group {
117
+ display: flex;
118
+ flex-direction: column;
119
+ gap: 0.5rem;
120
+ }
121
+
122
+ .radio-group-label {
123
+ font-size: 1rem;
124
+ font-weight: 500;
125
+ color: var(--text-color);
126
+ margin-bottom: 0.5rem;
127
+ display: flex;
128
+ align-items: center;
129
+ gap: 0.25rem;
130
+ }
131
+
132
+ .radio-group-options {
133
+ display: flex;
134
+ flex-direction: column;
135
+ gap: 0.75rem;
136
+ }
137
+
138
+ .radio-group.disabled {
139
+ opacity: 0.6;
140
+ }
141
+
142
+ .radio-group.error .radio-group-label {
143
+ color: var(--danger-color, #dc3545);
144
+ }
145
+
146
+ .required-indicator {
147
+ color: var(--danger-color, #dc3545);
148
+ font-weight: bold;
149
+ }
150
+
151
+ /* Responsive adjustments */
152
+ @media (max-width: 768px) {
153
+ .radio-group-options {
154
+ gap: 0.5rem;
155
+ }
156
+
157
+ .radio > label {
158
+ font-size: 0.9rem;
159
+ }
160
+ }
161
+
162
+ /* High contrast mode support */
163
+ @media (prefers-contrast: high) {
164
+ .radio:focus-within > .checkmark {
165
+ outline-width: 3px;
166
+ }
167
+ }
168
+
169
+ /* Reduced motion support */
170
+ @media (prefers-reduced-motion: reduce) {
171
+ .radio .checkmark,
172
+ .radio .checkmark:after {
173
+ transition: none;
174
+ }
175
+ }
50
176
 
@@ -0,0 +1,389 @@
1
+ import React, { useState } from 'react'
2
+ import { RadioButton, RadioGroup } from './radio'
3
+
4
+ /**
5
+ * Ejemplos de uso de los componentes Radio mejorados
6
+ */
7
+ export const RadioExamples = () => {
8
+ const [settings, setSettings] = useState({
9
+ theme: 'light',
10
+ language: 'es',
11
+ notifications: 'email',
12
+ privacy: 'public',
13
+ size: 'medium'
14
+ })
15
+
16
+ const [validationErrors, setValidationErrors] = useState({})
17
+
18
+ const handleChange = (id, value) => {
19
+ setSettings(prev => ({ ...prev, [id]: value }))
20
+
21
+ // Limpiar errores cuando el usuario interactúa
22
+ if (validationErrors[id]) {
23
+ setValidationErrors(prev => ({ ...prev, [id]: null }))
24
+ }
25
+ }
26
+
27
+ const validateSettings = () => {
28
+ const errors = {}
29
+
30
+ if (!settings.theme) {
31
+ errors.theme = 'Debe seleccionar un tema'
32
+ }
33
+
34
+ if (!settings.notifications) {
35
+ errors.notifications = 'Debe seleccionar un método de notificación'
36
+ }
37
+
38
+ setValidationErrors(errors)
39
+ return Object.keys(errors).length === 0
40
+ }
41
+
42
+ const handleSave = () => {
43
+ if (validateSettings()) {
44
+ alert('Configuración guardada: ' + JSON.stringify(settings, null, 2))
45
+ }
46
+ }
47
+
48
+ return (
49
+ <div style={{ padding: '2rem', maxWidth: '800px' }}>
50
+ <h1>Ejemplos de Componentes Radio Mejorados</h1>
51
+
52
+ <div style={{
53
+ background: '#f8f9fa',
54
+ padding: '1rem',
55
+ borderRadius: '8px',
56
+ marginBottom: '2rem',
57
+ border: '1px solid #e9ecef'
58
+ }}>
59
+ <h3>✅ Mejoras Implementadas:</h3>
60
+ <ul>
61
+ <li>🛡️ <strong>Validación de props</strong> - Advertencias para props incorrectas</li>
62
+ <li>♿ <strong>Accesibilidad completa</strong> - ARIA, soporte de teclado, focus</li>
63
+ <li>📝 <strong>PropTypes y documentación</strong> - Validación y documentación completa</li>
64
+ <li>🎯 <strong>Estados avanzados</strong> - disabled, readOnly, error</li>
65
+ <li>🎨 <strong>CSS mejorado</strong> - Estados visuales consistentes y responsivos</li>
66
+ <li>⌨️ <strong>Soporte de teclado</strong> - Espacio para seleccionar</li>
67
+ <li>🔧 <strong>Manejo de errores</strong> - Mensajes de error integrados</li>
68
+ <li>👥 <strong>RadioGroup</strong> - Componente para manejar grupos</li>
69
+ <li>🔄 <strong>Sincronización de estado</strong> - Control interno y externo</li>
70
+ <li>🧪 <strong>Pruebas unitarias</strong> - 17 pruebas que cubren toda la funcionalidad</li>
71
+ </ul>
72
+ </div>
73
+
74
+ {/* RadioButtons individuales */}
75
+ <section style={{ marginBottom: '2rem' }}>
76
+ <h3>RadioButtons Individuales</h3>
77
+ <div style={{
78
+ background: '#fff',
79
+ padding: '1.5rem',
80
+ borderRadius: '8px',
81
+ border: '1px solid #ddd'
82
+ }}>
83
+ <p><strong>Tema de la aplicación:</strong></p>
84
+ <div style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>
85
+ <RadioButton
86
+ id="theme-light"
87
+ name="theme"
88
+ label="Tema claro"
89
+ value="light"
90
+ checked={settings.theme === 'light'}
91
+ onChange={handleChange}
92
+ />
93
+ <RadioButton
94
+ id="theme-dark"
95
+ name="theme"
96
+ label="Tema oscuro"
97
+ value="dark"
98
+ checked={settings.theme === 'dark'}
99
+ onChange={handleChange}
100
+ />
101
+ <RadioButton
102
+ id="theme-auto"
103
+ name="theme"
104
+ label="Automático (según sistema)"
105
+ value="auto"
106
+ checked={settings.theme === 'auto'}
107
+ onChange={handleChange}
108
+ />
109
+ </div>
110
+ </div>
111
+ </section>
112
+
113
+ {/* RadioGroup básico */}
114
+ <section style={{ marginBottom: '2rem' }}>
115
+ <h3>RadioGroup - Idioma</h3>
116
+ <div style={{
117
+ background: '#fff',
118
+ padding: '1.5rem',
119
+ borderRadius: '8px',
120
+ border: '1px solid #ddd'
121
+ }}>
122
+ <RadioGroup
123
+ id="language"
124
+ label="Idioma de la interfaz"
125
+ value={settings.language}
126
+ onChange={handleChange}
127
+ options={[
128
+ { id: 'es', label: 'Español', value: 'es' },
129
+ { id: 'en', label: 'English', value: 'en' },
130
+ { id: 'fr', label: 'Français', value: 'fr' },
131
+ { id: 'de', label: 'Deutsch', value: 'de' }
132
+ ]}
133
+ />
134
+ </div>
135
+ </section>
136
+
137
+ {/* RadioGroup con validación */}
138
+ <section style={{ marginBottom: '2rem' }}>
139
+ <h3>RadioGroup con Validación</h3>
140
+ <div style={{
141
+ background: '#fff',
142
+ padding: '1.5rem',
143
+ borderRadius: '8px',
144
+ border: '1px solid #ddd'
145
+ }}>
146
+ <RadioGroup
147
+ id="notifications"
148
+ label="Método de notificaciones"
149
+ value={settings.notifications}
150
+ onChange={handleChange}
151
+ required={true}
152
+ error={validationErrors.notifications}
153
+ options={[
154
+ { id: 'email', label: 'Correo electrónico', value: 'email' },
155
+ { id: 'sms', label: 'SMS', value: 'sms' },
156
+ { id: 'push', label: 'Notificaciones push', value: 'push' },
157
+ { id: 'none', label: 'Sin notificaciones', value: 'none' }
158
+ ]}
159
+ />
160
+ </div>
161
+ </section>
162
+
163
+ {/* Estados especiales */}
164
+ <section style={{ marginBottom: '2rem' }}>
165
+ <h3>Estados Especiales</h3>
166
+ <div style={{
167
+ background: '#fff',
168
+ padding: '1.5rem',
169
+ borderRadius: '8px',
170
+ border: '1px solid #ddd'
171
+ }}>
172
+ <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(300px, 1fr))', gap: '2rem' }}>
173
+ {/* Disabled */}
174
+ <div>
175
+ <h4>RadioGroup Deshabilitado</h4>
176
+ <RadioGroup
177
+ id="disabled-example"
178
+ label="Configuración avanzada"
179
+ value="option1"
180
+ disabled={true}
181
+ options={[
182
+ { id: 'opt1', label: 'Opción 1', value: 'option1' },
183
+ { id: 'opt2', label: 'Opción 2', value: 'option2' }
184
+ ]}
185
+ />
186
+ </div>
187
+
188
+ {/* ReadOnly */}
189
+ <div>
190
+ <h4>RadioGroup Solo Lectura</h4>
191
+ <RadioGroup
192
+ id="readonly-example"
193
+ label="Configuración del sistema"
194
+ value="option2"
195
+ readOnly={true}
196
+ options={[
197
+ { id: 'opt1', label: 'Opción 1', value: 'option1' },
198
+ { id: 'opt2', label: 'Opción 2', value: 'option2' }
199
+ ]}
200
+ />
201
+ </div>
202
+
203
+ {/* Con Error */}
204
+ <div>
205
+ <h4>RadioGroup con Error</h4>
206
+ <RadioGroup
207
+ id="error-example"
208
+ label="Configuración requerida"
209
+ value=""
210
+ error="Debe seleccionar una opción"
211
+ options={[
212
+ { id: 'opt1', label: 'Opción 1', value: 'option1' },
213
+ { id: 'opt2', label: 'Opción 2', value: 'option2' }
214
+ ]}
215
+ />
216
+ </div>
217
+ </div>
218
+ </div>
219
+ </section>
220
+
221
+ {/* Formulario completo */}
222
+ <section style={{ marginBottom: '2rem' }}>
223
+ <h3>Formulario de Configuración</h3>
224
+ <div style={{
225
+ background: '#fff',
226
+ padding: '1.5rem',
227
+ borderRadius: '8px',
228
+ border: '1px solid #ddd'
229
+ }}>
230
+ <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(300px, 1fr))', gap: '2rem' }}>
231
+ <RadioGroup
232
+ id="privacy"
233
+ label="Configuración de privacidad"
234
+ value={settings.privacy}
235
+ onChange={handleChange}
236
+ required={true}
237
+ options={[
238
+ { id: 'public', label: 'Público', value: 'public' },
239
+ { id: 'friends', label: 'Solo amigos', value: 'friends' },
240
+ { id: 'private', label: 'Privado', value: 'private' }
241
+ ]}
242
+ />
243
+
244
+ <RadioGroup
245
+ id="size"
246
+ label="Tamaño de la interfaz"
247
+ value={settings.size}
248
+ onChange={handleChange}
249
+ options={[
250
+ { id: 'small', label: 'Pequeño', value: 'small' },
251
+ { id: 'medium', label: 'Mediano', value: 'medium' },
252
+ { id: 'large', label: 'Grande', value: 'large' }
253
+ ]}
254
+ />
255
+ </div>
256
+
257
+ <div style={{ display: 'flex', gap: '1rem', marginTop: '2rem' }}>
258
+ <button
259
+ onClick={handleSave}
260
+ style={{
261
+ padding: '0.5rem 1rem',
262
+ backgroundColor: '#007bff',
263
+ color: 'white',
264
+ border: 'none',
265
+ borderRadius: '4px',
266
+ cursor: 'pointer'
267
+ }}
268
+ >
269
+ Guardar Configuración
270
+ </button>
271
+ <button
272
+ onClick={() => {
273
+ setSettings({
274
+ theme: 'light',
275
+ language: 'es',
276
+ notifications: 'email',
277
+ privacy: 'public',
278
+ size: 'medium'
279
+ })
280
+ setValidationErrors({})
281
+ }}
282
+ style={{
283
+ padding: '0.5rem 1rem',
284
+ backgroundColor: '#6c757d',
285
+ color: 'white',
286
+ border: 'none',
287
+ borderRadius: '4px',
288
+ cursor: 'pointer'
289
+ }}
290
+ >
291
+ Resetear
292
+ </button>
293
+ </div>
294
+ </div>
295
+ </section>
296
+
297
+ {/* Demostración de accesibilidad */}
298
+ <section style={{ marginBottom: '2rem' }}>
299
+ <h3>Demostración de Accesibilidad</h3>
300
+ <div style={{
301
+ background: '#e8f5e8',
302
+ padding: '1rem',
303
+ borderRadius: '4px',
304
+ border: '1px solid #c8e6c9'
305
+ }}>
306
+ <p><strong>Prueba la accesibilidad:</strong></p>
307
+ <ol>
308
+ <li>Usa <kbd>Tab</kbd> para navegar entre grupos de radio buttons</li>
309
+ <li>Usa <kbd>Espacio</kbd> para seleccionar un radio button</li>
310
+ <li>Usa las flechas <kbd>↑</kbd> <kbd>↓</kbd> para navegar dentro de un grupo</li>
311
+ <li>Observa los indicadores de focus</li>
312
+ <li>Los lectores de pantalla anunciarán el estado y etiquetas</li>
313
+ </ol>
314
+
315
+ <RadioGroup
316
+ id="accessibility-demo"
317
+ label="Demostración de accesibilidad"
318
+ value="option1"
319
+ onChange={() => {}}
320
+ options={[
321
+ { id: 'acc1', label: 'Opción accesible 1', value: 'option1' },
322
+ { id: 'acc2', label: 'Opción accesible 2', value: 'option2' },
323
+ { id: 'acc3', label: 'Opción accesible 3', value: 'option3' }
324
+ ]}
325
+ />
326
+ </div>
327
+ </section>
328
+
329
+ {/* Comparación antes/después */}
330
+ <section style={{ marginBottom: '2rem' }}>
331
+ <h3>Comparación: Antes vs Después</h3>
332
+ <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: '1rem' }}>
333
+ <div style={{
334
+ background: '#ffebee',
335
+ padding: '1rem',
336
+ borderRadius: '4px',
337
+ border: '1px solid #ffcdd2'
338
+ }}>
339
+ <h4>❌ Antes</h4>
340
+ <ul>
341
+ <li>Error de sintaxis (class vs className)</li>
342
+ <li>Sin validación de props</li>
343
+ <li>Sin accesibilidad</li>
344
+ <li>Evento incorrecto (onClick vs onChange)</li>
345
+ <li>Props confusas (value para checked)</li>
346
+ <li>Sin estados avanzados</li>
347
+ <li>Sin componente de grupo</li>
348
+ <li>Sin documentación</li>
349
+ </ul>
350
+ </div>
351
+ <div style={{
352
+ background: '#e8f5e8',
353
+ padding: '1rem',
354
+ borderRadius: '4px',
355
+ border: '1px solid #c8e6c9'
356
+ }}>
357
+ <h4>✅ Después</h4>
358
+ <ul>
359
+ <li>Sintaxis corregida</li>
360
+ <li>PropTypes completos</li>
361
+ <li>Accesibilidad total</li>
362
+ <li>Eventos correctos</li>
363
+ <li>Props claras y consistentes</li>
364
+ <li>Estados avanzados (disabled, error, readOnly)</li>
365
+ <li>RadioGroup para manejo de grupos</li>
366
+ <li>Documentación y ejemplos completos</li>
367
+ </ul>
368
+ </div>
369
+ </div>
370
+ </section>
371
+
372
+ {/* Estado actual */}
373
+ <section>
374
+ <h3>Estado Actual de la Configuración</h3>
375
+ <pre style={{
376
+ background: '#f8f9fa',
377
+ padding: '1rem',
378
+ borderRadius: '4px',
379
+ fontSize: '0.9rem',
380
+ overflow: 'auto'
381
+ }}>
382
+ {JSON.stringify(settings, null, 2)}
383
+ </pre>
384
+ </section>
385
+ </div>
386
+ )
387
+ }
388
+
389
+ export default RadioExamples