ywana-core8 0.1.105 → 0.1.106
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/package.json +1 -1
- package/src/html/radio-example.js +120 -0
- package/src/html/radio-inline-feature.md +119 -0
- package/src/html/radio-inline-test.js +149 -0
- package/src/html/radio.css +34 -0
- package/src/html/radio.js +5 -0
- package/src/html/radio.test.js +26 -0
- package/dist/index.cjs +0 -36725
- package/dist/index.cjs.map +0 -1
- package/dist/index.css +0 -12371
- package/dist/index.css.map +0 -1
- package/dist/index.modern.js +0 -36561
- package/dist/index.modern.js.map +0 -1
- package/dist/index.umd.js +0 -36720
- package/dist/index.umd.js.map +0 -1
- package/src/html/chip.example.js.backup +0 -355
- package/src/html/components.example.js.backup +0 -492
- package/src/html/form.example.js.backup +0 -385
- package/src/html/header2.example.js.backup +0 -411
- package/src/html/icon.example.js.backup +0 -268
- package/src/html/list.example.js.backup +0 -404
- package/src/html/progress.example.js.backup +0 -424
- package/src/html/property.example.js.backup +0 -553
- package/src/html/radio.example.js.backup +0 -389
- package/src/html/section.example.js.backup +0 -99
- package/src/html/switch.example.js.backup +0 -461
- package/src/html/textfield2.example.js.backup +0 -1370
- package/src/html/tokenfield.example.js.backup +0 -503
- package/src/html/tree.example.js.backup +0 -475
package/package.json
CHANGED
@@ -0,0 +1,120 @@
|
|
1
|
+
import React, { useState } from 'react'
|
2
|
+
import { RadioGroup } from './radio'
|
3
|
+
|
4
|
+
/**
|
5
|
+
* Ejemplo de uso del componente RadioGroup con la nueva prop inline
|
6
|
+
*/
|
7
|
+
export const RadioExample = () => {
|
8
|
+
const [selectedValue1, setSelectedValue1] = useState('option1')
|
9
|
+
const [selectedValue2, setSelectedValue2] = useState('small')
|
10
|
+
|
11
|
+
const options1 = [
|
12
|
+
{ id: 'option1', label: 'Opción 1', value: 'option1' },
|
13
|
+
{ id: 'option2', label: 'Opción 2', value: 'option2' },
|
14
|
+
{ id: 'option3', label: 'Opción 3', value: 'option3' }
|
15
|
+
]
|
16
|
+
|
17
|
+
const sizeOptions = [
|
18
|
+
{ id: 'small', label: 'Pequeño', value: 'small' },
|
19
|
+
{ id: 'medium', label: 'Mediano', value: 'medium' },
|
20
|
+
{ id: 'large', label: 'Grande', value: 'large' }
|
21
|
+
]
|
22
|
+
|
23
|
+
const handleChange1 = (id, value) => {
|
24
|
+
setSelectedValue1(value)
|
25
|
+
console.log('RadioGroup 1 changed:', { id, value })
|
26
|
+
}
|
27
|
+
|
28
|
+
const handleChange2 = (id, value) => {
|
29
|
+
setSelectedValue2(value)
|
30
|
+
console.log('RadioGroup 2 changed:', { id, value })
|
31
|
+
}
|
32
|
+
|
33
|
+
return (
|
34
|
+
<div style={{ padding: '2rem', maxWidth: '800px' }}>
|
35
|
+
<h2>Ejemplos de RadioGroup</h2>
|
36
|
+
|
37
|
+
<div style={{ marginBottom: '2rem' }}>
|
38
|
+
<h3>RadioGroup Normal (vertical)</h3>
|
39
|
+
<RadioGroup
|
40
|
+
id="example1"
|
41
|
+
label="Selecciona una opción"
|
42
|
+
value={selectedValue1}
|
43
|
+
options={options1}
|
44
|
+
onChange={handleChange1}
|
45
|
+
required
|
46
|
+
/>
|
47
|
+
</div>
|
48
|
+
|
49
|
+
<div style={{ marginBottom: '2rem' }}>
|
50
|
+
<h3>RadioGroup Inline (horizontal)</h3>
|
51
|
+
<RadioGroup
|
52
|
+
id="example2"
|
53
|
+
label="Tamaño:"
|
54
|
+
value={selectedValue2}
|
55
|
+
options={sizeOptions}
|
56
|
+
onChange={handleChange2}
|
57
|
+
inline={true}
|
58
|
+
/>
|
59
|
+
</div>
|
60
|
+
|
61
|
+
<div style={{ marginBottom: '2rem' }}>
|
62
|
+
<h3>RadioGroup Inline con muchas opciones</h3>
|
63
|
+
<RadioGroup
|
64
|
+
id="example3"
|
65
|
+
label="Colores:"
|
66
|
+
value="red"
|
67
|
+
options={[
|
68
|
+
{ id: 'red', label: 'Rojo', value: 'red' },
|
69
|
+
{ id: 'blue', label: 'Azul', value: 'blue' },
|
70
|
+
{ id: 'green', label: 'Verde', value: 'green' },
|
71
|
+
{ id: 'yellow', label: 'Amarillo', value: 'yellow' },
|
72
|
+
{ id: 'purple', label: 'Morado', value: 'purple' },
|
73
|
+
{ id: 'orange', label: 'Naranja', value: 'orange' }
|
74
|
+
]}
|
75
|
+
inline={true}
|
76
|
+
/>
|
77
|
+
</div>
|
78
|
+
|
79
|
+
<div style={{ marginBottom: '2rem' }}>
|
80
|
+
<h3>RadioGroup Inline Deshabilitado</h3>
|
81
|
+
<RadioGroup
|
82
|
+
id="example4"
|
83
|
+
label="Estado:"
|
84
|
+
value="active"
|
85
|
+
options={[
|
86
|
+
{ id: 'active', label: 'Activo', value: 'active' },
|
87
|
+
{ id: 'inactive', label: 'Inactivo', value: 'inactive' }
|
88
|
+
]}
|
89
|
+
inline={true}
|
90
|
+
disabled={true}
|
91
|
+
/>
|
92
|
+
</div>
|
93
|
+
|
94
|
+
<div style={{ marginBottom: '2rem' }}>
|
95
|
+
<h3>RadioGroup Inline con Error</h3>
|
96
|
+
<RadioGroup
|
97
|
+
id="example5"
|
98
|
+
label="Prioridad:"
|
99
|
+
value=""
|
100
|
+
options={[
|
101
|
+
{ id: 'low', label: 'Baja', value: 'low' },
|
102
|
+
{ id: 'medium', label: 'Media', value: 'medium' },
|
103
|
+
{ id: 'high', label: 'Alta', value: 'high' }
|
104
|
+
]}
|
105
|
+
inline={true}
|
106
|
+
error="Por favor selecciona una prioridad"
|
107
|
+
required
|
108
|
+
/>
|
109
|
+
</div>
|
110
|
+
|
111
|
+
<div style={{ marginTop: '2rem', padding: '1rem', backgroundColor: '#f5f5f5', borderRadius: '4px' }}>
|
112
|
+
<h4>Valores seleccionados:</h4>
|
113
|
+
<p>RadioGroup 1: {selectedValue1}</p>
|
114
|
+
<p>RadioGroup 2: {selectedValue2}</p>
|
115
|
+
</div>
|
116
|
+
</div>
|
117
|
+
)
|
118
|
+
}
|
119
|
+
|
120
|
+
export default RadioExample
|
@@ -0,0 +1,119 @@
|
|
1
|
+
# RadioGroup - Nueva Funcionalidad Inline
|
2
|
+
|
3
|
+
## Versión: 0.1.105
|
4
|
+
|
5
|
+
### Descripción
|
6
|
+
Se ha agregado una nueva prop `inline` al componente `RadioGroup` que permite mostrar el label y los RadioButtons en una sola fila horizontal, en lugar del layout vertical por defecto.
|
7
|
+
|
8
|
+
### Nueva Prop
|
9
|
+
|
10
|
+
#### `inline` (boolean)
|
11
|
+
- **Tipo**: `boolean`
|
12
|
+
- **Por defecto**: `false`
|
13
|
+
- **Descripción**: Cuando es `true`, el label y las opciones se muestran en una sola fila horizontal.
|
14
|
+
|
15
|
+
### Uso
|
16
|
+
|
17
|
+
#### Ejemplo Básico
|
18
|
+
```jsx
|
19
|
+
import { RadioGroup } from './radio'
|
20
|
+
|
21
|
+
const options = [
|
22
|
+
{ id: 'small', label: 'Pequeño', value: 'small' },
|
23
|
+
{ id: 'medium', label: 'Mediano', value: 'medium' },
|
24
|
+
{ id: 'large', label: 'Grande', value: 'large' }
|
25
|
+
]
|
26
|
+
|
27
|
+
// RadioGroup normal (vertical)
|
28
|
+
<RadioGroup
|
29
|
+
id="size-vertical"
|
30
|
+
label="Selecciona un tamaño"
|
31
|
+
options={options}
|
32
|
+
value={selectedValue}
|
33
|
+
onChange={handleChange}
|
34
|
+
/>
|
35
|
+
|
36
|
+
// RadioGroup inline (horizontal)
|
37
|
+
<RadioGroup
|
38
|
+
id="size-inline"
|
39
|
+
label="Tamaño:"
|
40
|
+
options={options}
|
41
|
+
value={selectedValue}
|
42
|
+
onChange={handleChange}
|
43
|
+
inline={true}
|
44
|
+
/>
|
45
|
+
```
|
46
|
+
|
47
|
+
### Comportamiento
|
48
|
+
|
49
|
+
#### Desktop
|
50
|
+
- **Normal**: Label arriba, opciones en columna vertical
|
51
|
+
- **Inline**: Label a la izquierda, opciones en fila horizontal con flex-wrap
|
52
|
+
|
53
|
+
#### Mobile (< 768px)
|
54
|
+
- **Normal**: Mantiene el layout vertical
|
55
|
+
- **Inline**: Se convierte automáticamente a layout vertical para mejor usabilidad en pantallas pequeñas
|
56
|
+
|
57
|
+
### Estilos CSS Agregados
|
58
|
+
|
59
|
+
```css
|
60
|
+
/* Inline layout styles */
|
61
|
+
.radio-group.inline {
|
62
|
+
flex-direction: row;
|
63
|
+
align-items: center;
|
64
|
+
gap: 1rem;
|
65
|
+
}
|
66
|
+
|
67
|
+
.radio-group.inline .radio-group-label {
|
68
|
+
margin-bottom: 0;
|
69
|
+
flex-shrink: 0;
|
70
|
+
}
|
71
|
+
|
72
|
+
.radio-group.inline .radio-group-options {
|
73
|
+
flex-direction: row;
|
74
|
+
gap: 1rem;
|
75
|
+
flex-wrap: wrap;
|
76
|
+
}
|
77
|
+
|
78
|
+
/* Responsive: Stack inline radio groups on mobile */
|
79
|
+
@media (max-width: 768px) {
|
80
|
+
.radio-group.inline {
|
81
|
+
flex-direction: column;
|
82
|
+
align-items: flex-start;
|
83
|
+
gap: 0.5rem;
|
84
|
+
}
|
85
|
+
|
86
|
+
.radio-group.inline .radio-group-label {
|
87
|
+
margin-bottom: 0.5rem;
|
88
|
+
}
|
89
|
+
|
90
|
+
.radio-group.inline .radio-group-options {
|
91
|
+
flex-direction: column;
|
92
|
+
gap: 0.5rem;
|
93
|
+
}
|
94
|
+
}
|
95
|
+
```
|
96
|
+
|
97
|
+
### Casos de Uso Recomendados
|
98
|
+
|
99
|
+
#### ✅ Bueno para inline:
|
100
|
+
- Opciones cortas (2-4 opciones)
|
101
|
+
- Labels de opciones breves
|
102
|
+
- Formularios compactos
|
103
|
+
- Filtros y configuraciones
|
104
|
+
|
105
|
+
#### ❌ Evitar inline:
|
106
|
+
- Muchas opciones (>5)
|
107
|
+
- Labels de opciones muy largos
|
108
|
+
- Cuando el espacio horizontal es limitado
|
109
|
+
|
110
|
+
### Compatibilidad
|
111
|
+
- ✅ Funciona con todas las props existentes (`disabled`, `error`, `required`, etc.)
|
112
|
+
- ✅ Mantiene accesibilidad completa
|
113
|
+
- ✅ Responsive automático
|
114
|
+
- ✅ Retrocompatible (no afecta componentes existentes)
|
115
|
+
|
116
|
+
### Archivos Modificados
|
117
|
+
- `src/html/radio.js`: Agregada prop `inline` y lógica
|
118
|
+
- `src/html/radio.css`: Agregados estilos para layout inline y responsive
|
119
|
+
- `src/html/radio-example.js`: Ejemplos de uso (nuevo archivo)
|
@@ -0,0 +1,149 @@
|
|
1
|
+
/**
|
2
|
+
* Test simple para verificar la funcionalidad inline del RadioGroup
|
3
|
+
* Este test verifica que la prop inline se maneje correctamente
|
4
|
+
*/
|
5
|
+
|
6
|
+
// Simulamos las funciones que necesitamos para el test
|
7
|
+
const testInlineFunctionality = () => {
|
8
|
+
console.log('🧪 Iniciando tests para RadioGroup inline...')
|
9
|
+
|
10
|
+
// Test 1: Verificar que la prop inline se incluye en las CSS classes
|
11
|
+
const generateCssClasses = (inline, disabled, readOnly, error, className) => {
|
12
|
+
return [
|
13
|
+
'radio-group',
|
14
|
+
inline && 'inline',
|
15
|
+
disabled && 'disabled',
|
16
|
+
readOnly && 'readonly',
|
17
|
+
error && 'error',
|
18
|
+
className
|
19
|
+
].filter(Boolean).join(' ')
|
20
|
+
}
|
21
|
+
|
22
|
+
// Test casos para inline
|
23
|
+
const testCases = [
|
24
|
+
{
|
25
|
+
name: 'inline = false (default)',
|
26
|
+
input: [false, false, false, false, ''],
|
27
|
+
expected: 'radio-group'
|
28
|
+
},
|
29
|
+
{
|
30
|
+
name: 'inline = true',
|
31
|
+
input: [true, false, false, false, ''],
|
32
|
+
expected: 'radio-group inline'
|
33
|
+
},
|
34
|
+
{
|
35
|
+
name: 'inline = true con disabled',
|
36
|
+
input: [true, true, false, false, ''],
|
37
|
+
expected: 'radio-group inline disabled'
|
38
|
+
},
|
39
|
+
{
|
40
|
+
name: 'inline = true con readOnly',
|
41
|
+
input: [true, false, true, false, ''],
|
42
|
+
expected: 'radio-group inline readonly'
|
43
|
+
},
|
44
|
+
{
|
45
|
+
name: 'inline = true con error',
|
46
|
+
input: [true, false, false, 'error message', ''],
|
47
|
+
expected: 'radio-group inline error'
|
48
|
+
},
|
49
|
+
{
|
50
|
+
name: 'inline = true con className personalizada',
|
51
|
+
input: [true, false, false, false, 'custom-class'],
|
52
|
+
expected: 'radio-group inline custom-class'
|
53
|
+
},
|
54
|
+
{
|
55
|
+
name: 'inline = true con todas las props',
|
56
|
+
input: [true, true, true, 'error', 'custom'],
|
57
|
+
expected: 'radio-group inline disabled readonly error custom'
|
58
|
+
}
|
59
|
+
]
|
60
|
+
|
61
|
+
let passedTests = 0
|
62
|
+
let totalTests = testCases.length
|
63
|
+
|
64
|
+
testCases.forEach(testCase => {
|
65
|
+
const result = generateCssClasses(...testCase.input)
|
66
|
+
const passed = result === testCase.expected
|
67
|
+
|
68
|
+
if (passed) {
|
69
|
+
console.log(`✅ ${testCase.name}: PASSED`)
|
70
|
+
passedTests++
|
71
|
+
} else {
|
72
|
+
console.log(`❌ ${testCase.name}: FAILED`)
|
73
|
+
console.log(` Expected: "${testCase.expected}"`)
|
74
|
+
console.log(` Got: "${result}"`)
|
75
|
+
}
|
76
|
+
})
|
77
|
+
|
78
|
+
// Test 2: Verificar PropTypes (simulado)
|
79
|
+
const mockPropTypes = {
|
80
|
+
id: 'string',
|
81
|
+
label: 'string',
|
82
|
+
value: 'oneOfType',
|
83
|
+
options: 'arrayOf',
|
84
|
+
disabled: 'bool',
|
85
|
+
readOnly: 'bool',
|
86
|
+
error: 'oneOfType',
|
87
|
+
required: 'bool',
|
88
|
+
inline: 'bool', // Nueva prop
|
89
|
+
className: 'string',
|
90
|
+
ariaLabel: 'string',
|
91
|
+
onChange: 'func'
|
92
|
+
}
|
93
|
+
|
94
|
+
const hasInlineProp = 'inline' in mockPropTypes
|
95
|
+
if (hasInlineProp) {
|
96
|
+
console.log('✅ PropTypes incluye la prop inline: PASSED')
|
97
|
+
passedTests++
|
98
|
+
totalTests++
|
99
|
+
} else {
|
100
|
+
console.log('❌ PropTypes incluye la prop inline: FAILED')
|
101
|
+
totalTests++
|
102
|
+
}
|
103
|
+
|
104
|
+
// Test 3: Verificar defaultProps (simulado)
|
105
|
+
const mockDefaultProps = {
|
106
|
+
options: [],
|
107
|
+
disabled: false,
|
108
|
+
readOnly: false,
|
109
|
+
error: false,
|
110
|
+
required: false,
|
111
|
+
inline: false, // Nueva prop con valor por defecto
|
112
|
+
className: ''
|
113
|
+
}
|
114
|
+
|
115
|
+
const hasInlineDefault = mockDefaultProps.inline === false
|
116
|
+
if (hasInlineDefault) {
|
117
|
+
console.log('✅ defaultProps incluye inline: false: PASSED')
|
118
|
+
passedTests++
|
119
|
+
totalTests++
|
120
|
+
} else {
|
121
|
+
console.log('❌ defaultProps incluye inline: false: FAILED')
|
122
|
+
totalTests++
|
123
|
+
}
|
124
|
+
|
125
|
+
// Resumen
|
126
|
+
console.log('\n📊 Resumen de tests:')
|
127
|
+
console.log(` Tests pasados: ${passedTests}/${totalTests}`)
|
128
|
+
console.log(` Porcentaje de éxito: ${Math.round((passedTests / totalTests) * 100)}%`)
|
129
|
+
|
130
|
+
if (passedTests === totalTests) {
|
131
|
+
console.log('🎉 ¡Todos los tests pasaron! La funcionalidad inline está correctamente implementada.')
|
132
|
+
} else {
|
133
|
+
console.log('⚠️ Algunos tests fallaron. Revisar la implementación.')
|
134
|
+
}
|
135
|
+
|
136
|
+
return passedTests === totalTests
|
137
|
+
}
|
138
|
+
|
139
|
+
// Ejecutar los tests si el archivo se ejecuta directamente
|
140
|
+
if (typeof module !== 'undefined' && require.main === module) {
|
141
|
+
testInlineFunctionality()
|
142
|
+
}
|
143
|
+
|
144
|
+
// Exportar para uso en otros archivos
|
145
|
+
if (typeof module !== 'undefined') {
|
146
|
+
module.exports = { testInlineFunctionality }
|
147
|
+
}
|
148
|
+
|
149
|
+
export { testInlineFunctionality }
|
package/src/html/radio.css
CHANGED
@@ -135,6 +135,24 @@
|
|
135
135
|
gap: 0.75rem;
|
136
136
|
}
|
137
137
|
|
138
|
+
/* Inline layout styles */
|
139
|
+
.radio-group.inline {
|
140
|
+
flex-direction: row;
|
141
|
+
align-items: center;
|
142
|
+
gap: 1rem;
|
143
|
+
}
|
144
|
+
|
145
|
+
.radio-group.inline .radio-group-label {
|
146
|
+
margin-bottom: 0;
|
147
|
+
flex-shrink: 0;
|
148
|
+
}
|
149
|
+
|
150
|
+
.radio-group.inline .radio-group-options {
|
151
|
+
flex-direction: row;
|
152
|
+
gap: 1rem;
|
153
|
+
flex-wrap: wrap;
|
154
|
+
}
|
155
|
+
|
138
156
|
.radio-group.disabled {
|
139
157
|
opacity: 0.6;
|
140
158
|
}
|
@@ -157,6 +175,22 @@
|
|
157
175
|
.radio > label {
|
158
176
|
font-size: 0.9rem;
|
159
177
|
}
|
178
|
+
|
179
|
+
/* Stack inline radio groups on mobile for better usability */
|
180
|
+
.radio-group.inline {
|
181
|
+
flex-direction: column;
|
182
|
+
align-items: flex-start;
|
183
|
+
gap: 0.5rem;
|
184
|
+
}
|
185
|
+
|
186
|
+
.radio-group.inline .radio-group-label {
|
187
|
+
margin-bottom: 0.5rem;
|
188
|
+
}
|
189
|
+
|
190
|
+
.radio-group.inline .radio-group-options {
|
191
|
+
flex-direction: column;
|
192
|
+
gap: 0.5rem;
|
193
|
+
}
|
160
194
|
}
|
161
195
|
|
162
196
|
/* High contrast mode support */
|
package/src/html/radio.js
CHANGED
@@ -103,6 +103,7 @@ export const RadioGroup = (props) => {
|
|
103
103
|
readOnly = false,
|
104
104
|
error = false,
|
105
105
|
required = false,
|
106
|
+
inline = false,
|
106
107
|
className,
|
107
108
|
ariaLabel,
|
108
109
|
onChange
|
@@ -130,6 +131,7 @@ export const RadioGroup = (props) => {
|
|
130
131
|
// Generate CSS classes
|
131
132
|
const cssClasses = [
|
132
133
|
'radio-group',
|
134
|
+
inline && 'inline',
|
133
135
|
disabled && 'disabled',
|
134
136
|
readOnly && 'readonly',
|
135
137
|
error && 'error',
|
@@ -231,6 +233,8 @@ RadioGroup.propTypes = {
|
|
231
233
|
error: PropTypes.oneOfType([PropTypes.bool, PropTypes.string]),
|
232
234
|
/** Whether the group selection is required */
|
233
235
|
required: PropTypes.bool,
|
236
|
+
/** Whether to display label and options in a single row */
|
237
|
+
inline: PropTypes.bool,
|
234
238
|
/** Additional CSS classes */
|
235
239
|
className: PropTypes.string,
|
236
240
|
/** Accessibility label for screen readers */
|
@@ -245,5 +249,6 @@ RadioGroup.defaultProps = {
|
|
245
249
|
readOnly: false,
|
246
250
|
error: false,
|
247
251
|
required: false,
|
252
|
+
inline: false,
|
248
253
|
className: ''
|
249
254
|
}
|
package/src/html/radio.test.js
CHANGED
@@ -192,6 +192,7 @@ describe('Radio Components', () => {
|
|
192
192
|
expect(RadioGroup.propTypes.readOnly).toBeDefined()
|
193
193
|
expect(RadioGroup.propTypes.error).toBeDefined()
|
194
194
|
expect(RadioGroup.propTypes.required).toBeDefined()
|
195
|
+
expect(RadioGroup.propTypes.inline).toBeDefined()
|
195
196
|
expect(RadioGroup.propTypes.className).toBeDefined()
|
196
197
|
expect(RadioGroup.propTypes.ariaLabel).toBeDefined()
|
197
198
|
expect(RadioGroup.propTypes.onChange).toBeDefined()
|
@@ -204,6 +205,7 @@ describe('Radio Components', () => {
|
|
204
205
|
expect(RadioGroup.defaultProps.readOnly).toBe(false)
|
205
206
|
expect(RadioGroup.defaultProps.error).toBe(false)
|
206
207
|
expect(RadioGroup.defaultProps.required).toBe(false)
|
208
|
+
expect(RadioGroup.defaultProps.inline).toBe(false)
|
207
209
|
expect(RadioGroup.defaultProps.className).toBe('')
|
208
210
|
})
|
209
211
|
|
@@ -314,5 +316,29 @@ describe('Radio Components', () => {
|
|
314
316
|
expect(mapped[2].id).toBe('test-group-2')
|
315
317
|
expect(mapped[2].value).toBeUndefined()
|
316
318
|
})
|
319
|
+
|
320
|
+
test('applies inline CSS class when inline prop is true', () => {
|
321
|
+
const generateCssClasses = (inline, disabled, readOnly, error, className) => {
|
322
|
+
return [
|
323
|
+
'radio-group',
|
324
|
+
inline && 'inline',
|
325
|
+
disabled && 'disabled',
|
326
|
+
readOnly && 'readonly',
|
327
|
+
error && 'error',
|
328
|
+
className
|
329
|
+
].filter(Boolean).join(' ')
|
330
|
+
}
|
331
|
+
|
332
|
+
// Test inline = false (default)
|
333
|
+
expect(generateCssClasses(false, false, false, false, '')).toBe('radio-group')
|
334
|
+
|
335
|
+
// Test inline = true
|
336
|
+
expect(generateCssClasses(true, false, false, false, '')).toBe('radio-group inline')
|
337
|
+
|
338
|
+
// Test inline = true with other states
|
339
|
+
expect(generateCssClasses(true, true, false, false, 'custom-class')).toBe('radio-group inline disabled custom-class')
|
340
|
+
expect(generateCssClasses(true, false, true, false, '')).toBe('radio-group inline readonly')
|
341
|
+
expect(generateCssClasses(true, false, false, 'error message', '')).toBe('radio-group inline error')
|
342
|
+
})
|
317
343
|
})
|
318
344
|
})
|