Skip to content

Conception par intention

Pomikit privilégie les props qui décrivent ce que l'UI signifie, pas son apparence. Les composants déduisent le chargement, la confirmation, le vide et la validation à partir de cette intention.

Button

Les clics async déclenchent automatiquement un retour busy (et éventuellement succès/erreur) :

vue
<script setup lang="ts">
import { Button } from 'pomikit-ui'

async function save() {
  await api.save()
}
</script>

<template>
  <Button :confirm="true" @click="save">Delete</Button>
  <Button href="/docs">Open docs</Button>
</template>
  • Retourner un thenable sur @click → phase busy
  • confirm → validation au second clic
  • href → bouton de navigation (rendu comme lien)

Field + Input

required et rules expriment l'intention de validation. Field possède le layout label / helper / erreur :

vue
<script setup lang="ts">
import { Field, Input, rules } from 'pomikit-ui'
import { ref } from 'vue'

const email = ref('')
</script>

<template>
  <Field label="Email" required helper="Work address preferred">
    <Input v-model="email" type="email" :rules="[rules.required(), rules.email()]" />
  </Field>
</template>

Select

options et pending couvrent l'état des données sans props spinner séparées :

vue
<Select
  v-model="role"
  :options="roles"
  :pending="loadingRoles"
  placeholder="Pick a role"
/>

Collection

pending, items vides et error sélectionnent les surfaces skeleton / empty / error :

vue
<Collection
  :items="rows"
  :pending="loading"
  :error="loadError"
  @retry="reload"
>
  <template #item="{ item }">
    {{ item.name }}
  </template>
</Collection>

Toast

Les helpers de résultat encodent le tone à partir de l'intention :

ts
const toast = useToast()
toast.success('Saved')
toast.error('Could not save', 'Check your connection')

Ce qu'il ne faut pas mettre en avant

Évitez d'enseigner variant, tone, size ou radius comme API principale. Ce sont des échappatoires pour des exceptions rares ; le Design Kit possède l'esthétique.