Palettes variees, logo stamp croque, search/date modernises
- Palettes : Chagrine bleu lavande + ambre + rose ancien (moins aquatique), Grave ocre rouge + ardoise (plus lumineux), Zen vert franc + sienne + canard (pas de pastels glauques), Peps secondary indigo - Logo : icone dans stamp carre rotate(-10deg), separe du texte, hover -16deg - Login : logo stamp rotate -10deg, subtitle epure - Search : UInput/USelect remplaces par champs custom accent-soft + icone - Dates : icone clock + opacity 0.7 - Badges : UBadge remplace par pills custom uppercase accent Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -90,8 +90,12 @@ function isActive(to: string) {
|
||||
<UIcon name="i-lucide-menu" class="text-xl" />
|
||||
</button>
|
||||
<NuxtLink to="/" class="app-header__logo">
|
||||
<UIcon name="i-lucide-gavel" class="app-header__logo-icon" />
|
||||
<span class="app-header__logo-g">ğ</span><span class="app-header__logo-paren">(</span><span class="app-header__logo-word">Decision</span><span class="app-header__logo-paren">)</span>
|
||||
<span class="app-header__logo-stamp">
|
||||
<UIcon name="i-lucide-gavel" class="app-header__logo-icon" />
|
||||
</span>
|
||||
<span class="app-header__logo-text">
|
||||
<span class="app-header__logo-g">ğ</span><span class="app-header__logo-paren">(</span><span class="app-header__logo-word">Decision</span><span class="app-header__logo-paren">)</span>
|
||||
</span>
|
||||
</NuxtLink>
|
||||
</div>
|
||||
|
||||
@@ -266,15 +270,38 @@ function isActive(to: string) {
|
||||
text-decoration: none;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.5rem;
|
||||
gap: 0.75rem;
|
||||
}
|
||||
|
||||
.app-header__logo-stamp {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 2rem;
|
||||
height: 2rem;
|
||||
background: var(--mood-accent);
|
||||
color: var(--mood-accent-text);
|
||||
border-radius: 8px;
|
||||
transform: rotate(-10deg);
|
||||
transition: transform 0.2s ease;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.app-header__logo:hover .app-header__logo-stamp {
|
||||
transform: rotate(-16deg) scale(1.08);
|
||||
}
|
||||
|
||||
.app-header__logo-icon {
|
||||
font-size: 1.375rem;
|
||||
color: var(--mood-accent);
|
||||
font-size: 1.125rem;
|
||||
transform: scaleX(-1);
|
||||
}
|
||||
|
||||
.app-header__logo-text {
|
||||
display: flex;
|
||||
align-items: baseline;
|
||||
gap: 0;
|
||||
}
|
||||
|
||||
.app-header__logo-g {
|
||||
font-size: 1.5rem;
|
||||
font-weight: 800;
|
||||
|
||||
@@ -5,10 +5,10 @@
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
Peps — Chaud, colore, tonique (Light)
|
||||
Palette: corail / ocre / bleu electrique / vert vif
|
||||
Palette: corail vif / ocre / indigo / vert franc
|
||||
-------------------------------------------------------------------------- */
|
||||
.mood-peps {
|
||||
--mood-bg: #faf9f6;
|
||||
--mood-bg: #faf8f5;
|
||||
--mood-surface: #ffffff;
|
||||
--mood-surface-hover: #fdf2ec;
|
||||
--mood-text: #1e1410;
|
||||
@@ -17,12 +17,12 @@
|
||||
--mood-accent-soft: rgba(212, 74, 16, 0.08);
|
||||
--mood-accent-text: #ffffff;
|
||||
--mood-border: #e8d8c8;
|
||||
--mood-secondary: #2874a6;
|
||||
--mood-tertiary: #c4841d;
|
||||
--mood-secondary: #4a5ec0;
|
||||
--mood-tertiary: #c07820;
|
||||
--mood-success: #1a8c3e;
|
||||
--mood-warning: #c47d0a;
|
||||
--mood-error: #c23028;
|
||||
--mood-gradient: linear-gradient(145deg, #fdf8f0 0%, #ffffff 40%, #f0f6fb 100%);
|
||||
--mood-gradient: linear-gradient(145deg, #fdf8f0 0%, #ffffff 40%, #f0f4fb 100%);
|
||||
--mood-shadow: rgba(180, 80, 20, 0.07);
|
||||
--mood-input-bg: #ffffff;
|
||||
--mood-input-border: #d4c0aa;
|
||||
@@ -30,8 +30,8 @@
|
||||
|
||||
--mood-status-prepa: #b8600e;
|
||||
--mood-status-prepa-bg: rgba(184, 96, 14, 0.12);
|
||||
--mood-status-vote: #2874a6;
|
||||
--mood-status-vote-bg: rgba(40, 116, 166, 0.10);
|
||||
--mood-status-vote: #4a5ec0;
|
||||
--mood-status-vote-bg: rgba(74, 94, 192, 0.10);
|
||||
--mood-status-vigueur: #1a8c3e;
|
||||
--mood-status-vigueur-bg: rgba(26, 140, 62, 0.10);
|
||||
--mood-status-clos: #6e5844;
|
||||
@@ -39,108 +39,108 @@
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
Zen — Foret profonde, vegetal et mineral (Light)
|
||||
Palette: vert sombre / brun chaud / bleu ardoise / terre
|
||||
Zen — Vegetal lumineux, nature vivante (Light)
|
||||
Palette: vert franc / terre sienne / bleu canard / bois chaud
|
||||
-------------------------------------------------------------------------- */
|
||||
.mood-zen {
|
||||
--mood-bg: #f0f4ef;
|
||||
--mood-surface: #fafcf9;
|
||||
--mood-surface-hover: #e4ece0;
|
||||
--mood-text: #0e1a0c;
|
||||
--mood-text-muted: #3a5634;
|
||||
--mood-accent: #1a6838;
|
||||
--mood-accent-soft: rgba(26, 104, 56, 0.08);
|
||||
--mood-bg: #f4f6f0;
|
||||
--mood-surface: #fbfcf8;
|
||||
--mood-surface-hover: #eaf0e4;
|
||||
--mood-text: #1a2418;
|
||||
--mood-text-muted: #5a7050;
|
||||
--mood-accent: #2e8b48;
|
||||
--mood-accent-soft: rgba(46, 139, 72, 0.09);
|
||||
--mood-accent-text: #ffffff;
|
||||
--mood-border: #a0c098;
|
||||
--mood-secondary: #6b5838;
|
||||
--mood-tertiary: #3a6878;
|
||||
--mood-success: #146830;
|
||||
--mood-warning: #8a6018;
|
||||
--mood-error: #a03030;
|
||||
--mood-gradient: linear-gradient(145deg, #eaf2e6 0%, #fafcf9 40%, #f0ece4 100%);
|
||||
--mood-shadow: rgba(26, 80, 40, 0.08);
|
||||
--mood-input-bg: #fafcf9;
|
||||
--mood-input-border: #90b088;
|
||||
--mood-input-focus: #1a6838;
|
||||
--mood-border: #b8d0a8;
|
||||
--mood-secondary: #8a6030;
|
||||
--mood-tertiary: #2a7888;
|
||||
--mood-success: #268040;
|
||||
--mood-warning: #a87818;
|
||||
--mood-error: #b83838;
|
||||
--mood-gradient: linear-gradient(145deg, #f0f5ea 0%, #fbfcf8 40%, #f4efe6 100%);
|
||||
--mood-shadow: rgba(40, 100, 50, 0.07);
|
||||
--mood-input-bg: #fbfcf8;
|
||||
--mood-input-border: #a8c898;
|
||||
--mood-input-focus: #2e8b48;
|
||||
|
||||
--mood-status-prepa: #8a6018;
|
||||
--mood-status-prepa-bg: rgba(138, 96, 24, 0.10);
|
||||
--mood-status-vote: #3a6878;
|
||||
--mood-status-vote-bg: rgba(58, 104, 120, 0.10);
|
||||
--mood-status-vigueur: #146830;
|
||||
--mood-status-vigueur-bg: rgba(20, 104, 48, 0.10);
|
||||
--mood-status-clos: #506848;
|
||||
--mood-status-clos-bg: rgba(80, 104, 72, 0.08);
|
||||
--mood-status-prepa: #a87818;
|
||||
--mood-status-prepa-bg: rgba(168, 120, 24, 0.11);
|
||||
--mood-status-vote: #2a7888;
|
||||
--mood-status-vote-bg: rgba(42, 120, 136, 0.10);
|
||||
--mood-status-vigueur: #268040;
|
||||
--mood-status-vigueur-bg: rgba(38, 128, 64, 0.10);
|
||||
--mood-status-clos: #607858;
|
||||
--mood-status-clos-bg: rgba(96, 120, 88, 0.08);
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
Chagrine — Profond, electrique, bleu dominant (Dark)
|
||||
Palette: bleu electrique / cyan / magenta / or
|
||||
Chagrine — Nuit profonde, reflets varies (Dark)
|
||||
Palette: bleu lavande / ambre chaud / rose ancien / vert d'eau
|
||||
-------------------------------------------------------------------------- */
|
||||
.mood-chagrine {
|
||||
--mood-bg: #0c1018;
|
||||
--mood-surface: #121824;
|
||||
--mood-surface-hover: #1a2438;
|
||||
--mood-text: #d8e4f0;
|
||||
--mood-text-muted: #7898c0;
|
||||
--mood-accent: #4088d8;
|
||||
--mood-accent-soft: rgba(64, 136, 216, 0.12);
|
||||
--mood-bg: #0e1018;
|
||||
--mood-surface: #151a28;
|
||||
--mood-surface-hover: #1c2640;
|
||||
--mood-text: #dce0ec;
|
||||
--mood-text-muted: #8898b8;
|
||||
--mood-accent: #6488d8;
|
||||
--mood-accent-soft: rgba(100, 136, 216, 0.12);
|
||||
--mood-accent-text: #ffffff;
|
||||
--mood-border: #1e3050;
|
||||
--mood-secondary: #38c8c8;
|
||||
--mood-tertiary: #d870a0;
|
||||
--mood-success: #38d080;
|
||||
--mood-warning: #e0b040;
|
||||
--mood-error: #e06060;
|
||||
--mood-gradient: linear-gradient(145deg, #0c1018 0%, #121824 40%, #0c1420 100%);
|
||||
--mood-shadow: rgba(40, 100, 200, 0.15);
|
||||
--mood-input-bg: #121824;
|
||||
--mood-input-border: #283c58;
|
||||
--mood-input-focus: #4088d8;
|
||||
--mood-border: #222e48;
|
||||
--mood-secondary: #d0a040;
|
||||
--mood-tertiary: #c87090;
|
||||
--mood-success: #48c87a;
|
||||
--mood-warning: #d8a838;
|
||||
--mood-error: #d86060;
|
||||
--mood-gradient: linear-gradient(145deg, #0e1018 0%, #151a28 40%, #101420 100%);
|
||||
--mood-shadow: rgba(60, 100, 180, 0.12);
|
||||
--mood-input-bg: #151a28;
|
||||
--mood-input-border: #2a3858;
|
||||
--mood-input-focus: #6488d8;
|
||||
|
||||
--mood-status-prepa: #e0b040;
|
||||
--mood-status-prepa-bg: rgba(224, 176, 64, 0.15);
|
||||
--mood-status-vote: #38c8c8;
|
||||
--mood-status-vote-bg: rgba(56, 200, 200, 0.14);
|
||||
--mood-status-vigueur: #38d080;
|
||||
--mood-status-vigueur-bg: rgba(56, 208, 128, 0.14);
|
||||
--mood-status-clos: #6080a8;
|
||||
--mood-status-clos-bg: rgba(96, 128, 168, 0.12);
|
||||
--mood-status-prepa: #d8a838;
|
||||
--mood-status-prepa-bg: rgba(216, 168, 56, 0.14);
|
||||
--mood-status-vote: #6488d8;
|
||||
--mood-status-vote-bg: rgba(100, 136, 216, 0.14);
|
||||
--mood-status-vigueur: #48c87a;
|
||||
--mood-status-vigueur-bg: rgba(72, 200, 122, 0.14);
|
||||
--mood-status-clos: #7888a8;
|
||||
--mood-status-clos-bg: rgba(120, 136, 168, 0.10);
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
Grave — Chaud, mineral, lumineux (Dark)
|
||||
Palette: ambre / cuivre / bleu acier / vert oxyde
|
||||
Grave — Ambre mineral, ocre lumineux (Dark)
|
||||
Palette: ambre dore / ocre rouge / bleu ardoise / vert mousse
|
||||
-------------------------------------------------------------------------- */
|
||||
.mood-grave {
|
||||
--mood-bg: #12110e;
|
||||
--mood-surface: #1a1814;
|
||||
--mood-surface-hover: #24201a;
|
||||
--mood-text: #e8e0d0;
|
||||
--mood-text-muted: #a09880;
|
||||
--mood-accent: #d09828;
|
||||
--mood-accent-soft: rgba(208, 152, 40, 0.10);
|
||||
--mood-accent-text: #12110e;
|
||||
--mood-border: #302c24;
|
||||
--mood-secondary: #5898c8;
|
||||
--mood-tertiary: #c87848;
|
||||
--mood-success: #48c870;
|
||||
--mood-bg: #131210;
|
||||
--mood-surface: #1c1a16;
|
||||
--mood-surface-hover: #28241c;
|
||||
--mood-text: #ece4d4;
|
||||
--mood-text-muted: #a89870;
|
||||
--mood-accent: #d8a030;
|
||||
--mood-accent-soft: rgba(216, 160, 48, 0.11);
|
||||
--mood-accent-text: #131210;
|
||||
--mood-border: #342e24;
|
||||
--mood-secondary: #6898b8;
|
||||
--mood-tertiary: #c07040;
|
||||
--mood-success: #58c870;
|
||||
--mood-warning: #d0a030;
|
||||
--mood-error: #d05050;
|
||||
--mood-gradient: linear-gradient(145deg, #12110e 0%, #1a1814 40%, #141618 100%);
|
||||
--mood-gradient: linear-gradient(145deg, #131210 0%, #1c1a16 40%, #16181c 100%);
|
||||
--mood-shadow: rgba(180, 130, 40, 0.10);
|
||||
--mood-input-bg: #1a1814;
|
||||
--mood-input-border: #3a3428;
|
||||
--mood-input-focus: #d09828;
|
||||
--mood-input-bg: #1c1a16;
|
||||
--mood-input-border: #3c3428;
|
||||
--mood-input-focus: #d8a030;
|
||||
|
||||
--mood-status-prepa: #c87848;
|
||||
--mood-status-prepa-bg: rgba(200, 120, 72, 0.15);
|
||||
--mood-status-vote: #5898c8;
|
||||
--mood-status-vote-bg: rgba(88, 152, 200, 0.14);
|
||||
--mood-status-vigueur: #48c870;
|
||||
--mood-status-vigueur-bg: rgba(72, 200, 112, 0.14);
|
||||
--mood-status-clos: #787060;
|
||||
--mood-status-clos-bg: rgba(120, 112, 96, 0.12);
|
||||
--mood-status-prepa: #c07040;
|
||||
--mood-status-prepa-bg: rgba(192, 112, 64, 0.15);
|
||||
--mood-status-vote: #6898b8;
|
||||
--mood-status-vote-bg: rgba(104, 152, 184, 0.14);
|
||||
--mood-status-vigueur: #58c870;
|
||||
--mood-status-vigueur-bg: rgba(88, 200, 112, 0.14);
|
||||
--mood-status-clos: #807860;
|
||||
--mood-status-clos-bg: rgba(128, 120, 96, 0.12);
|
||||
}
|
||||
|
||||
/* ==========================================================================
|
||||
|
||||
@@ -13,9 +13,9 @@ const STORAGE_KEY = 'glibredecision_mood'
|
||||
|
||||
const moods: Mood[] = [
|
||||
{ id: 'peps', label: 'Peps', description: 'Chaud et tonique', icon: 'i-lucide-sun', color: '#d44a10', isDark: false },
|
||||
{ id: 'zen', label: 'Zen', description: 'Foret profonde', icon: 'i-lucide-leaf', color: '#1a6838', isDark: false },
|
||||
{ id: 'chagrine', label: 'Chagrine', description: 'Bleu electrique', icon: 'i-lucide-moon', color: '#4088d8', isDark: true },
|
||||
{ id: 'grave', label: 'Grave', description: 'Mineral et lumineux', icon: 'i-lucide-shield', color: '#d09828', isDark: true },
|
||||
{ id: 'zen', label: 'Zen', description: 'Nature vivante', icon: 'i-lucide-leaf', color: '#2e8b48', isDark: false },
|
||||
{ id: 'chagrine', label: 'Chagrine', description: 'Nuit profonde', icon: 'i-lucide-moon', color: '#6488d8', isDark: true },
|
||||
{ id: 'grave', label: 'Grave', description: 'Ambre mineral', icon: 'i-lucide-shield', color: '#d8a030', isDark: true },
|
||||
]
|
||||
|
||||
const currentMood: Ref<string> = ref('peps')
|
||||
|
||||
@@ -105,27 +105,28 @@ function formatDate(dateStr: string): string {
|
||||
>
|
||||
<!-- Search / sort bar -->
|
||||
<template #search>
|
||||
<UInput
|
||||
v-model="searchQuery"
|
||||
placeholder="Rechercher une decision..."
|
||||
icon="i-lucide-search"
|
||||
size="sm"
|
||||
class="w-full sm:w-64"
|
||||
/>
|
||||
<USelect
|
||||
v-model="sortBy"
|
||||
:items="sortOptions"
|
||||
size="sm"
|
||||
class="w-36"
|
||||
/>
|
||||
<UButton
|
||||
<div class="search-field">
|
||||
<UIcon name="i-lucide-search" class="search-field__icon" />
|
||||
<input
|
||||
v-model="searchQuery"
|
||||
type="text"
|
||||
class="search-field__input"
|
||||
placeholder="Rechercher une decision..."
|
||||
/>
|
||||
</div>
|
||||
<select v-model="sortBy" class="sort-select">
|
||||
<option v-for="opt in sortOptions" :key="opt.value" :value="opt.value">
|
||||
{{ opt.label }}
|
||||
</option>
|
||||
</select>
|
||||
<NuxtLink
|
||||
v-if="auth.isAuthenticated"
|
||||
to="/decisions/new"
|
||||
label="Nouvelle"
|
||||
icon="i-lucide-plus"
|
||||
color="primary"
|
||||
size="sm"
|
||||
/>
|
||||
class="action-btn"
|
||||
>
|
||||
<UIcon name="i-lucide-plus" class="text-xs" />
|
||||
<span>Nouvelle</span>
|
||||
</NuxtLink>
|
||||
</template>
|
||||
|
||||
<!-- Main content: decision list -->
|
||||
@@ -175,14 +176,15 @@ function formatDate(dateStr: string): string {
|
||||
</div>
|
||||
|
||||
<div class="decision-card__meta">
|
||||
<UBadge variant="subtle" color="primary" size="xs">
|
||||
<span class="decision-card__type-badge">
|
||||
{{ typeLabel(decision.decision_type) }}
|
||||
</UBadge>
|
||||
</span>
|
||||
<span class="decision-card__steps">
|
||||
<UIcon name="i-lucide-layers" class="text-xs" />
|
||||
{{ decision.steps.length }} etape{{ decision.steps.length !== 1 ? 's' : '' }}
|
||||
</span>
|
||||
<span class="decision-card__date">
|
||||
<UIcon name="i-lucide-clock" class="text-xs" />
|
||||
{{ formatDate(decision.created_at) }}
|
||||
</span>
|
||||
</div>
|
||||
@@ -305,9 +307,13 @@ function formatDate(dateStr: string): string {
|
||||
}
|
||||
|
||||
.decision-card__date {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 0.25rem;
|
||||
font-size: 0.75rem;
|
||||
color: var(--mood-text-muted);
|
||||
margin-left: auto;
|
||||
opacity: 0.7;
|
||||
}
|
||||
|
||||
@media (min-width: 640px) {
|
||||
@@ -316,6 +322,86 @@ function formatDate(dateStr: string): string {
|
||||
}
|
||||
}
|
||||
|
||||
.decision-card__type-badge {
|
||||
font-size: 0.6875rem;
|
||||
font-weight: 700;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.04em;
|
||||
padding: 3px 10px;
|
||||
border-radius: 20px;
|
||||
background: var(--mood-accent-soft);
|
||||
color: var(--mood-accent);
|
||||
}
|
||||
|
||||
/* --- Modern search / sort / action --- */
|
||||
.search-field {
|
||||
flex: 1;
|
||||
min-width: 10rem;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.5rem;
|
||||
padding: 0.625rem 1rem;
|
||||
background: var(--mood-accent-soft);
|
||||
border-radius: 12px;
|
||||
transition: box-shadow 0.15s ease;
|
||||
}
|
||||
.search-field:focus-within {
|
||||
box-shadow: 0 0 0 2.5px var(--mood-accent-soft);
|
||||
}
|
||||
.search-field__icon {
|
||||
color: var(--mood-text-muted);
|
||||
opacity: 0.5;
|
||||
font-size: 0.875rem;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
.search-field__input {
|
||||
flex: 1;
|
||||
background: none;
|
||||
font-size: 0.9375rem;
|
||||
color: var(--mood-text);
|
||||
min-width: 0;
|
||||
}
|
||||
.search-field__input::placeholder {
|
||||
color: var(--mood-text-muted);
|
||||
opacity: 0.4;
|
||||
}
|
||||
|
||||
.sort-select {
|
||||
padding: 0.625rem 1rem;
|
||||
font-size: 0.875rem;
|
||||
font-weight: 600;
|
||||
color: var(--mood-text);
|
||||
background: var(--mood-accent-soft);
|
||||
border-radius: 12px;
|
||||
cursor: pointer;
|
||||
appearance: none;
|
||||
-webkit-appearance: none;
|
||||
min-width: 5.5rem;
|
||||
}
|
||||
|
||||
.action-btn {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 0.375rem;
|
||||
padding: 0.625rem 1.25rem;
|
||||
font-size: 0.875rem;
|
||||
font-weight: 700;
|
||||
color: var(--mood-accent-text);
|
||||
background: var(--mood-accent);
|
||||
border-radius: 20px;
|
||||
cursor: pointer;
|
||||
text-decoration: none;
|
||||
transition: transform 0.12s ease, box-shadow 0.12s ease;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.action-btn:hover {
|
||||
transform: translateY(-1px);
|
||||
box-shadow: 0 4px 12px var(--mood-shadow);
|
||||
}
|
||||
.action-btn:active {
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
.toolbox-section-title {
|
||||
font-size: 0.8125rem;
|
||||
font-weight: 700;
|
||||
|
||||
@@ -163,27 +163,28 @@ async function createDocument() {
|
||||
>
|
||||
<!-- Search / sort bar -->
|
||||
<template #search>
|
||||
<UInput
|
||||
v-model="searchQuery"
|
||||
placeholder="Rechercher un document..."
|
||||
icon="i-lucide-search"
|
||||
size="sm"
|
||||
class="w-full sm:w-64"
|
||||
/>
|
||||
<USelect
|
||||
v-model="sortBy"
|
||||
:items="sortOptions"
|
||||
size="sm"
|
||||
class="w-36"
|
||||
/>
|
||||
<UButton
|
||||
<div class="search-field">
|
||||
<UIcon name="i-lucide-search" class="search-field__icon" />
|
||||
<input
|
||||
v-model="searchQuery"
|
||||
type="text"
|
||||
class="search-field__input"
|
||||
placeholder="Rechercher un document..."
|
||||
/>
|
||||
</div>
|
||||
<select v-model="sortBy" class="sort-select">
|
||||
<option v-for="opt in sortOptions" :key="opt.value" :value="opt.value">
|
||||
{{ opt.label }}
|
||||
</option>
|
||||
</select>
|
||||
<button
|
||||
v-if="auth.isAuthenticated"
|
||||
label="Nouveau"
|
||||
icon="i-lucide-plus"
|
||||
color="primary"
|
||||
size="sm"
|
||||
class="action-btn"
|
||||
@click="openNewDocModal"
|
||||
/>
|
||||
>
|
||||
<UIcon name="i-lucide-plus" class="text-xs" />
|
||||
<span>Nouveau</span>
|
||||
</button>
|
||||
</template>
|
||||
|
||||
<!-- Main content: document list -->
|
||||
@@ -228,15 +229,16 @@ async function createDocument() {
|
||||
</div>
|
||||
|
||||
<div class="doc-card__meta">
|
||||
<UBadge variant="subtle" color="primary" size="xs">
|
||||
<span class="doc-card__type-badge">
|
||||
{{ typeLabel(doc.doc_type) }}
|
||||
</UBadge>
|
||||
</span>
|
||||
<span class="doc-card__version">v{{ doc.version }}</span>
|
||||
<span class="doc-card__items">
|
||||
<UIcon name="i-lucide-list" class="text-xs" />
|
||||
{{ doc.items_count }} item{{ doc.items_count !== 1 ? 's' : '' }}
|
||||
</span>
|
||||
<span class="doc-card__date">
|
||||
<UIcon name="i-lucide-clock" class="text-xs" />
|
||||
{{ formatDate(doc.updated_at) }}
|
||||
</span>
|
||||
</div>
|
||||
@@ -433,9 +435,13 @@ async function createDocument() {
|
||||
}
|
||||
|
||||
.doc-card__date {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 0.25rem;
|
||||
font-size: 0.75rem;
|
||||
color: var(--mood-text-muted);
|
||||
margin-left: auto;
|
||||
opacity: 0.7;
|
||||
}
|
||||
|
||||
@media (min-width: 640px) {
|
||||
@@ -473,4 +479,83 @@ async function createDocument() {
|
||||
font-size: 0.8125rem;
|
||||
color: var(--mood-text-muted);
|
||||
}
|
||||
|
||||
/* --- Modern search / sort / action --- */
|
||||
.search-field {
|
||||
flex: 1;
|
||||
min-width: 10rem;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.5rem;
|
||||
padding: 0.625rem 1rem;
|
||||
background: var(--mood-accent-soft);
|
||||
border-radius: 12px;
|
||||
transition: box-shadow 0.15s ease;
|
||||
}
|
||||
.search-field:focus-within {
|
||||
box-shadow: 0 0 0 2.5px var(--mood-accent-soft);
|
||||
}
|
||||
.search-field__icon {
|
||||
color: var(--mood-text-muted);
|
||||
opacity: 0.5;
|
||||
font-size: 0.875rem;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
.search-field__input {
|
||||
flex: 1;
|
||||
background: none;
|
||||
font-size: 0.9375rem;
|
||||
color: var(--mood-text);
|
||||
min-width: 0;
|
||||
}
|
||||
.search-field__input::placeholder {
|
||||
color: var(--mood-text-muted);
|
||||
opacity: 0.4;
|
||||
}
|
||||
|
||||
.sort-select {
|
||||
padding: 0.625rem 1rem;
|
||||
font-size: 0.875rem;
|
||||
font-weight: 600;
|
||||
color: var(--mood-text);
|
||||
background: var(--mood-accent-soft);
|
||||
border-radius: 12px;
|
||||
cursor: pointer;
|
||||
appearance: none;
|
||||
-webkit-appearance: none;
|
||||
min-width: 5.5rem;
|
||||
}
|
||||
|
||||
.action-btn {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 0.375rem;
|
||||
padding: 0.625rem 1.25rem;
|
||||
font-size: 0.875rem;
|
||||
font-weight: 700;
|
||||
color: var(--mood-accent-text);
|
||||
background: var(--mood-accent);
|
||||
border-radius: 20px;
|
||||
cursor: pointer;
|
||||
transition: transform 0.12s ease, box-shadow 0.12s ease;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.action-btn:hover {
|
||||
transform: translateY(-1px);
|
||||
box-shadow: 0 4px 12px var(--mood-shadow);
|
||||
}
|
||||
.action-btn:active {
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
.doc-card__type-badge {
|
||||
font-size: 0.6875rem;
|
||||
font-weight: 700;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.04em;
|
||||
padding: 3px 10px;
|
||||
border-radius: 20px;
|
||||
background: var(--mood-accent-soft);
|
||||
color: var(--mood-accent);
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -62,8 +62,7 @@ onMounted(() => {
|
||||
</div>
|
||||
<h1 class="login-card__title">Connexion</h1>
|
||||
<p class="login-card__subtitle">
|
||||
<span class="login-card__g">ğ</span><span class="login-card__paren">(</span>Decision<span class="login-card__paren">)</span>
|
||||
· Duniter V2 · Ed25519
|
||||
Duniter V2 · Ed25519
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -173,26 +172,14 @@ onMounted(() => {
|
||||
font-size: 1.75rem;
|
||||
color: var(--mood-accent-text);
|
||||
background: var(--mood-accent);
|
||||
border-radius: 16px;
|
||||
border-radius: 14px;
|
||||
margin-bottom: 1rem;
|
||||
transform: rotate(-10deg);
|
||||
}
|
||||
.login-card__logo-icon {
|
||||
transform: scaleX(-1);
|
||||
}
|
||||
|
||||
.login-card__title {
|
||||
font-size: 1.5rem;
|
||||
font-weight: 800;
|
||||
color: var(--mood-text);
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
@media (min-width: 640px) {
|
||||
.login-card__title {
|
||||
font-size: 1.75rem;
|
||||
}
|
||||
}
|
||||
|
||||
.login-card__subtitle {
|
||||
font-size: 0.8125rem;
|
||||
color: var(--mood-text-muted);
|
||||
@@ -204,13 +191,18 @@ onMounted(() => {
|
||||
font-size: 0.9375rem;
|
||||
}
|
||||
}
|
||||
.login-card__g {
|
||||
font-style: italic;
|
||||
font-weight: 700;
|
||||
|
||||
.login-card__title {
|
||||
font-size: 1.5rem;
|
||||
font-weight: 800;
|
||||
color: var(--mood-text);
|
||||
margin: 0;
|
||||
}
|
||||
.login-card__paren {
|
||||
font-weight: 300;
|
||||
opacity: 0.5;
|
||||
|
||||
@media (min-width: 640px) {
|
||||
.login-card__title {
|
||||
font-size: 1.75rem;
|
||||
}
|
||||
}
|
||||
|
||||
/* Steps */
|
||||
|
||||
@@ -140,27 +140,28 @@ async function handleCreate() {
|
||||
>
|
||||
<!-- Search / sort bar -->
|
||||
<template #search>
|
||||
<UInput
|
||||
v-model="searchQuery"
|
||||
placeholder="Rechercher un mandat..."
|
||||
icon="i-lucide-search"
|
||||
size="sm"
|
||||
class="w-full sm:w-64"
|
||||
/>
|
||||
<USelect
|
||||
v-model="sortBy"
|
||||
:items="sortOptions"
|
||||
size="sm"
|
||||
class="w-36"
|
||||
/>
|
||||
<UButton
|
||||
<div class="search-field">
|
||||
<UIcon name="i-lucide-search" class="search-field__icon" />
|
||||
<input
|
||||
v-model="searchQuery"
|
||||
type="text"
|
||||
class="search-field__input"
|
||||
placeholder="Rechercher un mandat..."
|
||||
/>
|
||||
</div>
|
||||
<select v-model="sortBy" class="sort-select">
|
||||
<option v-for="opt in sortOptions" :key="opt.value" :value="opt.value">
|
||||
{{ opt.label }}
|
||||
</option>
|
||||
</select>
|
||||
<button
|
||||
v-if="auth.isAuthenticated"
|
||||
label="Nouveau"
|
||||
icon="i-lucide-plus"
|
||||
color="primary"
|
||||
size="sm"
|
||||
class="action-btn"
|
||||
@click="showCreateModal = true"
|
||||
/>
|
||||
>
|
||||
<UIcon name="i-lucide-plus" class="text-xs" />
|
||||
<span>Nouveau</span>
|
||||
</button>
|
||||
</template>
|
||||
|
||||
<!-- Main content: mandates list -->
|
||||
@@ -248,9 +249,9 @@ async function handleCreate() {
|
||||
</div>
|
||||
|
||||
<div class="mandate-card__meta">
|
||||
<UBadge variant="subtle" color="primary" size="xs">
|
||||
<span class="mandate-card__type-badge">
|
||||
{{ typeLabel(mandate.mandate_type) }}
|
||||
</UBadge>
|
||||
</span>
|
||||
<span class="mandate-card__steps">
|
||||
<UIcon name="i-lucide-layers" class="text-xs" />
|
||||
{{ mandate.steps.length }} etape{{ mandate.steps.length !== 1 ? 's' : '' }}
|
||||
@@ -550,4 +551,83 @@ async function handleCreate() {
|
||||
font-size: 0.8125rem;
|
||||
color: var(--mood-text-muted);
|
||||
}
|
||||
|
||||
.mandate-card__type-badge {
|
||||
font-size: 0.6875rem;
|
||||
font-weight: 700;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.04em;
|
||||
padding: 3px 10px;
|
||||
border-radius: 20px;
|
||||
background: var(--mood-accent-soft);
|
||||
color: var(--mood-accent);
|
||||
}
|
||||
|
||||
/* --- Modern search / sort / action --- */
|
||||
.search-field {
|
||||
flex: 1;
|
||||
min-width: 10rem;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.5rem;
|
||||
padding: 0.625rem 1rem;
|
||||
background: var(--mood-accent-soft);
|
||||
border-radius: 12px;
|
||||
transition: box-shadow 0.15s ease;
|
||||
}
|
||||
.search-field:focus-within {
|
||||
box-shadow: 0 0 0 2.5px var(--mood-accent-soft);
|
||||
}
|
||||
.search-field__icon {
|
||||
color: var(--mood-text-muted);
|
||||
opacity: 0.5;
|
||||
font-size: 0.875rem;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
.search-field__input {
|
||||
flex: 1;
|
||||
background: none;
|
||||
font-size: 0.9375rem;
|
||||
color: var(--mood-text);
|
||||
min-width: 0;
|
||||
}
|
||||
.search-field__input::placeholder {
|
||||
color: var(--mood-text-muted);
|
||||
opacity: 0.4;
|
||||
}
|
||||
|
||||
.sort-select {
|
||||
padding: 0.625rem 1rem;
|
||||
font-size: 0.875rem;
|
||||
font-weight: 600;
|
||||
color: var(--mood-text);
|
||||
background: var(--mood-accent-soft);
|
||||
border-radius: 12px;
|
||||
cursor: pointer;
|
||||
appearance: none;
|
||||
-webkit-appearance: none;
|
||||
min-width: 5.5rem;
|
||||
}
|
||||
|
||||
.action-btn {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 0.375rem;
|
||||
padding: 0.625rem 1.25rem;
|
||||
font-size: 0.875rem;
|
||||
font-weight: 700;
|
||||
color: var(--mood-accent-text);
|
||||
background: var(--mood-accent);
|
||||
border-radius: 20px;
|
||||
cursor: pointer;
|
||||
transition: transform 0.12s ease, box-shadow 0.12s ease;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.action-btn:hover {
|
||||
transform: translateY(-1px);
|
||||
box-shadow: 0 4px 12px var(--mood-shadow);
|
||||
}
|
||||
.action-btn:active {
|
||||
transform: translateY(0);
|
||||
}
|
||||
</style>
|
||||
|
||||
Reference in New Issue
Block a user