Merge with master

This commit is contained in:
Dan Simon 2021-08-17 18:05:03 -04:00
commit 1bf796eac5
19 changed files with 253 additions and 228 deletions

View File

@ -449,7 +449,7 @@
<script type="text/javascript" src="javascripts/components/new-ui/time-dimensions-tab/new-time-dimension-row.js"></script>
<script type="text/javascript" src="javascripts/components/new-ui/time-dimensions-tab/new-time-dimensions-tab.js"></script>
<script type="text/javascript" src="javascripts/components/new-ui/dimensions-tab/new-galaxy-row.js"></script>
<script type="text/javascript" src="javascripts/components/new-ui/sidebar-resources/sidebar-rm.js"></script>
<script type="text/javascript" src="javascripts/components/new-ui/sidebar-resources/sidebar-currency.js"></script>
<script type="text/javascript" src="javascripts/components/new-ui/new-ui.js"></script>
<script type="text/javascript" src="javascripts/components/common/news-ticker.js"></script>

View File

@ -33,5 +33,6 @@ Vue.component("game-ui", {
</div>
<div id="notification-container" class="l-notification-container" />
<tt-shop v-if="view.subtab === 'studies'" class="l-time-studies-tab__tt-shop" />
<sidebar v-if="view.newUI" />
</div>`
});

View File

@ -4,35 +4,16 @@ Vue.component("modal-away-progress", {
components: {
"away-progress-helper": {
props: {
config: Object,
item: Object,
playerBefore: Object,
playerAfter: Object,
},
computed: {
after() {
return this.config.after;
},
before() {
return this.config.before;
return this.item.navigateTo(this.playerBefore);
},
classObject() {
return this.config.classObject;
},
name() {
return this.config.name;
},
showOption() {
return this.config.awayProgress;
},
increased() {
// Both Decimals and numbers may be passed in. This code handles both.
const after = this.after;
const before = this.before;
return after instanceof Decimal
? after.gt(before)
: after > before;
},
show() {
return this.showOption && this.increased;
after() {
return this.item.navigateTo(this.playerAfter);
},
formatBefore() {
return this.formatPseudo(this.before);
@ -40,8 +21,41 @@ Vue.component("modal-away-progress", {
formatAfter() {
return this.formatPseudo(this.after);
},
classObject() {
return this.item.classObject;
},
name() {
return this.item.formatName;
},
increased() {
// If they would visually display as the same number, they shouldn't be treated as if they increased
if (this.formatAfter === this.formatBefore) return false;
// Both Decimals and numbers may be passed in. This code handles both.
const before = this.before;
const after = this.after;
return after instanceof Decimal
? after.gt(before)
: after > before;
},
show() {
if (!this.item.appearsInAwayModal) return false;
const show = this.increased && this.item.option && this.item.isUnlocked();
// For the achievement and display, we need to emit if something happened to the parent
if (show) this.$emit("something-happened");
return show;
},
isBlackHole() {
// If its a Black Hole we need different formatting, so find that
return this.item.name.includes("BlackHole");
},
formatBlackHoleActivations() {
const activations = this.after - this.before;
return `${formatInt(activations)} ${pluralize("time", activations)}`;
}
},
methods: {
// We want different formatting above and below 1e9 to improve readability
formatPseudo(number) {
if (Decimal.lt(number, 1e9)) return formatInt(number);
return format(number, 2, 2);
@ -49,59 +63,21 @@ Vue.component("modal-away-progress", {
},
template: `
<div v-if="show" :class="classObject" class="c-modal-away-progress__resources">
<b>{{ name }}</b> increased from {{ formatBefore }} to {{ formatAfter }}
<span v-if="isBlackHole">Your <b>{{ name }}</b> activated {{ formatBlackHoleActivations }}</span>
<span v-else><b>{{ name }}</b> increased from {{ formatBefore }} to {{ formatAfter }}</span>
</div>`
},
"away-progress-black-hole": {
props: {
blackHole: Number,
playerBefore: Object,
playerAfter: Object,
},
computed: {
before() {
return this.playerBefore.blackHole[this.blackHole];
},
after() {
return this.playerAfter.blackHole[this.blackHole];
},
increased() {
return this.after.activations > this.before.activations;
},
show() {
return player.options.awayProgress.blackHole && this.increased;
},
activationTimes() {
return this.after.activations - this.before.activations;
},
name() {
// If its 0 its the first black hole, if its 1 its the second. if its not one of those two, something has gone
// wrong, and an error should be thrown.
// TODO: Standardize Black Hole handling and naming, this shouldnt be done locally
if (this.blackHole === 0) return "First";
if (this.blackHole === 1) return "Second";
throw new Error("Unknown Black Hole ID in modal-away-progress.js");
},
displayName() {
// If we have the second black hole unlocked, specify which black hole activated.
return this.playerBefore.blackHole[1].unlocked;
}
},
template: `
<div v-if="show">
Your
<b class="c-modal-away-progress__black-hole">
<span v-if="displayName">{{ name }} </span>Black Hole
</b>
activated {{ formatInt(activationTimes) }} {{ "time" | pluralize(activationTimes) }}
</div>`
}
},
props: {
modalConfig: Object
},
data() {
return {
somethingHappened: false,
};
},
computed: {
nothingAway() {
nothingHappened() {
return Theme.current().name === "S9";
},
before() {
@ -111,58 +87,34 @@ Vue.component("modal-away-progress", {
return this.modalConfig.playerAfter;
},
offlineStats() {
const statObject = { };
for (const awayProgress of AwayProgressTypes.all) {
Object.assign(statObject, this.getObjectForAway(awayProgress));
}
return statObject;
return AwayProgressTypes.all;
},
headerText() {
const timeDisplay = TimeSpan.fromSeconds(this.modalConfig.seconds).toString();
if (this.nothingAway) {
SecretAchievement(36).unlock();
if (this.nothingHappened || !this.somethingHappened) {
return `While you were away for ${timeDisplay}... Nothing happened.`;
}
return `While you were away for ${timeDisplay}: `;
},
},
methods: {
getObjectForAway(item) {
const objectName = item.name;
const name = item.formatName;
const before = item.navigateTo(this.before);
const after = item.navigateTo(this.after);
const awayProgress = item.option;
const classObject = item.classObject;
return {
[`${objectName}`]: {
name,
before,
after,
awayProgress,
classObject,
}
};
},
mounted() {
this.$nextTick(() => {
// After all the children have been loaded, check if somethingHappened - if not, give them the achievement!
if (this.nothingHappened || !this.somethingHappened) SecretAchievement(36).unlock();
});
},
template: `
<div class="c-modal-away-progress">
<modal-close-button @click="emitClose" />
<div class="c-modal-away-progress__header">{{ headerText }}</div>
<div v-if="!nothingAway" class="c-modal-away-progress__resources">
<div v-if="!nothingHappened" class="c-modal-away-progress__resources">
<away-progress-helper
v-for="(stat, name) in offlineStats"
:key="name"
:config="stat"
/>
<away-progress-black-hole
v-for="blackHole in [0, 1]"
:key="blackHole"
:blackHole="blackHole"
v-for="(stat, index) of offlineStats"
:key="index"
:item="stat"
:playerBefore="before"
:playerAfter="after"
v-on:something-happened="somethingHappened = true"
/>
</div>
</div>`

View File

@ -1,7 +1,6 @@
"use strict";
Vue.component("modal-away-progress-options", {
mixins: [modalOptionsMixin],
components: {
"away-progress-options-helper": {
mixins: [modalOptionsMixin],
@ -38,28 +37,11 @@ Vue.component("modal-away-progress-options", {
data() {
return {
all: Array,
celestialMemories: false,
blackHole: false
};
},
watch: {
celestialMemories(newValue) {
player.options.awayProgress.celestialMemories = newValue;
},
blackHole(newValue) {
player.options.awayProgress.blackHole = newValue;
},
},
methods: {
update() {
this.all = AwayProgressTypes.all.filter(type => type.showOption && type.isUnlocked());
this.raUnlocked = V.has(V_UNLOCKS.RA_UNLOCK);
this.blackHoleUnlocked = BlackHoles.list[0].isUnlocked;
const options = player.options.awayProgress;
this.celestialMemories = options.celestialMemories;
this.blackHole = options.blackHole;
}
},
template: `
@ -70,8 +52,6 @@ Vue.component("modal-away-progress-options", {
:key="id"
:option="entry.name"
/>
<wide-on-off-button v-if="raUnlocked" v-model="celestialMemories" text="Celestial Memories:" />
<wide-on-off-button v-if="blackHoleUnlocked" v-model="blackHole" text="Black Hole:" />
</div>
Note: Selected resources will only show if they've increased.
</modal-options>`

View File

@ -96,7 +96,6 @@ Vue.component("new-ui", {
template: `
<div id="page">
<link rel="stylesheet" type="text/css" href="stylesheets/new-ui-styles.css">
<sidebar />
<div class="game-container" :style="topMargin">
<news-ticker v-if="news" />
<div v-if="bigCrunch" class="l-new-ui-big-crunch__container">

View File

@ -0,0 +1,71 @@
"use strict";
Vue.component("sidebar-currency", {
data() {
return {
AM: new Decimal(0),
IP: new Decimal(0),
EP: new Decimal(0),
RM: new Decimal(0),
IM: 0,
showIP: false,
showEP: false,
showRM: false,
};
},
methods: {
update() {
this.AM.copyFrom(Currency.antimatter.value);
this.IP.copyFrom(Currency.infinityPoints.value);
this.EP.copyFrom(Currency.eternityPoints.value);
this.RM.copyFrom(Currency.realityMachines);
this.IM = Currency.imaginaryMachines.value;
this.showIP = PlayerProgress.infinityUnlocked();
this.showEP = PlayerProgress.eternityUnlocked();
this.showRM = PlayerProgress.realityUnlocked();
}
},
template: `
<div class="resource">
<template v-if="showRM">
<template v-if="IM === 0">
<h2 class="o-sidebar-currency--reality">{{ format(RM, 2) }}</h2>
<div class="resource-information">
<span class="resource-name">Reality {{ "Machine" | pluralize(RM) }}</span>
</div>
</template>
<template v-else>
<h3 class="o-sidebar-currency--reality">
{{ format(RM, 2) }}<br> + {{ format(IM, 2) }}i
</h3>
<div class="resource-information">
<span class="resource-name">Machines</span>
</div>
</template>
</template>
<template v-else-if="showEP">
<h2 class="o-sidebar-currency--eternity">
{{ format(EP, 2) }}
</h2>
<div class="resource-information">
<span class="resource-name">Eternity {{ "Point" | pluralize(EP) }}</span>
</div>
</template>
<template v-else-if="showIP">
<h2 class="o-sidebar-currency--infinity">
{{ format(IP, 2) }}
</h2>
<div class="resource-information">
<span class="resource-name">Infinity {{ "Point" | pluralize(IP) }}</span>
</div>
</template>
<template v-else>
<h2 class="o-sidebar-currency--antimatter">
{{ format(AM, 2, 1) }}
</h2>
<div class="resource-information">
<span class="resource-name">Antimatter</span>
</div>
</template>
</div>`
});

View File

@ -1,33 +0,0 @@
"use strict";
Vue.component("sidebar-rm", {
data() {
return {
rm: new Decimal(0),
im: 0,
};
},
methods: {
update() {
this.rm.copyFrom(Currency.realityMachines);
this.im = Currency.imaginaryMachines.value;
}
},
template: `
<div class="resource">
<div v-if="im === 0">
<h2 class="o-sidebar-reality-button">{{ format(rm, 2) }}</h2>
<div class="resource-information">
<span class="resource-name">Reality {{ "Machine" | pluralize(rm) }}</span>
</div>
</div>
<div v-else>
<h3 class="o-sidebar-reality-button">
{{ format(rm, 2) }}<br> + {{ format(im, 2) }}i
</h3>
<div class="resource-information">
<span class="resource-name">Machines</span>
</div>
</div>
</div>`
});

View File

@ -3,13 +3,11 @@
Vue.component("sidebar", {
data() {
return {
RMVisible: false,
newsEnabled: false
};
},
methods: {
update() {
this.RMVisible = PlayerProgress.realityUnlocked();
this.newsEnabled = player.options.news.enabled;
}
},
@ -29,7 +27,7 @@ Vue.component("sidebar", {
},
template: `
<div class="sidebar">
<sidebar-rm v-if="RMVisible" />
<sidebar-currency />
<tab-button
v-for="tab in tabs"
:key="tab.name"

View File

@ -31,15 +31,13 @@ Vue.component("tab-button", {
}
},
template: `
<div v-if="!isHidden" :class="[classObject, tab.config.UIClass]">
<div v-if="!isHidden && isAvailable" :class="[classObject, tab.config.UIClass]">
<div
v-if="isAvailable"
class="l-tab-btn-inner"
@click="tab.show(true)"
>
{{ tab.name }} <i v-if="hasNotification" class="fas fa-exclamation"></i>
</div>
<div v-else class="l-tab-btn-inner">???</div>
<div class="subtabs" v-if="showSubtabs">
<div
v-for="(subtab, index) in tab.subtabs"

View File

@ -4,24 +4,27 @@ class AwayProgress {
constructor(config) {
this.name = config.name;
this.isUnlocked = config.isUnlocked;
this.awayOption = config.awayOption === undefined ? this.name : config.awayOption;
this.showOption = config.showOption === undefined ? true : config.showOption;
// This is an array of strings, each one the name of the next entry in the player object to navigate to
// If there is no reference, it is accessed directly by the name through the player object.
this.reference = config.reference === undefined ? [this.name] : config.reference;
this.classObjectReference = config.classObjectReference === undefined ? this.name : config.classObjectReference;
this.appearsInAwayModal = config.appearsInAwayModal === undefined ? true : config.appearsInAwayModal;
}
get option() {
return player.options.awayProgress[this.name];
return player.options.awayProgress[this.awayOption];
}
set option(value) {
player.options.awayProgress[this.name] = value;
player.options.awayProgress[this.awayOption] = value;
}
get classObject() {
// Format the camelCase name to kebab-case
return `c-modal-away-progress__${
this.name.replace(/[A-Z]/gu, match => `-${match.toLowerCase()}`)
this.classObjectReference.replace(/[A-Z]/gu, match => `-${match.toLowerCase()}`)
}`;
}
@ -116,28 +119,38 @@ const AwayProgressTypes = {
reference: ["celestials", "effarig", "relicShards"],
isUnlocked: () => Teresa.has(TERESA_UNLOCKS.EFFARIG),
}),
celestialMemories: new AwayProgress({
name: "celestialMemories",
isUnlocked: () => V.has(V_UNLOCKS.RA_UNLOCK),
// Functions as the visible option for all Memories, never appears due to having no reference.
appearsInAwayModal: false,
}),
teresaMemories: new AwayProgress({
name: "teresaMemories",
awayOption: "celestialMemories",
reference: ["celestials", "ra", "pets", "teresa", "memories"],
isUnlocked: () => V.has(V_UNLOCKS.RA_UNLOCK),
isUnlocked: () => Ra.pets.teresa.isUnlocked && !Ra.pets.teresa.isCapped,
showOption: false,
}),
effarigMemories: new AwayProgress({
name: "effarigMemories",
awayOption: "celestialMemories",
reference: ["celestials", "ra", "pets", "effarig", "memories"],
isUnlocked: () => V.has(V_UNLOCKS.RA_UNLOCK),
isUnlocked: () => Ra.pets.effarig.isUnlocked && !Ra.pets.effarig.isCapped,
showOption: false,
}),
enslavedMemories: new AwayProgress({
name: "enslavedMemories",
awayOption: "celestialMemories",
reference: ["celestials", "ra", "pets", "enslaved", "memories"],
isUnlocked: () => V.has(V_UNLOCKS.RA_UNLOCK),
isUnlocked: () => Ra.pets.enslaved.isUnlocked && !Ra.pets.enslaved.isCapped,
showOption: false,
}),
vMemories: new AwayProgress({
name: "vMemories",
awayOption: "celestialMemories",
reference: ["celestials", "ra", "pets", "v", "memories"],
isUnlocked: () => V.has(V_UNLOCKS.RA_UNLOCK),
isUnlocked: () => Ra.pets.v.isUnlocked && !Ra.pets.v.isCapped,
showOption: false,
}),
darkMatter: new AwayProgress({
@ -155,6 +168,28 @@ const AwayProgressTypes = {
reference: ["celestials", "laitela", "singularities"],
isUnlocked: () => Laitela.isUnlocked,
}),
blackHole: new AwayProgress({
name: "blackHole",
isUnlocked: () => BlackHole(1).isUnlocked,
// Functions as the visible option for both first & second BHs, never appears due to having no reference.
appearsInAwayModal: false,
}),
firstBlackHole: new AwayProgress({
name: "firstBlackHole",
awayOption: "blackHole",
reference: ["blackHole", "0", "activations"],
isUnlocked: () => BlackHole(1).isUnlocked,
classObjectReference: "black-hole",
showOption: false,
}),
secondBlackHole: new AwayProgress({
name: "secondBlackHole",
awayOption: "blackHole",
reference: ["blackHole", "1", "activations"],
isUnlocked: () => BlackHole(2).isUnlocked,
classObjectReference: "black-hole",
showOption: false,
}),
};
AwayProgressTypes.all = Object.values(AwayProgressTypes);

View File

@ -30,6 +30,10 @@ class RaPetState {
return this.requiredUnlock === undefined || Ra.has(this.requiredUnlock);
}
get isCapped() {
return this.level >= Ra.levelCap;
}
get level() {
return this.data.level;
}

View File

@ -79,40 +79,31 @@ function buyTickSpeed() {
function buyMaxTickSpeed() {
if (!Tickspeed.isAvailableForPurchase || !Tickspeed.isAffordable) return;
const costBumps = player.chall9TickspeedCostBumps;
const inCostScalingChallenge = NormalChallenge(9).isRunning;
const tickspeedMultDecreaseMaxed = BreakInfinityUpgrade.tickspeedCostMult.isCapped;
const costScale = Tickspeed.costScale;
let boughtTickspeed = false;
if (
costScale.calculateCost(player.totalTickBought + costBumps).lt(Decimal.NUMBER_MAX_VALUE) ||
inCostScalingChallenge ||
!tickspeedMultDecreaseMaxed
) {
let shouldContinue = true;
while (Currency.antimatter.gt(costScale.calculateCost(player.totalTickBought + costBumps)) && shouldContinue) {
if (inCostScalingChallenge) {
if (NormalChallenge(9).isRunning) {
const goal = Player.infinityGoal;
let cost = Tickspeed.cost;
while (Currency.antimatter.gt(cost) && cost.lt(goal)) {
Tickspeed.multiplySameCosts();
}
Currency.antimatter.subtract(costScale.calculateCost(player.totalTickBought + costBumps));
Currency.antimatter.subtract(cost);
player.totalTickBought++;
player.records.thisInfinity.lastBuyTime = player.records.thisInfinity.time;
if (NormalChallenge(2).isRunning) player.chall2Pow = 0;
if (costScale.calculateCost(player.totalTickBought + costBumps).gte(Decimal.NUMBER_MAX_VALUE) &&
!inCostScalingChallenge &&
tickspeedMultDecreaseMaxed) {
shouldContinue = false;
boughtTickspeed = true;
cost = Tickspeed.cost;
}
}
}
if (costScale.calculateCost(player.totalTickBought + costBumps).gte(Decimal.NUMBER_MAX_VALUE)) {
const purchases = costScale.getMaxBought(player.totalTickBought + costBumps, Currency.antimatter.value);
} else {
const purchases = Tickspeed.costScale.getMaxBought(player.totalTickBought, Currency.antimatter.value);
if (purchases === null) {
return;
}
player.totalTickBought += purchases.quantity;
Currency.antimatter.subtract(Decimal.pow10(purchases.logPrice));
player.totalTickBought += purchases.quantity;
boughtTickspeed = true;
}
if (boughtTickspeed) {
player.records.thisInfinity.lastBuyTime = player.records.thisInfinity.time;
if (NormalChallenge(2).isRunning) player.chall2Pow = 0;
}
}

View File

@ -46,8 +46,8 @@ body.t-s9 {
display: flex;
flex-direction: column;
width: 12rem;
margin-top: 3.9rem;
position: fixed;
left: 0;
z-index: 5;
}
@ -63,6 +63,8 @@ body.t-s9 {
width: 12rem;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
background-color: var(--color-base);
border-right: 0.1rem solid var(--color-accent);
border-bottom: 0.1rem solid var(--color-accent);
@ -71,10 +73,8 @@ body.t-s9 {
.resource h2 {
margin: 0;
color: var(--color-accent);
font-size: 1.7em;
z-index: 1;
text-align: left;
}
.t-dark .resource h2,
@ -100,10 +100,34 @@ body.t-s9 {
font-size: 0.8em;
}
.t-dark #antimatter {animation: a-game-header__antimatter--glow 25s infinite;}
.o-sidebar-infinity-button { color: var(--color-infinity) }
.o-sidebar-eternity-button { color: var(--color-eternity) }
.resource .o-sidebar-reality-button { color: var(--color-reality) }
.o-sidebar-currency--antimatter {
color: black;
}
.t-normal .o-sidebar-currency--antimatter {
color: var(--color-accent);
}
.t-dark .o-sidebar-currency--antimatter,
.t-s6 .o-sidebar-currency--antimatter {
animation: a-game-header__antimatter--glow 25s infinite;
}
.t-dark-metro .o-sidebar-currency--antimatter {
color: #e0e0e0;
}
.o-sidebar-currency--infinity {
color: var(--color-infinity)
}
.o-sidebar-currency--eternity {
color: var(--color-eternity)
}
.o-sidebar-currency--reality {
color: var(--color-reality)
}
.resource-infinity-canreset,
.resource-eternity-canreset {
@ -133,6 +157,10 @@ body.t-s9 {
transition-delay: 0.2s;
}
.o-tab-btn:hover {
z-index: 1;
}
.sidebar > .o-tab-btn {
border-left: none;
}
@ -156,8 +184,8 @@ body.t-s9 {
.o-tab-btn::after {
content: '';
position: absolute;
left: 100%;
top: -2%;
left: calc(100% + 0.1rem);
top: calc(0% + -0.1rem);
width: 0;
height: 0;
border-bottom: 2.3rem solid transparent;
@ -169,7 +197,7 @@ body.t-s9 {
}
.o-tab-btn--subtabs:hover::after {
border-left-width: 2.3rem;
border-left-width: 2.2rem;
}
.o-tab-btn--infinity::after {
@ -232,11 +260,10 @@ body.t-s9 {
}
.c-news-ticker {
width: calc(100% + 12rem);
width: 100%;
border-bottom: 0.1rem solid var(--color-accent);
padding: 0.8rem 0;
height: 3.9rem;
margin-left: -12rem;
}
.c-news-line {
@ -251,8 +278,7 @@ body.t-s9 {
top: -0.6rem;
left: 12rem;
z-index: 4;
transition-duration: 0.15s;
transition-delay: 0.2s;
transition: pointer-events 0s linear 0s, all 0.15s linear 0.2s;
padding: 0.5rem;
padding-left: 0;
}
@ -829,7 +855,7 @@ body.t-s9 {
color: var(--color-eternity);
}
.c-game-header__antimatter {
.t-normal .c-game-header__antimatter {
color: var(--color-accent);
}

View File

@ -5278,36 +5278,34 @@ screen and (max-width: 480px) {
0 0 0.2rem var(--color-laitela--accent);
}
b.c-modal-away-progress__black-hole {
text-shadow:
0 0 0.2rem #e67919,
0 0 0.3rem #e67919;
}
.c-modal-away-progress__replicanti-galaxies,
.c-modal-away-progress__replicanti {
color: #03a9f4;
}
.c-modal-away-progress__teresa {
.c-modal-away-progress__teresa-memories {
color: var(--color-ra-pet-teresa);
}
.c-modal-away-progress__relic-shards,
.c-modal-away-progress__effarig {
.c-modal-away-progress__effarig-memories {
color: var(--color-ra-pet-effarig);
}
.c-modal-away-progress__enslaved {
.c-modal-away-progress__enslaved-memories {
color: var(--color-ra-pet-enslaved);
}
.c-modal-away-progress__v {
.c-modal-away-progress__v-memories {
color: var(--color-ra-pet-v);
}
.c-modal-away-progress__black-hole b,
.c-modal-away-progress__black-hole {
color: black;
text-shadow:
0 0 0.2rem #e67919,
0 0 0.3rem #e67919;
}
/*#endregion c-modal-away-progress*/

View File

@ -7,6 +7,7 @@ body.t-inverted-metro {
.t-inverted-metro .l-notification-container,
.t-inverted-metro .c-modal,
.t-inverted-metro #TTbuttons,
.t-inverted-metro .sidebar,
.t-inverted-metro .c-glyph-tooltip {
filter: invert(100%);
}

View File

@ -7,6 +7,7 @@ body.t-inverted {
.t-inverted .l-notification-container,
.t-inverted .c-modal,
.t-inverted #TTbuttons,
.t-inverted .sidebar,
.t-inverted .c-glyph-tooltip {
filter: invert(100%);
}

View File

@ -18,6 +18,7 @@ body {
.t-s2 .l-notification-container,
.t-s2 .c-modal,
.t-s2 #TTbuttons,
.t-s2 .sidebar,
.t-s2 .c-glyph-tooltip {
filter: sepia(100%) hue-rotate(180deg) saturate(250%);
}

View File

@ -7,6 +7,7 @@ body {
.t-s3 .l-notification-container,
.t-s3 .c-modal,
.t-s3 #TTbuttons,
.t-s3 .sidebar,
.t-s3 .c-glyph-tooltip {
animation: glasses 7s infinite;
}

View File

@ -15,6 +15,7 @@ body.t-s5 {
.t-s5 #page,
.t-s5 .l-notification-container,
.t-s5 .c-modal,
.t-s5 #TTbuttons {
.t-s5 #TTbuttons,
.t-s5 .sidebar {
filter: sepia(100%) hue-rotate(0deg) saturate(100%);
}