;
+
+export const Default: Story = {
+ render: () => {
+ const [v, setV] = useState("a");
+ return (
+
+ );
+ },
+};
diff --git a/storybook/stories/Toast.stories.tsx b/storybook/stories/Toast.stories.tsx
new file mode 100644
index 0000000..abae540
--- /dev/null
+++ b/storybook/stories/Toast.stories.tsx
@@ -0,0 +1,35 @@
+import type { Meta, StoryObj } from "@storybook/react";
+import { ToastProvider, useToast, Button } from "@managemate/react";
+
+const meta = {
+ title: "Feedback/Toast",
+ tags: ["autodocs"],
+ decorators: [(Story) => ],
+} satisfies Meta;
+
+export default meta;
+type Story = StoryObj;
+
+function Trigger() {
+ const { toast } = useToast();
+ return (
+
+
+
+
+
+
+
+ );
+}
+
+export const Default: Story = { render: () => };
diff --git a/storybook/stories/ToggleGroup.stories.tsx b/storybook/stories/ToggleGroup.stories.tsx
new file mode 100644
index 0000000..355a03d
--- /dev/null
+++ b/storybook/stories/ToggleGroup.stories.tsx
@@ -0,0 +1,52 @@
+import type { Meta, StoryObj } from "@storybook/react";
+import { useState } from "react";
+import { ToggleGroup } from "@managemate/react";
+
+const meta = {
+ title: "Forms/ToggleGroup",
+ component: ToggleGroup,
+ tags: ["autodocs"],
+} satisfies Meta;
+
+export default meta;
+type Story = StoryObj;
+
+const items = [
+ { value: "list", label: "Liste", icon: "menu-line" as const },
+ { value: "grid", label: "Grille", icon: "apps-2-line" as const },
+ { value: "kanban", label: "Kanban", icon: "stack-line" as const },
+];
+
+export const Single: Story = {
+ render: () => {
+ const [v, setV] = useState("list");
+ return x && setV(x)} items={items} />;
+ },
+};
+
+export const Multiple: Story = {
+ render: () => {
+ const [v, setV] = useState(["list"]);
+ return ;
+ },
+};
+
+export const Solid: Story = {
+ render: () => {
+ const [v, setV] = useState("grid");
+ return x && setV(x)} items={items} />;
+ },
+};
+
+export const Sizes: Story = {
+ render: () => {
+ const [v, setV] = useState("list");
+ return (
+
+ x && setV(x)} items={items} />
+ x && setV(x)} items={items} />
+ x && setV(x)} items={items} />
+
+ );
+ },
+};
diff --git a/storybook/stories/UserCard.stories.tsx b/storybook/stories/UserCard.stories.tsx
new file mode 100644
index 0000000..366b3c9
--- /dev/null
+++ b/storybook/stories/UserCard.stories.tsx
@@ -0,0 +1,37 @@
+import type { Meta, StoryObj } from "@storybook/react";
+import { UserCard, Button } from "@managemate/react";
+
+const meta = {
+ title: "Profile/UserCard",
+ component: UserCard,
+ tags: ["autodocs"],
+} satisfies Meta;
+
+export default meta;
+type Story = StoryObj;
+
+export const Default: Story = {
+ args: { name: "Marie Dupont", role: "Lead Developer", initials: "MD", status: "online" },
+};
+
+export const Sizes: Story = {
+ render: () => (
+
+
+
+
+
+ ),
+};
+
+export const Interactive: Story = {
+ args: {
+ name: "Lohann Bouveresse",
+ role: "CEO",
+ initials: "LB",
+ status: "online",
+ meta: "ceo@managemate.fr",
+ href: "#",
+ actions: ,
+ },
+};
diff --git a/verdaccio/README.md b/verdaccio/README.md
new file mode 100644
index 0000000..976f1d5
--- /dev/null
+++ b/verdaccio/README.md
@@ -0,0 +1,85 @@
+# Verdaccio â registre privĂ© DSMMG
+
+Verdaccio est utilisé pour publier les packages `@managemate/*` en
+interne, sans exposition publique. Le registre tourne en local via
+Docker Compose et peut ĂȘtre dĂ©ployĂ© sur l'infra ManageMate
+(`npm.dinawo.fr` recommandé).
+
+## Démarrer en local
+
+```sh
+docker compose -f docker-compose.verdaccio.yml up -d
+open http://localhost:4873
+```
+
+## Premier compte (admin)
+
+```sh
+npm adduser --registry http://localhost:4873
+# Username: admin
+# Password:
+# Email: dev@managemate.fr
+```
+
+Le htpasswd est stocké dans le volume `dsmmg-verdaccio-storage`.
+
+## Publier les packages
+
+Ă partir du root du monorepo, aprĂšs un build complet :
+
+```sh
+pnpm build
+pnpm changeset version # consume les changesets, bump versions
+pnpm -r --filter "@managemate/*" publish --registry http://localhost:4873
+```
+
+Ou via le script raccourci :
+
+```sh
+pnpm release
+```
+
+## Déploiement production
+
+Le `docker-compose.verdaccio.yml` est utilisable tel quel sur un host
+docker. Recommandations production :
+
+1. **Reverse proxy** (Caddy, Nginx, Traefik) avec **HTTPS** obligatoire.
+ Exemple Caddy :
+
+ ```caddy
+ npm.dinawo.fr {
+ reverse_proxy localhost:4873
+ }
+ ```
+
+2. **Backups** réguliers du volume `dsmmg-verdaccio-storage` (contient
+ les tarballs publiés et le htpasswd). Cible : snapshot quotidien
+ conservé 30j.
+
+3. **Rate limiting** sur le reverse proxy (~ 60 req/min/IP) pour éviter
+ le bruteforce sur le htpasswd.
+
+4. **Auth supplémentaire** possible : intégration LDAP/SAML via
+ `verdaccio-ldap` ou `verdaccio-saml` plugins si l'org grandit.
+
+5. **Monitoring** : `/_stats/heap` exposé par Verdaccio, à scraper
+ par Prometheus si infra existe.
+
+## Sécurité
+
+- `auth: htpasswd` uniquement par défaut. Pas d'inscription publique
+ (max_users: 50 limite).
+- `@managemate/*` : `access: $authenticated` â seuls les users
+ authentifiés peuvent installer.
+- Le proxy `uplinks.npmjs` permet de récupérer les deps publiques
+ (Radix, React, etc.) en passant par Verdaccio (cache).
+
+## Migration vers npm public (futur)
+
+Si le DSMMG devient open source un jour :
+
+1. Renommer le scope `@managemate` â `@managemate-group` (ou autre)
+ sur npm public.
+2. Publier sur https://registry.npmjs.org en `--access public`.
+3. Garder Verdaccio en cache local pour la CI.
diff --git a/verdaccio/config.yaml b/verdaccio/config.yaml
new file mode 100644
index 0000000..cd01f8d
--- /dev/null
+++ b/verdaccio/config.yaml
@@ -0,0 +1,65 @@
+# Verdaccio config â registre privĂ© local pour le DSMMG
+# Usage : docker compose -f docker-compose.verdaccio.yml up -d
+# Puis : pnpm config set @managemate:registry http://localhost:4873
+# Puis : pnpm publish -r --filter "@managemate/*"
+
+storage: /verdaccio/storage
+plugins: /verdaccio/plugins
+web:
+ title: DSMMG â Registre privĂ© ManageMate Group
+ primary_color: "#D12B6A"
+ scope: "@managemate"
+
+auth:
+ htpasswd:
+ file: /verdaccio/storage/htpasswd
+ max_users: 50
+ algorithm: bcrypt
+ rounds: 10
+
+uplinks:
+ npmjs:
+ url: https://registry.npmjs.org/
+
+packages:
+ # Packages DSMMG â privĂ©s, accĂšs restreint aux users authentifiĂ©s
+ "@managemate/*":
+ access: $authenticated
+ publish: $authenticated
+ unpublish: $authenticated
+ # Tout le reste tape sur npmjs en proxy
+ "@*/*":
+ access: $all
+ publish: $authenticated
+ unpublish: $authenticated
+ proxy: npmjs
+ "**":
+ access: $all
+ publish: $authenticated
+ unpublish: $authenticated
+ proxy: npmjs
+
+server:
+ keepAliveTimeout: 60
+
+middlewares:
+ audit:
+ enabled: true
+
+# Logs
+logs: { type: stdout, format: pretty, level: info }
+
+# Sécurité
+security:
+ api:
+ legacy: true
+ jwt:
+ sign:
+ expiresIn: 90d
+ verify:
+ someProp: [some, key]
+ web:
+ sign:
+ expiresIn: 7d
+ verify:
+ someProp: [some, key]