-
-
-
+
+
+
+
+
+ Retour
+
+
+
+ Décisions
+
-
-
-
- Nouvelle decision
-
-
- Cadrage d'un nouveau processus de decision collectif
-
-
+
+
+
+
-
-
-
-
-
{{ decisions.error }}
+
+
+
+
+
+
+ {{ option.title }}
+ {{ option.desc }}
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+ {{ selectedOption.title }}
+
+
+
+
+
+
+ {{ decisions.error }}
+
+
+
+
+
+ {{ nature === 'individual' ? 'Question à consulter' : 'Titre de la décision' }}
+ *
+
+
+
+
+
+ Description
+
+
+
+
+ Contexte et références
+
+
+
+
+
+
Protocole de vote
+
+
Optionnel — peut être défini à chaque étape
+
+
+
+
+
+
+ Ouvrir un mandat en parallèle
+ Si la consultation mène à déléguer une mission
+
+
+
+
+
+
+ Annuler
+
+
+
+
+ {{ nature === 'individual' ? 'Lancer la consultation' : 'Créer la décision' }}
+
+
+
+
+
+
diff --git a/frontend/app/pages/index.vue b/frontend/app/pages/index.vue
index e544e73..6932f66 100644
--- a/frontend/app/pages/index.vue
+++ b/frontend/app/pages/index.vue
@@ -116,6 +116,22 @@ function formatDate(dateStr: string): string {
+
+
+
+
+
+
+
+ Prendre une décision
+ Individuelle · collective · déléguée — le parcours s'adapte
+
+
+
+
+
+
+
@@ -177,7 +193,7 @@ function formatDate(dateStr: string): string {
Vote WoT
Inertie
Smith
- Nuancé
+ Élection
@@ -292,6 +308,87 @@ function formatDate(dateStr: string): string {
}
}
+/* --- Décider CTA --- */
+.dash__decide {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 1rem;
+ padding: 1.25rem;
+ background: var(--mood-accent);
+ border-radius: 16px;
+ text-decoration: none;
+ transition: transform 0.12s ease, box-shadow 0.12s ease;
+}
+.dash__decide:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 8px 28px var(--mood-shadow);
+}
+.dash__decide:active { transform: translateY(0); }
+
+.dash__decide-left {
+ display: flex;
+ align-items: center;
+ gap: 0.875rem;
+ min-width: 0;
+}
+
+.dash__decide-icon {
+ width: 2.75rem;
+ height: 2.75rem;
+ flex-shrink: 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border-radius: 14px;
+ background: rgba(255,255,255,0.18);
+ color: var(--mood-accent-text);
+}
+
+.dash__decide-text {
+ display: flex;
+ flex-direction: column;
+ gap: 0.125rem;
+ min-width: 0;
+}
+
+.dash__decide-label {
+ font-size: 1rem;
+ font-weight: 800;
+ color: var(--mood-accent-text);
+ letter-spacing: -0.01em;
+}
+
+@media (min-width: 640px) {
+ .dash__decide-label { font-size: 1.125rem; }
+}
+
+.dash__decide-sub {
+ font-size: 0.75rem;
+ color: rgba(255,255,255,0.75);
+ font-weight: 500;
+}
+
+@media (min-width: 640px) {
+ .dash__decide-sub { font-size: 0.8125rem; }
+}
+
+.dash__decide-arrow {
+ flex-shrink: 0;
+ width: 2rem;
+ height: 2rem;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border-radius: 50%;
+ background: rgba(255,255,255,0.18);
+ color: var(--mood-accent-text);
+ transition: transform 0.12s;
+}
+.dash__decide:hover .dash__decide-arrow {
+ transform: translateX(3px);
+}
+
/* --- Entry cards --- */
.dash__entries {
display: grid;
diff --git a/frontend/app/pages/login.vue b/frontend/app/pages/login.vue
index 47a4db9..6ba7d2a 100644
--- a/frontend/app/pages/login.vue
+++ b/frontend/app/pages/login.vue
@@ -49,7 +49,8 @@ async function loginAsProfile(p: DevProfile) {
try {
step.value = 'signing'
- await auth.login(p.address)
+ // Dev mode: bypass extension — backend accepte toute signature pour les profils dev
+ await auth.login(p.address, () => Promise.resolve('0x' + 'a'.repeat(128)))
step.value = 'success'
setTimeout(() => router.push('/'), 800)
} catch (err: any) {
diff --git a/frontend/app/pages/protocols/index.vue b/frontend/app/pages/protocols/index.vue
index ec7044d..ce2ec96 100644
--- a/frontend/app/pages/protocols/index.vue
+++ b/frontend/app/pages/protocols/index.vue
@@ -136,24 +136,6 @@ interface OperationalProtocol {
}
const operationalProtocols: OperationalProtocol[] = [
- {
- slug: 'election-sociocratique',
- name: 'Élection sociocratique',
- description: 'Processus d\'élection d\'un rôle par consentement : clarification du rôle, nominations silencieuses, argumentaire, levée d\'objections. Garantit légitimité et clarté.',
- category: 'gouvernance',
- icon: 'i-lucide-users',
- instancesLabel: 'Tout renouvellement de rôle',
- linkedRefs: [
- { label: 'Mandats', icon: 'i-lucide-user-check', to: '/mandates', kind: 'decision' },
- ],
- steps: [
- { label: 'Clarifier le rôle', actor: 'Cercle', icon: 'i-lucide-clipboard-list', type: 'checklist' },
- { label: 'Nominations silencieuses', actor: 'Tous les membres', icon: 'i-lucide-pencil', type: 'checklist' },
- { label: 'Recueil & argumentaire', actor: 'Facilitateur', icon: 'i-lucide-list-checks', type: 'checklist' },
- { label: 'Objections & consentement', actor: 'Cercle', icon: 'i-lucide-shield-check', type: 'certification' },
- { label: 'Proclamation', actor: 'Facilitateur', icon: 'i-lucide-star', type: 'on_chain' },
- ],
- },
{
slug: 'embarquement-forgeron',
name: 'Embarquement Forgeron',
diff --git a/frontend/app/pages/tools.vue b/frontend/app/pages/tools.vue
index bb7edf8..8814ff8 100644
--- a/frontend/app/pages/tools.vue
+++ b/frontend/app/pages/tools.vue
@@ -20,6 +20,8 @@ interface ToolSection {
tools: Tool[]
}
+const expandSocio = ref(false)
+
const sections: ToolSection[] = [
{
key: 'documents',
@@ -149,6 +151,29 @@ const sections: ToolSection[] = [
+
+
+