BjButton

Composant React pour le bouton DSBJ. Utilise forwardRef et des props typées.

Utilisation

import { BjButton } from '@flrxnt/dsbj/react'

export default function App() {
  return (
    <>
      <BjButton>Valider</BjButton>
      <BjButton variant="secondary">Annuler</BjButton>
    </>
  )
}

Aperçu

Variantes

Chaque valeur de variant (primary est la base sans modificateur CSS).

import { BjButton } from '@flrxnt/dsbj/react'

export default function App() {
  return (
    <>
      <BjButton variant="primary">Primary</BjButton>
      <BjButton variant="secondary">Secondary</BjButton>
      <BjButton variant="tertiary">Tertiary</BjButton>
      <BjButton variant="accent">Accent</BjButton>
      <BjButton variant="contrast">Contrast</BjButton>
    </>
  )
}

Tailles

sm, md (défaut) et lg via la prop size.

import { BjButton } from '@flrxnt/dsbj/react'

export default function App() {
  return (
    <>
      <BjButton size="sm">Small</BjButton>
      <BjButton size="md">Medium</BjButton>
      <BjButton size="lg">Large</BjButton>
    </>
  )
}

Variantes × tailles

Toutes les paires variant × size.

smmdlgPrimarySecondaryTertiaryAccentContrast
import { BjButton } from '@flrxnt/dsbj/react'

const variants = ['primary', 'secondary', 'tertiary', 'accent', 'contrast'] as const
const sizes = ['sm', 'md', 'lg'] as const

export default function App() {
  return (
    <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>
      {variants.map((variant) => (
        <div key={variant} style={{ display: 'flex', flexWrap: 'wrap', gap: 8 }}>
          {sizes.map((size) => (
            <BjButton key={size} variant={variant} size={size}>
              {variant} {size}
            </BjButton>
          ))}
        </div>
      ))}
    </div>
  )
}

Bouton icône

Prop icon : bouton carré bj-btn--icon pour chaque variante et taille.

smmdlgPrimarySecondaryTertiaryAccentContrast
import { BjButton } from '@flrxnt/dsbj/react'

const variants = ['primary', 'secondary', 'tertiary', 'accent', 'contrast'] as const
const sizes = ['sm', 'md', 'lg'] as const

export default function App() {
  return (
    <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>
      {variants.map((variant) => (
        <div key={variant} style={{ display: 'flex', flexWrap: 'wrap', gap: 8 }}>
          {sizes.map((size) => (
            <BjButton
              key={size}
              variant={variant}
              size={size}
              icon
              aria-label={`Add ${variant} ${size}`}
            >
              <i className="ri-add-line" aria-hidden />
            </BjButton>
          ))}
        </div>
      ))}
    </div>
  )
}

Pleine largeur

Prop full : classe bj-btn--full pour chaque variante.

import { BjButton } from '@flrxnt/dsbj/react'

export default function App() {
  return (
    <div style={{ maxWidth: 280 }}>
      <BjButton full variant="primary" style={{ marginBottom: 8 }}>
        Primary full
      </BjButton>
      <BjButton full variant="secondary" style={{ marginBottom: 8 }}>
        Secondary full
      </BjButton>
      <BjButton full variant="tertiary" style={{ marginBottom: 8 }}>
        Tertiary full
      </BjButton>
      <BjButton full variant="accent" style={{ marginBottom: 8 }}>
        Accent full
      </BjButton>
      <BjButton full variant="contrast">Contrast full</BjButton>
    </div>
  )
}

Désactivé

Attribut disabled natif sur chaque variante.

import { BjButton } from '@flrxnt/dsbj/react'

export default function App() {
  return (
    <>
      <BjButton disabled variant="primary">
        Primary
      </BjButton>
      <BjButton disabled variant="secondary">
        Secondary
      </BjButton>
      <BjButton disabled variant="tertiary">
        Tertiary
      </BjButton>
      <BjButton disabled variant="accent">
        Accent
      </BjButton>
      <BjButton disabled variant="contrast">
        Contrast
      </BjButton>
    </>
  )
}

as="a" avec href : rend une ancre avec les styles bouton.

import { BjButton } from '@flrxnt/dsbj/react'

export default function App() {
  return (
    <>
      <BjButton as="a" href="/dashboard" variant="primary">
        Dashboard
      </BjButton>
      <BjButton as="a" href="https://example.com" variant="secondary" target="_blank" rel="noopener noreferrer">
        External
      </BjButton>
    </>
  )
}

Combinaisons

Exemple combinant accent, lg, icon, loading et aria-label.

import { BjButton } from '@flrxnt/dsbj/react'

export default function App() {
  return (
    <BjButton variant="accent" size="lg" icon loading aria-label="Ajouter">
      <i className="ri-add-line" aria-hidden />
    </BjButton>
  )
}

Chargement

import { BjButton } from '@flrxnt/dsbj/react'

export default function App() {
  return (
    <>
      <BjButton loading>Envoi en cours</BjButton>
      <BjButton variant="secondary" loading>Chargement</BjButton>
      <BjButton variant="tertiary" loading>Patientez</BjButton>
      <BjButton variant="accent" loading>Accent</BjButton>
      <BjButton variant="contrast" loading>Contraste</BjButton>
      <BjButton size="sm" loading>Petit</BjButton>
      <BjButton size="lg" loading>Grand</BjButton>
    </>
  )
}

Callbacks

Les gestionnaires natifs du bouton ou du lien (ex. onClick) sont transmis via les props HTML.

import { BjButton } from '@flrxnt/dsbj/react'

export default function App() {
  return (
    <BjButton
      type="button"
      onClick={() => {
        console.log('clicked')
      }}
    >
      Submit
    </BjButton>
  )
}

Props

PropDescription
variantVariante visuelle : primary, secondary, tertiary, accent ou contrast.
sizeTaille : sm, md (défaut) ou lg.
iconMode bouton carré pour une icône seule (bj-btn--icon).
fullLargeur 100 % du conteneur (bj-btn--full).
loadingAffiche un spinner et désactive le bouton.
asÉlément rendu : button (défaut) ou a pour un lien stylé comme bouton.