curved token names
edition icons added refactored token icons
18
src/App.vue
|
@ -373,9 +373,23 @@ ul {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Editions
|
// Editions
|
||||||
@each $img in $editions {
|
@each $img, $skipIcons in $editions {
|
||||||
.edition-#{$img} {
|
.edition-#{$img} {
|
||||||
background-image: url("./assets/edition-#{$img}.png");
|
background-image: url("./assets/editions/#{$img}.png");
|
||||||
|
}
|
||||||
|
@if $skipIcons != true {
|
||||||
|
.edition-#{$img}.townsfolk {
|
||||||
|
background-image: url("./assets/editions/#{$img}-townsfolk.png");
|
||||||
|
}
|
||||||
|
.edition-#{$img}.outsider {
|
||||||
|
background-image: url("./assets/editions/#{$img}-outsider.png");
|
||||||
|
}
|
||||||
|
.edition-#{$img}.minion {
|
||||||
|
background-image: url("./assets/editions/#{$img}-minion.png");
|
||||||
|
}
|
||||||
|
.edition-#{$img}.demon {
|
||||||
|
background-image: url("./assets/editions/#{$img}-demon.png");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Before Width: | Height: | Size: 5.5 KiB After Width: | Height: | Size: 5.5 KiB |
Before Width: | Height: | Size: 5.5 KiB After Width: | Height: | Size: 5.5 KiB |
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 5.4 KiB |
Before Width: | Height: | Size: 5.5 KiB After Width: | Height: | Size: 5.5 KiB |
Before Width: | Height: | Size: 67 KiB After Width: | Height: | Size: 67 KiB |
Before Width: | Height: | Size: 244 KiB After Width: | Height: | Size: 244 KiB |
Before Width: | Height: | Size: 6.7 KiB After Width: | Height: | Size: 6.7 KiB |
Before Width: | Height: | Size: 6.6 KiB After Width: | Height: | Size: 6.6 KiB |
Before Width: | Height: | Size: 6.6 KiB After Width: | Height: | Size: 6.6 KiB |
Before Width: | Height: | Size: 6.6 KiB After Width: | Height: | Size: 6.6 KiB |
Before Width: | Height: | Size: 98 KiB After Width: | Height: | Size: 98 KiB |
Before Width: | Height: | Size: 6.5 KiB After Width: | Height: | Size: 6.5 KiB |
Before Width: | Height: | Size: 6.3 KiB After Width: | Height: | Size: 6.3 KiB |
Before Width: | Height: | Size: 6.4 KiB After Width: | Height: | Size: 6.4 KiB |
Before Width: | Height: | Size: 6.4 KiB After Width: | Height: | Size: 6.4 KiB |
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
|
@ -47,10 +47,20 @@
|
||||||
v-bind:class="[reminder.role]"
|
v-bind:class="[reminder.role]"
|
||||||
@click="removeReminder(reminder)"
|
@click="removeReminder(reminder)"
|
||||||
>
|
>
|
||||||
|
<span
|
||||||
|
class="icon"
|
||||||
|
v-bind:style="{
|
||||||
|
backgroundImage: `url(${require('../assets/icons/' +
|
||||||
|
reminder.role +
|
||||||
|
'.png')})`
|
||||||
|
}"
|
||||||
|
></span>
|
||||||
{{ reminder.name }}
|
{{ reminder.name }}
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<div class="reminder add" @click="$emit('add-reminder', player)"></div>
|
<div class="reminder add" @click="$emit('add-reminder', player)">
|
||||||
|
<span class="icon"></span>
|
||||||
|
</div>
|
||||||
</li>
|
</li>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@ -441,7 +451,7 @@ export default {
|
||||||
transition: all 200ms;
|
transition: all 200ms;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
|
||||||
&:before,
|
.icon,
|
||||||
&:after {
|
&:after {
|
||||||
content: " ";
|
content: " ";
|
||||||
position: absolute;
|
position: absolute;
|
||||||
|
|
|
@ -1,5 +1,14 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="token" @click="setRole" :class="[role.id]">
|
<div class="token" @click="setRole" :class="[role.id]">
|
||||||
|
<span
|
||||||
|
class="icon"
|
||||||
|
v-if="role.id"
|
||||||
|
v-bind:style="{
|
||||||
|
backgroundImage: `url(${require('../assets/icons/' +
|
||||||
|
role.id +
|
||||||
|
'.png')})`
|
||||||
|
}"
|
||||||
|
></span>
|
||||||
<span class="leaf-left" v-if="role.firstNight"></span>
|
<span class="leaf-left" v-if="role.firstNight"></span>
|
||||||
<span class="leaf-right" v-if="role.otherNight"></span>
|
<span class="leaf-right" v-if="role.otherNight"></span>
|
||||||
<span
|
<span
|
||||||
|
@ -7,7 +16,28 @@
|
||||||
v-bind:class="['leaf-top' + role.reminders.length]"
|
v-bind:class="['leaf-top' + role.reminders.length]"
|
||||||
></span>
|
></span>
|
||||||
<span class="leaf-orange" v-if="role.setup"></span>
|
<span class="leaf-orange" v-if="role.setup"></span>
|
||||||
<div class="name">{{ role.name }}</div>
|
<svg viewBox="0 0 150 150" class="name">
|
||||||
|
<path
|
||||||
|
d="M 13 75 C 13 160, 138 160, 138 75"
|
||||||
|
id="curve"
|
||||||
|
fill="transparent"
|
||||||
|
/>
|
||||||
|
<text
|
||||||
|
width="150"
|
||||||
|
x="66.6%"
|
||||||
|
text-anchor="middle"
|
||||||
|
class="label"
|
||||||
|
v-bind:font-size="role.name | nameToFontSize"
|
||||||
|
>
|
||||||
|
<textPath xlink:href="#curve">
|
||||||
|
{{ role.name }}
|
||||||
|
</textPath>
|
||||||
|
</text>
|
||||||
|
</svg>
|
||||||
|
<div
|
||||||
|
class="edition"
|
||||||
|
v-bind:class="[`edition-${role.edition}`, role.team]"
|
||||||
|
></div>
|
||||||
<div class="ability" v-if="role.ability">
|
<div class="ability" v-if="role.ability">
|
||||||
{{ role.ability }}
|
{{ role.ability }}
|
||||||
</div>
|
</div>
|
||||||
|
@ -26,6 +56,9 @@ export default {
|
||||||
data() {
|
data() {
|
||||||
return {};
|
return {};
|
||||||
},
|
},
|
||||||
|
filters: {
|
||||||
|
nameToFontSize: name => (name && name.length > 10 ? "20px" : "24px")
|
||||||
|
},
|
||||||
methods: {
|
methods: {
|
||||||
setRole() {
|
setRole() {
|
||||||
this.$emit("set-role");
|
this.$emit("set-role");
|
||||||
|
@ -47,15 +80,14 @@ export default {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
|
||||||
&:before {
|
.icon {
|
||||||
content: " ";
|
|
||||||
background-size: 100%;
|
background-size: 100%;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
left: 0;
|
margin-top: 3%;
|
||||||
top: 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
span {
|
span {
|
||||||
|
@ -63,8 +95,6 @@ export default {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
background-size: 100%;
|
background-size: 100%;
|
||||||
left: 0;
|
|
||||||
top: 0;
|
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
|
|
||||||
&.leaf-left {
|
&.leaf-left {
|
||||||
|
@ -100,6 +130,31 @@ export default {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.name {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
.label {
|
||||||
|
fill: black;
|
||||||
|
stroke: white;
|
||||||
|
stroke-width: 2px;
|
||||||
|
paint-order: stroke;
|
||||||
|
font-family: "Papyrus", serif;
|
||||||
|
font-weight: bold;
|
||||||
|
text-shadow: 0 2px 2px rgba(0, 0, 0, 0.2);
|
||||||
|
letter-spacing: 1px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.edition {
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
|
bottom: 5px;
|
||||||
|
width: 30px;
|
||||||
|
height: 30px;
|
||||||
|
background-size: 100%;
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
.ability {
|
.ability {
|
||||||
display: flex;
|
display: flex;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
|
@ -136,17 +191,6 @@ export default {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.name {
|
|
||||||
color: black;
|
|
||||||
font-weight: 600;
|
|
||||||
text-shadow: -1px -1px 0 #fff, 1px -1px 0 #fff, -1px 1px 0 #fff,
|
|
||||||
1px 1px 0 #fff, 0 0 5px rgba(0, 0, 0, 0.75);
|
|
||||||
font-family: "Papyrus", serif;
|
|
||||||
position: absolute;
|
|
||||||
top: 73%;
|
|
||||||
width: 100%;
|
|
||||||
line-height: 100%;
|
|
||||||
}
|
|
||||||
&:hover .ability {
|
&:hover .ability {
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,6 +47,14 @@
|
||||||
v-bind:key="reminder.role + ' ' + reminder.name"
|
v-bind:key="reminder.role + ' ' + reminder.name"
|
||||||
@click="addReminder(reminder)"
|
@click="addReminder(reminder)"
|
||||||
>
|
>
|
||||||
|
<span
|
||||||
|
class="icon"
|
||||||
|
v-bind:style="{
|
||||||
|
backgroundImage: `url(${require('../assets/icons/' +
|
||||||
|
reminder.role +
|
||||||
|
'.png')})`
|
||||||
|
}"
|
||||||
|
></span>
|
||||||
{{ reminder.name }}
|
{{ reminder.name }}
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
@ -160,21 +168,6 @@ export default {
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
@import "../vars.scss";
|
@import "../vars.scss";
|
||||||
|
|
||||||
@each $img, $fontsize in $roles {
|
|
||||||
.token.#{$img} {
|
|
||||||
&:before {
|
|
||||||
background-image: url("../assets/icons/#{$img}.png");
|
|
||||||
}
|
|
||||||
.name {
|
|
||||||
font-size: $fontsize;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.reminder.#{$img}:before {
|
|
||||||
background-image: url("../assets/icons/#{$img}.png");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.circle {
|
.circle {
|
||||||
padding: 0;
|
padding: 0;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
@ -353,8 +346,7 @@ ul.reminders .reminder {
|
||||||
line-height: 100%;
|
line-height: 100%;
|
||||||
transition: transform 500ms ease;
|
transition: transform 500ms ease;
|
||||||
|
|
||||||
&:before {
|
.icon {
|
||||||
content: " ";
|
|
||||||
position: absolute;
|
position: absolute;
|
||||||
left: 0;
|
left: 0;
|
||||||
top: 0;
|
top: 0;
|
||||||
|
|
101
src/vars.scss
|
@ -9,104 +9,5 @@ $editions:
|
||||||
'tb',
|
'tb',
|
||||||
'bmr',
|
'bmr',
|
||||||
'snv',
|
'snv',
|
||||||
'luf'
|
'luf' true
|
||||||
;
|
|
||||||
|
|
||||||
$roles:
|
|
||||||
'apprentice',
|
|
||||||
'artist',
|
|
||||||
'assassin',
|
|
||||||
'barber',
|
|
||||||
'barista',
|
|
||||||
'baron',
|
|
||||||
'beggar',
|
|
||||||
'bishop',
|
|
||||||
'bonecollector' 75%,
|
|
||||||
'bureaucrat',
|
|
||||||
'butcher',
|
|
||||||
'butler',
|
|
||||||
'cerenovus',
|
|
||||||
'chambermaid' 90%,
|
|
||||||
'chef',
|
|
||||||
'clockmaker',
|
|
||||||
'courtier',
|
|
||||||
'deviant',
|
|
||||||
'devilsadvocate' 70%,
|
|
||||||
'dreamer',
|
|
||||||
'drunk',
|
|
||||||
'empath',
|
|
||||||
'evil',
|
|
||||||
'eviltwin',
|
|
||||||
'exorcist',
|
|
||||||
'fanggu',
|
|
||||||
'flowergirl',
|
|
||||||
'fool',
|
|
||||||
'fortuneteller' 80%,
|
|
||||||
'gambler',
|
|
||||||
'godfather',
|
|
||||||
'good',
|
|
||||||
'goon',
|
|
||||||
'gossip',
|
|
||||||
'grandmother' 90%,
|
|
||||||
'gunslinger',
|
|
||||||
'harlot',
|
|
||||||
'imp',
|
|
||||||
'innkeeper',
|
|
||||||
'investigator',
|
|
||||||
'judge',
|
|
||||||
'juggler',
|
|
||||||
'klutz',
|
|
||||||
'librarian',
|
|
||||||
'lunatic',
|
|
||||||
'mastermind',
|
|
||||||
'mathematician' 80%,
|
|
||||||
'matron',
|
|
||||||
'mayor',
|
|
||||||
'minstrel',
|
|
||||||
'monk',
|
|
||||||
'moonchild',
|
|
||||||
'mutant',
|
|
||||||
'nodashii',
|
|
||||||
'oracle',
|
|
||||||
'pacifist',
|
|
||||||
'philosopher',
|
|
||||||
'pithag',
|
|
||||||
'po',
|
|
||||||
'poisoner',
|
|
||||||
'professor',
|
|
||||||
'pukka',
|
|
||||||
'ravenkeeper' 80%,
|
|
||||||
'recluse',
|
|
||||||
'sage',
|
|
||||||
'sailor',
|
|
||||||
'saint',
|
|
||||||
'savant',
|
|
||||||
'scapegoat',
|
|
||||||
'scarletwoman' 75%,
|
|
||||||
'seamstress',
|
|
||||||
'shabaloth',
|
|
||||||
'slayer',
|
|
||||||
'snakecharmer' 75%,
|
|
||||||
'soldier',
|
|
||||||
'spy',
|
|
||||||
'sweetheart',
|
|
||||||
'tealady',
|
|
||||||
'thief',
|
|
||||||
'tinker',
|
|
||||||
'towncrier',
|
|
||||||
'undertaker' 85%,
|
|
||||||
'vigormortis',
|
|
||||||
'virgin',
|
|
||||||
'vortox',
|
|
||||||
'voudon',
|
|
||||||
'washerwoman' 75%,
|
|
||||||
'witch',
|
|
||||||
'zombuul',
|
|
||||||
'amnesiac',
|
|
||||||
'cannibal',
|
|
||||||
'fisherman',
|
|
||||||
'balloonist',
|
|
||||||
'goblin',
|
|
||||||
'widow',
|
|
||||||
'leviathan'
|
|
||||||
;
|
;
|
||||||
|
|