diff --git a/src/app/profile/profile-structure/personal-offer/personal-offer.component.html b/src/app/profile/profile-structure/personal-offer/personal-offer.component.html
index a2b96a0605efe801aa9849929005006e03e863f2..fc6cefa431adff8c4aebb339546982c1d6875aeb 100644
--- a/src/app/profile/profile-structure/personal-offer/personal-offer.component.html
+++ b/src/app/profile/profile-structure/personal-offer/personal-offer.component.html
@@ -21,63 +21,47 @@
     />
   </div>
   <div class="content">
-    <div *ngIf="this.personalOffer.categoriesDisplay.onlineProcedures.length" class="dropDown">
-      <div
-        class="collapseHeader"
-        tabindex="0"
-        (click)="toggleOnlineProcedures()"
-        (keyup.enter)="toggleOnlineProcedures()"
-      >
-        <p>Démarches en ligne</p>
-        <app-svg-icon
-          class="showDetails"
-          [ngClass]="!showOnlineProcedures ? 'visible' : 'hidden'"
-          [type]="'ico'"
-          [icon]="'chevronUp'"
-          [iconClass]="'icon-32'"
-        />
-      </div>
-      <div class="collapseContent" [@collapse]="showOnlineProcedures">
+    <app-collapse *ngIf="this.personalOffer.categoriesDisplay.onlineProcedures.length">
+      <app-collapse-header>
+        <div class="collapseHeader">
+          <h3>Démarches en ligne</h3>
+        </div>
+      </app-collapse-header>
+      <app-collapse-content>
         <ul>
           <li *ngFor="let onlineProcedure of this.personalOffer.categoriesDisplay.onlineProcedures">
             {{ onlineProcedure }}
           </li>
         </ul>
-      </div>
-    </div>
-    <div *ngIf="this.personalOffer.categoriesDisplay.baseSkills.length" class="dropDown">
-      <div class="collapseHeader" tabindex="0" (click)="toggleBaseSkills()" (keyup.enter)="toggleBaseSkills()">
-        <p>Compétences numériques de base</p>
-        <app-svg-icon
-          class="showDetails"
-          [ngClass]="!showBaseSkills ? 'visible' : 'hidden'"
-          [type]="'ico'"
-          [icon]="'chevronUp'"
-          [iconClass]="'icon-32'"
-        />
-      </div>
-      <div class="collapseContent" [@collapse]="showBaseSkills">
+      </app-collapse-content>
+    </app-collapse>
+
+    <app-collapse *ngIf="this.personalOffer.categoriesDisplay.baseSkills.length">
+      <app-collapse-header>
+        <div class="collapseHeader">
+          <h3>Compétences numériques de base</h3>
+        </div>
+      </app-collapse-header>
+      <app-collapse-content>
         <ul>
           <li *ngFor="let baseSkill of this.personalOffer.categoriesDisplay.baseSkills">{{ baseSkill }}</li>
         </ul>
-      </div>
-    </div>
-    <div *ngIf="this.personalOffer.categoriesDisplay.advancedSkills.length" class="dropDown">
-      <div class="collapseHeader" tabindex="0" (click)="toggleAdvancedSkills()" (keyup.enter)="toggleAdvancedSkills()">
-        <p>Compétences numériques avancées</p>
-        <app-svg-icon
-          class="showDetails"
-          [ngClass]="!showAdvancedSkills ? 'visible' : 'hidden'"
-          [type]="'ico'"
-          [icon]="'chevronUp'"
-          [iconClass]="'icon-32'"
-        />
-      </div>
-      <div class="collapseContent" [@collapse]="showAdvancedSkills">
+      </app-collapse-content>
+    </app-collapse>
+
+    <app-collapse *ngIf="this.personalOffer.categoriesDisplay.advancedSkills.length">
+      <app-collapse-header>
+        <div class="collapseHeader">
+          <h3>Compétences numériques avancées</h3>
+        </div>
+      </app-collapse-header>
+      <app-collapse-content>
         <ul>
-          <li *ngFor="let advancedSkill of this.personalOffer.categoriesDisplay.advancedSkills">{{ advancedSkill }}</li>
+          <li *ngFor="let advancedSkill of this.personalOffer.categoriesDisplay.advancedSkills">
+            {{ advancedSkill }}
+          </li>
         </ul>
-      </div>
-    </div>
+      </app-collapse-content>
+    </app-collapse>
   </div>
 </div>
diff --git a/src/app/profile/profile-structure/personal-offer/personal-offer.component.scss b/src/app/profile/profile-structure/personal-offer/personal-offer.component.scss
index e366b44f468e4557de99d9724296eeb46d6be542..ccd5a18bd0c849eadbeb2a95b5517edd2c8c483e 100644
--- a/src/app/profile/profile-structure/personal-offer/personal-offer.component.scss
+++ b/src/app/profile/profile-structure/personal-offer/personal-offer.component.scss
@@ -25,39 +25,31 @@
     display: flex;
     flex-direction: column;
     gap: 1rem;
-    .dropDown {
-      overflow: hidden;
-      border: 1px solid $grey-4;
-      border-radius: 4px;
-      .collapseHeader {
-        @include font-bold-16;
-        display: flex;
-        align-items: center;
-        justify-content: space-between;
-        cursor: pointer;
-        color: $grey-2;
-        padding: 4px 12px;
-        user-select: none;
 
-        .showDetails {
-          transition: all 0.3s;
-          &.visible {
-            transform: rotate(-180deg);
-          }
-        }
+    .collapseHeader {
+      @include font-bold-16;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      color: $grey-2;
+      padding: 0.75rem;
+      user-select: none;
+
+      h3 {
+        margin: 0 !important;
+        @include font-bold-16;
       }
-      .collapseContent {
-        border-top: 1px solid $grey-4;
+    }
+
+    ul {
+      margin: 0;
+      padding: 0.5rem 1.5rem;
+      list-style-position: inside;
+      border-top: 1px solid $grey-4;
 
-        ul {
-          margin: 0;
-          padding: 0.5rem 1.5rem;
-          list-style-position: inside;
-          li {
-            line-height: 2rem;
-            @include font-regular-15;
-          }
-        }
+      li {
+        line-height: 2rem;
+        @include font-regular-15;
       }
     }
   }
diff --git a/src/app/profile/profile-structure/personal-offer/personal-offer.component.ts b/src/app/profile/profile-structure/personal-offer/personal-offer.component.ts
index a74a58081b3f8a6d786886da3059de577dc2be91..c98d015f274960525c9c3eaaa24903be426fa272 100644
--- a/src/app/profile/profile-structure/personal-offer/personal-offer.component.ts
+++ b/src/app/profile/profile-structure/personal-offer/personal-offer.component.ts
@@ -1,4 +1,3 @@
-import { animate, AUTO_STYLE, state, style, transition, trigger } from '@angular/animations';
 import { Component, Input } from '@angular/core';
 import { ButtonType } from '../../../shared/components/button/buttonType.enum';
 import { PersonalOffer } from './../../../models/personalOffer.model';
@@ -7,33 +6,10 @@ import { PersonalOffer } from './../../../models/personalOffer.model';
   selector: 'app-personal-offer',
   templateUrl: './personal-offer.component.html',
   styleUrls: ['./personal-offer.component.scss'],
-  animations: [
-    trigger('collapse', [
-      state('true', style({ height: AUTO_STYLE, visibility: AUTO_STYLE })),
-      state('false', style({ height: '0px', visibility: 'hidden', margin: '0' })),
-      transition('true => false', animate('300ms ease-out')),
-      transition('false => true', animate('300ms ease-out')),
-    ]),
-  ],
 })
 export class PersonalOfferComponent {
   @Input() public personalOffer: PersonalOffer;
   @Input() public isPublic: boolean;
   @Input() public structureName?: string;
   public buttonTypeEnum = ButtonType;
-  public showOnlineProcedures = false;
-  public showBaseSkills = false;
-  public showAdvancedSkills = false;
-
-  public toggleOnlineProcedures(): void {
-    this.showOnlineProcedures = !this.showOnlineProcedures;
-  }
-
-  public toggleBaseSkills(): void {
-    this.showBaseSkills = !this.showBaseSkills;
-  }
-
-  public toggleAdvancedSkills(): void {
-    this.showAdvancedSkills = !this.showAdvancedSkills;
-  }
 }
