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.
Files changed (172) hide show
  1. package/dist/index.css +4941 -324
  2. package/dist/index.js +42338 -0
  3. package/dist/index.js.map +1 -0
  4. package/dist/index.modern.js +37458 -31678
  5. package/dist/index.modern.js.map +1 -1
  6. package/dist/index.umd.js +39634 -34010
  7. package/dist/index.umd.js.map +1 -1
  8. package/package.json +26 -29
  9. package/src/Test.stories.jsx +28 -0
  10. package/src/desktop/Desktop.stories.jsx +110 -0
  11. package/src/desktop/WindowContext.js +135 -0
  12. package/src/desktop/WindowManager.js +355 -0
  13. package/src/desktop/desktop.css +55 -4
  14. package/src/desktop/desktop.js +312 -6
  15. package/src/desktop/index.js +7 -0
  16. package/src/desktop/window.css +229 -36
  17. package/src/desktop/window.js +254 -20
  18. package/src/desktop.backup/desktop.css +6 -0
  19. package/src/desktop.backup/desktop.js +13 -0
  20. package/src/desktop.backup/window.css +58 -0
  21. package/src/desktop.backup/window.js +27 -0
  22. package/src/html/Accordion.stories.jsx +178 -0
  23. package/src/html/Button.stories.jsx +175 -0
  24. package/src/html/Checkbox.stories.jsx +131 -0
  25. package/src/html/Chip.stories.jsx +189 -0
  26. package/src/html/Color.stories.jsx +234 -0
  27. package/src/html/Form.stories.jsx +271 -0
  28. package/src/html/Icon.stories.jsx +233 -0
  29. package/src/html/Progress.stories.jsx +247 -0
  30. package/src/html/Radio.stories.jsx +289 -0
  31. package/src/html/StyleTest.stories.jsx +81 -0
  32. package/src/html/Switch.stories.jsx +329 -0
  33. package/src/html/Tab.stories.jsx +239 -0
  34. package/src/html/Table.stories.jsx +188 -0
  35. package/src/html/Table2.stories.jsx +238 -0
  36. package/src/html/TextField2.stories.jsx +337 -0
  37. package/src/html/Tree.stories.jsx +285 -0
  38. package/src/html/accordion.example.js +0 -74
  39. package/src/html/accordion.js +1 -6
  40. package/src/html/button.js +2 -13
  41. package/src/html/checkbox.js +1 -9
  42. package/src/html/chip.js +2 -19
  43. package/src/html/color.js +1 -14
  44. package/src/html/form.js +4 -15
  45. package/src/html/header2.js +1 -12
  46. package/src/html/icon.js +1 -7
  47. package/src/html/index.js +1 -1
  48. package/src/html/list.js +1 -19
  49. package/src/html/menu.js +9 -5
  50. package/src/html/progress.js +5 -53
  51. package/src/html/property.js +9 -25
  52. package/src/html/radio.js +2 -16
  53. package/src/html/section.js +1 -6
  54. package/src/html/selector.js +2 -19
  55. package/src/html/switch.css +134 -100
  56. package/src/html/switch.example.js +46 -36
  57. package/src/html/switch.js +43 -192
  58. package/src/html/tab.js +3 -24
  59. package/src/html/text.js +1 -12
  60. package/src/html/textfield2.js +5 -42
  61. package/src/html/thumbnail.js +1 -12
  62. package/src/html/tokenfield.js +2 -21
  63. package/src/html/tree.js +3 -35
  64. package/src/index.js +1 -0
  65. package/__previewjs__/Wrapper.tsx +0 -14
  66. package/build-doc.sh +0 -10
  67. package/db/db.json +0 -89
  68. package/db/routes.json +0 -0
  69. package/dist/index.cjs +0 -36722
  70. package/dist/index.cjs.map +0 -1
  71. package/dist/index.css.map +0 -1
  72. package/doc/README.md +0 -196
  73. package/doc/evalulations/ACCORDION_EVALUATION.md +0 -583
  74. package/doc/evalulations/CHECKBOX_EVALUATION.md +0 -273
  75. package/doc/evalulations/CHIP_EVALUATION.md +0 -542
  76. package/doc/evalulations/COLOR_EVALUATION.md +0 -524
  77. package/doc/evalulations/COMPONENTS_EVALUATION.md +0 -477
  78. package/doc/evalulations/FORM_EVALUATION.md +0 -459
  79. package/doc/evalulations/HEADER_EVALUATION.md +0 -436
  80. package/doc/evalulations/ICON_EVALUATION.md +0 -254
  81. package/doc/evalulations/LIST_EVALUATION.md +0 -574
  82. package/doc/evalulations/PROGRESS_EVALUATION.md +0 -450
  83. package/doc/evalulations/RADIO_EVALUATION.md +0 -439
  84. package/doc/evalulations/RADIO_VISUAL_FIX.md +0 -183
  85. package/doc/evalulations/SECTION_IMPROVEMENTS.md +0 -153
  86. package/doc/evalulations/SWITCH_EVALUATION.md +0 -335
  87. package/doc/evalulations/SWITCH_VISUAL_FIX.md +0 -232
  88. package/doc/evalulations/TAB_EVALUATION.md +0 -626
  89. package/doc/evalulations/TEXTFIELD_EVALUATION.md +0 -747
  90. package/doc/evalulations/TOOLTIP_FIX.md +0 -157
  91. package/doc/evalulations/TREE_EVALUATION.md +0 -708
  92. package/doc/index.html +0 -0
  93. package/doc/package-lock.json +0 -17298
  94. package/doc/package.json +0 -34
  95. package/doc/public/index.html +0 -24
  96. package/doc/scripts/generate-examples.js +0 -129
  97. package/doc/src/App.css +0 -171
  98. package/doc/src/App.js +0 -114
  99. package/doc/src/components/ExamplePage.js +0 -129
  100. package/doc/src/components/WelcomePage.js +0 -84
  101. package/doc/src/index.css +0 -246
  102. package/doc/src/index.js +0 -17
  103. package/doc/src/theme.css +0 -256
  104. package/jest.config.js +0 -24
  105. package/preview.config.js +0 -38
  106. package/publish.sh +0 -6
  107. package/src/desktop/dektop.test.js +0 -11
  108. package/src/domain/CollectionAPI.test.js +0 -19
  109. package/src/domain/ContentEditor.test.js +0 -52
  110. package/src/domain2/CollectionAPI.test.js +0 -19
  111. package/src/domain2/CollectionContext.test.js +0 -71
  112. package/src/domain2/CollectionPage.test.js +0 -112
  113. package/src/domain2/DynamicForm.test.js +0 -47
  114. package/src/html/accordion.test.js +0 -37
  115. package/src/html/accordion.unit.test.js +0 -334
  116. package/src/html/button.example.new.js +0 -416
  117. package/src/html/button.test.js +0 -422
  118. package/src/html/checkbox.test.js +0 -285
  119. package/src/html/chip.test.js +0 -425
  120. package/src/html/color.example.js.backup +0 -527
  121. package/src/html/color.test.js +0 -377
  122. package/src/html/components.example.js.backup +0 -492
  123. package/src/html/components_enhanced.test.js +0 -581
  124. package/src/html/form.example.js.backup +0 -385
  125. package/src/html/form.test.js +0 -369
  126. package/src/html/header2.example.js.backup +0 -411
  127. package/src/html/header2.test.js +0 -377
  128. package/src/html/icon.example.js.backup +0 -268
  129. package/src/html/icon.test.js +0 -231
  130. package/src/html/label.test.js +0 -0
  131. package/src/html/list.example.js.backup +0 -404
  132. package/src/html/list.test.js +0 -383
  133. package/src/html/progress.example.js.backup +0 -424
  134. package/src/html/progress.test.js +0 -313
  135. package/src/html/property.example.js.backup +0 -553
  136. package/src/html/property.test.js +0 -371
  137. package/src/html/radio.example.js.backup +0 -389
  138. package/src/html/radio.test.js +0 -318
  139. package/src/html/section.example.js.backup +0 -99
  140. package/src/html/section.test.js +0 -131
  141. package/src/html/selector.test.js +0 -20
  142. package/src/html/switch.example.js.backup +0 -461
  143. package/src/html/switch.test.js +0 -355
  144. package/src/html/tab.example.js.backup +0 -446
  145. package/src/html/tab.test.js +0 -25
  146. package/src/html/tab_enhanced.test.js +0 -504
  147. package/src/html/table.test.js +0 -70
  148. package/src/html/table2.test.js +0 -582
  149. package/src/html/text.test.js +0 -15
  150. package/src/html/textfield.test.js +0 -51
  151. package/src/html/textfield2.example.js.backup +0 -1370
  152. package/src/html/textfield2.test.js +0 -950
  153. package/src/html/tokenfield.example.js.backup +0 -503
  154. package/src/html/tokenfield.test.js +0 -423
  155. package/src/html/tree.example.js.backup +0 -475
  156. package/src/html/tree.test.js +0 -43
  157. package/src/html/tree_enhanced.test.js +0 -495
  158. package/src/http/token.test.js +0 -50
  159. package/src/incubator/pdfViewer.js +0 -33
  160. package/src/incubator/wizard.test.js +0 -127
  161. package/src/site/site.test.js +0 -230
  162. package/src/site/view.test.js +0 -41
  163. package/src/widgets/calendar/Calendar.test.js +0 -28
  164. package/src/widgets/explorer/Explorer.test.js +0 -121
  165. package/src/widgets/ide/editor.test.js +0 -33
  166. package/src/widgets/kanban/Kanban.test.js +0 -78
  167. package/src/widgets/login/LoginBox.test.js +0 -12
  168. package/src/widgets/login/ResetPasswordBox.test.js +0 -34
  169. package/src/widgets/login/validations.test.js +0 -51
  170. package/src/widgets/planner/Planner.test.js +0 -60
  171. package/src/widgets/upload/Upload.test.js +0 -32
  172. 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
+ )