feat : Revoir la config couleur tailwind

This commit is contained in:
2026-03-24 10:01:58 +01:00
parent 04f16c1f04
commit ae2ca40458
13 changed files with 48 additions and 47 deletions

View File

@@ -20,6 +20,7 @@ Liste des évolutions de la librairie Malio layer UI
* [#MUI-14] Création d'un composant bouton icône
* [#MUI-11] Création d'un composant navigation par onglets
* [#MUI-20] Création d'un composant sidebar
* [#MUI-23] Revoir la config couleur tailwind
### Changed

View File

@@ -12,7 +12,7 @@
--m-muted: 100 116 139; /* #64748B */
--m-border: 203 213 225; /* #CBD5E1 */
--m-disabled: 204 204 223; /* #CCCCDF - Partagé entre toutes les familles bouton */
--m-error: 155 17 30; /* #9B111E */
--m-danger: 242 105 107; /* #F2696B - Erreurs et boutons danger */
--m-success: 15 149 70; /* #0F9546 */
/* ── Boutons Primary ── */

View File

@@ -114,7 +114,7 @@ describe('MalioCheckbox', () => {
})
expect(wrapper.get('input').attributes('aria-invalid')).toBe('true')
expect(wrapper.get('label').classes()).toContain('text-m-error')
expect(wrapper.get('label').classes()).toContain('text-m-danger')
expect(wrapper.get('p').text()).toBe('You must accept')
})
@@ -125,7 +125,7 @@ describe('MalioCheckbox', () => {
})
expect(wrapper.get('p').text()).toBe('Invalid')
expect(wrapper.get('p').classes()).toContain('text-m-error')
expect(wrapper.get('p').classes()).toContain('text-m-danger')
})
it('shows success styles and message when there is no error', () => {

View File

@@ -161,19 +161,19 @@ describe('MalioInputText', () => {
it('shows error message without label and icon', () => {
const wrapper = mountInput({error: 'Error message test'})
expect(wrapper.get('p.text-m-error').text()).toBe('Error message test')
expect(wrapper.get('input').classes()).toContain('border-m-error')
expect(wrapper.get('p.text-m-danger').text()).toBe('Error message test')
expect(wrapper.get('input').classes()).toContain('border-m-danger')
expect(wrapper.get('input').attributes('aria-invalid')).toBe('true')
expect(wrapper.get('p').classes()).toContain('text-m-error')
expect(wrapper.get('p').classes()).toContain('text-m-danger')
})
it('shows error message with label and without icon', () => {
const wrapper = mountInput({error: 'Error message test', label: 'Error message'})
expect(wrapper.get('p.text-m-error').text()).toBe('Error message test')
expect(wrapper.get('input').classes()).toContain('border-m-error')
expect(wrapper.get('label').classes()).toContain('text-m-error')
expect(wrapper.get('p').classes()).toContain('text-m-error')
expect(wrapper.get('p.text-m-danger').text()).toBe('Error message test')
expect(wrapper.get('input').classes()).toContain('border-m-danger')
expect(wrapper.get('label').classes()).toContain('text-m-danger')
expect(wrapper.get('p').classes()).toContain('text-m-danger')
})
it('shows error message with label and icon', () => {
@@ -183,19 +183,19 @@ describe('MalioInputText', () => {
iconName: 'mdi:key-outline',
})
expect(wrapper.get('p.text-m-error').text()).toBe('Error message test')
expect(wrapper.get('input').classes()).toContain('border-m-error')
expect(wrapper.get('label').classes()).toContain('text-m-error')
expect(wrapper.get('[data-test="icon"]').classes()).toContain('text-m-error')
expect(wrapper.get('p').classes()).toContain('text-m-error')
expect(wrapper.get('p.text-m-danger').text()).toBe('Error message test')
expect(wrapper.get('input').classes()).toContain('border-m-danger')
expect(wrapper.get('label').classes()).toContain('text-m-danger')
expect(wrapper.get('[data-test="icon"]').classes()).toContain('text-m-danger')
expect(wrapper.get('p').classes()).toContain('text-m-danger')
})
it('shows error message with icon and without label', () => {
const wrapper = mountInput({error: 'Error message test', iconName: 'mdi:key-outline'})
expect(wrapper.get('p.text-m-error').text()).toBe('Error message test')
expect(wrapper.get('input').classes()).toContain('border-m-error')
expect(wrapper.get('[data-test="icon"]').classes()).toContain('text-m-error')
expect(wrapper.get('p.text-m-danger').text()).toBe('Error message test')
expect(wrapper.get('input').classes()).toContain('border-m-danger')
expect(wrapper.get('[data-test="icon"]').classes()).toContain('text-m-danger')
})
it('shows success message without label and icon', () => {
@@ -240,10 +240,10 @@ describe('MalioInputText', () => {
success: 'Success message test',
})
expect(wrapper.find('p.text-m-error').exists()).toBe(true)
expect(wrapper.get('p.text-m-error').text()).toBe('Error message test')
expect(wrapper.find('p.text-m-danger').exists()).toBe(true)
expect(wrapper.get('p.text-m-danger').text()).toBe('Error message test')
expect(wrapper.find('p.text-m-success').exists()).toBe(false)
expect(wrapper.get('input').classes()).toContain('border-m-error')
expect(wrapper.get('input').classes()).toContain('border-m-danger')
expect(wrapper.get('input').classes()).not.toContain('border-m-success')
})

View File

@@ -87,7 +87,7 @@ describe('MalioInputAmount', () => {
expect(wrapper.get('input').attributes('aria-invalid')).toBe('true')
expect(wrapper.get('input').attributes('aria-describedby')).toBe(`${inputId}-describedby`)
expect(wrapper.get('p.text-m-error').text()).toBe('Montant invalide')
expect(wrapper.get('p.text-m-danger').text()).toBe('Montant invalide')
})
it('keeps dots as the decimal separator on input', async () => {

View File

@@ -126,15 +126,15 @@ describe('MalioInputPassword', () => {
it('shows error message and styles', () => {
const wrapper = mountComponent({error: 'Mot de passe requis'})
expect(wrapper.get('p.text-m-error').text()).toBe('Mot de passe requis')
expect(wrapper.get('input').classes()).toContain('border-m-error')
expect(wrapper.get('p.text-m-danger').text()).toBe('Mot de passe requis')
expect(wrapper.get('input').classes()).toContain('border-m-danger')
expect(wrapper.get('input').attributes('aria-invalid')).toBe('true')
})
it('shows error style on icon', () => {
const wrapper = mountComponent({error: 'Error'})
expect(wrapper.get('[data-test="icon"]').classes()).toContain('text-m-error')
expect(wrapper.get('[data-test="icon"]').classes()).toContain('text-m-danger')
})
it('shows success message and styles', () => {

View File

@@ -40,7 +40,7 @@
data-test="icon"
:class="[
hasError
? 'text-m-error'
? 'text-m-danger'
: hasSuccess
? 'text-m-success' : iconColor,
iconPositionClass,
@@ -53,7 +53,7 @@
:id="`${inputId}-describedby`"
:class="[
hasError
? 'text-m-error'
? 'text-m-danger'
: hasSuccess
? 'text-m-success'
: 'text-m-muted',
@@ -148,7 +148,7 @@ const mergedInputClass = computed(() =>
isFilled.value ? 'border-black' : 'border-m-muted',
disabled.value ? 'cursor-not-allowed text-black/60 [&:not(:placeholder-shown)]:border-m-muted border-m-muted' : 'cursor-text',
hasError.value
? 'border-m-error focus:border-m-error [&:not(:placeholder-shown)]:border-m-error'
? 'border-m-danger focus:border-m-danger [&:not(:placeholder-shown)]:border-m-danger'
: hasSuccess.value
? 'border-m-success focus:border-m-success [&:not(:placeholder-shown)]:border-m-success'
: 'focus:border-m-primary',
@@ -164,7 +164,7 @@ const mergedLabelClass = computed(() =>
shouldFloatLabel.value ? '-translate-y-[1.25rem] peer-focus:-translate-y-[1.55rem] scale-90' : '',
disabled.value ? 'peer-[&:not(:placeholder-shown):not(:focus)]:text-black/60' : '',
hasError.value
? 'text-m-error'
? 'text-m-danger'
: hasSuccess.value
? 'text-m-success'
: 'peer-placeholder-shown:text-m-muted peer-[&:not(:placeholder-shown):not(:focus)]:text-black peer-focus:text-m-primary',

View File

@@ -118,9 +118,9 @@ describe('MalioInputTextArea', () => {
},
})
expect(wrapper.get('textarea').classes()).toContain('border-m-error')
expect(wrapper.get('label').classes()).toContain('text-m-error')
expect(wrapper.get('p.text-m-error').text()).toBe('Textarea error')
expect(wrapper.get('textarea').classes()).toContain('border-m-danger')
expect(wrapper.get('label').classes()).toContain('text-m-danger')
expect(wrapper.get('p.text-m-danger').text()).toBe('Textarea error')
expect(wrapper.get('textarea').attributes('aria-invalid')).toBe('true')
})
@@ -145,8 +145,8 @@ describe('MalioInputTextArea', () => {
},
})
expect(wrapper.get('textarea').classes()).toContain('border-m-error')
expect(wrapper.get('textarea').classes()).toContain('border-m-danger')
expect(wrapper.find('p.text-m-success').exists()).toBe(false)
expect(wrapper.get('p.text-m-error').text()).toBe('Textarea error')
expect(wrapper.get('p.text-m-danger').text()).toBe('Textarea error')
})
})

View File

@@ -115,15 +115,15 @@ describe('MalioInputUpload', () => {
it('shows error message and styles', () => {
const wrapper = mountComponent({error: 'Fichier requis'})
expect(wrapper.get('p.text-m-error').text()).toBe('Fichier requis')
expect(wrapper.get('input[type="text"]').classes()).toContain('border-m-error')
expect(wrapper.get('p.text-m-danger').text()).toBe('Fichier requis')
expect(wrapper.get('input[type="text"]').classes()).toContain('border-m-danger')
expect(wrapper.get('input[type="text"]').attributes('aria-invalid')).toBe('true')
})
it('shows error style on icon', () => {
const wrapper = mountComponent({error: 'Error'})
expect(wrapper.get('[data-test="icon"]').classes()).toContain('text-m-error')
expect(wrapper.get('[data-test="icon"]').classes()).toContain('text-m-danger')
})
it('shows success message and styles', () => {

View File

@@ -112,8 +112,8 @@ describe('MalioRadioButton', () => {
})
expect(wrapper.get('.radio-control').classes()).toContain('is-error')
expect(wrapper.get('.radio-text').classes()).toContain('text-m-error')
expect(wrapper.get('.radio-message').classes()).toContain('text-m-error')
expect(wrapper.get('.radio-text').classes()).toContain('text-m-danger')
expect(wrapper.get('.radio-message').classes()).toContain('text-m-danger')
expect(wrapper.get('input').attributes('aria-invalid')).toBe('true')
})
@@ -137,7 +137,7 @@ describe('MalioRadioButton', () => {
expect(wrapper.get('.radio-control').classes()).toContain('is-error')
expect(wrapper.get('.radio-control').classes()).not.toContain('is-success')
expect(wrapper.get('.radio-message').text()).toBe('Selection required')
expect(wrapper.get('.radio-message').classes()).toContain('text-m-error')
expect(wrapper.get('.radio-message').classes()).toContain('text-m-danger')
})
it('merges custom classes on group, input and label', () => {

View File

@@ -139,9 +139,9 @@ describe('MalioSelect', () => {
},
})
expect(wrapper.get('button').classes()).toContain('border-m-error')
expect(wrapper.get('label').classes()).toContain('text-m-error')
expect(wrapper.get('p.text-m-error').text()).toBe('Selection error')
expect(wrapper.get('button').classes()).toContain('border-m-danger')
expect(wrapper.get('label').classes()).toContain('text-m-danger')
expect(wrapper.get('p.text-m-danger').text()).toBe('Selection error')
expect(wrapper.get('button').attributes('aria-invalid')).toBe('true')
})
@@ -170,8 +170,8 @@ describe('MalioSelect', () => {
},
})
expect(wrapper.get('button').classes()).toContain('border-m-error')
expect(wrapper.get('button').classes()).toContain('border-m-danger')
expect(wrapper.find('p.text-m-success').exists()).toBe(false)
expect(wrapper.get('p.text-m-error').text()).toBe('Selection error')
expect(wrapper.get('p.text-m-danger').text()).toBe('Selection error')
})
})

View File

@@ -202,7 +202,7 @@ automatiquement.
### Couleur de l'icône
- `text-m-muted` par défaut.
- `text-m-error` si la prop `error` est renseignée.
- `text-m-danger` si la prop `error` est renseignée.
- `text-m-success` si la prop `success` est renseignée.
------------------------------------------------------------------------

View File

@@ -22,7 +22,7 @@ export default {
muted: 'rgb(var(--m-muted) / <alpha-value>)',
bg: 'rgb(var(--m-bg) / <alpha-value>)',
disabled: 'rgb(var(--m-disabled) / <alpha-value>)',
error: 'rgb(var(--m-error) / <alpha-value>)',
danger: 'rgb(var(--m-danger) / <alpha-value>)',
success: 'rgb(var(--m-success) / <alpha-value>)',
'btn-primary': 'rgb(var(--m-btn-primary) / <alpha-value>)',
'btn-primary-hover': 'rgb(var(--m-btn-primary-hover) / <alpha-value>)',