133feff75d
6 chantiers v1 sur 7 livrés (DataTable refonte reportée car nécessite 2-3j en propre — TanStack Table + virtualisation + filter builder). v1-A — Tests (4 → 22 fichiers) : - Avatar, AvatarGroup, UserCard, MetricCard, ProfileHeader, Tooltip, Sheet, Drawer, Slider, ToggleGroup, Tabs, Pagination, Accordion, Switch, Badge, ConfirmDialog, Popover, Menu, Text, PricingCard, FeatureCard, Toast — chacun avec render + clavier + axe-core. v1-B — Storybook (7 → 23 fichiers) : - Avatar, UserCard, ProfileHeader, MetricCard, PricingCard, FeatureCard, Sheet (4 sides), HoverCard, Slider, ToggleGroup, Menu+ContextMenu, Toast (avec démo "Empiler 5"), Tabs, Pagination, Accordion, Badge. v1-D — Visual regression Playwright : - playwright.config.ts (light + dark, threshold strict 0.2) - e2e/visual.spec.ts (20 stories critiques) - Step CI + upload report en cas de fail v1-E — Site doc Starlight rempli : - 11 pages composants détaillées (Button, Input, Tooltip, Dialog, Toast, Avatar, ThemePicker, MetricCard, PricingCard, ToggleGroup, Slider) avec API, anatomie, do/don't, A11y. v1-F — Publishing Verdaccio : - verdaccio/config.yaml, docker-compose.verdaccio.yml, .npmrc - README setup local + déploiement prod + backups + sécurité v1-G — Gouvernance : - LICENSE, CONTRIBUTING.md, CODE_OF_CONDUCT.md, SECURITY.md - CODEOWNERS, PR template, 3 issue templates (bug/feature/rfc) Bug fix bonus : tooltip dark mode (text-primary comme bg + text-inverse comme texte → blanc-sur-blanc invisible). Remplacé par neutral-900/0 en light + bg-raised/text-primary en dark. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
36 lines
1.8 KiB
TypeScript
36 lines
1.8 KiB
TypeScript
import type { Meta, StoryObj } from "@storybook/react";
|
|
import { ToastProvider, useToast, Button } from "@managemate/react";
|
|
|
|
const meta = {
|
|
title: "Feedback/Toast",
|
|
tags: ["autodocs"],
|
|
decorators: [(Story) => <ToastProvider position="bottom-right" max={5}><Story /></ToastProvider>],
|
|
} satisfies Meta;
|
|
|
|
export default meta;
|
|
type Story = StoryObj;
|
|
|
|
function Trigger() {
|
|
const { toast } = useToast();
|
|
return (
|
|
<div style={{ display: "flex", gap: 8, flexWrap: "wrap" }}>
|
|
<Button variant="success" onClick={() => toast({ title: "Sauvegardé", description: "Vos modifs ont été enregistrées.", severity: "success" })}>Success</Button>
|
|
<Button variant="tonal" onClick={() => toast({ title: "Maintenance prévue dimanche", severity: "info" })}>Info</Button>
|
|
<Button variant="ghost" onClick={() => toast({ title: "Quota presque atteint", description: "85% du stockage utilisé.", severity: "warning" })}>Warning</Button>
|
|
<Button variant="danger" onClick={() => toast({ title: "Échec de la synchronisation", severity: "danger", duration: 0 })}>Danger</Button>
|
|
<Button variant="primary" icon="stack-line" onClick={() => {
|
|
const msgs = [
|
|
{ title: "Bulletin Marie", description: "2 850 €", severity: "success" as const },
|
|
{ title: "Bulletin Jean", description: "2 200 €", severity: "success" as const },
|
|
{ title: "Bulletin Sophie", description: "3 400 €", severity: "success" as const },
|
|
{ title: "Bulletin Thomas", description: "2 900 €", severity: "success" as const },
|
|
{ title: "Bulletin Emma", description: "1 950 €", severity: "success" as const },
|
|
];
|
|
msgs.forEach((m, i) => setTimeout(() => toast(m), i * 220));
|
|
}}>Empiler 5 toasts</Button>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
export const Default: Story = { render: () => <Trigger /> };
|