diff --git a/src/app/profile/profile-structure/profile-structure.component.html b/src/app/profile/profile-structure/profile-structure.component.html
index e46c96fd4566c1fbd0aa94efefa4dbeaf5dab435..44aa52fed719bcbcb991db079bca97b48742ccf7 100644
--- a/src/app/profile/profile-structure/profile-structure.component.html
+++ b/src/app/profile/profile-structure/profile-structure.component.html
@@ -1,50 +1,37 @@
-<div
-  class="structureCard"
-  [ngClass]="{ fold: !showDetails, warningBorder: (!isPublic && !isValid() && !isPending) || isPending }"
->
-  <div
-    class="collapseHeader"
-    tabindex="0"
-    (click)="toggleDetails(); $event.stopPropagation()"
-    (keyup.enter)="toggleDetails(); $event.stopPropagation()"
-  >
-    <div class="left">
-      <app-svg-icon [type]="'ico'" [icon]="getStructureTypeIcon()" [iconClass]="'icon-52'" />
-      <div class="structureInfos">
-        <p class="structureName">{{ structure.structureName }}</p>
-        <app-v3-tag-item
-          [clickable]="false"
-          [label]="structure.structureType?.value"
-          [size]="'small'"
-          [color]="'red'"
-        />
-        <div *ngIf="!isPublic && !isValid() && !isPending" class="missingData">
-          <app-missing-information [plural]="true" />
-        </div>
-        <div *ngIf="isPending" class="missingData">
-          <p>En attente d'acceptation - Demande faite le {{ getFormattedDate() }}</p>
+<app-collapse [variant]="collapseVariant" [size]="'medium'" [boxShadow]="true">
+  <app-collapse-header>
+    <div class="collapseHeader">
+      <div class="left">
+        <app-svg-icon [type]="'ico'" [icon]="getStructureTypeIcon()" [iconClass]="'icon-52'" />
+        <div class="structureInfos">
+          <p class="structureName">{{ structure.structureName }}</p>
+          <app-v3-tag-item
+            [clickable]="false"
+            [label]="structure.structureType?.category"
+            [size]="'small'"
+            [color]="'red'"
+          />
+          <div *ngIf="!isPublic && !isValid() && !isPending" class="missingData">
+            <app-missing-information [plural]="true" />
+          </div>
+          <div *ngIf="isPending" class="missingData">
+            <p>En attente d'acceptation - Demande faite le {{ getFormattedDate() }}</p>
+          </div>
         </div>
       </div>
+      <div class="right">
+        <app-button
+          *ngIf="isPending && !isPublic"
+          class="hide-on-mobile"
+          [iconType]="'form'"
+          [text]="'Annuler la demande'"
+          [style]="buttonTypeEnum.Secondary"
+          (click)="handleCancelJoin(structure._id); $event.stopPropagation()"
+        />
+      </div>
     </div>
-    <div class="right">
-      <app-button
-        *ngIf="isPending && !isPublic"
-        class="hide-on-mobile"
-        [iconType]="'form'"
-        [text]="'Annuler la demande'"
-        [style]="buttonTypeEnum.Secondary"
-        (click)="handleCancelJoin(structure._id); $event.stopPropagation()"
-      />
-      <app-svg-icon
-        class="showDetails"
-        [ngClass]="!showDetails ? 'visible' : 'hidden'"
-        [type]="'ico'"
-        [icon]="'fold'"
-        [iconClass]="'icon-26'"
-      />
-    </div>
-  </div>
-  <div class="collapseContent" [@collapse]="showDetails">
+  </app-collapse-header>
+  <app-collapse-content>
     <div class="section">
       <div class="sectionHeader">
         <p class="sectionTitle">informations</p>
@@ -110,13 +97,13 @@
         </div>
       </div>
     </div>
-    <app-personal-offer
-      *ngIf="this.personalOffer && !isPending"
-      class="section"
-      [personalOffer]="personalOffer"
-      [structureName]="structure.structureName"
-      [isPublic]="isPublic"
-    />
+    <div *ngIf="this.personalOffer && !isPending" class="section">
+      <app-personal-offer
+        [personalOffer]="personalOffer"
+        [structureName]="structure.structureName"
+        [isPublic]="isPublic"
+      />
+    </div>
     <div *ngIf="membersWithJobWithPO.length > 0" class="section">
       <div class="sectionHeader">
         <p class="sectionTitle">Accompagnant·es numériques</p>
@@ -154,5 +141,5 @@
         (click)="goToOffer()"
       />
     </div>
-  </div>
-</div>
+  </app-collapse-content>
+</app-collapse>
diff --git a/src/app/profile/profile-structure/profile-structure.component.scss b/src/app/profile/profile-structure/profile-structure.component.scss
index 796ed10367d29a0b791f3894fa87d11c2b4f4a64..49319fcb3b9720b430bd7559279be846e1aad5a2 100644
--- a/src/app/profile/profile-structure/profile-structure.component.scss
+++ b/src/app/profile/profile-structure/profile-structure.component.scss
@@ -3,141 +3,99 @@
 @import 'breakpoint';
 @import 'shapes';
 
