All checks were successful
- Possibilité de discuter avec un PDF ; RAG ou analyse approfondie. Enlèvement de l'autre outil PDF de discussion qui analysait d'abord un PDF en proposant directement une intégration sans attendre qu'on pose de question - Mise en place de l'import directement dans les outils dans la sidebar - Mise en place d'un outil pour créer des tables aléatoires avec possibilité d'utiliser pendant la partie - Mise en place d'un outil pour mettre en place des PNJ, scènes, chapitre.... directement à partir de la discussion avec le PDF - Mise en place RAG avec mistal-embeding ou nomic si on utilise ollama - Mise en place mistral, google en fournisseurs alternatifs pour l'IA dans le cloud - version 0.11.0-bêta
137 lines
4.9 KiB
HTML
137 lines
4.9 KiB
HTML
<div class="reference-panel">
|
|
|
|
<nav class="ref-tabs">
|
|
<button type="button"
|
|
class="ref-tab"
|
|
[class.ref-tab--active]="activeTab === 'ai'"
|
|
(click)="selectTab('ai')">
|
|
<lucide-icon [img]="Sparkles" [size]="14"></lucide-icon>
|
|
IA
|
|
</button>
|
|
<button type="button"
|
|
class="ref-tab"
|
|
[class.ref-tab--active]="activeTab === 'dice'"
|
|
(click)="selectTab('dice')">
|
|
<lucide-icon [img]="Dices" [size]="14"></lucide-icon>
|
|
Dés
|
|
</button>
|
|
<button type="button"
|
|
class="ref-tab"
|
|
[class.ref-tab--active]="activeTab === 'tables'"
|
|
(click)="selectTab('tables')">
|
|
<lucide-icon [img]="Table2" [size]="14"></lucide-icon>
|
|
Tables
|
|
</button>
|
|
<button type="button"
|
|
class="ref-tab"
|
|
[class.ref-tab--active]="activeTab === 'characters'"
|
|
(click)="selectTab('characters')">
|
|
<lucide-icon [img]="User" [size]="14"></lucide-icon>
|
|
PJ/PNJ
|
|
</button>
|
|
<button type="button"
|
|
class="ref-tab"
|
|
[class.ref-tab--active]="activeTab === 'scenes'"
|
|
(click)="selectTab('scenes')">
|
|
<lucide-icon [img]="Swords" [size]="14"></lucide-icon>
|
|
Scènes
|
|
</button>
|
|
</nav>
|
|
|
|
<div class="ref-content" [class.ref-content--fill]="activeTab === 'ai'">
|
|
|
|
<!-- ====== IA ====== -->
|
|
<app-session-ai-chat-panel
|
|
*ngIf="activeTab === 'ai'"
|
|
[sessionId]="sessionId"
|
|
[canSaveToJournal]="canAddToJournal"
|
|
(saveToJournal)="onAiSaveToJournal($event)">
|
|
</app-session-ai-chat-panel>
|
|
|
|
<!-- ====== Dés ====== -->
|
|
<app-session-dice-panel
|
|
*ngIf="activeTab === 'dice'"
|
|
[canAddToJournal]="canAddToJournal"
|
|
(rolled)="onDiceRolled($event)">
|
|
</app-session-dice-panel>
|
|
|
|
<!-- ====== Tables aléatoires ====== -->
|
|
<app-session-random-tables-panel
|
|
*ngIf="activeTab === 'tables'"
|
|
[campaignId]="campaignId"
|
|
[canAddToJournal]="canAddToJournal"
|
|
(rolled)="onDiceRolled($event)"
|
|
(aiReplyToJournal)="onAiSaveToJournal($event)">
|
|
</app-session-random-tables-panel>
|
|
|
|
<!-- ====== Personnages (PJ + PNJ) ====== -->
|
|
<div *ngIf="activeTab === 'characters'" class="ref-list">
|
|
<p class="loading-hint" *ngIf="loadingChars">Chargement…</p>
|
|
|
|
<div *ngIf="!loadingChars">
|
|
<div class="ref-group" *ngIf="characters.length > 0">
|
|
<h4>
|
|
<lucide-icon [img]="User" [size]="13"></lucide-icon>
|
|
Personnages joueurs
|
|
</h4>
|
|
<button *ngFor="let c of characters"
|
|
type="button"
|
|
class="ref-item"
|
|
(click)="openInNewTab(['campaigns', campaignId, 'playthroughs', playthroughId!, 'characters', c.id!])">
|
|
<span class="ref-item-name">{{ c.name }}</span>
|
|
<lucide-icon [img]="ExternalLink" [size]="12" class="ref-item-icon"></lucide-icon>
|
|
</button>
|
|
</div>
|
|
|
|
<div class="ref-group" *ngIf="npcs.length > 0">
|
|
<h4>
|
|
<lucide-icon [img]="Drama" [size]="13"></lucide-icon>
|
|
Personnages non-joueurs
|
|
</h4>
|
|
<button *ngFor="let n of npcs"
|
|
type="button"
|
|
class="ref-item"
|
|
(click)="openInNewTab(['campaigns', campaignId, 'npcs', n.id!])">
|
|
<span class="ref-item-name">{{ n.name }}</span>
|
|
<lucide-icon [img]="ExternalLink" [size]="12" class="ref-item-icon"></lucide-icon>
|
|
</button>
|
|
</div>
|
|
|
|
<p class="empty-hint" *ngIf="characters.length === 0 && npcs.length === 0">
|
|
Aucun personnage dans cette campagne.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- ====== Scènes (arborescence aplatie) ====== -->
|
|
<div *ngIf="activeTab === 'scenes'" class="ref-list">
|
|
<p class="loading-hint" *ngIf="loadingTree">Chargement…</p>
|
|
|
|
<ng-container *ngIf="!loadingTree && treeData">
|
|
<p class="empty-hint" *ngIf="treeData.arcs.length === 0">
|
|
Aucun arc narratif. Construis le scénario de ta campagne pour le retrouver ici.
|
|
</p>
|
|
|
|
<div *ngFor="let arc of treeData.arcs" class="ref-group">
|
|
<h4>
|
|
<lucide-icon [img]="Swords" [size]="13"></lucide-icon>
|
|
{{ arc.name }}
|
|
</h4>
|
|
|
|
<div *ngFor="let chapter of chaptersOf(arc)" class="ref-subgroup">
|
|
<span class="ref-subgroup-title">{{ chapter.name }}</span>
|
|
<button *ngFor="let scene of scenesOf(chapter)"
|
|
type="button"
|
|
class="ref-item ref-item--nested"
|
|
(click)="openInNewTab(['campaigns', campaignId, 'arcs', arc.id!, 'chapters', chapter.id!, 'scenes', scene.id!])">
|
|
<span class="ref-item-name">{{ scene.name }}</span>
|
|
<lucide-icon [img]="ExternalLink" [size]="12" class="ref-item-icon"></lucide-icon>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</ng-container>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|