diff --git a/website/client/components/achievements/chooseClass.vue b/website/client/components/achievements/chooseClass.vue
index 0da20851aa..a1528b27de 100644
--- a/website/client/components/achievements/chooseClass.vue
+++ b/website/client/components/achievements/chooseClass.vue
@@ -1,119 +1,203 @@
- b-modal#choose-class(:title="$t('chooseClassHeading')", size='lg', :hide-footer="true")
+ b-modal#choose-class(
+ size='lg',
+ :hide-header='true',
+ :hide-footer='true',
+ :no-close-on-esc='true',
+ :no-close-on-backdrop='true',
+ )
.modal-body.select-class
+ h1.header-purple.text-center {{ $t('chooseClass') }}
.container-fluid
- .row
- .col-md-3(@click='selectedClass = "warrior"')
- h5 {{ $t('warriorWiki') }}
- figure.herobox(:class='{"selected-class": selectedClass === "warrior"}')
- .character-sprites
- span(:class='`skin_${user.preferences.skin}`')
- span(class='head_0')
- span(:class='`${user.preferences.size}_armor_warrior_5`')
- span(:class='`hair_base_${user.preferences.hair.base}_${user.preferences.hair.color}`')
- span(:class='`hair_bangs_${user.preferences.hair.bangs}_${user.preferences.hair.color}`')
- span(:class='`hair_beard_${user.preferences.hair.beard}_${user.preferences.hair.color}`')
- span(:class='`hair_mustache_${user.preferences.hair.mustache}_${user.preferences.hair.color}`')
- span(class='head_warrior_5')
- span(class='shield_warrior_5')
- span(class='weapon_warrior_6')
- .col-md-3(@click='selectedClass = "wizard"')
- h5 {{ $t('mageWiki') }}
- figure.herobox(:class='{"selected-class": selectedClass === "wizard"}')
- .character-sprites
- span(class='`skin_${user.preferences.skin}`')
- span(class='head_0')
- span(:class='`${user.preferences.size}_armor_wizard_5`')
- span(:class='`hair_base_${user.preferences.hair.base}_${user.preferences.hair.color}`')
- span(:class='`hair_bangs_${user.preferences.hair.bangs}_${user.preferences.hair.color}`')
- span(:class='`hair_beard_${user.preferences.hair.beard}_${user.preferences.hair.color}`')
- span(:class='`hair_mustache_${user.preferences.hair.mustache}_${user.preferences.hair.color}`')
- span(class='head_wizard_5')
- span(class='shield_wizard_5')
- span(class='weapon_wizard_6')
- .col-md-3(@click='selectedClass = "rogue"')
- h5 {{ $t('rogueWiki') }}
- figure.herobox(:class='{"selected-class": selectedClass === "rogue"}')
- .character-sprites
- span(:class='`skin_${user.preferences.skin}`')
- span(class='head_0')
- span(:class='`${user.preferences.size}_armor_rogue_5`')
- span(:class='`hair_base_${user.preferences.hair.base}_${user.preferences.hair.color}`')
- span(:class='`hair_bangs_${user.preferences.hair.bangs}_${user.preferences.hair.color}`')
- span(:class='`hair_beard_${user.preferences.hair.beard}_${user.preferences.hair.color}`')
- span(:class='`hair_mustache_${user.preferences.hair.mustache}_${user.preferences.hair.color}`')
- span(class='head_rogue_5')
- span(class='shield_rogue_6')
- span(class='weapon_rogue_6')
- .col-md-3(@click='selectedClass = "healer"')
- h5 {{ $t('healerWiki') }}
- figure.herobox(ng-class='{"selected-class": selectedClass === "healer"}')
- .character-sprites
- span(:class='`skin_${user.preferences.skin}`')
- span(class='head_0')
- span(:class='`${user.preferences.size}_armor_healer_5`')
- span(:class='`hair_base_${user.preferences.hair.base}_${user.preferences.hair.color}`')
- span(:class='`hair_bangs_${user.preferences.hair.bangs}_${user.preferences.hair.color}`')
- span(:class='`hair_beard_${user.preferences.hair.beard}_${user.preferences.hair.color}`')
- span(:class='`hair_mustache_${user.preferences.hair.mustache}_${user.preferences.hair.color}`')
- span(class='head_healer_5')
- span(class='shield_healer_5')
- span(class='weapon_healer_6')
br
- .well(v-if='selectedClass === "warrior"') {{ $t('warriorText') }}
- .well(v-if='selectedClass === "wizard"') {{ $t('mageText') }}
- .well(v-if='selectedClass === "rogue"') {{ $t('rogueText') }}
- .well(v-if='selectedClass === "healer"') {{ $t('healerText') }}
-
- .modal-footer
- span(popover-placement='left', popover-trigger='mouseenter', :popover="$t('optOutOfClassesText')")
- button.btn.btn-danger(@click='disableClasses({}); close()') {{ $t('optOutOfClasses') }}
- button.btn.btn-primary(:disabled='!selectedClass' @click='changeClass(selectedClass); selectedClass = undefined; close()') {{ $t('select') }}
- .pull-left {{ $t('chooseClassLearn') }}
+ .row
+ .col-md-3(v-for='heroClass in classes')
+ div(@click='selectedClass = heroClass')
+ avatar(
+ :member='user',
+ :avatarOnly='true',
+ :withBackground='false',
+ :overrideAvatarGear='classGear(heroClass)',
+ :hideClassBadge='true',
+ :spritesMargin='"1.8em 1.5em"',
+ :overrideTopPadding='"0px"',
+ :class='selectionBox(selectedClass, heroClass)',
+ )
+ br
+ .d-flex.justify-content-center(v-for='heroClass in classes')
+ .d-inline-flex(v-if='selectedClass === heroClass')
+ .class-badge.d-flex.justify-content-center
+ .svg-icon.align-self-center(v-html='icons[heroClass]')
+ .class-name(:class='`${heroClass}-color`') {{ $t(heroClass) }}
+ div(v-for='heroClass in classes')
+ .class-explanation.text-center(v-if='selectedClass === heroClass') {{ $t(`${heroClass}Text`) }}
+ .text-center(v-markdown='$t("chooseClassLearnMarkdown")')
+ .modal-actions.text-center
+ button.btn.btn-primary.d-inline-block(v-if='!selectedClass', :disabled='true') {{ $t('select') }}
+ button.btn.btn-primary.d-inline-block(v-else, @click='clickSelectClass(selectedClass); close();') {{ $t('selectClass', {heroClass: $t(selectedClass)}) }}
+ b-popover(
+ :triggers="['hover']",
+ :placement="'top'",
+ ).d-inline-block
+ span(slot="content")
+ div.popover-content-text {{ $t('optOutOfClassesText') }}
+ .danger(@click='clickDisableClasses(); close();') {{ $t('optOutOfClasses') }}
-