diff --git a/.dropboxignore b/.dropboxignore
new file mode 100644
index 0000000..fed427a
--- /dev/null
+++ b/.dropboxignore
@@ -0,0 +1,4 @@
+node_modules
+.nuxt
+.output
+.nitro
diff --git a/components/ChatbotPlaceholder.vue b/components/ChatbotPlaceholder.vue
index 00cdf6e..1f0e294 100644
--- a/components/ChatbotPlaceholder.vue
+++ b/components/ChatbotPlaceholder.vue
@@ -52,18 +52,9 @@
-
Ce chatbot fonctionne sur un serveur européen souverain
-(Mistral FR, zéro rétention), conçu sobre en énergie.
-
Pour m'aider à te répondre efficacement,
-formule ta requête ainsi :
-
- • Besoin : [ce que tu cherches]
- • Thématique : [juridique / technique / économique / ...]
- • Lieu : [région ou ville]
-
-
Exemple : "Je suis salarié d'agence, litige avec mon
-employeur, besoin conseil juridique droit du travail,
-Île-de-France."
+
Explore les 120 structures de la carte par la conversation. Je peux t'aider à trouver des collectifs, agences ou réseaux selon ta situation, ta pratique ou tes inspirations du moment.
+
Exemple : "Je cherche des acteurs de la rénovation de maisons individuelles en France, plutôt en milieu rural, avec des approches biosourcées ou low-tech."
+
Propulsé par Mistral FR - serveur européen souverain, zéro rétention.
@@ -72,7 +63,7 @@ employeur, besoin conseil juridique droit du travail,
{{ msg.content }}
+
+
Filtrer par :
+
+ {{ tag }}
+
+
@@ -132,10 +138,12 @@ interface ChatMessage {
role: 'user' | 'assistant'
content: string
fiches?: FicheReco[]
+ suggestedHashtags?: string[]
}
const emit = defineEmits<{
'highlightOrgs': [ids: (number | string)[]]
+ 'applyHashtag': [tag: string]
}>()
const isExpanded = ref(false)
@@ -145,6 +153,37 @@ const loading = ref(false)
const errorMsg = ref('')
const messagesContainer = ref
(null)
+// Detection hashtags depuis la question posee
+const HASHTAG_KEYWORDS: Record = {
+ '#reemploi-structurel': ['reemploi', 'materiaux recuperes', 'deconstruction', 'reemploi structurel'],
+ '#reemploi-second-oeuvre': ['revetement', 'second oeuvre', 'reemploi'],
+ '#biosource-geosource': ['biosource', 'geosource', 'paille', 'terre', 'chanvre', 'lin', 'biosource'],
+ '#low-tech-experimentation': ['low-tech', 'low tech', 'technique simple', 'autonomie', 'lowtech'],
+ '#chantier-ecole': ['formation', 'chantier ecole', 'chantier-ecole', 'apprendre', 'auto-construction', 'autoconstruction'],
+ '#sobriete-energetique': ['sobriete', 'energie', 'renovation energetique', 'isolation', 'chauffage', 'economie energie'],
+ '#mal-logement-precarite': ['mal-logement', 'precarite', 'sans-abri', 'logement social', 'squat', 'mal logement'],
+ '#tiers-lieux-friches': ['friche', 'tiers-lieu', 'tiers lieu', 'espace intermediaire', 'temporaire', 'reconversion'],
+ '#accompagnement-cooperatif': ['cooperative', 'accompagnement', 'cooperation', 'collectif', 'mutualisation'],
+ '#transition-energetique-territoriale': ['territoire', 'transition', 'energetique', 'local', 'region', 'transition energetique'],
+ '#communs-fonciers': ['communs', 'foncier', 'anti-speculatif', 'community land trust', 'commun foncier'],
+ '#hack-juridique': ['juridique', 'montage', 'structure legale', 'sci', 'cooperative', 'statut'],
+ '#retrofit-strates': ['retrofit', 'renovation lourde', 'sur-isolation', 'rehaussement'],
+ '#phytoconstruction': ['plantes', 'vegetal', 'arbre', 'construction vivante', 'phyto'],
+}
+
+function detectHashtagsFromQuery(query: string): string[] {
+ const q = query.toLowerCase()
+ .normalize('NFD')
+ .replace(/[̀-ͯ]/g, '')
+ const detected: string[] = []
+ for (const [hashtag, keywords] of Object.entries(HASHTAG_KEYWORDS)) {
+ if (keywords.some(kw => q.includes(kw))) {
+ detected.push(hashtag)
+ }
+ }
+ return detected.slice(0, 3)
+}
+
function toggleExpand() {
isExpanded.value = !isExpanded.value
}
@@ -170,10 +209,12 @@ async function sendMessage() {
body: { question },
})
+ const suggestedHashtags = detectHashtagsFromQuery(question)
const assistantMsg: ChatMessage = {
role: 'assistant',
content: res.reponse_texte,
fiches: res.fiches_recommandees || [],
+ suggestedHashtags: suggestedHashtags.length ? suggestedHashtags : undefined,
}
messages.value.push(assistantMsg)
diff --git a/pages/index.vue b/pages/index.vue
index 4d42073..71107c3 100644
--- a/pages/index.vue
+++ b/pages/index.vue
@@ -1,56 +1,144 @@
-
-
-
= 1024px) -->
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ filtered.length }} structure{{ filtered.length > 1 ? 's' : '' }}
+
+ Effacer les filtres
+
+
+
+
+
+ Chargement...
+
+
+
+
+ {{ structure.nom }}
+
+
+
{{ structure.type_principal }} - {{ structure.ville }}
+
+ {{ tag }}
+
+
+
+
-
-
- Mode dev — données seed
-
-
-
+
-
-
+
+
+ Métropolitain
+ Outre-mer
+ Vue graphique
+
+
+
+
-
-
+ {}"
+ @applyHashtag="(tag) => { if (!selectedHashtags.includes(tag)) selectedHashtags = [...selectedHashtags, tag] }"
+ />
-
-
+
+
{}"
/>
-
+
+
+
+
+
+
+
+
+ Chargement du graphe...
+
+
+
+
+
{}"
+ @applyHashtag="(tag) => { if (!selectedHashtags.includes(tag)) selectedHashtags = [...selectedHashtags, tag] }"
+ />
+
-
-
-
+
-
-
+
-
-
+
Chargement de la carte…
-
+
{}"
/>
@@ -146,81 +248,65 @@
-
+
-
+
+
+
+ 120 réseaux, collectifs et agences où des pensées écologiques deviennent des pratiques d'architecture.
+
+
+
+
+
+
+
+
+
-
+
-
-
-
-
ÉCHELLE
-
- {{ opt }}
-
-
-
-
-
-
FONCTION
-
- {{ fn }}
-
-
-
✕ Effacer les filtres
+ >Effacer les filtres
-
+
- {{ filtered.length }} résultat{{ filtered.length > 1 ? 's' : '' }}
+ {{ filtered.length }} structure{{ filtered.length > 1 ? 's' : '' }}
Chargement des fiches…
@@ -233,46 +319,36 @@
- {{ org.nom }}
+ {{ structure.nom }}
{{ org.echelle }}
-
-
- {{ fn }}
-
-
- {{ org.localisation_ville }}
+ class="shrink-0 w-2.5 h-2.5 rounded-full mt-1"
+ :style="`background: ${familleColor(structure.famille_principale)};`"
+ />
+
{{ structure.type_principal }} · {{ structure.ville }}
-
-
-
+
@@ -301,268 +377,141 @@
{}"
/>