-.structureCard {
-  padding: 12px 0;
-  border-radius: 8px;
-  overflow: hidden;
-  transition: all 0.3s;
-  &.fold {
-    border-color: $grey-4;
-    box-shadow: none;
-  }
-  // unfold
-  border: 1px solid $grey-1;
-  box-shadow: 0px 12px 24px 0px rgba(0, 0, 0, 0.1);
+.collapseHeader {
+  width: 100%;
+  padding: 12px 1.5rem;
+  display: flex;
+  justify-content: space-between;
+  user-select: none;
 
-  .collapseHeader {
-    padding: 0 1.5rem;
+  .left {
     display: flex;
-    justify-content: space-between;
-    cursor: pointer;
-    .left {
+    gap: 1.5rem;
+    .structureInfos {
       display: flex;
-      gap: 1.5rem;
-      .structureInfos {
-        display: flex;
-        flex-direction: column;
-        justify-content: center;
-        gap: 8px;
-      }
+      flex-direction: column;
+      justify-content: center;
+      gap: 8px;
     }
+  }
 
-    .right {
-      display: flex;
-      align-items: center;
-      ::ng-deep button {
-        margin-right: 0.7rem;
-        margin-top: 0.25rem;
-      }
-      .showDetails {
-        transition: all 0.3s;
-        &.visible {
-          transform: rotate(-180deg);
-        }
-      }
+  .right {
+    display: flex;
+    align-items: center;
+    ::ng-deep button {
+      margin-right: 0.7rem;
+      margin-top: 0.25rem;
     }
-    p {
-      margin: 0 !important;
-      &.structureName {
-        @include font-bold-16;
-      }
-      &.structureType {
-        @include font-regular-14;
-        font-style: italic;
-        color: $grey-3;
-      }
+  }
+  p {
+    margin: 0 !important;
+    &.structureName {
+      @include font-bold-16;
     }
-
-    .missingData {
-      display: flex;
-      align-items: center;
-      gap: 0.5rem;
-
-      @include font-bold-14;
-      color: $info-warning;
+    &.structureType {
+      @include font-regular-14;
+      font-style: italic;
+      color: $grey-3;
     }
   }
+  .missingData {
+    display: flex;
+    align-items: center;
+    gap: 0.5rem;
+
+    @include font-bold-14;
+    color: $info-warning;
+  }
+}
 
-  .collapseContent {
+.section {
+  border-top: 1px solid $grey-7;
+  padding-block: 1rem;
+  padding-inline: 48px;
+  display: flex;
+  flex-direction: column;
+  gap: 12px;
+  .sectionHeader {
     display: flex;
-    flex-direction: column;
-    margin-bottom: 0.5rem;
-    .section {
-      border-top: 1px solid $grey-7;
-      padding-block: 1rem;
-      padding-inline: 48px;
+    justify-content: space-between;
+    align-items: center;
+    .sectionTitle {
+      @include font-bold-18;
+      text-transform: uppercase;
+      color: $grey-1;
+    }
+    .sectionButtons {
       display: flex;
-      flex-direction: column;
       gap: 12px;
-      .sectionHeader {
-        display: flex;
-        justify-content: space-between;
-        align-items: center;
-        .sectionTitle {
-          @include font-bold-18;
-          text-transform: uppercase;
-          color: $grey-1;
-        }
-        .sectionButtons {
-          display: flex;
-          gap: 12px;
-        }
-      }
-
-      .sectionContent {
-        &.infoSection {
-          @include font-regular-14;
-          display: flex;
-          flex-direction: column;
-          gap: 8px;
-          .email {
-            text-decoration: underline;
-            color: $grey-1;
-          }
-        }
+    }
+  }
 
-        &.members {
-          display: flex;
-          flex-direction: column;
-          gap: 12px;
-        }
+  .sectionContent {
+    &.infoSection {
+      @include font-regular-14;
+      display: flex;
+      flex-direction: column;
+      gap: 8px;
+      .email {
+        text-decoration: underline;
+        color: $grey-1;
       }
     }
 
-    p {
-      margin: 0 !important;
-    }
-    .call-to-action {
+    &.members {
       display: flex;
-      justify-content: center;
+      flex-direction: column;
+      gap: 12px;
     }
   }
+}
 
-  app-button {
-    &.warning {
-      position: relative;
-      &:after {
-        content: '';
-        background-image: url('../../../assets/form/notValidateWithBorder.svg');
-        background-size: cover;
-        width: 24px;
-        height: 24px;
-        position: absolute;
-        top: -6px;
-        right: -6px;
-      }
-    }
-  }
+.call-to-action {
+  display: flex;
+  justify-content: center;
+  margin-bottom: 1rem;
 }
 
 // V3REMOVE
diff --git a/src/app/profile/profile-structure/profile-structure.component.ts b/src/app/profile/profile-structure/profile-structure.component.ts
index 5a882ae4ab5ca3cf1f9aa69991112ab26cfa4e97..1bf25dedea210c78517279b253062dbc21407017 100644
--- a/src/app/profile/profile-structure/profile-structure.component.ts
+++ b/src/app/profile/profile-structure/profile-structure.component.ts
@@ -1,4 +1,3 @@
-import { animate, AUTO_STYLE, state, style, transition, trigger } from '@angular/animations';
 import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
 import { FormGroup } from '@angular/forms';
 import { Router } from '@angular/router';
@@ -7,6 +6,7 @@ import { structureFormStep } from '../../form/form-view/structure-form/structure
 import { Structure } from '../../models/structure.model';
 import { StructureWithOwners } from '../../models/structureWithOwners.model';
 import { ButtonType } from '../../shared/components/button/buttonType.enum';
+import { CollapseType } from '../../shared/components/v3/collapse/collapse.type';
 import { SearchService } from '../../structure-list/services/search.service';
 import { formUtils } from '../../utils/formUtils';
 import { Utils } from '../../utils/utils';
@@ -18,15 +18,6 @@ import { UserService } from './../../services/user.service';
   selector: 'app-profile-structure',
   templateUrl: './profile-structure.component.html',
   styleUrls: ['./profile-structure.component.scss'],
-  animations: [
-    trigger('collapse', [
-      state('*', style({ height: '0px', visibility: 'hidden', margin: '0' })),
-      state('false', style({ height: '0px', visibility: 'hidden', margin: '0' })),
-      state('true', style({ height: AUTO_STYLE, visibility: AUTO_STYLE, marginTop: '10px' })),
-      transition('true => *', animate('300ms ease-in')),
-      transition('* => true', animate('300ms ease-out')),
-    ]),
-  ],
 })
 export class ProfileStructureComponent implements OnInit {
   @Input() public structureWithOwners: StructureWithOwners;
@@ -39,7 +30,6 @@ export class ProfileStructureComponent implements OnInit {
   public membersWithJobWithPO: User[] = [];
   public structureForm: FormGroup;
   public buttonTypeEnum = ButtonType;
-  public showDetails = false;
   public addMemberModalOpened = false;
   public structure: Structure;
   public personalOffer: PersonalOffer;
@@ -101,9 +91,6 @@ export class ProfileStructureComponent implements OnInit {
   public getStructureTypeIcon(): string {
     return this.structure?.getTypeStructureIcon();
   }
-  public toggleDetails(): void {
-    this.showDetails = !this.showDetails;
-  }
 
   public getAddress(): string {
     const address = this.structure.address;
@@ -121,4 +108,8 @@ export class ProfileStructureComponent implements OnInit {
   public handleCancelJoin(idStructure: string): void {
     this.cancelJoin.emit(idStructure);
   }
+
+  get collapseVariant(): CollapseType {
+    return this.isPending ? CollapseType.Warning : CollapseType.Regular;
+  }
 }
diff --git a/src/app/shared/components/index.ts b/src/app/shared/components/index.ts
index f37438dc6e792b05dbcd5bd9a219feb1c3ad25b7..eafcf80550125e10083d4fbbecc53dd8f82bd80e 100644
--- a/src/app/shared/components/index.ts
+++ b/src/app/shared/components/index.ts
@@ -22,6 +22,9 @@ import { TrainingTypePickerComponent } from './training-type-picker/training-typ
 import { ButtonV3Component } from './v3/button/button.component';
 import { IconButtonV3Component } from './v3/button/icon-button/icon-button.component';
 import { CheckboxV3Component } from './v3/checkbox/checkbox.component';
+import { CollapseContentComponent } from './v3/collapse/collapse-content/collapse-content.component';
+import { CollapseHeaderComponent } from './v3/collapse/collapse-header/collapse-header.component';
+import { CollapseComponent } from './v3/collapse/collapse.component';
 import { InputV3Component } from './v3/input/input.component';
 import { LabelCheckboxV3Component } from './v3/label-checkbox/label-checkbox.component';
 import { RadioV3Component } from './v3/radio/radio.component';
@@ -36,6 +39,9 @@ export {
   ButtonV3Component,
   CheckboxFormComponent,
   CheckboxV3Component,
+  CollapseComponent,
+  CollapseContentComponent,
+  CollapseHeaderComponent,
   CustomModalComponent,
   HourPickerComponent,
   InformationStepComponent,
@@ -63,6 +69,9 @@ export const SharedComponents = [
   ButtonV3Component,
   CheckboxFormComponent,
   CheckboxV3Component,
+  CollapseComponent,
+  CollapseContentComponent,
+  CollapseHeaderComponent,
   CustomModalComponent,
   HourPickerComponent,
   IconButtonV3Component,
diff --git a/src/app/shared/components/training-type-picker/training-type-picker.component.html b/src/app/shared/components/training-type-picker/training-type-picker.component.html
index 7b3a6937673ad29fa74e5c4b608ee2c4cbb6107e..1cdc832689eaa61afc22f2e9c3b3f8372696a4e4 100644
--- a/src/app/shared/components/training-type-picker/training-type-picker.component.html
+++ b/src/app/shared/components/training-type-picker/training-type-picker.component.html
@@ -1,48 +1,26 @@
 <div class="trainingContainer">
-  <div
-    *ngFor="let categorie of categories"
-    class="collapse"
-    [ngClass]="{ notCollapsed: !isCategorieExpanded(categorie.id) }"
-  >
-    <div
-      class="collapseHeader"
-      tabindex="0"
-      (click)="toggleCollapse(categorie.id); $event.stopPropagation()"
-      (keyup.enter)="toggleCollapse(categorie.id); $event.stopPropagation()"
-    >
-      <label class="checkbox">
-        <input
-          type="checkbox"
-          [checked]="getCategoryCheckboxStatus(categorie) === 'checked'"
-          (change)="pickAllCategory(categorie); $event.stopPropagation()"
+  <app-collapse *ngFor="let category of categories" [expanded]="isCategorieExpanded(category.id)">
+    <app-collapse-header>
+      <div class="collapseHeader">
+        <app-v3-checkbox
+          [checked]="getCategoryCheckboxStatus(category) === 'checked'"
+          [indeterminate]="getCategoryCheckboxStatus(category) === 'halfChecked'"
+          (action)="pickAllCategory(category); $event.stopPropagation()"
         />
-        <span
-          class="customCheck customCheckPrimary"
-          [ngClass]="{ halfCheck: getCategoryCheckboxStatus(categorie) === 'halfChecked' }"
-        ></span>
-      </label>
-      <div class="titleCollapse">
-        {{ categorie.name }}
+        {{ category.name }}
       </div>
-      <div class="logo">
-        <svg class="show" aria-hidden="true">
-          <use [attr.xlink:href]="'assets/form/sprite.svg#unfold'" />
-        </svg>
-        <svg class="hide" aria-hidden="true">
-          <use [attr.xlink:href]="'assets/form/sprite.svg#fold'" />
-        </svg>
+    </app-collapse-header>
+    <app-collapse-content>
+      <div class="inputSection btn-grid">
+        <ng-container *ngFor="let module of category.modules">
+          <app-button
+            [extraClass]="isModulePicked(category, module) ? 'selected' : ''"
+            [style]="buttonTypeEnum.CheckButton"
+            [text]="module.name"
+            (action)="pickChoice(category, module)"
+          />
+        </ng-container>
       </div>
-    </div>
-
-    <div *ngIf="isCategorieExpanded(categorie.id)" class="inputSection btn-grid">
-      <ng-container *ngFor="let module of categorie.modules">
-        <app-button
-          [extraClass]="isModulePicked(categorie, module) ? 'selected' : ''"
-          [style]="buttonTypeEnum.CheckButton"
-          [text]="module.name"
-          (action)="pickChoice(categorie, module)"
-        />
-      </ng-container>
-    </div>
-  </div>
+    </app-collapse-content>
+  </app-collapse>
 </div>
diff --git a/src/app/shared/components/training-type-picker/training-type-picker.component.scss b/src/app/shared/components/training-type-picker/training-type-picker.component.scss
index dc192e71b4e6d63da7ba60806d8f9a1ec7fce55a..4e313411831131c1fbe7b4492250b398068a22fa 100644
--- a/src/app/shared/components/training-type-picker/training-type-picker.component.scss
+++ b/src/app/shared/components/training-type-picker/training-type-picker.component.scss
@@ -5,79 +5,27 @@
 @import 'buttons';
 
 .trainingContainer {
-  padding-bottom: 0.5rem;
   display: flex;
   flex-direction: column;
   gap: 0.5rem;
-}
-
-label.checkbox {
-  width: 2.25rem;
-  margin-top: 0.2rem;
-}
 
-.collapse {
-  border-radius: 4px;
-  border: 1px solid $grey-5;
-  box-sizing: border-box;
-  @media #{$small-phone} {
-    width: 95% !important;
-  }
-  &.notCollapsed {
-    border: 1px solid $grey-9;
-    background: $grey-9;
-    &:hover {
-      border: 1px solid $grey-5;
-    }
-    .logo {
-      .hide {
-        display: none;
-      }
-      .show {
-        display: block;
-      }
-    }
-  }
-  .inputSection {
-    padding: 0px 1rem 1rem;
-    svg {
-      border-right: 0;
-      padding-left: 16px;
-    }
-  }
   .collapseHeader {
     display: flex;
     align-items: center;
-    height: 65px;
-    padding: 0 1rem;
-    cursor: pointer;
+    padding: 0.5rem 1.5rem;
+    gap: 0.5rem;
 
     .checkbox {
       width: 2.25rem;
       margin-top: 0.2rem;
     }
     .titleCollapse {
-      width: 100%;
       @include font-bold-14;
       color: $grey-1;
     }
-    .logo {
-      height: 24px;
-      width: 24px;
-      svg {
-        width: 100%;
-        height: 100%;
-        fill: $grey-1;
-      }
-    }
   }
-  .logo,
-  .titleCollapse {
-    .hide {
-      display: block;
-    }
-    .show {
-      display: none;
-    }
+  .inputSection {
+    border-top: 1px solid $grey-4;
+    padding: 1rem;
   }
 }
diff --git a/src/app/shared/components/training-type-picker/training-type-picker.component.ts b/src/app/shared/components/training-type-picker/training-type-picker.component.ts
index 21f1580a4d86aaa53fe48549f7db74f5166f2ac8..48e734fed8c30beb08cfad685a0711b08c1d8768 100644
--- a/src/app/shared/components/training-type-picker/training-type-picker.component.ts
+++ b/src/app/shared/components/training-type-picker/training-type-picker.component.ts
@@ -19,7 +19,6 @@ export class TrainingTypePickerComponent implements OnInit, OnChanges {
 
   public buttonTypeEnum = ButtonType;
   public categories: Category[] = [];
-  public categoriesExpanded: string[] = [];
   public selectedChoices: Category[] = [];
 
   ngOnInit(): void {
@@ -27,13 +26,7 @@ export class TrainingTypePickerComponent implements OnInit, OnChanges {
       this.categories.push(data.category);
     });
     this.initSelectedChoice();
-    this.selectedChoices.forEach((category) => {
-      if (category.modules.length) {
-        this.categoriesExpanded.push(category.id);
-      }
-    });
   }
-
   ngOnChanges(): void {
     this.initSelectedChoice();
   }
@@ -57,16 +50,8 @@ export class TrainingTypePickerComponent implements OnInit, OnChanges {
   }
 
   public isCategorieExpanded(id: string): boolean {
-    return this.categoriesExpanded.includes(id);
-  }
-
-  public toggleCollapse(id: string): void {
-    if (this.isCategorieExpanded(id)) {
-      const index = this.categoriesExpanded.findIndex((categorieId) => categorieId === id);
-      this.categoriesExpanded.splice(index, 1);
-    } else {
-      this.categoriesExpanded.push(id);
-    }
+    const index = this.selectedChoices.findIndex((category) => category.id === id);
+    return this.selectedChoices[index].modules.length !== 0;
   }
 
   public isModulePicked(categorie: Category, module: Module): boolean {
diff --git a/src/app/shared/components/v3/checkbox/checkbox.component.html b/src/app/shared/components/v3/checkbox/checkbox.component.html
index 22a577d95a99e09a9ccfab4726b09ea106d01252..17d7e6d70e490579f76c744f3ac2a179a37e0584 100644
--- a/src/app/shared/components/v3/checkbox/checkbox.component.html
+++ b/src/app/shared/components/v3/checkbox/checkbox.component.html
@@ -3,6 +3,7 @@
   [id]="id"
   [ngClass]="classes"
   [checked]="checked"
+  [indeterminate]="indeterminate"
   [disabled]="disabled"
   (click)="action.emit($event)"
 />
diff --git a/src/app/shared/components/v3/checkbox/checkbox.component.scss b/src/app/shared/components/v3/checkbox/checkbox.component.scss
index ae11ca617cd85dc94dea94fecaa30bd9850b978d..e4418d85b5b47fa802787102b911ac59d5a30c9e 100644
--- a/src/app/shared/components/v3/checkbox/checkbox.component.scss
+++ b/src/app/shared/components/v3/checkbox/checkbox.component.scss
@@ -28,7 +28,19 @@ input {
       background-color: $grey-6;
       background-image: url('./check-grey.svg');
     }
-    // transition: background-image 2s ease;
+  }
+
+  &:indeterminate {
+    background-color: $grey-1;
+    background-image: url('./indeterminate.svg');
+    stroke: $white;
+    background-repeat: no-repeat;
+    background-position: center center;
+    background-size: 16px 16px;
+    &:disabled {
+      background-color: $grey-6;
+      background-image: url('./indeterminate-grey.svg');
+    }
   }
 
   &:focus-visible {
diff --git a/src/app/shared/components/v3/checkbox/checkbox.component.ts b/src/app/shared/components/v3/checkbox/checkbox.component.ts
index 970c81eeaa3576dea17e22ad0769cd01a5fe9a4f..8fb73ea6f850d854952face78e7df4a1eb03da0e 100644
--- a/src/app/shared/components/v3/checkbox/checkbox.component.ts
+++ b/src/app/shared/components/v3/checkbox/checkbox.component.ts
@@ -12,6 +12,9 @@ export class CheckboxV3Component {
   /** Checked ? */
   @Input() checked: boolean;
 
+  /** Indeterminate (half-checked) ? */
+  @Input() indeterminate?: boolean;
+
   /** What size should the checkbox be ? */
   @Input() size?: 'small' | 'medium' = 'medium';
 
diff --git a/src/app/shared/components/v3/checkbox/checkbox.stories.ts b/src/app/shared/components/v3/checkbox/checkbox.stories.ts
index b0bcd19b7fe33f8b9375cbacdc9bc09dab5b487a..fca45a411a8a3de4c7c051ed346446c8d2cdfc73 100644
--- a/src/app/shared/components/v3/checkbox/checkbox.stories.ts
+++ b/src/app/shared/components/v3/checkbox/checkbox.stories.ts
@@ -42,6 +42,13 @@ export const CheckboxMediumChecked: Story = {
   },
 };
 
+export const CheckboxMediumIndeterminate: Story = {
+  args: {
+    ...CheckboxMedium.args,
+    indeterminate: true,
+  },
+};
+
 export const DisabledNotChecked: Story = {
   args: {
     disabled: true,
@@ -55,3 +62,10 @@ export const DisabledChecked: Story = {
     checked: true,
   },
 };
+
+export const DisabledIndeterminate: Story = {
+  args: {
+    disabled: true,
+    indeterminate: true,
+  },
+};
diff --git a/src/app/shared/components/v3/checkbox/indeterminate-grey.svg b/src/app/shared/components/v3/checkbox/indeterminate-grey.svg
new file mode 100644
index 0000000000000000000000000000000000000000..da9f47f47c0a69f3bb396399799497dcbba51385
--- /dev/null
+++ b/src/app/shared/components/v3/checkbox/indeterminate-grey.svg
@@ -0,0 +1,5 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <path d="M18 13H6C5.45 13 5 12.55 5 12C5 11.45 5.45 11 6 11H18C18.55 11 19 11.45 19 12C19 12.55 18.55 13 18 13Z"
+        fill="#696969" />
+
+</svg>
\ No newline at end of file
diff --git a/src/app/shared/components/v3/checkbox/indeterminate.svg b/src/app/shared/components/v3/checkbox/indeterminate.svg
new file mode 100644
index 0000000000000000000000000000000000000000..3a867008eb9b07441b380d680f6fefe85e79bf07
--- /dev/null
+++ b/src/app/shared/components/v3/checkbox/indeterminate.svg
@@ -0,0 +1,5 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <path d="M18 13H6C5.45 13 5 12.55 5 12C5 11.45 5.45 11 6 11H18C18.55 11 19 11.45 19 12C19 12.55 18.55 13 18 13Z"
+        fill="white" />
+
+</svg>
\ No newline at end of file
diff --git a/src/app/shared/components/v3/collapse/collapse-content/collapse-content.component.ts b/src/app/shared/components/v3/collapse/collapse-content/collapse-content.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..3e59ac6b8beb32eabceccaff7aac6fa9e3a8a9f2
--- /dev/null
+++ b/src/app/shared/components/v3/collapse/collapse-content/collapse-content.component.ts
@@ -0,0 +1,20 @@
+import { AUTO_STYLE, animate, state, style, transition, trigger } from '@angular/animations';
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-collapse-content',
+  template: `<div style="overflow: hidden" [@collapse]="expanded">
+    <ng-content></ng-content>
+  </div>`,
+  animations: [
+    trigger('collapse', [
+      state('false', style({ height: '0px', visibility: 'hidden' })),
+      state('true', style({ height: AUTO_STYLE, visibility: AUTO_STYLE })),
+      transition('true => *', animate('300ms ease-in')),
+      transition('* => true', animate('300ms ease-out')),
+    ]),
+  ],
+})
+export class CollapseContentComponent {
+  expanded = false;
+}
diff --git a/src/app/shared/components/v3/collapse/collapse-header/collapse-header.component.scss b/src/app/shared/components/v3/collapse/collapse-header/collapse-header.component.scss
new file mode 100644
index 0000000000000000000000000000000000000000..e67cf260852847bbfc98537dec163244c8955f9b
--- /dev/null
+++ b/src/app/shared/components/v3/collapse/collapse-header/collapse-header.component.scss
@@ -0,0 +1,29 @@
+@import 'color';
+
+.collapse-header {
+  display: flex;
+  justify-content: space-between;
+  cursor: pointer;
+
+  // SIZES
+  &.small {
+    border-radius: 0.25rem;
+    padding-right: 0.75rem;
+  }
+  &.medium {
+    border-radius: 0.5rem;
+    padding-right: 1.5rem;
+  }
+
+  app-svg-icon {
+    transition: all 0.3s;
+    &.expanded {
+      transform: rotate(180deg);
+    }
+  }
+
+  &:focus-visible {
+    outline-offset: 0px;
+    outline: 2px solid $blue-focus;
+  }
+}
diff --git a/src/app/shared/components/v3/collapse/collapse-header/collapse-header.component.ts b/src/app/shared/components/v3/collapse/collapse-header/collapse-header.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..44fb31448c9eee8f09cc53f0c919aeab9de662ba
--- /dev/null
+++ b/src/app/shared/components/v3/collapse/collapse-header/collapse-header.component.ts
@@ -0,0 +1,22 @@
+import { Component, EventEmitter, Output } from '@angular/core';
+
+@Component({
+  selector: 'app-collapse-header',
+  template: `<div
+    class="collapse-header"
+    [ngClass]="size"
+    role="button"
+    tabindex="0"
+    (click)="toggle.emit()"
+    (keyup.enter)="toggle.emit()"
+  >
+    <ng-content></ng-content>
+    <app-svg-icon [ngClass]="expanded && 'expanded'" [type]="'ico'" [icon]="'fold'" [iconClass]="'icon-32'" />
+  </div>`,
+  styleUrls: ['collapse-header.component.scss'],
+})
+export class CollapseHeaderComponent {
+  @Output() toggle = new EventEmitter<void>();
+  expanded = false;
+  size: 'small' | 'medium' = 'small';
+}
diff --git a/src/app/shared/components/v3/collapse/collapse.component.scss b/src/app/shared/components/v3/collapse/collapse.component.scss
new file mode 100644
index 0000000000000000000000000000000000000000..277689b362ac7b2fda1e4cb44c4b20c175ac6eaa
--- /dev/null
+++ b/src/app/shared/components/v3/collapse/collapse.component.scss
@@ -0,0 +1,28 @@
+@import 'color';
+
+.collapse {
+  transition: all 300ms ease-in;
+  border: 1px solid $grey-4;
+
+  // SIZES
+  &.small {
+    border-radius: 0.25rem;
+  }
+  &.medium {
+    border-radius: 0.5rem;
+  }
+
+  // VARIANTS
+  &.collapse-warning {
+    border: 1px solid $info-warning;
+  }
+
+  &.expanded {
+    &.boxShadow {
+      box-shadow: 0px 12px 24px 0px rgba(0, 0, 0, 0.1);
+    }
+    &:not(.collapse-warning) {
+      border: 1px solid $grey-1;
+    }
+  }
+}
diff --git a/src/app/shared/components/v3/collapse/collapse.component.ts b/src/app/shared/components/v3/collapse/collapse.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9680242edd6a2c1e67032402e6ae837c11b1a790
--- /dev/null
+++ b/src/app/shared/components/v3/collapse/collapse.component.ts
@@ -0,0 +1,40 @@
+import { AfterContentInit, Component, ContentChild, Input } from '@angular/core';
+import { CollapseContentComponent } from './collapse-content/collapse-content.component';
+import { CollapseHeaderComponent } from './collapse-header/collapse-header.component';
+import { CollapseType } from './collapse.type';
+
+@Component({
+  selector: 'app-collapse',
+  template: `<div class="collapse" [ngClass]="classes">
+    <ng-content></ng-content>
+  </div>`,
+  styleUrls: ['collapse.component.scss'],
+})
+export class CollapseComponent implements AfterContentInit {
+  @ContentChild(CollapseHeaderComponent) title: CollapseHeaderComponent;
+  @ContentChild(CollapseContentComponent) content: CollapseContentComponent;
+  @Input() variant?: CollapseType = CollapseType.Regular;
+  /** Adapts border-radius and right padding */
+  @Input() size?: 'small' | 'medium' = 'small';
+  /** Box-shadow when expanded? */
+  @Input() boxShadow? = false;
+  /** Default expanded value */
+  @Input() expanded? = false;
+
+  ngAfterContentInit(): void {
+    this.title.size = this.size;
+    this.title.expanded = this.expanded;
+    this.content.expanded = this.expanded;
+    this.title.toggle.subscribe(() => this.toggle());
+  }
+
+  private toggle(): void {
+    this.expanded = !this.expanded;
+    this.title.expanded = this.expanded;
+    this.content.expanded = this.expanded;
+  }
+
+  public get classes(): string[] {
+    return [this.variant, this.size, this.expanded ? 'expanded' : '', this.boxShadow ? 'boxShadow' : ''];
+  }
+}
diff --git a/src/app/shared/components/v3/collapse/collapse.stories.ts b/src/app/shared/components/v3/collapse/collapse.stories.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6e84843a3db56fd68ca6f5f76e5e7964af8944b0
--- /dev/null
+++ b/src/app/shared/components/v3/collapse/collapse.stories.ts
@@ -0,0 +1,86 @@
+import { CommonModule } from '@angular/common';
+import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
+import type { Meta, StoryObj } from '@storybook/angular';
+import { moduleMetadata } from '@storybook/angular';
+import { SvgIconComponent } from '../../svg-icon/svg-icon.component';
+import { CollapseContentComponent } from './collapse-content/collapse-content.component';
+import { CollapseHeaderComponent } from './collapse-header/collapse-header.component';
+import { CollapseComponent } from './collapse.component';
+
+// More on how to set up stories at: https://storybook.js.org/docs/angular/writing-stories/introduction
+const meta: Meta<CollapseComponent> = {
+  title: 'Components/Collapse',
+  component: CollapseComponent,
+  tags: ['autodocs'],
+  decorators: [
+    moduleMetadata({
+      declarations: [SvgIconComponent, CollapseHeaderComponent, CollapseContentComponent],
+      imports: [CommonModule, BrowserAnimationsModule],
+    }),
+  ],
+  argTypes: {},
+};
+
+export default meta;
+type Story = StoryObj<CollapseComponent>;
+
+const collapseChildren = `
+    <app-collapse-header>
+      <div style="padding:0.5rem;">
+      <p style="margin:0;">Contenu de l'en-tête</p>
+      </div>
+    </app-collapse-header>
+    <app-collapse-content>
+      <div style="padding:0.5rem;border-top:1px solid #e9e9e9;">
+        <p>Premier élément</p>
+        <p>Deuxième élément</p>
+        <p>Troisième élément</p>
+        <p>Quatrième élément</p>
+      </div>
+    </app-collapse-content>
+`;
+
+export const CollapseSmall: Story = {
+  render: () => ({
+    template: `
+      <app-collapse>
+        ${collapseChildren}
+      </app-collapse>`,
+  }),
+};
+
+export const CollapseSmallExpanded: Story = {
+  render: () => ({
+    template: `
+      <app-collapse [expanded]="true">
+        ${collapseChildren}
+      </app-collapse>`,
+  }),
+};
+
+export const CollapseMedium: Story = {
+  render: () => ({
+    template: `
+      <app-collapse [size]="'medium'">
+        ${collapseChildren}
+      </app-collapse>`,
+  }),
+};
+
+export const CollapseMediumBoxShadow: Story = {
+  render: () => ({
+    template: `
+      <app-collapse [size]="'medium'" [boxShadow]="true">
+        ${collapseChildren}
+      </app-collapse>`,
+  }),
+};
+
+export const CollapseMediumWarning: Story = {
+  render: () => ({
+    template: `
+      <app-collapse [size]="'medium'" [variant]="'collapse-warning'">
+        ${collapseChildren}
+      </app-collapse>`,
+  }),
+};
diff --git a/src/app/shared/components/v3/collapse/collapse.type.ts b/src/app/shared/components/v3/collapse/collapse.type.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a4ea24a0ad1b0c495be0aaec29d0f0657ffe7d04
--- /dev/null
+++ b/src/app/shared/components/v3/collapse/collapse.type.ts
@@ -0,0 +1,5 @@
+/** values will be used for css selectors */
+export enum CollapseType {
+  Regular = 'collapse-regular',
+  Warning = 'collapse-warning',
+}
diff --git a/src/app/shared/components/v3/label-checkbox/label-checkbox.component.html b/src/app/shared/components/v3/label-checkbox/label-checkbox.component.html
index e1527edb99758efd723f07186f8ae7028bbf99af..fe28c8e7876f8a90ecb89970c3a404de1a7bedbd 100644
--- a/src/app/shared/components/v3/label-checkbox/label-checkbox.component.html
+++ b/src/app/shared/components/v3/label-checkbox/label-checkbox.component.html
@@ -1,6 +1,12 @@
 <div>
   <div class="row">
-    <app-v3-checkbox [id]="for" [size]="'small'" [checked]="checked" (action)="action.emit($event)" />
+    <app-v3-checkbox
+      [id]="for"
+      [size]="size"
+      [checked]="checked"
+      [indeterminate]="indeterminate"
+      (action)="action.emit($event)"
+    />
     <label [for]="for">{{ label }}</label>
   </div>
 
diff --git a/src/app/shared/components/v3/label-checkbox/label-checkbox.component.scss b/src/app/shared/components/v3/label-checkbox/label-checkbox.component.scss
index 4f0a5324b173ef969f47e07ae0a6c77f96314312..d81c99dbb57b8d0bff7af0b6705d7a02531ccda4 100644
--- a/src/app/shared/components/v3/label-checkbox/label-checkbox.component.scss
+++ b/src/app/shared/components/v3/label-checkbox/label-checkbox.component.scss
@@ -3,6 +3,7 @@
 
 .row {
   display: flex;
+  align-items: center;
   gap: 8px;
   &:nth-child(3) {
     margin-top: 12px;
diff --git a/src/app/shared/components/v3/label-checkbox/label-checkbox.component.ts b/src/app/shared/components/v3/label-checkbox/label-checkbox.component.ts
index 026c5063aa5ac4158d9eb62cdb3133f98e0eccb5..b8662ab3cdf816a3b40b3670f817615b60ef2867 100644
--- a/src/app/shared/components/v3/label-checkbox/label-checkbox.component.ts
+++ b/src/app/shared/components/v3/label-checkbox/label-checkbox.component.ts
@@ -12,8 +12,13 @@ export class LabelCheckboxV3Component {
   /** HTML for that will control checkbox */
   @Input() for: string;
 
+  /** What size should the checkbox be ? */
+  @Input() size?: 'small' | 'medium' = 'small';
+
   @Input() checked: boolean;
 
+  @Input() indeterminate?: boolean;
+
   /** Additional label description */
   @Input() description?: string;
 
diff --git a/src/app/structure-list/components/more-filters/more-filters.component.html b/src/app/structure-list/components/more-filters/more-filters.component.html
index 33eab09ac5485f41b354270f9eb48da3fefec52b..60119e63805bee83287d5a40e55044f23eee9b24 100644
--- a/src/app/structure-list/components/more-filters/more-filters.component.html
+++ b/src/app/structure-list/components/more-filters/more-filters.component.html
@@ -41,61 +41,40 @@
             </div>
           </div>
           <div class="scroll-container">
-            <div *ngFor="let c of categories" class="blockFiltre" id="{{ c.id }}">
-              <li class="checkbox">
-                <div class="checkboxItem categoryCheckBox">
-                  <div fxLayout="row" fxLayoutAlign="start center">
-                    <label>
-                      <input
-                        type="checkbox"
-                        class="multiCheck"
-                        [checked]="getCategoryCheckboxStatus(c) === 'checked'"
-                        (change)="handleCategoryCheckBox($event, c)"
-                      />
-                      <span
-                        class="customCheck customCheckPrimary"
-                        [ngClass]="{ halfCheck: getCategoryCheckboxStatus(c) === 'halfChecked' }"
-                      ></span>
-                    </label>
-                    <div
-                      class="w-100 clickable"
-                      tabindex="0"
-                      fxLayout="row"
-                      fxLayoutAlign="space-between center"
-                      (click)="toggleShowCategory(c.id)"
-                      (keyup.enter)="toggleShowCategory(c.id)"
-                    >
-                      <div class="label">{{ c.name }}</div>
-                      <div class="arrow" [ngClass]="{ toggled: this.toggledCategories.includes(c.id) }"></div>
-                    </div>
-                  </div>
-                  <ul class="blockLigne smallList" [ngClass]="{ show: this.toggledCategories.includes(c.id) }">
-                    <li
-                      *ngFor="let module of c.modules"
-                      fxLayout="row"
-                      fxLayoutAlign="start center"
-                      class="ligneFiltre"
-                    >
-                      <div class="checkbox">
-                        <div class="checkboxItem">
-                          <label fxLayout="row" fxLayoutAlign="start center">
-                            <input
-                              type="checkbox"
-                              class="visually-hidden"
-                              [checked]="searchService.getIndex(checkedModules, module.id, c.id) > -1"
-                              [value]="module.id"
-                              (change)="onCheckboxChange($event, c.id, module.name)"
-                            />
-                            <span class="customCheck customCheckPrimary"></span>
-                            <div class="label">{{ module.name }}</div>
-                          </label>
-                        </div>
-                      </div>
-                    </li>
-                  </ul>
+            <app-collapse *ngFor="let c of categories">
+              <app-collapse-header>
+                <div class="checkboxHeader">
+                  <app-v3-checkbox
+                    [size]="'medium'"
+                    [checked]="getCategoryCheckboxStatus(c) === 'checked'"
+                    [indeterminate]="getCategoryCheckboxStatus(c) === 'halfChecked'"
+                    (action)="handleCategoryCheckBox($event, c); $event.stopPropagation()"
+                  />
+                  {{ c.name }}
                 </div>
-              </li>
-            </div>
+              </app-collapse-header>
+              <app-collapse-content>
+                <ul class="blockLigne smallList">
+                  <li *ngFor="let module of c.modules" fxLayout="row" fxLayoutAlign="start center" class="ligneFiltre">
+                    <div class="checkbox">
+                      <div class="checkboxItem">
+                        <label fxLayout="row" fxLayoutAlign="start center">
+                          <input
+                            type="checkbox"
+                            class="visually-hidden"
+                            [checked]="searchService.getIndex(checkedModules, module.id, c.id) > -1"
+                            [value]="module.id"
+                            (change)="onCheckboxChange($event, c.id, module.name)"
+                          />
+                          <span class="customCheck customCheckPrimary"></span>
+                          <div class="label">{{ module.name }}</div>
+                        </label>
+                      </div>
+                    </div>
+                  </li>
+                </ul>
+              </app-collapse-content>
+            </app-collapse>
           </div>
         </ul>
       </div>
@@ -110,11 +89,7 @@
         <app-button [style]="buttonTypeEnum.modalSecondary" [text]="'Effacer'" (click)="clearFilters()" />
       </div>
       <div class="half-width">
-        <app-button
-          [style]="buttonTypeEnum.modalPrimary"
-          [text]="'Appliquer'"
-          (click)="emitModules(checkedModules)"
-        />
+        <app-button [style]="buttonTypeEnum.modalPrimary" [text]="'Appliquer'" (click)="emitModules(checkedModules)" />
       </div>
     </div>
   </div>
diff --git a/src/app/structure-list/components/more-filters/more-filters.component.scss b/src/app/structure-list/components/more-filters/more-filters.component.scss
index 4331c4261faf2d4c458a6f2300b7fcd045469507..95dabc4b5467fb8ec69e3b58dc6f3f03f2238ce0 100644
--- a/src/app/structure-list/components/more-filters/more-filters.component.scss
+++ b/src/app/structure-list/components/more-filters/more-filters.component.scss
@@ -71,6 +71,12 @@
   .multipleCategories {
     width: fit-content;
     margin: auto;
+
+    .checkboxHeader {
+      display: flex;
+      align-items: center;
+      gap: 0.5rem;
+    }
   }
   .scroll-container {
     height: 40vh;
diff --git a/src/app/structure-list/components/more-filters/more-filters.component.ts b/src/app/structure-list/components/more-filters/more-filters.component.ts
index b20f6786097e519f78a9b328c8d0d26acb3da822..266a03570f569a63d6ce09c5c2a8bb83b0e549eb 100644
--- a/src/app/structure-list/components/more-filters/more-filters.component.ts
+++ b/src/app/structure-list/components/more-filters/more-filters.component.ts
@@ -25,7 +25,6 @@ export class MoreFiltersComponent implements OnInit, OnChanges {
 
   // Checkbox variable
   public checkedModules: Module[] = [];
-  public toggledCategories: string[] = [];
 
   ngOnInit(): void {
     // Manage checkbox
@@ -108,16 +107,6 @@ export class MoreFiltersComponent implements OnInit, OnChanges {
     }
   }
 
-  public toggleShowCategory(categoryId: string): void {
-    if (this.toggledCategories.includes(categoryId)) {
-      const index = this.toggledCategories.indexOf(categoryId);
-      this.toggledCategories.splice(index);
-    } else {
-      this.toggledCategories.push(categoryId);
-      setTimeout(() => document.getElementById(categoryId).scrollIntoView({ behavior: 'smooth', block: 'start' }), 1);
-    }
-  }
-
   public getCategoryCheckboxStatus(c: Category): string {
     const selectedModule: Module[] = this.checkedModules.filter((m) => m.name === c.id);
     if (selectedModule.length === c.modules.length) {
diff --git a/src/assets/ico/fold.svg b/src/assets/ico/fold.svg
index 21c86e227726be1cc9945ce8b528ce37a409d1d9..8651c6da743d42a9755205dff15642525c83249d 100644
--- a/src/assets/ico/fold.svg
+++ b/src/assets/ico/fold.svg
@@ -1,3 +1,4 @@
-<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
-<path d="M6 16L12.5 9L19 16" stroke="black" stroke-linecap="round" stroke-linejoin="round" />
-</svg>
+<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <rect width="32" height="32" fill="white" />
+    <path d="M9.33203 13.3333L15.9987 20L22.6654 13.3333H9.33203Z" fill="#333333" />
+</svg>
\ No newline at end of file
diff --git a/src/assets/ico/sprite.svg b/src/assets/ico/sprite.svg
index b5496a2d581edd37e7579adbe6aa6affb09a5f9b..d7f79f954c258108c0fbb971ff3a24c9fe6cc291 100644
--- a/src/assets/ico/sprite.svg
+++ b/src/assets/ico/sprite.svg
@@ -1547,8 +1547,8 @@
     <path d="M6 10L12.5 17L19 10" stroke="black" stroke-linecap="round" stroke-linejoin="round" />
   </symbol>
 
-  <symbol id="fold" width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
-    <path d="M6 16L12.5 9L19 16" stroke="black" stroke-linecap="round" stroke-linejoin="round" />
+  <symbol id="fold" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <path d="M9.33203 13.3333L15.9987 20L22.6654 13.3333H9.33203Z" fill="#333333" />
   </symbol>
 
   <symbol id="searchPrintMarker" width="20" height="20" viewBox="0 0 20 20" fill="none"