Refonte front (packages/web) : coquille applicative partagée (sidebar desktop + barre d'onglets mobile + PageHeader, langue/push/logout centralisés) pilotée par route.meta.layout ; design system (BaseButton/BaseBadge/SegmentedControl/EmptyState/ SkeletonRow, anneau de focus, icônes @lucide/vue) ; tri/filtre/recherche/pagination côté client via useListControls (+ synchro URL) sur sessions/worktrees/groupes ; section « À traiter », palette de commandes ⌘K, toasts. Aucune modif serveur/protocole/DB. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
18 lines
706 B
Vue
18 lines
706 B
Vue
<template>
|
|
<div class="flex flex-col items-center gap-2 rounded-xl border border-dashed border-zinc-800 px-6 py-10 text-center">
|
|
<component :is="icon" v-if="icon" :size="32" class="text-zinc-600" :stroke-width="1.5" />
|
|
<p class="text-sm font-medium text-zinc-300">{{ title }}</p>
|
|
<p v-if="hint" class="max-w-sm text-xs text-zinc-500">{{ hint }}</p>
|
|
<div v-if="$slots.action" class="mt-1">
|
|
<slot name="action" />
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
// État vide soigné (icône + titre + indice + CTA) — remplace les <p text-zinc-500> plats.
|
|
import type { Component } from 'vue';
|
|
|
|
defineProps<{ icon?: Component; title: string; hint?: string }>();
|
|
</script>
|