feat(admin): add TagInput component demo to devkit components page

- import TagInput component and useState hook
- define ROLE_OPTIONS with color metadata for demo purposes
- add TagInputDemo wrapper component to manage local state
- add PreviewBlock showcasing default, colored badge, and error variants
This commit is contained in:
2026-04-25 17:07:57 -04:00
parent 8b61da7322
commit 4e759767f2
@@ -1,5 +1,6 @@
'use client'; 'use client';
import { useState } from 'react';
import { import {
Button, Button,
Card, Card,
@@ -9,12 +10,37 @@ import {
Select, Select,
Textarea, Textarea,
Switch, Switch,
TagInput,
StatCard, StatCard,
Loading, Loading,
} from '@zen/core/shared/components'; } from '@zen/core/shared/components';
import { UserCircle02Icon } from '@zen/core/shared/icons'; import { UserCircle02Icon } from '@zen/core/shared/icons';
import AdminHeader from '../components/AdminHeader.js'; import AdminHeader from '../components/AdminHeader.js';
const ROLE_OPTIONS = [
{ value: 'admin', label: 'Admin', color: '#6366f1' },
{ value: 'editor', label: 'Éditeur', color: '#f59e0b' },
{ value: 'viewer', label: 'Lecteur', color: '#10b981' },
{ value: 'support', label: 'Support', color: '#3b82f6' },
{ value: 'billing', label: 'Facturation', color: '#ec4899' },
];
function TagInputDemo({ label, description, error, renderTag }) {
const [value, setValue] = useState([]);
return (
<TagInput
label={label}
description={description}
error={error}
placeholder="Ajouter un rôle..."
options={ROLE_OPTIONS}
value={value}
onChange={setValue}
renderTag={renderTag}
/>
);
}
function PreviewBlock({ title, children }) { function PreviewBlock({ title, children }) {
return ( return (
<div className="flex flex-col gap-3"> <div className="flex flex-col gap-3">
@@ -165,6 +191,19 @@ export default function ComponentsPage() {
</div> </div>
</PreviewBlock> </PreviewBlock>
<PreviewBlock title="TagInput">
<div className="w-72 flex flex-col gap-3">
<TagInputDemo label="Rôles" description="Sélectionnez un ou plusieurs rôles." />
<TagInputDemo
label="Avec pastilles colorées"
renderTag={(opt, onRemove) => (
<Badge key={opt.value} color={opt.color} dot onRemove={onRemove}>{opt.label}</Badge>
)}
/>
<TagInputDemo label="Avec erreur" error="Ce champ est requis." />
</div>
</PreviewBlock>
<PreviewBlock title="Loading"> <PreviewBlock title="Loading">
<Loading /> <Loading />
</PreviewBlock> </PreviewBlock>