diff --git a/build.gradle b/build.gradle index 01153f8..877c00d 100644 --- a/build.gradle +++ b/build.gradle @@ -17,6 +17,8 @@ dependencies { compile "org.apache.logging.log4j:log4j-api:2.10.0" compile "org.apache.logging.log4j:log4j-core:2.10.0" compile "org.hibernate:hibernate-c3p0:5.2.12.Final" + compile "org.eclipse.jetty:jetty-server:9.4.8.v20171121" + compile "com.google.code.gson:gson:2.8.2" } jar { diff --git a/src/main/java/com/derpthemeus/runeCoach/RuneCoach.java b/src/main/java/com/derpthemeus/runeCoach/RuneCoach.java index 3e0d5d0..8761364 100644 --- a/src/main/java/com/derpthemeus/runeCoach/RuneCoach.java +++ b/src/main/java/com/derpthemeus/runeCoach/RuneCoach.java @@ -8,6 +8,7 @@ import com.derpthemeus.runeCoach.databasePopulator.threadSupervisors.SummonerAccountIdUpdaterSupervisor; import com.derpthemeus.runeCoach.databasePopulator.threadSupervisors.SummonerFinderSupervisor; import com.derpthemeus.runeCoach.databasePopulator.threadSupervisors.SummonerLeagueUpdaterSupervisor; +import com.derpthemeus.runeCoach.jetty.RuneCoachWebServer; import no.stelar7.api.l4j8.basic.APICredentials; import no.stelar7.api.l4j8.impl.L4J8; import org.hibernate.SessionFactory; @@ -32,7 +33,7 @@ public class RuneCoach { threadCounts.put(MatchFinderSupervisor.getInstance(), 1); threadCounts.put(MatchDownloaderSupervisor.getInstance(), 1); threadCounts.put(StatAggregatorSupervisor.getInstance(), 3); - threadCounts.put(PerkScoreCalculatorSupervisor.getInstance(), 6); + threadCounts.put(PerkScoreCalculatorSupervisor.getInstance(), 7); l4j8 = new L4J8(new APICredentials(System.getenv("API_KEY"), null)); Configuration config = new Configuration() @@ -45,7 +46,9 @@ public class RuneCoach { } - public static void main(String[] args) { + public static void main(String[] args) throws Exception { + int port = Integer.parseInt(System.getenv("HTTP_PORT")); + new RuneCoachWebServer(port); startDatabasePopulators(); } diff --git a/src/main/java/com/derpthemeus/runeCoach/databasePopulator/threadSupervisors/StatAggregatorSupervisor.java b/src/main/java/com/derpthemeus/runeCoach/databasePopulator/threadSupervisors/StatAggregatorSupervisor.java index 397ba43..1be8dd3 100644 --- a/src/main/java/com/derpthemeus/runeCoach/databasePopulator/threadSupervisors/StatAggregatorSupervisor.java +++ b/src/main/java/com/derpthemeus/runeCoach/databasePopulator/threadSupervisors/StatAggregatorSupervisor.java @@ -8,6 +8,7 @@ import org.hibernate.Transaction; import org.hibernate.query.Query; +import java.sql.Timestamp; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.HashMap; @@ -66,6 +67,7 @@ public synchronized AggregatedStatsEntity getStatToAggregate(String patch) { stat.setChampionId(championId); stat.setPerkId(perkId); stat.setPatch(patch); + stat.setLastUpdated(new Timestamp(0)); session.save(stat); stats.add(stat); diff --git a/src/main/java/com/derpthemeus/runeCoach/jetty/ChampionInfoHandler.java b/src/main/java/com/derpthemeus/runeCoach/jetty/ChampionInfoHandler.java new file mode 100644 index 0000000..dc91813 --- /dev/null +++ b/src/main/java/com/derpthemeus/runeCoach/jetty/ChampionInfoHandler.java @@ -0,0 +1,73 @@ +package com.derpthemeus.runeCoach.jetty; + +import com.derpthemeus.runeCoach.DDragonManager; +import com.derpthemeus.runeCoach.RuneCoach; +import com.google.gson.Gson; +import org.eclipse.jetty.http.MimeTypes; +import org.eclipse.jetty.server.Request; +import org.eclipse.jetty.server.handler.AbstractHandler; +import org.hibernate.Session; +import org.hibernate.query.Query; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.AbstractMap; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class ChampionInfoHandler extends AbstractHandler { + // How long data should be cached for (in milliseconds) + private static final int CACHE_TIME = 1000 * 60 * 60; + + private final List championIds; + private final Gson gson = new Gson(); + + // Cached JSON responses for champions. Shorts are champion IDs, Longs are timestamps, Strings are JSON + private final Map> cache = new HashMap<>(); + + + public ChampionInfoHandler() throws IOException { + DDragonManager.ChampionList champions = DDragonManager.getChampionList(DDragonManager.getLatestVersion()); + championIds = champions.data.values().stream().map(champion -> champion.key).collect(Collectors.toList()); + } + + @Override + public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { + if (!championIds.contains(request.getParameter("championId"))) { + response.setContentType(MimeTypes.Type.TEXT_PLAIN.asString()); + // TODO use a raw message instead of an HTML page + response.sendError(HttpServletResponse.SC_NOT_FOUND, "Error: champion with specified ID does not exist"); + baseRequest.setHandled(true); + return; + } + + short championId = Short.parseShort(request.getParameter("championId")); + Map.Entry cacheEntry = cache.get(championId); + + if (cacheEntry == null || System.currentTimeMillis() - cacheEntry.getKey() > CACHE_TIME) { + try (Session session = RuneCoach.getSessionFactory().openSession()) { + // TODO allow patch to be specified through config, or automatically switch to latest patch once enough data has been aggregated + Query query = session.createQuery("SELECT NEW MAP(perkScore.perkId AS perkId, perkScore.score AS score, perkScore.scoreType AS type)" + + " FROM PerkScoreEntity AS perkScore WHERE patch=:patch AND championId=:championId AND games>200 AND scoreType!='RAW'") + .setParameter("patch", "7.24").setParameter("championId", championId); + List scores = query.getResultList(); + + String json = gson.toJson(scores); + + response.setStatus(HttpServletResponse.SC_OK); + response.getWriter().write(json); + baseRequest.setHandled(true); + + cache.put(championId, new AbstractMap.SimpleEntry<>(System.currentTimeMillis(), json)); + } + } else { + response.setStatus(HttpServletResponse.SC_OK); + response.getWriter().write(cacheEntry.getValue()); + } + baseRequest.setHandled(true); + } +} \ No newline at end of file diff --git a/src/main/java/com/derpthemeus/runeCoach/jetty/RuneCoachWebServer.java b/src/main/java/com/derpthemeus/runeCoach/jetty/RuneCoachWebServer.java new file mode 100644 index 0000000..0eafbfc --- /dev/null +++ b/src/main/java/com/derpthemeus/runeCoach/jetty/RuneCoachWebServer.java @@ -0,0 +1,34 @@ +package com.derpthemeus.runeCoach.jetty; + +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.handler.ContextHandler; +import org.eclipse.jetty.server.handler.HandlerCollection; +import org.eclipse.jetty.server.handler.ResourceHandler; +import org.eclipse.jetty.util.resource.Resource; + +public class RuneCoachWebServer { + private final Server jettyServer; + + public RuneCoachWebServer(int port) throws Exception { + jettyServer = new Server(port); + + ResourceHandler staticHandler = new ResourceHandler(); + staticHandler.setDirectoriesListed(false); + staticHandler.setResourceBase(Resource.newClassPathResource("frontend_static/").toString()); + + ContextHandler championInfoHandler = new ContextHandler("/getChampionInfo"); + championInfoHandler.setHandler(new ChampionInfoHandler()); + + ContextHandler staticDataHandler = new ContextHandler("/getStaticData"); + staticDataHandler.setHandler(new StaticDataHandler()); + + ContextHandler runesHandler = new ContextHandler("/getRunes"); + runesHandler.setHandler(new RunesHandler()); + + HandlerCollection handlers = new HandlerCollection( + staticHandler, championInfoHandler, staticDataHandler, runesHandler + ); + jettyServer.setHandler(handlers); + jettyServer.start(); + } +} diff --git a/src/main/java/com/derpthemeus/runeCoach/jetty/RunesHandler.java b/src/main/java/com/derpthemeus/runeCoach/jetty/RunesHandler.java new file mode 100644 index 0000000..1a9feea --- /dev/null +++ b/src/main/java/com/derpthemeus/runeCoach/jetty/RunesHandler.java @@ -0,0 +1,72 @@ +package com.derpthemeus.runeCoach.jetty; + +import com.derpthemeus.runeCoach.DDragonManager; +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import org.eclipse.jetty.server.Request; +import org.eclipse.jetty.server.handler.AbstractHandler; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.HashMap; +import java.util.Map; + +public class RunesHandler extends AbstractHandler { + + private String cachedResponse; + + public RunesHandler() throws IOException { + Gson gson = new Gson(); + JsonObject builderRunes = gson.toJsonTree(gson.fromJson(new InputStreamReader(getClass().getResourceAsStream("/builder-runes.json")), Object.class)).getAsJsonObject(); + JsonArray lcuRunes = gson.toJsonTree(gson.fromJson(new InputStreamReader(getClass().getResourceAsStream("/LCU-runes.json")), Object.class)).getAsJsonArray(); + DDragonManager.StyleInfo[] ddragonRunes = DDragonManager.getRuneInfo(DDragonManager.getLatestVersion()); + + // Map LCU runes by ID + Map lcuMappedRunes = new HashMap<>(); + // The first element is a template, not an actual rune + for (int i = 1; i < lcuRunes.size(); i++) { + JsonObject rune = lcuRunes.get(i).getAsJsonObject(); + lcuMappedRunes.put(rune.get("id").getAsInt(), rune); + } + + builderRunes.getAsJsonArray("styles").forEach(builderStyleEl -> { + JsonObject builderStyle = builderStyleEl.getAsJsonObject(); + // Copy style IDs from DDragon + for (DDragonManager.StyleInfo ddragStyle : ddragonRunes) { + if (builderStyle.get("name").getAsString().equals(ddragStyle.name)) { + builderStyle.getAsJsonObject().addProperty("id", ddragStyle.id); + break; + } + } + + // Copy formatted descriptions from LCU + builderStyle.getAsJsonArray("slots").forEach(slot -> { + slot.getAsJsonObject().getAsJsonArray("runes").forEach(runeEl -> { + JsonObject builderRune = runeEl.getAsJsonObject(); + JsonObject lcuRune = lcuMappedRunes.get(builderRune.get("runeId").getAsInt()); + + String longDesc = lcuRune.get("longDesc").getAsString(); + String shortDesc = lcuRune.get("shortDesc").getAsString(); + + builderRune.addProperty("longDescription", longDesc); + builderRune.addProperty("shortDescription", shortDesc); + }); + }); + + // TODO bonuses (secondary styles) + }); + + this.cachedResponse = gson.toJson(builderRunes); + } + + @Override + public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { + response.setStatus(HttpServletResponse.SC_OK); + response.getWriter().write(cachedResponse); + baseRequest.setHandled(true); + } +} \ No newline at end of file diff --git a/src/main/java/com/derpthemeus/runeCoach/jetty/StaticDataHandler.java b/src/main/java/com/derpthemeus/runeCoach/jetty/StaticDataHandler.java new file mode 100644 index 0000000..191f395 --- /dev/null +++ b/src/main/java/com/derpthemeus/runeCoach/jetty/StaticDataHandler.java @@ -0,0 +1,79 @@ +package com.derpthemeus.runeCoach.jetty; + +import com.derpthemeus.runeCoach.DDragonManager; +import com.derpthemeus.runeCoach.RuneCoach; +import com.derpthemeus.runeCoach.hibernate.PerkScoreEntity; +import com.derpthemeus.runeCoach.hibernate.TagEntity; +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.eclipse.jetty.server.Request; +import org.eclipse.jetty.server.handler.AbstractHandler; +import org.hibernate.Session; +import org.hibernate.query.Query; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Returns a champion list, tag list, the best tag for each rune, and announcement messages + */ +public class StaticDataHandler extends AbstractHandler { + + private String cachedResponse; + private final Gson gson = new Gson(); + private final Logger logger = LogManager.getLogger(); + + public StaticDataHandler() throws IOException { + updateCachedResponse(); + } + + @Override + public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { + response.setStatus(HttpServletResponse.SC_OK); + response.getWriter().write(cachedResponse); + baseRequest.setHandled(true); + } + + // TODO automatically update (also requires updating DDragonManager, since it currently caches latest version) + private void updateCachedResponse() throws IOException { + logger.info("Updating static data..."); + String ddragVersion = DDragonManager.getLatestVersion(); + + JsonObject obj = new JsonObject(); + obj.addProperty("announcementMessage", System.getenv("ANNOUNCEMENT_MESSAGE")); + obj.addProperty("announcementLink", System.getenv("ANNOUNCEMENT_LINK")); + obj.addProperty("ddragonVersion", ddragVersion); + obj.add("champions", gson.toJsonTree(DDragonManager.getChampionList(ddragVersion).data.values().toArray())); + try (Session session = RuneCoach.getSessionFactory().openSession()) { + // Get tags + Map tags = new HashMap<>(); + for (TagEntity tag : (List) session.createQuery("FROM TagEntity").getResultList()) { + tags.put(tag.getTagId(), tag); + } + obj.add("tags", gson.toJsonTree(tags)); + + // Get best tags for each perk + List bestTags = new ArrayList<>(); + // TODO do some fancy HQL stuff here instead of iterating over perk IDs + for (Short perkId : DDragonManager.getPerkAndStyleIds(DDragonManager.getLatestVersion())) { + // TODO allow patch to be specified through config, or automatically switch to latest patch once enough data has been aggregated + Query query = session.createQuery("SELECT NEW MAP(perkScore.perkId AS perkId, perkScore.score AS score, -perkScore.championId AS tagId) " + + "FROM PerkScoreEntity AS perkScore WHERE games>200 AND championId<0 AND patch=:patch AND scoreType='RELATIVE' AND perkId=:perkId ORDER BY score DESC") + .setParameter("patch", "7.24").setParameter("perkId", perkId); + bestTags.addAll(query.setMaxResults(2).getResultList()); + } + obj.add("bestTags", gson.toJsonTree(bestTags)); + } + + cachedResponse = gson.toJson(obj); + logger.info("Updated static data"); + } +} diff --git a/src/main/resources/LCU-runes.json b/src/main/resources/LCU-runes.json new file mode 100644 index 0000000..5020d38 --- /dev/null +++ b/src/main/resources/LCU-runes.json @@ -0,0 +1,650 @@ +[ + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Template/7000.png", + "id": 7000, + "longDesc": "", + "name": "Template", + "shortDesc": "", + "tooltip": "" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/RunesIcon.png", + "id": 8004, + "longDesc": "+18% Attack Speed", + "name": "The Brazen Perfect", + "shortDesc": "Precision + Sorcery Set Bonus", + "tooltip": "Precision + Sorcery
+18% Attack Speed" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Precision/PressThreeAttacks/PressThreeAttacks.png", + "id": 8005, + "longDesc": "Hitting an enemy champion with 3 consecutive basic attacks deals 30 - 120 bonus adaptive damage (based on level) and makes them vulnerable, increasing the damage they take by 12% from all sources for 6s.", + "name": "Press the Attack", + "shortDesc": "Hitting an enemy champion 3 consecutive times makes them vulnerable, dealing bonus damage and causing them to take more damage from all sources for 6s.", + "tooltip": "Hitting an enemy champion with 3 consecutive basic attacks deals @f4@ bonus adaptive damage (based on level) and makes them vulnerable, increasing the damage they take by 12% from all sources for 6s.


Bonus Damage Dealt: @f2@
Total Exposure Damage: @f3@" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/RunesIcon.png", + "id": 8006, + "longDesc": "+18% Attack Speed", + "name": "The Eternal Champion", + "shortDesc": "Precision + Resolve Set Bonus", + "tooltip": "Precision + Resolve
+18% Attack Speed" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/RunesIcon.png", + "id": 8007, + "longDesc": "+18% Attack Speed", + "name": "The Savant", + "shortDesc": "Precision + Inspiration Set Bonus", + "tooltip": "Precision + Inspiration
+18% Attack Speed" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Precision/FlowofBattle/FlowofBattleTemp.png", + "id": 8008, + "longDesc": "1.5s after damaging a champion gain 30 - 80% Attack Speed (based on level) for 3s. Attacking a champion extends the effect to 6s.

Cooldown: 6s

Lethal Tempo allows you to temporarily exceed the attack speed limit.", + "name": "Lethal Tempo", + "shortDesc": "1.5s after damaging a champion gain a large amount of Attack Speed. Lethal Tempo allows you to temporarily exceed the attack speed limit.", + "tooltip": "1.5s after damaging a champion gain 30 - 80% Attack Speed (based on level) for 3s. Attacking a champion extends the effect to 6s.

Cooldown: 6s

Lethal Tempo allows you to temporarily exceed the attack speed limit.


Total Time Active: @f1@s" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Precision/LastResort/LastResortIcon.png", + "id": 8009, + "longDesc": "For 7s after gaining a level or takedown any mana you spend is fully restored.", + "name": "Presence of Mind", + "shortDesc": "For 7s after gaining a level or takedown any mana you spend is fully restored.", + "tooltip": "For 7s after gaining a level or takedown any mana you spend is fully restored.


Mana from Leveling: @f2@
Mana from Takedowns: @f3@" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Precision/CoupDeGrace/CoupDeGrace.png", + "id": 8014, + "longDesc": "Deal 9% more damage to champions who have less than 40% health.

Additionally, takedowns on champions grant an adaptive bonus of 9 Attack Damage or 15 Ability Power for 10s.", + "name": "Coup de Grace", + "shortDesc": "Deal more damage to low health enemy champions.", + "tooltip": "Deal 9% more damage to champions who have less than 40% health.

Additionally, takedowns on champions grant an adaptive bonus of 9 Attack Damage or 15 Ability Power for 10s.


Total bonus damage dealt: @f1@" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/RunesIcon.png", + "id": 8016, + "longDesc": "+18% Attack Speed", + "name": "The Merciless Elite", + "shortDesc": "Precision + Domination Set Bonus", + "tooltip": "Precision + Domination
+18% Attack Speed" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Precision/GiantSlayer/GiantSlayer.png", + "id": 8017, + "longDesc": "Deal 4% more damage to champions with 150 more max health than you, increasing to 10% at 2000 more max health.", + "name": "Cut Down", + "shortDesc": "Deal more damage to champions with more max health than you.", + "tooltip": "Deal 4% more damage to champions with 150 more max health than you, increasing to 10% at 2000 more max health.

Minimum bonus is 4%.
Maximum bonus is granted against champions with 2000 or more health than you.



Total bonus damage: @f1@" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Precision/KSFleetFootwork/KSFleetFootwork.png", + "id": 8021, + "longDesc": "Attacking and moving builds Energy stacks. At 100 stacks, your next attack is Energized.

Energized attacks heal you for 3 - 60 (+0.3 Bonus AD, +0.4 AP) and grant +30% movement speed for 1s.
Healing is 60% as effective when used on a minion.
Healing is increased by 40% of your critical damage modifier when triggered by a critical hit.
", + "name": "Fleet Footwork", + "shortDesc": "Attacking and moving builds Energy stacks. At 100 stacks, your next attack heals you and grants increased MS.", + "tooltip": "Attacking and moving builds Energy stacks. At 100 stacks, your next attack is Energized.

Energized attacks heal you for @f2@ (+@f3@) (+@f4@) and grant +30% movement speed for 1 second.

Healing is 60% as effective when used on a minion.
Healing is increased by 40% of your critical damage modifier when triggered by a critical hit.



Total Healing: @f1@" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Domination/ProlificHunter/ProlificHunter.png", + "id": 8105, + "longDesc": "Gain 8 out of combat Movement Speed plus 8 per Bounty Hunter stack.

Earn a Bounty Hunter stack the first time you get a takedown on each enemy champion.", + "name": "Relentless Hunter", + "shortDesc": "Unique takedowns grant permanent out of combat MS. ", + "tooltip": "Gain 8 out of combat Movement Speed plus 8 per Bounty Hunter stack.

Earn a Bounty Hunter stack the first time you get a takedown on each enemy champion.


No Claimable Bounties" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/RunesIcon.png", + "id": 8109, + "longDesc": "+11 Attack Damage or +18 Ability Power, Adaptive", + "name": "The Wicked Maestro ", + "shortDesc": "Domination + Inspiration Set Bonus", + "tooltip": "Domination + Inspiration
+11 Attack Damage or +18 Ability Power, Adaptive
Current Bonus: +@f1@ Attack Damage" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Domination/TLords/TLords.png", + "id": 8112, + "longDesc": "Hitting a champion with 3 separate attacks or abilities within 3s deals bonus adaptive damage.

Damage: 50 - 220 (+0.5 bonus AD, +0.3 AP) damage.

Cooldown: 50 - 25s


'We called them the Thunderlords, for to speak of their lightning was to invite disaster.'", + "name": "Electrocute", + "shortDesc": "Hitting a champion with 3 separate attacks or abilities in 3s deals bonus adaptive damage.", + "tooltip": "Hitting a champion with 3 separate attacks or abilities within 3s deals bonus adaptive damage.
Cooldown: 50 - 25s


Current damage: @f2@ (+@f3@) (+@f4@)
Total Damage Dealt: @f1@" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/RunesIcon.png", + "id": 8114, + "longDesc": "+11 Attack Damage or +18 Ability Power, Adaptive", + "name": "The Immortal Butcher", + "shortDesc": "Domination + Resolve Set Bonus", + "tooltip": "Domination + Resolve
+11 Attack Damage or +18 Ability Power, Adaptive
Current Bonus: +@f1@ Attack Damage" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/RunesIcon.png", + "id": 8115, + "longDesc": "+11 Attack Damage or +18 Ability Power, Adaptive", + "name": "The Aether Blade", + "shortDesc": "Domination + Sorcery Set Bonus", + "tooltip": "Domination + Sorcery
+11 Attack Damage or +18 Ability Power, Adaptive
Current Bonus: +@f1@ Attack Damage" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Domination/ViciousPoro/ViciousPoro.png", + "id": 8120, + "longDesc": "Enter a brush to summon a poro after a brief channel. The poro will stay behind to give you vision until you summon a new one.

If an enemy enters brush with a poro in it, they scare it away, putting Ghost Poro on a 3s cooldown.

Poro channel is interrupted if you take damage.", + "name": "Ghost Poro", + "shortDesc": "When you enter brush, a poro appears. It will stay behind to give you vision.", + "tooltip": "Enter a brush to summon a poro after a brief channel. The poro will stay behind to give you vision until you summon a new one.

If an enemy enters brush with a poro in it, they scare it away, putting Ghost Poro on a 3s cooldown.

Poro channel is interrupted if you take damage.


Total poros spawned: @f1@" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Domination/KSLycanthropy/KSLycanthropy.png", + "id": 8124, + "longDesc": "Enchants your boots with the active effect 'Predator.'

Channel for 1.5s out of combat to gain 45% movement speed for 15s. Damaging attacks or abilities end this effect, dealing 60 - 180 (+0.4 bonus AD)(+0.25 AP) bonus adaptive damage.

Cooldown: 150s - 100s. Starts the game on cooldown and goes on cooldown if interrupted while channeling.", + "name": "Predator", + "shortDesc": "Add an active effect to your boots that grants a large boost of MS and causes your next attack or ability to deal bonus adaptive damage.", + "tooltip": "Enchants your boots with the active effect Predator.

Channel for 1.5s without taking or dealing damage to gain @f8@% increased movement speed for 15s. Damaging attacks or abilities end this effect, dealing @f3@ (+@f5@) (+@f4@) bonus damage.

Cooldown: @f7@s


Damage Dealt To Champions: @f1@" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Domination/Bully/Bully.png", + "id": 8126, + "longDesc": "Damaging champions with impaired movement or actions deals 12 - 30 bonus true damage (based on level).

Cooldown: 4s
Activates on damage occurring after the impairment.", + "name": "Cheap Shot", + "shortDesc": "Deal bonus true damage to enemy champions with impaired movement or actions. ", + "tooltip": "Damaging champions with impaired movement or actions deals 12 - 30 bonus true damage (based on level).

Cooldown: 4s
Activates on damage occurring after the impairment.


Current Damage: @f2@
Total bonus damage dealt: @f1@" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/RunesIcon.png", + "id": 8127, + "longDesc": "+11 Attack Damage or +18 Ability Power, Adaptive", + "name": "The Twisted Surgeon", + "shortDesc": "Domination + Precision Set Bonus", + "tooltip": "Domination + Precision
+11 Attack Damage or +18 Ability Power, Adaptive
Current Bonus: +@f1@ Attack Damage" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Domination/KSSoulReaper/KSSoulReaper.png", + "id": 8128, + "longDesc": "Champions, large minions, and large monsters drop soul essence on death. Collect souls to become Soul Charged. Your next attack on a champion or structure consumes Soul Charged to deal bonus adaptive damage.

Soul Charged lasts 20s, increased to 300s after collecting 150 soul essence.

Bonus damage: 40 - 80 (+0.25 bonus AD) (+0.2 AP) + soul essence collected.

Champions - 6 soul essence.
Monsters - 2 soul essence.
Minions - 4 soul essence.
", + "name": "Dark Harvest", + "shortDesc": "Champions, large minions, and large monsters drop soul essence on death. Touch souls to absorb them and deal bonus adaptive damage on your next attack based on total soul essence collected.", + "tooltip": "Champions, large minions, and large monsters drop soul essence on death. Collect souls to become Soul Charged. Your next attack on a champion or structure consumes Soul Charged to deal bonus adaptive damage.

Soul Charged lasts 20s, increased to 300s after collecting 150 soul essence.

Bonus damage: @f2@ (+@f5@) (+@f6@) + @f3@ soul essence

Champions - 6 soul essence.
Monsters - 2 soul essence.
Minions - 4 soul essence.




Total Damage Dealt: @f1@" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Domination/BigGameHunter/BigGameHunter.png", + "id": 8134, + "longDesc": "Gain 10% Active Item CDR plus an additional 6% per Bounty Hunter stack (includes Trinkets).

Earn a Bounty Hunter stack the first time you get a takedown on each enemy champion.", + "name": "Ingenious Hunter", + "shortDesc": "Unique takedowns grant permanent Active Item CDR (includes Trinkets).", + "tooltip": "Gain 10% Active Item CDR plus an additional 6% per Bounty Hunter stack (includes Trinkets).

Earn a Bounty Hunter stack the first time you get a takedown on each enemy champion.


No Claimable Bounties" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Domination/InsatiableHunter/InsatiableHunter.png", + "id": 8135, + "longDesc": "Heal for a percentage of the damage dealt by your abilities.
Healing: 2.5% + 2.5% per Bounty Hunter stack.

Earn a Bounty Hunter stack the first time you get a takedown on each enemy champion.

Healing reduced to one third for Area of Effect abilities.

", + "name": "Ravenous Hunter", + "shortDesc": "Unique takedowns grant permanent healing from ability damage. ", + "tooltip": "Heal for a percentage of the damage dealt by your abilities.
Healing: 2.5% + 2.5% per Bounty Hunter stack.

Earn a Bounty Hunter stack the first time you get a takedown on each enemy champion.

Healing reduced to one third for Area of Effect abilities.




Current Healing: @f3.1@%

No Claimable Bounties" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Domination/ZombieWard/ZombieWard.png", + "id": 8136, + "longDesc": "After killing a ward, a friendly Zombie Ward is raised in its place. Additionally, when your wards expire, they reanimate as Zombie Wards.

Zombie Wards are visible, last for 180s and don't count towards your ward limit.", + "name": "Zombie Ward", + "shortDesc": "After killing a ward, a friendly Zombie Ward is raised in its place. When your wards expire, they also reanimate as Zombie Wards.", + "tooltip": "After killing a ward, a friendly Zombie Ward is raised in its place. Additionally, when your wards expire, they reanimate as Zombie Wards.

Zombie Wards are visible, last for 180s and don't count towards your ward limit.


Wards corrupted: @f1@" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Domination/WardSlayer/WardSlayer.png", + "id": 8138, + "longDesc": "Collect eyeballs for champion and ward takedowns. Gain an adaptive bonus of 0.6 Attack Damage or 1 Ability Power, per eyeball collected.

Upon completing your collection at 20 eyeballs, additionally gain an adaptive bonus of 6 Attack Damage, or 10 Ability Power.

Collect 2 eyeballs per champion kill, 1 per assist, and 1 per ward takedown.", + "name": "Eyeball Collection", + "shortDesc": "Collect eyeballs for champion and ward takedowns. Gain permanent AD or AP, adaptive for each eyeball plus bonus upon collection completion.", + "tooltip": "Collect eyeballs for champion and ward takedowns. Gain an adaptive bonus of 0.6 Attack Damage or 1 Ability Power, per eyeball collected.

Upon completing your collection at 20 eyeballs, additionally gain an adaptive bonus of 6 Attack Damage, or 10 Ability Power.

Collect 2 eyeballs per champion kill, 1 per assist, and 1 per ward takedown.


Adapative Force Gained: @f1@
Eyeballs Collected: @f3@/20" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Domination/Feast/GreenTerror_Feast.png", + "id": 8139, + "longDesc": "Heal when you damage an enemy champion.

Healing: 18-35 (+0.2 bonus AD, +0.1 AP) health (based on level)

Cooldown: 20s", + "name": "Taste of Blood", + "shortDesc": "Heal when you damage an enemy champion.", + "tooltip": "Heal when you damage an enemy champion.

Healing: @f2@ (+@f3@) (+@f4@)

Cooldown: 20s


Total Healing: @f1@" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Domination/DashAttack/DashAttack.png", + "id": 8143, + "longDesc": "After exiting stealth or using a dash, leap, blink, or teleport, dealing any damage to a champion grants you 10 Lethality and 8 Magic Penetration for 5s.

Cooldown: 4s", + "name": "Sudden Impact", + "shortDesc": "Gain a burst of Lethality and Magic Penetration after using a dash, leap, blink, teleport, or when leaving stealth.", + "tooltip": "After exiting stealth or using a dash, leap, blink, or teleport, dealing any damage to a champion grants you 10 Lethality and 8 Magic Penetration for 5s.

Cooldown: 4s


Bonus champion damage: @f1@" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/RunesIcon.png", + "id": 8205, + "longDesc": "+12 Attack Damage or +20 Ability Power, Adaptive", + "name": "The Incontestable Spellslinger", + "shortDesc": "Sorcery + Precision Set Bonus", + "tooltip": "Sorcery + Precision
+12 Attack Damage or +20 Ability Power, Adaptive
Current Bonus: +@f1@ Attack Damage" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/RunesIcon.png", + "id": 8207, + "longDesc": "+12 Attack Damage or +20 Ability Power, Adaptive", + "name": "The Cryptic", + "shortDesc": "Sorcery + Inspiration Set Bonus", + "tooltip": "Sorcery + Inspiration
+12 Attack Damage or +20 Ability Power, Adaptive
Current Bonus: +@f1@ Attack Damage" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/RunesIcon.png", + "id": 8208, + "longDesc": "+12 Attack Damage or +20 Ability Power, Adaptive", + "name": "The Ancient One", + "shortDesc": "Sorcery + Resolve Set Bonus", + "tooltip": "Sorcery + Resolve
+12 Attack Damage or +20 Ability Power, Adaptive
Current Bonus: +@f1@ Attack Damage" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Sorcery/Overcharger/Overcharger.png", + "id": 8210, + "longDesc": "Gain 10% CDR when you reach level 10.

Each percent of CDR exceeding the CDR limit is converted to an adaptive bonus of 1.2 Attack Damage or 2 Ability Power.", + "name": "Transcendence", + "shortDesc": "Gain 10% CDR when you reach level 10. Excess CDR becomes AP or AD, adaptive.", + "tooltip": "Gain 10% CDR when you reach level 10.

Each percent of CDR exceeding the CDR limit is converted to an adaptive bonus of 1.2 Attack Damage or 2 Ability Power.


Cooldown Reduction: +@f4*100@%
Current Bonus: +@f1@ Attack Damage" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Sorcery/KSPerxie/KSPerxie.png", + "id": 8214, + "longDesc": "Your attacks and abilities send Aery to a target, damaging enemy champions or shielding allies.

Damage: 15 - 40 based on level (+0.1 AP and +0.15 bonus AD)
Shield: 30 - 80 based on level (+0.25 AP and +0.4 bonus AD)

Aery cannot be sent out again until she returns to you.", + "name": "Summon Aery", + "shortDesc": "Your attacks and abilities send Aery to a target, damaging enemies or shielding allies.", + "tooltip": "Your attacks and abilities send Aery to a target, damaging enemy champions or shielding allies. Aery cannot be sent out again until she returns to you.

Damage: @f5@ (+@f6@) (+@f7@)
Shield: @f8@ (+@f9@) (+@f10@)


Aery has attacked enemies @f1@ times for a total of @f3@ damage.
Aery has helped allies @f2@ times, shielding a total of @f4@ damage." + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/RunesIcon.png", + "id": 8220, + "longDesc": "+12 Attack Damage or +20 Ability Power, Adaptive", + "name": "The Calamity", + "shortDesc": "Sorcery + Domination Set Bonus", + "tooltip": "Sorcery + Domination
+12 Attack Damage or +20 Ability Power, Adaptive
Current Bonus: +@f1@ Attack Damage" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Sorcery/PokeShield/Pokeshield.png", + "id": 8224, + "longDesc": "When you take magic damage that would reduce your Health below 30%, gain a shield that absorbs 40 - 120 magic damage based on level (+0.1 AP and +0.15 bonus AD) for 4s.

Cooldown: 60s", + "name": "Nullifying Orb", + "shortDesc": "Gain a magic damage shield when taken to low health by magic damage.", + "tooltip": "When you take magic damage that would reduce your Health below 30%, gain a shield that absorbs @f2@ (+@f3@) (+@f4@) magic damage for 4s.

Cooldown: 60s


Total Magic Damage Blocked: @f1@" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Sorcery/Clearcasting/Clearcasting.png", + "id": 8226, + "longDesc": "Every 75s, your next ability used has its mana or energy cost refunded, and restores 8% of your missing mana or energy.", + "name": "Manaflow Band", + "shortDesc": "Periodically your next ability used has its mana or energy cost refunded and restores some of your missing mana or energy.", + "tooltip": "Every 75s, your next ability used has its mana or energy cost refunded, and restores 8% of your missing mana or energy.


Total resource restored: @f1@" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Sorcery/KSDoomsayer/KSDoomsayer.png", + "id": 8229, + "longDesc": "Damaging a champion with an ability hurls a comet at their location, or, if Arcane Comet is on cooldown, reduces its remaining cooldown.

Adaptive Damage: 30 - 100 based on level (+0.2 AP and +0.35 bonus AD)
Cooldown: 20 - 8s

Cooldown Reduction:
Single Target: 20%.
Area of Effect: 10%.
Damage over Time: 5%.
", + "name": "Arcane Comet", + "shortDesc": "Damaging a champion with an ability hurls a damaging comet at their location.", + "tooltip": "Damaging a champion with an ability hurls a comet at their location, or, if Arcane Comet is on cooldown, reduces its remaining cooldown.

Cooldown Reduction:
Single Target: 20%.
Area of Effect: 10%.
Damage over Time: 5%.

Damage: @f5@ (+@f6@) (+@f7@)
Cooldown: @f2@s


You have hit with @f3@% of comets fired, for a total of @f1@ damage to champions." + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Sorcery/KSSpellslingersSurge/KSSpellslingersSurge.png", + "id": 8230, + "longDesc": "Hitting an enemy champion with 3 attacks or separate abilities within 3s grants 15 - 40% Movement Speed based on level and 75% Slow Resistance.

Duration: 3s
Cooldown: 15s", + "name": "Phase Rush", + "shortDesc": "Hitting an enemy champion with 3 separate attacks or abilities grants a burst of MS. ", + "tooltip": "Hitting an enemy champion with 3 attacks or separate abilities within 3s grants 15 - 40% Movement Speed based on level and 75% Slow Resistance.

Duration: 3s
Cooldown: 15s


Haste Bonus: @f2.2*100@%" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Sorcery/Roamer/Roamer.png", + "id": 8232, + "longDesc": "Gain 25 Movement Speed and an adaptive bonus of up to 18 Attack Damage or 30 Ability Power (based on level) when in the river.



May you be as swift as the rushing river and agile as a startled Rift Scuttler.
", + "name": "Waterwalking", + "shortDesc": "Gain MS and AP or AD, adaptive in the river.", + "tooltip": "Gain 25 Movement Speed and an adaptive bonus of up to 18 Attack Damage or 30 Ability Power (based on level) when in the river." + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Sorcery/FlawlessCombatant/FlawlessCombatant.png", + "id": 8233, + "longDesc": "While above 70% health, gain an adaptive bonus of up to 24 Attack Damage or 40 Ability Power (based on level).", + "name": "Absolute Focus", + "shortDesc": "While above 70% health, gain extra adaptive damage.", + "tooltip": "While above 70% health, gain an adaptive bonus of up to 24 Attack Damage or 40 Ability Power (based on level).


Current Bonus: +@f1@ Attack Damage" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Sorcery/SpeedDemon/SpeedDemonTemp.png", + "id": 8234, + "longDesc": "Gain 3% increased Movement Speed and add 8% of your Bonus Movement Speed to your AP or AD, adaptive. ", + "name": "Celerity", + "shortDesc": "Gain 3% extra MS. Gain extra AP or AD, adaptive based on your bonus MS. ", + "tooltip": "Gain 3% increased Movement Speed and add 8% of your Bonus Movement Speed to your AP or AD, adaptive.


Current Bonus: +@f1@ Attack Damage" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Sorcery/ElderGod/ElderGod.png", + "id": 8236, + "longDesc": "Every 10 min gain AP or AD, adaptive.

10 min: + 8 AP or 5 AD
20 min: + 24 AP or 14 AD
30 min: + 48 AP or 29 AD
40 min: + 80 AP or 48 AD
50 min: + 120 AP or 72 AD
60 min: + 168 AP or 101 AD
etc...", + "name": "Gathering Storm", + "shortDesc": "Gain increasing amounts of AD or AP, adaptive over the course of the game.", + "tooltip": "Every 10 min gain AP or AD, adaptive.

10 min: + 8 AP or 5 AD
20 min: + 24 AP or 14 AD
30 min: + 48 AP or 29 AD
40 min: + 80 AP or 48 AD
50 min: + 120 AP or 72 AD
60 min: + 168 AP or 101 AD
etc...


Current Bonus: +@f1@ Attack Damage" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Sorcery/Spellburn/Spellburn.png", + "id": 8237, + "longDesc": "Your next ability hit sets champions on fire dealing 20 - 60 bonus magic damage based on level after 1s.

Cooldown: 20s", + "name": "Scorch", + "shortDesc": "Your first ability hit every 20s burns champions.", + "tooltip": "Your next ability hit sets champions on fire dealing 20 - 60 bonus magic damage based on level after 1s.

Cooldown: 20s


Current Damage: @f2@
Total Damage Dealt: @f1@" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Sorcery/Recharge/Recharge.png", + "id": 8242, + "longDesc": "After casting a Summoner Spell, gain 15% Tenacity and Slow Resistance for 10s. Additionally, gain 10% Tenacity and Slow Resistance for each Summoner Spell on cooldown. ", + "name": "Unflinching", + "shortDesc": "After casting a Summoner Spell, gain Tenacity and Slow Resistance for a short duration. Additionally, gain Tenacity and Slow Resistance for each Summoner Spell on cooldown. ", + "tooltip": "After casting a Summoner Spell, gain 15% Tenacity and Slow Resistance for 10s. Additionally, gain 10% Tenacity and Slow Resistance for each Summoner Spell on cooldown.


Current Bonus Tenacity: @f1.-1@
Current Bonus Slow Resist: @f2@" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Sorcery/UltiMore/UltiMore.png", + "id": 8243, + "longDesc": "Your ultimate's cooldown is reduced by 5%. Each time you cast your ultimate, its cooldown is further reduced by 2%. Stacks up to 5 times.", + "name": "The Ultimate Hat", + "shortDesc": "Your ultimate's cooldown is reduced. Each time you cast your ultimate, its cooldown is further reduced.", + "tooltip": "Your ultimate's cooldown is reduced by 5%. Each time you cast your ultimate, its cooldown is further reduced by 2%. Stacks up to 5 times.


Ultimate Cooldown Reduction: +@f1*100@%
Stacks: @f3@/5" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Sorcery/ToTheDeath/ToTheDeath.png", + "id": 8299, + "longDesc": "Deal 5% - 12% increased damage to champions while you are below 60% health. Max damage gained at 30% health.", + "name": "Last Stand", + "shortDesc": "Deal more damage to champions while you are low on health.", + "tooltip": "Deal 5% - 12% increased damage to champions while you are below 60% health. Max damage gained at 30% health.

Minimum bonus is 5%.
Maximum bonus is granted while below 30% health.



Total bonus damage: @f1@" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Inspiration/MagicalFootwear/MagicalFootwear.png", + "id": 8304, + "longDesc": "You get free Slightly Magical Boots at 10 min, but you cannot buy boots before then. For each takedown you acquire the boots 30s sooner.

Slightly Magical Boots give you an additional +10 Movement Speed and upgrade for 50 gold less.", + "name": "Magical Footwear", + "shortDesc": "You get free boots at 10 min but you cannot buy boots before then. Each takedown you get makes your boots come 30s sooner.", + "tooltip": "You get free Slightly Magical Boots at 10 min, but you cannot buy boots before then. For each takedown you acquire the boots 30s sooner.

Slightly Magical Boots give you an additional +10 Movement Speed and upgrade for 50 gold less.


Boots arrival time: @f1@:@f2@@f3@" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Inspiration/DontBlink/DontBlink.png", + "id": 8306, + "longDesc": "While Flash is on cooldown it is replaced by Hexflash.

Hexflash: Channel for 2s to blink to a new location.

Cooldown: 20s. Goes on a 10s cooldown when you enter champion combat.", + "name": "Hextech Flashtraption", + "shortDesc": "While Flash is on cooldown it is replaced by Hexflash.

Hexflash: Channel, then blink to a new location.", + "tooltip": "While Flash is on cooldown it is replaced by Hexflash.

Hexflash: Channel for 2s to blink to a new location.

Cooldown: 20s. Goes on a 10s cooldown when you enter champion combat." + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Style5/AllInGoodTime/AllInGoodTime.png", + "id": 8313, + "longDesc": "Start the game with a Commencing Stopwatch that transforms into a Stopwatch after 6 min. Stopwatch has a one time use Stasis effect.

Reduces the cooldown of Zhonya's Hourglass, Guardian Angel, and Gargoyle Stoneplate by 15%.", + "name": "Perfect Timing", + "shortDesc": "Gain a free Stopwatch. Stopwatch has a one time use Stasis effect.", + "tooltip": "Start the game with a Commencing Stopwatch that transforms into a Stopwatch after 6 min. Stopwatch has a one time use Stasis effect.

Reduces the cooldown of Zhonya's Hourglass, Guardian Angel, and Gargoyle Stoneplate by 15%." + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Inspiration/TheClearChoice/TheClearChoice.png", + "id": 8316, + "longDesc": "Start the game with 6 Minion Dematerializers that kill and absorb lane minions instantly. Minion Dematerializers are on cooldown for the first 155s of the game.

Absorbing a minion increases your damage by +4% against that type of minion permanently, and an extra +1% for each additional minion of that type absorbed.
", + "name": "Minion Dematerializer", + "shortDesc": "Start the game with 6 Minion Dematerializers. Killing minions with the item gives permanent bonus damage vs. that minion type.", + "tooltip": "Start the game with 6 Minion Dematerializers that kill and absorb lane minions instantly. Minion Dematerializers are on cooldown for the first 155s of the game.

Absorbing a minion increases your damage by +4% against that type of minion permanently, and an extra +1% for each additional minion of that type absorbed.



Melee Bonus Damage: +@f1@%
Caster Bonus Damage: +@f2@%
Siege Bonus Damage: +@f3@%" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/RunesIcon.png", + "id": 8318, + "longDesc": "+20% Potion and Elixir Duration
+13 Attack Damage or +22 Ability Power, Adaptive", + "name": "The Ruthless Visionary", + "shortDesc": "Inspiration + Domination Set Bonus", + "tooltip": "Inspiration + Domination
+20% Potion and Elixir Duration
+13 Attack Damage or +22 Ability Power, Adaptive
Current Bonus: +@f1@ Attack Damage" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/RunesIcon.png", + "id": 8319, + "longDesc": "+20% Potion and Elixir Duration
+13 Attack Damage or +22 Ability Power, Adaptive", + "name": "The Stargazer", + "shortDesc": "Inspiration + Sorcery Set Bonus", + "tooltip": "Inspiration + Sorcery
+20% Potion and Elixir Duration
+13 Attack Damage or +22 Ability Power, Adaptive
Current Bonus: +@f1@ Attack Damage" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/RunesIcon.png", + "id": 8320, + "longDesc": "+20% Potion and Elixir Duration
+145 Health", + "name": "The Timeless", + "shortDesc": "Inspiration + Resolve Set Bonus", + "tooltip": "Inspiration + Resolve
+20% Potion and Elixir Duration
+145 Health" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Style5/NanaTaxman/NanaTaxman.png", + "id": 8321, + "longDesc": "You can enter debt to buy items. The amount you can borrow increases over time.

Lending Fee: 50 gold
Debt limit: 150 + 5/min
(Debt doesn't become available until 2 minutes)", + "name": "Future's Market", + "shortDesc": "You can enter debt to buy items.", + "tooltip": "You can enter debt to buy items. The amount you can borrow increases over time.

Lending Fee: 50 gold


Debt limit: Available at 2 minutes
Future Purchases: @f3@" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Inspiration/KSAlchemicalEsoterica/KSAlchemicalEsoterica.png", + "id": 8326, + "longDesc": "Gain a Summoner Shard at 2 min and another every 6 min after (Max 2 shards).

While near the shop, you can exchange 1 Summoner Shard to replace a Summoner Spell with a different one.

Additionally, your Summoner Spell Cooldowns are reduced by 25%.

Smite: Buying Smite won't grant access to Smite items
You cannot have two of the same Summoner Spell
", + "name": "Unsealed Spellbook", + "shortDesc": "Exchange Summoner Shards at the shop to change your Summoner Spells during game. Your Summoner Spells have reduced cooldowns.
", + "tooltip": "Gain a Summoner Shard at 2 min and another every 6 min after (Max 2 shards).

While near the shop, you can exchange 1 Summoner Shard to replace a Summoner Spell with a different one.

Additionally, your Summoner Spell Cooldowns are reduced by 25%.

Smite: Buying Smite won't grant access to Smite items
You cannot have two of the same Summoner Spell



Summoner Shards: @f1@" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Inspiration/TheThirdPath/TheThirdPath.png", + "id": 8339, + "longDesc": "+100 Health permanently
-10% damage to champions and monsters until 10 min



'The greatest legends live on in the stars.'
—Daphna the Dreamer
", + "name": "Celestial Body", + "shortDesc": "+100 Health permanently
-10% damage to champions and monsters until 10 min", + "tooltip": "+100 Health permanently
-10% damage to champions and monsters until 10 min" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/RunesIcon.png", + "id": 8344, + "longDesc": "+20% Potion and Elixir Duration
+20% Attack Speed", + "name": "The Elegant Duelist ", + "shortDesc": "Inspiration + Precision Set Bonus", + "tooltip": "Inspiration + Precision
+20% Potion and Elixir Duration
+20% Attack Speed" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Inspiration/BiscuitsAndBonuses/BiscuitsAndBonuses.png", + "id": 8345, + "longDesc": "Biscuit Delivery: Gain a Total Biscuit of Everlasting Will every 3 mins, until 12 min.

Biscuits restore 15% of your missing health and mana. Consuming any Biscuit increases your mana cap by 40 mana permanently.

Manaless: Champions without mana restore 20% missing health instead.", + "name": "Biscuit Delivery", + "shortDesc": "Gain a free Biscuit every 3 min, until 12 min. Consuming a Biscuit permanently increases your max mana and restores health and mana.", + "tooltip": "Biscuit Delivery: Gain a Total Biscuit of Everlasting Will every 3 mins, until 12 min.

Biscuits restore 15% of your missing health and mana. Consuming any Biscuit increases your mana cap by 40 mana permanently.

Manaless: Champions without mana restore 20% missing health instead.


Biscuits Gained: @f1@/@f2@" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Inspiration/Intelligence/Intelligence.png", + "id": 8347, + "longDesc": "+5% CDR
+5% Max CDR
+5% Summoner Spell CDR
+5% Item CDR", + "name": "Cosmic Insight", + "shortDesc": "+5% CDR
+5% Max CDR
+5% Summoner Spell CDR
+5% Item CDR", + "tooltip": "+5% CDR
+5% Max CDR
+5% Summoner Spell CDR
+5% Item CDR" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Inspiration/KSGlacialAugment/KSGlacialAugment.png", + "id": 8351, + "longDesc": "Basic attacking a champion slows them for 2s. The slow increases in strength over its duration.
  • Ranged: Ranged attacks slow by up to 20% - 40%
  • Melee: Melee attacks slow by up to 40% - 50%

  • Slowing a champion with active items shoots a freeze ray through them, freezing the nearby ground for 5s, slowing all units inside by 50%.

    Cooldown: 7-4s per unit", + "name": "Glacial Augment", + "shortDesc": "Your first attack against an enemy champion slows them (per unit cooldown). Slowing champions with active items shoots a freeze ray at them, creating a lingering slow zone.", + "tooltip": "Basic attacking a champion slows them for 2s. The slow increases in strength over its duration.
  • Ranged: Ranged attacks slow by up to 20% - 40%
  • Melee: Melee attacks slow by up to 40% - 50%

  • Slowing a champion with active items shoots a freeze ray through them, freezing the nearby ground for 5s, slowing all units inside by 50%.

    Cooldown: 7-4s per unit


    Time kept enemies slowed: @f1@s" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Inspiration/KSLooter/KSLooter.png", + "id": 8359, + "longDesc": "After using an ability, your next attack will grant bonus gold if used on a champion. There's a chance you'll also gain a consumable.", + "name": "Kleptomancy", + "shortDesc": "After using an ability, your next attack will grant bonus gold if used on a champion. There's a chance you'll also gain a consumable.", + "tooltip": "After using an ability, your next attack will grant bonus gold if used on a champion. There's a chance you'll also gain a consumable.


    Gold Gained: @f1@
    Items Looted: @f3@" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Resolve/HotPursuit/HotPursuit.png", + "id": 8410, + "longDesc": "Gain 10% Movement Speed towards nearby ally champions that are movement impaired or enemy champions that you impair.

    Range: 1000", + "name": "Approach Velocity", + "shortDesc": "Bonus MS towards nearby ally champions that are movement impaired or enemy champions that you impair.", + "tooltip": "Gain 10% Movement Speed towards nearby ally champions that are movement impaired or enemy champions that you impair.

    Range: 1000


    Time Spent Hasted: @f1@s" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/RunesIcon.png", + "id": 8414, + "longDesc": "+130 Health", + "name": "The Behemoth", + "shortDesc": "Resolve + Precision Set Bonus", + "tooltip": "Resolve + Precision
    +130 Health" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/RunesIcon.png", + "id": 8415, + "longDesc": "+130 Health", + "name": "The Arcane Colossus", + "shortDesc": "Resolve + Sorcery Set Bonus", + "tooltip": "Resolve + Sorcery
    +130 Health" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/RunesIcon.png", + "id": 8416, + "longDesc": "+130 Health", + "name": "The Enlightened Titan", + "shortDesc": "Resolve + Inspiration Set Bonus", + "tooltip": "Resolve + Inspiration
    +130 Health" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Resolve/NemFighter/NemFighter.png", + "id": 8429, + "longDesc": "After 10 min gain +8 Armor and +8 Magic Resist and increase your Armor and Magic Resist by 5%.", + "name": "Conditioning", + "shortDesc": "After 10 min gain +8 Armor and +8 Magic Resist and increase your Armor and Magic Resist by 5%.", + "tooltip": "After 10 min gain +8 Armor and +8 Magic Resist and increase your Armor and Magic Resist by 5%.

    Armor Gained: @f3@ (+@f4@)
    Resist Gained: @f5@ (+@f6@)" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Resolve/NemMarks/NemMarks.png", + "id": 8430, + "longDesc": "Gain +5 Armor.

    Heal effects from consumables, heals for at least 20 health and shields increase your Armor by 5% for 3s.", + "name": "Iron Skin", + "shortDesc": "Gain +5 Armor.
    Heals, including consumables, increase your Armor by 5% temporarily.", + "tooltip": "Gain +5 Armor.

    Heal effects from consumables, heals for at least 20 health and shields increase your Armor by 5% for 3s." + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Resolve/NemMage/NemMage.png", + "id": 8435, + "longDesc": "Gain +6 Magic Resist.

    Heal effects from consumables, heals for at least 20 health and shields increase your Magic Resist by 5% for 3s. ", + "name": "Mirror Shell", + "shortDesc": "Gain +6 Magic Resist.
    Heals, including consumables, increase your Magic Resist by 5% temporarily.
    ", + "tooltip": "Gain +6 Magic Resist.

    Heal effects from consumables, heals for at least 20 health and shields increase your Magic Resist by 5% for 3s. " + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Resolve/KSRuinedKing/KSRuinedKing.png", + "id": 8437, + "longDesc": "Every 4s in combat, your next basic attack on a champion will:
  • Deal bonus magic damage equal to 4% of your max health
  • Heal you for 2% of your max health
  • Permanently increase your health by 5

  • Ranged Champions: Damage and healing are halved and gain 2 permanent health instead.", + "name": "Grasp of the Undying", + "shortDesc": "Every 4s your next attack on a champion deals bonus magic damage, heals you, and permanently increases your health.", + "tooltip": "Every 4s in combat, your next basic attack on a champion will:
  • Deal bonus magic damage equal to 4% of your max health
  • Heal you for 2% of your max health
  • Permanently increase your health by 5

  • Ranged Champions: Damage and healing are halved and gain 2 permanent health instead.


    Damage to Champions: @f1@
    Total Healing: @f2@
    Total Health Increase: @f3.-1@" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Resolve/VeteranVengeance/VeteranVengeance.png", + "id": 8439, + "longDesc": "After immobilizing an enemy champion, increase your Armor and Magic Resist by 20 + 30% for 2.5s. Then explode, dealing magic damage to nearby enemies.

    Damage: 40 - 140 (+3.5% of your maximum health)
    Cooldown: 20s", + "name": "Aftershock", + "shortDesc": "After immobilizing an enemy champion gain defenses and later deal a burst of adaptive damage around you.", + "tooltip": "After immobilizing an enemy champion, increase your Armor and Magic Resist by 20 + 30% for 2.5s. Then explode, dealing magic damage to nearby enemies.

    Damage: 40 - 140 (+3.5% of your maximum health)
    Cooldown: 20s


    Total damage dealt: @f1@
    Armor buff: @f2@
    Magic Resist buff: @f3@" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Resolve/SecondWind/SecondWind.png", + "id": 8444, + "longDesc": "After taking damage from an enemy champion, heal for 4% of your missing health +6 over 10s.", + "name": "Second Wind", + "shortDesc": "After taking damage from an enemy champion heal back some missing health over time. ", + "tooltip": "After taking damage from an enemy champion, heal for 4% of your missing health +6 over 10s.


    Total healing: @f1@" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Resolve/BrickHitHouse/BrickHitHouse.png", + "id": 8446, + "longDesc": "Charge up a powerful attack against a tower over 4s, while within 600 range of it. The charged attack deals 125 (+30% of your max health) bonus physical damage.

    Cooldown: 45s", + "name": "Demolish", + "shortDesc": "Charge up a powerful attack against a tower while near it.", + "tooltip": "Charge up a powerful attack against a tower over 4s, while within 600 range of it. The charged attack deals 125 (+30% of your max health) bonus physical damage.

    Cooldown: 45s


    Cooldown remaining: @f2@
    Total bonus damage: @f1@" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Resolve/HealthBandit/HealthBandit.png", + "id": 8451, + "longDesc": "Permanently gain 0.2% maximum health for every 8 monsters or enemy minions that die near you.", + "name": "Overgrowth", + "shortDesc": "Gain additional permanent max health when minions or monsters die near you.", + "tooltip": "Permanently gain 0.2% maximum health for every 8 monsters or enemy minions that die near you.


    Total Max Health Earned: @f1@ (@f2*100.1@%)" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Resolve/AmpShields/AmpShields.png", + "id": 8453, + "longDesc": "Heals and shields you cast or receive are 5% stronger and increased by an additional 10% on targets below 40% health.", + "name": "Revitalize", + "shortDesc": "Heals and shields you cast or receive are 5% stronger and increased by an additional 10% on low health targets.", + "tooltip": "Heals and shields you cast or receive are 5% stronger and increased by an additional 10% on targets below 40% health.


    Bonus healing: @f1@
    Bonus shielding: @f2@" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/RunesIcon.png", + "id": 8454, + "longDesc": "+130 Health", + "name": "The Leviathan", + "shortDesc": "Resolve + Domination Set Bonus", + "tooltip": "Resolve + Domination
    +130 Health" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Resolve/BloodFromStone/BloodFromStone.png", + "id": 8463, + "longDesc": "Impairing the movement of an enemy champion marks them for 4s.

    Ally champions who attack marked enemies heal for 5 + 1% of your max health over 2s. ", + "name": "Font of Life", + "shortDesc": "Impairing the movement of an enemy champion marks them. Your allies heal when attacking champions you've marked. ", + "tooltip": "Impairing the movement of an enemy champion marks them for 4s.

    Ally champions who attack marked enemies heal for 5 + 1% of your max health over 2s. " + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Resolve/KSBuddyShield/KSBuddyShield.png", + "id": 8465, + "longDesc": "Guard allies within 175 units of you, and allies you target with spells for 2.5s. While Guarding, if you or the ally take damage, both of you gain a shield and are hasted for 1.5s.

    Cooldown: 45s
    Shield: 60 - 150 +(0.2 AP) + (+10% bonus health).
    Haste: +20% Movement Speed.", + "name": "Guardian", + "shortDesc": "Guard allies you cast spells on and those that are very nearby. If you or a guarded ally would take damage, you're both hasted and granted a shield.", + "tooltip": "Guard allies within 175 units of you, and allies you target with spells for 2.5s. While Guarding, if you or the ally take damage, both of you gain a shield and are hasted for 1.5s.


    Cooldown: 45s
    Current shield strength: @f2@ + (@f3@) + (@f4@).
    Haste: 20% increased Movement Speed." + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Precision/Overheal.png", + "id": 9101, + "longDesc": "Excess healing on you becomes a shield, for up to 10% of your total health + 10.

    Shield is built up from 40% of excess self-healing, or 300% of excess healing from allies.", + "name": "Overheal", + "shortDesc": "Excess healing on you becomes a shield.", + "tooltip": "Excess healing on you becomes a shield, for up to 10% of your total health + 10.

    Shield is built up from 40% of excess self-healing, or 300% of excess healing from allies.


    Total damage blocked: @f1@" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Precision/Legend_Infamy.png", + "id": 9103, + "longDesc": "Gain 0.8% life steal for every Legend stack (max 10 stacks).

    Earn progress toward Legend stacks for every champion takedown, epic monster takedown, large monster kill, and minion kill.", + "name": "Legend: Bloodline", + "shortDesc": "Takedowns on enemies grant permanent Lifesteal. ", + "tooltip": "Gain 0.8% life steal for every Legend stack (max 10 stacks).

    Earn progress toward Legend stacks for every champion takedown, epic monster takedown, large monster kill, and minion kill.


    Total Life Steal Granted: @f1*100@% (@f3@ of 10)
    Progress Towards Next Stack: @f2@%" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Precision/Legend_Heroism.png", + "id": 9104, + "longDesc": "Gain 3% attack speed plus an additional 1.5% for every Legend stack (max 10 stacks).

    Earn progress toward Legend stacks for every champion takedown, epic monster takedown, large monster kill, and minion kill.", + "name": "Legend: Alacrity", + "shortDesc": "Takedowns on enemies grant permanent Attack Speed. ", + "tooltip": "Gain 3% attack speed plus an additional 1.5% for every Legend stack (max 10 stacks).

    Earn progress toward Legend stacks for every champion takedown, epic monster takedown, large monster kill, and minion kill.


    Total Attack Speed added: @f1*100@% (@f3@ of 10)
    Progress towards next stack: @f2@%" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Precision/Legend_Tenacity.png", + "id": 9105, + "longDesc": "Gain 5% tenacity plus an additional 1.5% for every Legend stack (max 10 stacks).

    Earn progress toward Legend stacks for every champion takedown, epic monster takedown, large monster kill, and minion kill.", + "name": "Legend: Tenacity", + "shortDesc": "Takedowns on enemies grant permanent Tenacity. ", + "tooltip": "Gain 5% tenacity plus an additional 1.5% for every Legend stack (max 10 stacks).

    Earn progress toward Legend stacks for every champion takedown, epic monster takedown, large monster kill, and minion kill.


    Total tenacity granted: @f1*100@% (@f3@ of 10)
    Progress towards next stack: @f2@%" + }, + { + "iconPath": "/lol-game-data/assets/v1/perk-images/Styles/Precision/DangerousGame.png", + "id": 9111, + "longDesc": "Takedowns restore 12% of your missing health and grant an additional 25 gold.



    'The most dangerous game brings the greatest glory.'
    —Noxian Reckoner
    ", + "name": "Triumph", + "shortDesc": "Takedowns restore 12% of your missing health and grant an additional 25 gold. ", + "tooltip": "Takedowns restore 12% of your missing health and grant an additional 25 gold.


    Total health restored: @f1@
    Total bonus gold granted: @f2@" + } +] \ No newline at end of file diff --git a/src/main/resources/builder-runes.json b/src/main/resources/builder-runes.json new file mode 100644 index 0000000..9d23aef --- /dev/null +++ b/src/main/resources/builder-runes.json @@ -0,0 +1,589 @@ +{ + "styles": [ + { + "name": "Resolve", + "slogan": "Live forever", + "description": "Durability and crowd control", + "bonuses": [ + { + "name": "Resolve + Precision", + "value": "+130 Health" + }, + { + "name": "Resolve + Domination", + "value": "+130 Health" + }, + { + "name": "Resolve + Sorcery", + "value": "+130 Health" + }, + { + "name": "Resolve + Inspiration", + "value": "+130 Health" + } + ], + "slots": [ + { + "runes": [ + { + "name": "Grasp of the Undying", + "longDescription": "Every 4s in combat, your next basic attack on a champion will:
  • Deal bonus magic damage equal to 4% of your max health
  • Heal you for 2% of your max health
  • Permanently increase your health by 5

  • Ranged Champions: Damage and healing are halved and gain 2 permanent health instead.", + "shortDescription": "Every 4s your next attack on a champion deals bonus magic damage, heals you, and permanently increases your health.", + "runeId": 8437 + }, + { + "name": "Aftershock", + "longDescription": "After immobilizing an enemy champion, increase your Armor and Magic Resist by 20 + 30% for 2.5s. Then explode, dealing magic damage to nearby enemies.

    Damage: 40 - 140 (+3.5% of your maximum health)
    Cooldown: 20s", + "shortDescription": "After immobilizing an enemy champion gain defenses and later deal a burst of adaptive damage around you.", + "runeId": 8439 + }, + { + "name": "Guardian", + "longDescription": "Guard allies within 175 units of you, and allies you target with spells for 2.5s. While Guarding, if you or the ally take damage, both of you gain a shield and are hasted for 1.5s.

    Cooldown: 45s
    Shield: 60 - 150 +(0.200000 AP) + (+10% bonus health).
    Haste: +20% Movement Speed.", + "shortDescription": "Guard allies you cast spells on and those that are very nearby. If you or a guarded ally would take damage, you're both hasted and granted a shield.", + "runeId": 8465 + } + ], + "name": "" + }, + { + "runes": [ + { + "name": "Unflinching", + "longDescription": "After casting a Summoner Spell, gain 15% Tenacity and Slow Resistance for 10s. Additionally, gain 10% Tenacity and Slow Resistance for each Summoner Spell on cooldown. ", + "shortDescription": "After casting a Summoner Spell, gain Tenacity and Slow Resistance for a short duration. Additionally, gain Tenacity and Slow Resistance for each Summoner Spell on cooldown. ", + "runeId": 8242 + }, + { + "name": "Demolish", + "longDescription": "Charge up a powerful attack against a tower over 4s, while within 600 range of it. The charged attack deals 125 (+30% of your max health) bonus physical damage.

    Cooldown: 45s", + "shortDescription": "Charge up a powerful attack against a tower while near it.", + "runeId": 8446 + }, + { + "name": "Font of Life", + "longDescription": "Impairing the movement of an enemy champion marks them for 4s.

    Ally champions who attack marked enemies heal for 5 + 1% of your max health over 2s. ", + "shortDescription": "Impairing the movement of an enemy champion marks them. Your allies heal when attacking champions you've marked. ", + "runeId": 8463 + } + ], + "name": "Strength" + }, + { + "runes": [ + { + "name": "Iron Skin", + "longDescription": "Gain +5 Armor.

    Heal effects from consumables, heals for at least 20 health and shields increase your Armor by 5% for 3s.", + "shortDescription": "Gain +5 Armor.
    Heals, including consumables, increase your Armor by 5% temporarily.", + "runeId": 8430 + }, + { + "name": "Mirror Shell", + "longDescription": "Gain +5 Magic Resist.

    Heal effects from consumables, heals for at least 20 health and shields increase your Magic Resist by 5% for 3s. ", + "shortDescription": "Gain +5 Magic Resist.
    Heals, including consumables, increase your Magic Resist by 5% temporarily.
    ", + "runeId": 8435 + }, + { + "name": "Conditioning", + "longDescription": "After 10 min gain +8 Armor and +8 Magic Resist and increase your Armor and Magic Resist by 5%.", + "shortDescription": "After 10 min gain +8 Armor and +8 Magic Resist and increase your Armor and Magic Resist by 5%.", + "runeId": 8429 + } + ], + "name": "Resistance" + }, + { + "runes": [ + { + "name": "Overgrowth", + "longDescription": "Permanently gain 0.2% maximum health for every 8 monsters or enemy minions that die near you.", + "shortDescription": "Gain additional permanent max health when minions or monsters die near you.", + "runeId": 8451 + }, + { + "name": "Revitalize", + "longDescription": "Heals and shields are 5% stronger and increased by an additional 10% on targets below 40% health.", + "shortDescription": "Heals and shields are 5% stronger and increased by an additional 10% on low health targets.", + "runeId": 8453 + }, + { + "name": "Second Wind", + "longDescription": "After taking damage from an enemy champion, heal for 4% of your missing health +6 over 10s.", + "shortDescription": "After taking damage from an enemy champion heal back some of your missing health over time. ", + "runeId": 8444 + } + ], + "name": "Vitality" + } + ] + }, + { + "name": "Domination", + "slogan": "Hunt and eliminate prey", + "description": "Burst damage and target access", + "bonuses": [ + { + "name": "Domination + Inspiration", + "value": "+11 Attack Damage or +18 Ability Power, Adaptive" + }, + { + "name": "Domination + Resolve", + "value": "+11 Attack Damage or +18 Ability Power, Adaptive" + }, + { + "name": "Domination + Sorcery", + "value": "+11 Attack Damage or +18 Ability Power, Adaptive" + }, + { + "name": "Domination + Precision", + "value": "+11 Attack Damage or +18 Ability Power, Adaptive" + } + ], + "slots": [ + { + "runes": [ + { + "name": "Electrocute", + "longDescription": "Hitting a champion with 3 separate attacks or abilities within 3s deals bonus adaptive damage.

    Damage: 50 - 220 (+0.500000 bonus AD, +0.3 AP) damage.

    Cooldown: 50 - 25s


    'We called them the Thunderlords, for to speak of their lightning was to invite disaster.'", + "shortDescription": "Hitting a champion with 3 separate attacks or abilities in 3s deals bonus adaptive damage.", + "runeId": 8112 + }, + { + "name": "Predator", + "longDescription": "Enchants your boots with the active effect 'Predator.'

    Channel for 1.5s out of combat to gain 45% movement speed for 15s. Damaging attacks or abilities end this effect, dealing 60 - 140 (+0.4 bonus AD)(+0.25 AP) bonus adaptive damage.

    Cooldown: 180s - 120s. Starts the game on cooldown and goes on cooldown if interrupted while channeling.", + "shortDescription": "Add an active effect to your boots that grants a large boost of MS and causes your next attack or ability to deal bonus adaptive damage.", + "runeId": 8124 + }, + { + "name": "Dark Harvest", + "longDescription": "Champions, large minions, and large monsters drop soul essence on death. Collect souls to become Soul Charged. Your next attack on a champion or structure consumes Soul Charged to deal bonus adaptive damage.

    Soul Charged lasts 20s, increased to 300s after collecting 150 soul essence.

    Bonus damage: 40 - 80 (+0.25 bonus AD) (+0.2 AP) + soul essence collected.

    Champions - 6 soul essence.
    Monsters - 2 soul essence.
    Minions - 4 soul essence.
    ", + "shortDescription": "Champions, large minions, and large monsters drop soul essence on death. Touch souls to absorb them and deal bonus adaptive damage on your next attack based on total soul essence collected.", + "runeId": 8128 + } + ], + "name": "" + }, + { + "runes": [ + { + "name": "Cheap Shot", + "longDescription": "Damaging champions with impaired movement or actions deals 12 - 30 bonus true damage (based on level).

    Cooldown: 4s
    Activates on damage occurring after the impairment.", + "shortDescription": "Deal bonus true damage to enemies with impaired movement or actions. ", + "runeId": 8126 + }, + { + "name": "Taste of Blood", + "longDescription": "Heal when you damage an enemy champion.

    Healing: 18-35 (+0.20 bonus AD, +0.1 AP) health (based on level)

    Cooldown: 20s", + "shortDescription": "Heal when you damage an enemy champion.", + "runeId": 8139 + }, + { + "name": "Sudden Impact", + "longDescription": "After exiting stealth or using a dash, leap, blink, or teleport, dealing any damage to a champion grants you 10 Lethality and 8 Magic Penetration for 5s.

    Cooldown: 4s", + "shortDescription": "Gain a burst of Lethality and Magic Penetration after using a dash, leap, blink, teleport, or when leaving stealth.", + "runeId": 8143 + } + ], + "name": "Malice" + }, + { + "runes": [ + { + "name": "Zombie Ward", + "longDescription": "After killing a ward, a friendly Zombie Ward is raised in its place. Additionally, when your wards expire, they reanimate as Zombie Wards.

    Zombie Wards are visible, last for 180s and don't count towards your ward limit.", + "shortDescription": "After killing a ward, a friendly Zombie Ward is raised in its place. When your wards expire, they also reanimate as Zombie Wards.", + "runeId": 8136 + }, + { + "name": "Ghost Poro", + "longDescription": "Enter a brush to summon a poro after a brief channel. The poro will stay behind to give you vision until you summon a new one.

    If an enemy enters brush with a poro in it, they scare it away, putting Ghost Poro on a 3s cooldown.

    Poro channel is interrupted if you enter combat with a champion.", + "shortDescription": "When you enter brush, a poro appears. It will stay behind to give you vision.", + "runeId": 8120 + }, + { + "name": "Eyeball Collection", + "longDescription": "Collect eyeballs for champion and ward takedowns. Gain an adaptive bonus of 0.6 Attack Damage or 1 Ability Power, per eyeball collected.

    Upon completing your collection at 20 eyeballs, additionally gain an adaptive bonus of 6 attack damage, or 10 ability power.

    Collect 2 eyeballs per champion takedown, 1 eyeball per ward takedown.", + "shortDescription": "Collect eyeballs for champion and ward takedowns. Gain permanent AD or AP, adaptive for each eyeball plus bonus upon collection completion.", + "runeId": 8138 + } + ], + "name": "Tracking" + }, + { + "runes": [ + { + "name": "Ravenous Hunter", + "longDescription": "Heal for a percentage of the damage dealt by your abilities.
    Healing: 2.5% + 2.5% per Bounty Hunter stack.

    Earn a Bounty Hunter stack the first time you get a takedown on each enemy champion.

    Healing reduced to one third for Area of Effect abilities.

    ", + "shortDescription": "Unique takedowns grant permanent healing from ability damage. ", + "runeId": 8135 + }, + { + "name": "Ingenious Hunter", + "longDescription": "Gain 10% Active Item CDR plus an additional 6% per Bounty Hunter stack (includes Trinkets).

    Earn a Bounty Hunter stack the first time you get a takedown on each enemy champion.", + "shortDescription": "Unique takedowns grant permanent Active Item CDR (includes Trinkets).", + "runeId": 8134 + }, + { + "name": "Relentless Hunter", + "longDescription": "Gain 8 out of combat Movement Speed plus 8 per Bounty Hunter stack.

    Earn a Bounty Hunter stack the first time you get a takedown on each enemy champion.", + "shortDescription": "Unique champion takedowns grant permanent out of combat MS. ", + "runeId": 8105 + } + ], + "name": "Hunter" + } + ] + }, + { + "name": "Precision", + "slogan": "Become a legend", + "description": "Improved attacks and sustained damage", + "bonuses": [ + { + "name": "Precision + Sorcery", + "value": "+18% Attack Speed" + }, + { + "name": "Precision + Resolve", + "value": "+18% Attack Speed" + }, + { + "name": "Precision + Inspiration", + "value": "+18% Attack Speed" + }, + { + "name": "Precision + Domination", + "value": "+18% Attack Speed" + } + ], + "slots": [ + { + "runes": [ + { + "name": "Press the Attack", + "longDescription": "Hitting an enemy champion with 3 consecutive basic attacks deals 30 - 120 bonus adaptive damage (based on level) and makes them vulnerable, increasing the damage they take by 12% from all sources for 6s.", + "shortDescription": "Hitting an enemy champion 3 consecutive times makes them vunerable, dealing bonus damage and causing them to take more damage from all sources for 6s.", + "runeId": 8005 + }, + { + "name": "Lethal Tempo", + "longDescription": "1.5s after damaging a champion gain 30 - 80% Attack Speed (based on level) for 3s. Attacking a champion extends the effect to 6s.

    Cooldown: 10s

    Lethal Tempo allows you to temporarily exceed the attack speed limit.", + "shortDescription": "1.5s after damaging a champion gain a large amount of attack speed. Lethal Tempo allows you to temporarily exceed the attack speed limit.", + "runeId": 8008 + }, + { + "name": "Fleet Footwork", + "longDescription": "Attacking and moving builds Energy stacks. At 100 stacks, your next attack is Energized.

    Energized attacks heal you for 5 - 50 (+0.100000 Bonus AD, +0.200000 AP) and grant +30% Movement Speed for 1s.
    Healing is 60% as effective when used on a minion.", + "shortDescription": "Attacking and moving builds Energy stacks. At 100 stacks, your next attack heals you and grants increased MS.", + "runeId": 8021 + } + ], + "name": "" + }, + { + "runes": [ + { + "name": "Overheal", + "longDescription": "Excess healing on you becomes a shield, for up to 10% of your total health + 10.

    Shield is built up from 30% of excess self-healing, or 300% of excess healing from allies.", + "shortDescription": "Excess healing on you becomes a shield.", + "runeId": 9101 + }, + { + "name": "Triumph", + "longDescription": "Takedowns restore 15% of your missing health and grant an additional 25 gold.



    'The most dangerous game brings the greatest glory.'
    —Noxian Reckoner
    ", + "shortDescription": "Takedowns restore 15% of your missing health and grant an additional 25 gold. ", + "runeId": 9111 + }, + { + "name": "Presence of Mind", + "longDescription": "For 5s after gaining a level or takedown any mana you spend is fully restored.", + "shortDescription": "For 5s after gaining a level or takedown any mana you spend is fully restored.", + "runeId": 8009 + } + ], + "name": "Heroism" + }, + { + "runes": [ + { + "name": "Legend: Alacrity", + "longDescription": "Gain 3% attack speed plus an additional 1.5% for every Legend stack (max 10 stacks).

    Earn progress toward Legend stacks for every champion takedown, epic monster takedown, large monster kill, and minion kill.", + "shortDescription": "Takedowns on enemies grant permanent Attack Speed. ", + "runeId": 9104 + }, + { + "name": "Legend: Tenacity", + "longDescription": "Gain 5% tenacity plus an additional 1.5% for every Legend stack (max 10 stacks).

    Earn progress toward Legend stacks for every champion takedown, epic monster takedown, large monster kill, and minion kill.", + "shortDescription": "Takedowns on enemies grant permanent Tenacity. ", + "runeId": 9105 + }, + { + "name": "Legend: Bloodline", + "longDescription": "Gain 0.8% life steal for every Legend stack (max 10 stacks).

    Earn progress toward Legend stacks for every champion takedown, epic monster takedown, large monster kill, and minion kill.", + "shortDescription": "Takedowns on enemies grant permanent Lifesteal. ", + "runeId": 9103 + } + ], + "name": "Legend" + }, + { + "runes": [ + { + "name": "Coup de Grace", + "longDescription": "Deal 10% more damage to champions who have less than 40% health.

    Additionally, takedowns on champions grant an adaptive bonus of 9 Attack Damage or 15 Ability Power for 10s.", + "shortDescription": "Deal more damage to low health enemy champions.", + "runeId": 8014 + }, + { + "name": "Cut Down", + "longDescription": "Deal 4% more damage to champions with 150 more max health than you, increasing to 10% at 2000 more max health.", + "shortDescription": "Deal more damage to champions with more maximum health than you.", + "runeId": 8017 + }, + { + "name": "Last Stand", + "longDescription": "Deal 5%-12% increased damage to champions while you are below 60% health. Max damage gained at 30% health.", + "shortDescription": "Deal more damage to champions while you are low on health.", + "runeId": 8299 + } + ], + "name": "Combat" + } + ] + }, + { + "name": "Sorcery", + "slogan": "Unleash destruction", + "description": "Empowered abilities and resource manipulation", + "bonuses": [ + { + "name": "Sorcery + Precision", + "value": "+15 Attack Damage or +25 Ability Power, Adaptive" + }, + { + "name": "Sorcery + Inspiration", + "value": "+15 Attack Damage or +25 Ability Power, Adaptive" + }, + { + "name": "Sorcery + Resolve", + "value": "+15 Attack Damage or +25 Ability Power, Adaptive" + }, + { + "name": "Sorcery + Domination", + "value": "+15 Attack Damage or +25 Ability Power, Adaptive" + } + ], + "slots": [ + { + "runes": [ + { + "name": "Summon Aery", + "longDescription": "Your attacks and abilities send Aery to a target, damaging enemies or shielding allies.

    Damage: 20 - 60 based on level (+0.100000 AP and +0.150000 bonus AD)
    Shield: 30 - 80 based on level (+0.250000 AP and +0.400000 bonus AD)

    Aery cannot be sent out again until she returns to you.", + "shortDescription": "Your attacks and abilities send Aery to a target, damaging enemies or shielding allies.", + "runeId": 8214 + }, + { + "name": "Arcane Comet", + "longDescription": "Damaging a champion with an ability hurls a comet at their location, or, if Arcane Comet is on cooldown, reduces its remaining cooldown.

    Adaptive Damage: 30 - 100 based on level (+0.200000 AP and +0.350000 bonus AD)
    Cooldown: 20 - 8s

    Cooldown Reduction:
    Single Target: 20%.
    Area of Effect: 10%.
    Damage over Time: 5%.
    ", + "shortDescription": "Damaging a champion with an ability hurls a damaging comet at their location, or, if Arcane Comet is on cooldown, reduces its remaining cooldown.", + "runeId": 8229 + }, + { + "name": "Phase Rush", + "longDescription": "Hitting an enemy champion with 3 attacks or separate abilities within 3s grants 15 - 40% Movement Speed based on level.

    Duration: 3s
    Cooldown: 15s
    Melee: Additionally, gain 75% Slow Resistance for the duration.", + "shortDescription": "Hitting an enemy champion with 3 separate attacks or abilities grants a burst of MS. ", + "runeId": 8230 + } + ], + "name": "" + }, + { + "runes": [ + { + "name": "Nullifying Orb", + "longDescription": "When you take magic damage that would reduce your Health below 30%, gain a shield that absorbs 40 - 120 magic damage based on level (+0.100000 AP and +0.150000 bonus AD) for 4s.

    Cooldown: 60s", + "shortDescription": "Gain a magic damage shield when taken to low health by magic damage.", + "runeId": 8224 + }, + { + "name": "Manaflow Band", + "longDescription": "Every 60s, your next ability used has its mana or energy cost refunded, and restores 8% of your missing mana or energy.", + "shortDescription": "Periodically your next ability used has its mana or energy cost refunded and restores some of your missing mana or energy.", + "runeId": 8226 + }, + { + "name": "The Ultimate Hat", + "longDescription": "Your ultimate's cooldown is reduced by 5%. Each time you cast your ultimate, its cooldown is further reduced by 2%. Stacks up to 5 times.", + "shortDescription": "Your ultimate's cooldown is reduced. Each time you cast your ultimate, its cooldown is further reduced.", + "runeId": 8243 + } + ], + "name": "Artifact" + }, + { + "runes": [ + { + "name": "Transcendence", + "longDescription": "Gain 10% CDR when you reach level 10.

    Each percent of CDR exceeding the CDR limit is converted to an adaptive bonus of 1.2 Attack Damage or 2 Ability Power.", + "shortDescription": "Gain 10% CDR when you reach level 10. Excess CDR becomes AP or AD, adaptive.", + "runeId": 8210 + }, + { + "name": "Celerity", + "longDescription": "Gain 4% increased Movement Speed and add 8% of your Bonus Movement Speed to your AP or AD, adaptive (based on level). ", + "shortDescription": "Gain 4% extra MS. Gain extra AP or AD, adaptive based on your bonus MS. ", + "runeId": 8234 + }, + { + "name": "Absolute Focus", + "longDescription": "While above 70% health, gain an adaptive bonus of up to 24 attack damage or 40 ability power (based on level).", + "shortDescription": "While above 70% health, gain extra adaptive damage.", + "runeId": 8233 + } + ], + "name": "Excellence" + }, + { + "runes": [ + { + "name": "Scorch", + "longDescription": "Your next ability hit sets champions on fire dealing 30 - 60 bonus magic damage based on level after 1s.

    Cooldown: 20s", + "shortDescription": "Your first ability hit every 20s burns champions.", + "runeId": 8237 + }, + { + "name": "Waterwalking", + "longDescription": "Gain 25 Movement Speed and an adaptive bonus of up to 18 attack damage or 30 ability power (based on level) when in the river.



    May you be as swift as the rushing river and agile as a startled Rift Scuttler.
    ", + "shortDescription": "Gain MS and AP or AD, adaptive in the river.", + "runeId": 8232 + }, + { + "name": "Gathering Storm", + "longDescription": "Every 10 min gain AP or AD, adaptive.

    10 min: + 8 AP or 5 AD
    20 min: + 24 AP or 14 AD
    30 min: + 48 AP or 29 AD
    40 min: + 80 AP or 48 AD
    50 min: + 120 AP or 72 AD
    60 min: + 168 AP or 101 AD
    etc...", + "shortDescription": "Gain increasing amounts of AD or AP, adaptive over the course of the game.", + "runeId": 8236 + } + ], + "name": "Power" + } + ] + }, + { + "name": "Inspiration", + "slogan": "Outwit mere mortals", + "description": "Creative tools and rule bending", + "bonuses": [ + { + "name": "Inspiration + Domination", + "value": "+20% Potion and Elixir Duration
    +16 Attack Damage or +27 Ability Power, Adaptive" + }, + { + "name": "Inspiration + Sorcery", + "value": "+20% Potion and Elixir Duration
    +16 Attack Damage or +27 Ability Power, Adaptive" + }, + { + "name": "Inspiration + Resolve", + "value": "+20% Potion and Elixir Duration
    +145 Health" + }, + { + "name": "Inspiration + Precision", + "value": "+20% Potion and Elixir Duration
    +20% Attack Speed" + } + ], + "slots": [ + { + "runes": [ + { + "name": "Unsealed Spellbook", + "longDescription": "Gain a Summoner Shard at 2 min and another every 6 min after (Max 2 shards).

    While near the shop, you can exchange 1 Summoner Shard to replace a Summoner Spell with a different one.

    Additionally, your Summoner Spell Cooldowns are reduced by 25%.

    Smite: Buying Smite won't grant access to Smite items
    You cannot have two of the same Summoner Spell
    ", + "shortDescription": "Get Summoner Shards and exchange them at the shop to change your Summoner Spells during game. Your Summoner Spells have reduced cooldown.
    ", + "runeId": 8326 + }, + { + "name": "Glacial Augment", + "longDescription": "Basic attacking a champion slows them for 2s. The slow increases in strength over its duration.
  • Ranged: Ranged attacks slow by up to 20% - 40%
  • Melee: Melee attacks slow by up to 40% - 50%

  • Slowing a champion with active items shoots a freeze ray through them, freezing the nearby ground for 5s, slowing all units inside by 50%.

    Cooldown: 7-4s per unit", + "shortDescription": "Your first attack against an enemy champion slows them (per unit cooldown). Slowing champions with active items shoots a freeze ray at them, creating a lingering slow zone.", + "runeId": 8351 + }, + { + "name": "Kleptomancy", + "longDescription": "After using an ability, your next attack on a champion grants bonus gold. There's a chance you'll also gain a consumable.", + "shortDescription": "Your first attack after using an ability grants gold and sometimes consumables.", + "runeId": 8359 + } + ], + "name": "" + }, + { + "runes": [ + { + "name": "Hextech Flashtraption", + "longDescription": "While Flash is on cooldown it is replaced by Hexflash.

    Hexflash: Channel for 2s to blink to a new location.

    Cooldown: 20s. Goes on a 10s cooldown when you enter champion combat.", + "shortDescription": "While Flash is on cooldown it is replaced by Hexflash.

    Hexflash: Channel, then blink to a new location.", + "runeId": 8306 + }, + { + "name": "Biscuit Delivery", + "longDescription": "Biscuit Delivery: Gain a Total Biscuit of Everlasting Will every 3 mins, until 12 min.

    Biscuits restore 15% of your missing health and mana. Consuming any Biscuit increases your mana cap by 40 mana permanently.

    Manaless: Champions without mana restore 20% missing health instead.", + "shortDescription": "Gain a free Biscuit every 3 min, until 12 min. Biscuits restore health and mana. Consuming a Biscuit permanently increases your max mana.", + "runeId": 8345 + }, + { + "name": "Perfect Timing", + "longDescription": "Start the game with a Commencing Stopwatch that transforms into a Stopwatch after 6 min. Stopwatch has a one time use Stasis effect.

    Reduces the cooldown of Zhonya's Hourglass, Guardian Angel, and Gargoyle Stoneplate by 15%.", + "shortDescription": "Gain a free Stopwatch. Stopwatch has a one time use Stasis effect.", + "runeId": 8313 + } + ], + "name": "Contraptions" + }, + { + "runes": [ + { + "name": "Magical Footwear", + "longDescription": "You get free Slightly Magical Boots at 10 min, but you cannot buy boots before then. For each takedown you acquire the boots 30s sooner.

    Slightly Magical Boots give you an additional +10 Movement Speed and upgrade for 50 gold less.", + "shortDescription": "You get free boots at 10 min but you cannot buy boots before then. Each takedown you get makes your boots come 30s sooner.", + "runeId": 8304 + }, + { + "name": "Future's Market", + "longDescription": "You can enter debt to buy items. The amount you can borrow increases over time.

    Lending Fee: 50 gold
    Debt limit: 150 + 5/min
    (Debt doesn't become available until 2 minutes)", + "shortDescription": "You can enter debt to buy items.", + "runeId": 8321 + }, + { + "name": "Minion Dematerializer", + "longDescription": "Start the game with 6 Minion Dematerializers that kill and absorb lane minions instantly. Minion Dematerializers are on cooldown for the first 155s of the game.

    Absorbing a minion increases your damage by +4% against that type of minion permanently, and an extra +1% for each additional minion of that type absorbed.
    ", + "shortDescription": "Start the game with 6 Minion Dematerializers. Killing minions with the item gives permanent bonus damage vs. that minion type.", + "runeId": 8316 + } + ], + "name": "Tomorrow" + }, + { + "runes": [ + { + "name": "Cosmic Insight", + "longDescription": "+5% CDR
    +5% Max CDR
    +5% Summoner Spell CDR
    +5% Item CDR", + "shortDescription": "+5% CDR
    +5% Max CDR
    +5% Summoner Spell CDR
    +5% Item CDR", + "runeId": 8347 + }, + { + "name": "Approach Velocity", + "longDescription": "Gain 10% Movement Speed towards nearby ally champions that are movement impaired or enemy champions that you impair.

    Range: 1000", + "shortDescription": "Bonus MS towards nearby ally champions that are movement impaired or enemy champions that you impair.", + "runeId": 8410 + }, + { + "name": "Celestial Body", + "longDescription": "+100 Health permanently
    -10% damage to champions and monsters until 10 min



    'The greatest legends live on in the stars.'
    —Daphna the Dreamer
    ", + "shortDescription": "+100 Health permanently
    -10% damage to champions and monsters until 10 min", + "runeId": 8339 + } + ], + "name": "Beyond" + } + ] + } + ] +} diff --git a/src/main/resources/frontend_static/css/lol-fonts.css b/src/main/resources/frontend_static/css/lol-fonts.css new file mode 100644 index 0000000..92f1ba6 --- /dev/null +++ b/src/main/resources/frontend_static/css/lol-fonts.css @@ -0,0 +1,151 @@ +/* Beaufort for LOL Bold */ +@font-face { + font-family: "Beaufort for LOL"; + src: url("../fonts/BeaufortforLOL-Boldd41d.eot?#iefix"); + src: url("../fonts/BeaufortforLOL-Boldd41d.eot?#iefix") format("eot"), url("../fonts/BeaufortforLOL-Bold.woff") format("woff"), url("../fonts/BeaufortforLOL-Bold.ttf") format("truetype"), url("../fonts/BeaufortforLOL-Bold.svg#") format("svg"); + font-weight: 700; + font-style: normal; +} + +@font-face { + font-family: "BeaufortforLOL-Bold"; + src: url("../fonts/BeaufortforLOL-Boldd41d.eot?#iefix"); + src: url("../fonts/BeaufortforLOL-Boldd41d.eot?#iefix") format("eot"), url("../fonts/BeaufortforLOL-Bold.woff") format("woff"), url("../fonts/BeaufortforLOL-Bold.ttf") format("truetype"), url("../fonts/BeaufortforLOL-Bold.svg#") format("svg"); +} + +/* Beaufort for LOL Bold Italic */ +@font-face { + font-family: "Beaufort for LOL"; + src: url("../fonts/BeaufortforLOL-BoldItalicd41d.eot?#iefix"); + src: url("../fonts/BeaufortforLOL-BoldItalicd41d.eot?#iefix") format("eot"), url("../fonts/BeaufortforLOL-BoldItalic.woff") format("woff"), url("../fonts/BeaufortforLOL-BoldItalic.ttf") format("truetype"), url("../fonts/BeaufortforLOL-BoldItalic.svg#") format("svg"); + font-weight: 700; + font-style: italic; +} + +@font-face { + font-family: "BeaufortforLOL-BoldItalic"; + src: url("../fonts/BeaufortforLOL-BoldItalicd41d.eot?#iefix"); + src: url("../fonts/BeaufortforLOL-BoldItalicd41d.eot?#iefix") format("eot"), url("../fonts/BeaufortforLOL-BoldItalic.woff") format("woff"), url("../fonts/BeaufortforLOL-BoldItalic.ttf") format("truetype"), url("../fonts/BeaufortforLOL-BoldItalic.svg#") format("svg"); +} + +/* Beaufort for LOL Heavy */ +@font-face { + font-family: "Beaufort for LOL"; + src: url("../fonts/BeaufortforLOL-Heavyd41d.eot?#iefix"); + src: url("../fonts/BeaufortforLOL-Heavyd41d.eot?#iefix") format("eot"), url("../fonts/BeaufortforLOL-Heavy.woff") format("woff"), url("../fonts/BeaufortforLOL-Heavy.ttf") format("truetype"), url("../fonts/BeaufortforLOL-Heavy.svg#") format("svg"); + font-weight: 800; + font-style: normal; +} + +@font-face { + font-family: "BeaufortforLOL-Heavy"; + src: url("../fonts/BeaufortforLOL-Heavyd41d.eot?#iefix"); + src: url("../fonts/BeaufortforLOL-Heavyd41d.eot?#iefix") format("eot"), url("../fonts/BeaufortforLOL-Heavy.woff") format("woff"), url("../fonts/BeaufortforLOL-Heavy.ttf") format("truetype"), url("../fonts/BeaufortforLOL-Heavy.svg#") format("svg"); +} + +/* Beaufort for LOL Heavy Italic */ +@font-face { + font-family: "Beaufort for LOL"; + src: url("../fonts/BeaufortforLOL-HeavyItalicd41d.eot?#iefix"); + src: url("../fonts/BeaufortforLOL-HeavyItalicd41d.eot?#iefix") format("eot"), url("../fonts/BeaufortforLOL-HeavyItalic.woff") format("woff"), url("../fonts/BeaufortforLOL-HeavyItalic.ttf") format("truetype"), url("../fonts/BeaufortforLOL-HeavyItalic.svg#") format("svg"); + font-weight: 800; + font-style: italic; +} + +@font-face { + font-family: "BeaufortforLOL-HeavyItalic"; + src: url("../fonts/BeaufortforLOL-HeavyItalicd41d.eot?#iefix"); + src: url("../fonts/BeaufortforLOL-HeavyItalicd41d.eot?#iefix") format("eot"), url("../fonts/BeaufortforLOL-HeavyItalic.woff") format("woff"), url("../fonts/BeaufortforLOL-HeavyItalic.ttf") format("truetype"), url("../fonts/BeaufortforLOL-HeavyItalic.svg#") format("svg"); +} + +/* Beaufort for LOL Italic */ +@font-face { + font-family: "Beaufort for LOL"; + src: url("../fonts/BeaufortforLOL-Italicd41d.eot?#iefix"); + src: url("../fonts/BeaufortforLOL-Italicd41d.eot?#iefix") format("eot"), url("../fonts/BeaufortforLOL-Italic.woff") format("woff"), url("../fonts/BeaufortforLOL-Italic.ttf") format("truetype"), url("../fonts/BeaufortforLOL-Italic.svg#") format("svg"); + font-weight: 400; + font-style: italic; +} + +@font-face { + font-family: "BeaufortforLOL-Italic"; + src: url("../fonts/BeaufortforLOL-Italicd41d.eot?#iefix"); + src: url("../fonts/BeaufortforLOL-Italicd41d.eot?#iefix") format("eot"), url("../fonts/BeaufortforLOL-Italic.woff") format("woff"), url("../fonts/BeaufortforLOL-Italic.ttf") format("truetype"), url("../fonts/BeaufortforLOL-Italic.svg#") format("svg"); +} + +/* Beaufort for LOL Light */ +@font-face { + font-family: "Beaufort for LOL"; + src: url("../fonts/BeaufortforLOL-Lightd41d.eot?#iefix"); + src: url("../fonts/BeaufortforLOL-Lightd41d.eot?#iefix") format("eot"), url("../fonts/BeaufortforLOL-Light.woff") format("woff"), url("../fonts/BeaufortforLOL-Light.ttf") format("truetype"), url("../fonts/BeaufortforLOL-Light.svg#") format("svg"); + font-weight: 200; + font-style: normal; +} + +@font-face { + font-family: "BeaufortforLOL-Light"; + src: url("../fonts/BeaufortforLOL-Lightd41d.eot?#iefix"); + src: url("../fonts/BeaufortforLOL-Lightd41d.eot?#iefix") format("eot"), url("../fonts/BeaufortforLOL-Light.woff") format("woff"), url("../fonts/BeaufortforLOL-Light.ttf") format("truetype"), url("../fonts/BeaufortforLOL-Light.svg#") format("svg"); +} + +/* Beaufort for LOL Light Italic */ +@font-face { + font-family: "Beaufort for LOL"; + src: url("../fonts/BeaufortforLOL-LightItalicd41d.eot?#iefix"); + src: url("../fonts/BeaufortforLOL-LightItalicd41d.eot?#iefix") format("eot"), url("../fonts/BeaufortforLOL-LightItalic.woff") format("woff"), url("../fonts/BeaufortforLOL-LightItalic.ttf") format("truetype"), url("../fonts/BeaufortforLOL-LightItalic.svg#") format("svg"); + font-weight: 200; + font-style: italic; +} + +@font-face { + font-family: "BeaufortforLOL-LightItalic"; + src: url("../fonts/BeaufortforLOL-LightItalicd41d.eot?#iefix"); + src: url("../fonts/BeaufortforLOL-LightItalicd41d.eot?#iefix") format("eot"), url("../fonts/BeaufortforLOL-LightItalic.woff") format("woff"), url("../fonts/BeaufortforLOL-LightItalic.ttf") format("truetype"), url("../fonts/BeaufortforLOL-LightItalic.svg#") format("svg"); +} + +/* Beaufort for LOL Medium */ +@font-face { + font-family: "Beaufort for LOL"; + src: url("../fonts/BeaufortforLOL-Mediumd41d.eot?#iefix"); + src: url("../fonts/BeaufortforLOL-Mediumd41d.eot?#iefix") format("eot"), url("../fonts/BeaufortforLOL-Medium.woff") format("woff"), url("../fonts/BeaufortforLOL-Medium.ttf") format("truetype"), url("../fonts/BeaufortforLOL-Medium.svg#") format("svg"); + font-weight: 500; + font-style: normal; +} + +@font-face { + font-family: "BeaufortforLOL-Medium"; + src: url("../fonts/BeaufortforLOL-Mediumd41d.eot?#iefix"); + src: url("../fonts/BeaufortforLOL-Mediumd41d.eot?#iefix") format("eot"), url("../fonts/BeaufortforLOL-Medium.woff") format("woff"), url("../fonts/BeaufortforLOL-Medium.ttf") format("truetype"), url("../fonts/BeaufortforLOL-Medium.svg#") format("svg"); +} + +/* Beaufort for LOL Medium Italic */ +@font-face { + font-family: "Beaufort for LOL"; + src: url("../fonts/BeaufortforLOL-MediumItalicd41d.eot?#iefix"); + src: url("../fonts/BeaufortforLOL-MediumItalicd41d.eot?#iefix") format("eot"), url("../fonts/BeaufortforLOL-MediumItalic.woff") format("woff"), url("../fonts/BeaufortforLOL-MediumItalic.ttf") format("truetype"), url("../fonts/BeaufortforLOL-MediumItalic.svg#") format("svg"); + font-weight: 500; + font-style: italic; +} + +@font-face { + font-family: "BeaufortforLOL-MediumItalic"; + src: url("../fonts/BeaufortforLOL-MediumItalicd41d.eot?#iefix"); + src: url("../fonts/BeaufortforLOL-MediumItalicd41d.eot?#iefix") format("eot"), url("../fonts/BeaufortforLOL-MediumItalic.woff") format("woff"), url("../fonts/BeaufortforLOL-MediumItalic.ttf") format("truetype"), url("../fonts/BeaufortforLOL-MediumItalic.svg#") format("svg"); +} + +/* Beaufort for LOL Regular */ +@font-face { + font-family: "Beaufort for LOL"; + src: url("../fonts/BeaufortforLOL-Regulard41d.eot?#iefix"); + src: url("../fonts/BeaufortforLOL-Regulard41d.eot?#iefix") format("eot"), url("../fonts/BeaufortforLOL-Regular.woff") format("woff"), url("../fonts/BeaufortforLOL-Regular.ttf") format("truetype"), url("../fonts/BeaufortforLOL-Regular.svg#") format("svg"); + font-weight: 400; + font-style: normal; +} + +@font-face { + font-family: "BeaufortforLOL-Regular"; + src: url("../fonts/BeaufortforLOL-Regulard41d.eot?#iefix"); + src: url("../fonts/BeaufortforLOL-Regulard41d.eot?#iefix") format("eot"), url("../fonts/BeaufortforLOL-Regular.woff") format("woff"), url("../fonts/BeaufortforLOL-Regular.ttf") format("truetype"), url("../fonts/BeaufortforLOL-Regular.svg#") format("svg"); +} + + diff --git a/src/main/resources/frontend_static/css/rune-builder.css b/src/main/resources/frontend_static/css/rune-builder.css new file mode 100644 index 0000000..75a5432 --- /dev/null +++ b/src/main/resources/frontend_static/css/rune-builder.css @@ -0,0 +1,3527 @@ +/*! normalize.css v3.0.2 | MIT License | git.io/normalize */ +html { + font-family: sans-serif; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; +} + +body { + margin: 0; +} + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} + +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; +} + +audio:not([controls]) { + display: none; + height: 0; +} + +[hidden], +template { + display: none; +} + +a { + background-color: transparent; +} + +a:active, +a:hover { + outline: 0; +} + +abbr[title] { + border-bottom: 1px dotted; +} + +b, +strong { + font-weight: 700; +} + +dfn { + font-style: italic; +} + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +mark { + background: #ff0; + color: #000; +} + +small { + font-size: 80%; +} + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +img { + border: 0; +} + +svg:not(:root) { + overflow: hidden; +} + +figure { + margin: 1em 40px; +} + +hr { + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; +} + +pre { + overflow: auto; +} + +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} + +button, +input, +optgroup, +select, +textarea { + color: inherit; + font: inherit; + margin: 0; +} + +button { + overflow: visible; +} + +button, +select { + text-transform: none; +} + +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} + +button[disabled], +html input[disabled] { + cursor: default; +} + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +input { + line-height: normal; +} + +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; + padding: 0; +} + +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +input[type="search"] { + -webkit-appearance: textfield; + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + box-sizing: content-box; +} + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +fieldset { + border: 1px solid silver; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +legend { + border: 0; + padding: 0; +} + +textarea { + overflow: auto; +} + +optgroup { + font-weight: 700; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +td, +th { + padding: 0; +} + +*, +::after, +::before { + -webkit-box-sizing: inherit; + box-sizing: inherit; +} + +html { + -webkit-box-sizing: border-box; + box-sizing: border-box; +} + +html { + background: rgb(255, 255, 255); + color: #b5b4b2; + font-family: Spiegel, sans-serif; + font-size: 19px; + line-height: 1.47368; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +body { + font-size: 12px; + line-height: 1.41667; +} + +@media (min-width: 768px) { + body { + font-size: 18px; + } +} + +@media (min-width: 1600px) { + body { + font-size: inherit; + line-height: inherit; + } +} + +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 0 0 10px; + color: #d8cfbd; + font-family: "Beaufort for LOL", serif; + font-weight: 700; + font-size: 1.2rem; + line-height: 1.47368; +} + +@media (min-width: 768px) { + h1, + h2, + h3, + h4, + h5, + h6 { + margin: 0 0 20px; + } +} + +p { + margin: 0 0 20px; +} + +dl, +ol, +ul { + margin: 0 0 20px; +} + +a { + color: #c7b184; + text-decoration: none; +} + +a:active, +a:focus, +a:hover { + text-decoration: underline; +} + +hr { + width: 100%; + height: 1px; + margin: 0 0 20px; + border: 0; + background: -webkit-gradient(linear, left top, right top, from(transparent), color-stop(50%, #74562c), to(transparent)); + background: linear-gradient(90deg, transparent 0, #74562c 50%, transparent 100%); +} + +img { + vertical-align: middle; + margin: 0 0 20px; +} + +figure { + margin: 0 0 20px; +} + +figcaption { + font-size: 0.63158em; + font-style: italic; +} + +.o-wrap { + overflow: hidden; +} + +.o-container { + padding: 0 18px; + margin: 0 auto; + width: 100%; + max-width: 1476px; +} + +@media (min-width: 768px) { + .o-container { + width: 90%; + } +} + +.o-list-unstyled { + list-style: none; + padding: 0; +} + +.o-list-inline { + list-style: none; + padding: 0; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} + +.o-grid { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: stretch; + -ms-flex-align: stretch; + align-items: stretch; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + margin-right: -5px; + margin-left: -5px; +} + +@media (min-width: 1024px) { + .o-grid { + margin-right: -10px; + margin-left: -10px; + } +} + +.o-grid__column { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + padding-right: 5px; + padding-left: 5px; + width: 100%; + min-height: 1px; + position: relative; +} + +@media (min-width: 1024px) { + .o-grid__column { + padding-right: 10px; + padding-left: 10px; + } +} + +.o-grid--center .o-grid__column { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} + +.o-grid--bottom .o-grid__column { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end; +} + +.o-grid__column--1 { + width: 8.33333%; +} + +.o-grid__column--2 { + width: 16.66667%; +} + +.o-grid__column--3 { + width: 25%; +} + +.o-grid__column--4 { + width: 33.33333%; +} + +.o-grid__column--5 { + width: 41.66667%; +} + +.o-grid__column--6 { + width: 50%; +} + +.o-grid__column--7 { + width: 58.33333%; +} + +.o-grid__column--8 { + width: 66.66667%; +} + +.o-grid__column--9 { + width: 75%; +} + +.o-grid__column--10 { + width: 83.33333%; +} + +.o-grid__column--11 { + width: 91.66667%; +} + +.o-grid__column--12 { + width: 100%; +} + +@media (min-width: 768px) { + .o-grid__column--1\@sm { + width: 8.33333%; + } + + .o-grid__column--2\@sm { + width: 16.66667%; + } + + .o-grid__column--3\@sm { + width: 25%; + } + + .o-grid__column--4\@sm { + width: 33.33333%; + } + + .o-grid__column--5\@sm { + width: 41.66667%; + } + + .o-grid__column--6\@sm { + width: 50%; + } + + .o-grid__column--7\@sm { + width: 58.33333%; + } + + .o-grid__column--8\@sm { + width: 66.66667%; + } + + .o-grid__column--9\@sm { + width: 75%; + } + + .o-grid__column--10\@sm { + width: 83.33333%; + } + + .o-grid__column--11\@sm { + width: 91.66667%; + } + + .o-grid__column--12\@sm { + width: 100%; + } +} + +@media (min-width: 1024px) { + .o-grid__column--1\@md { + width: 8.33333%; + } + + .o-grid__column--2\@md { + width: 16.66667%; + } + + .o-grid__column--3\@md { + width: 25%; + } + + .o-grid__column--4\@md { + width: 33.33333%; + } + + .o-grid__column--5\@md { + width: 41.66667%; + } + + .o-grid__column--6\@md { + width: 50%; + } + + .o-grid__column--7\@md { + width: 58.33333%; + } + + .o-grid__column--8\@md { + width: 66.66667%; + } + + .o-grid__column--9\@md { + width: 75%; + } + + .o-grid__column--10\@md { + width: 83.33333%; + } + + .o-grid__column--11\@md { + width: 91.66667%; + } + + .o-grid__column--12\@md { + width: 100%; + } +} + +@media (min-width: 1200px) { + .o-grid__column--1\@lg { + width: 8.33333%; + } + + .o-grid__column--2\@lg { + width: 16.66667%; + } + + .o-grid__column--3\@lg { + width: 25%; + } + + .o-grid__column--4\@lg { + width: 33.33333%; + } + + .o-grid__column--5\@lg { + width: 41.66667%; + } + + .o-grid__column--6\@lg { + width: 50%; + } + + .o-grid__column--7\@lg { + width: 58.33333%; + } + + .o-grid__column--8\@lg { + width: 66.66667%; + } + + .o-grid__column--9\@lg { + width: 75%; + } + + .o-grid__column--10\@lg { + width: 83.33333%; + } + + .o-grid__column--11\@lg { + width: 91.66667%; + } + + .o-grid__column--12\@lg { + width: 100%; + } +} + +.o-grid__column--offset-1 { + margin-left: 8.33333%; +} + +.o-grid__column--offset-2 { + margin-left: 16.66667%; +} + +.o-grid__column--offset-3 { + margin-left: 25%; +} + +.o-grid__column--offset-4 { + margin-left: 33.33333%; +} + +.o-grid__column--offset-5 { + margin-left: 41.66667%; +} + +.o-grid__column--offset-6 { + margin-left: 50%; +} + +.o-grid__column--offset-7 { + margin-left: 58.33333%; +} + +.o-grid__column--offset-8 { + margin-left: 66.66667%; +} + +.o-grid__column--offset-9 { + margin-left: 75%; +} + +.o-grid__column--offset-10 { + margin-left: 83.33333%; +} + +.o-grid__column--offset-11 { + margin-left: 91.66667%; +} + +.o-grid__column--offset-12 { + margin-left: 100%; +} + +@media (min-width: 768px) { + .o-grid__column--offset-1\@sm { + margin-left: 8.33333%; + } + + .o-grid__column--offset-2\@sm { + margin-left: 16.66667%; + } + + .o-grid__column--offset-3\@sm { + margin-left: 25%; + } + + .o-grid__column--offset-4\@sm { + margin-left: 33.33333%; + } + + .o-grid__column--offset-5\@sm { + margin-left: 41.66667%; + } + + .o-grid__column--offset-6\@sm { + margin-left: 50%; + } + + .o-grid__column--offset-7\@sm { + margin-left: 58.33333%; + } + + .o-grid__column--offset-8\@sm { + margin-left: 66.66667%; + } + + .o-grid__column--offset-9\@sm { + margin-left: 75%; + } + + .o-grid__column--offset-10\@sm { + margin-left: 83.33333%; + } + + .o-grid__column--offset-11\@sm { + margin-left: 91.66667%; + } + + .o-grid__column--offset-12\@sm { + margin-left: 100%; + } +} + +@media (min-width: 1024px) { + .o-grid__column--offset-1\@md { + margin-left: 8.33333%; + } + + .o-grid__column--offset-2\@md { + margin-left: 16.66667%; + } + + .o-grid__column--offset-3\@md { + margin-left: 25%; + } + + .o-grid__column--offset-4\@md { + margin-left: 33.33333%; + } + + .o-grid__column--offset-5\@md { + margin-left: 41.66667%; + } + + .o-grid__column--offset-6\@md { + margin-left: 50%; + } + + .o-grid__column--offset-7\@md { + margin-left: 58.33333%; + } + + .o-grid__column--offset-8\@md { + margin-left: 66.66667%; + } + + .o-grid__column--offset-9\@md { + margin-left: 75%; + } + + .o-grid__column--offset-10\@md { + margin-left: 83.33333%; + } + + .o-grid__column--offset-11\@md { + margin-left: 91.66667%; + } + + .o-grid__column--offset-12\@md { + margin-left: 100%; + } +} + +@media (min-width: 1200px) { + .o-grid__column--offset-1\@lg { + margin-left: 8.33333%; + } + + .o-grid__column--offset-2\@lg { + margin-left: 16.66667%; + } + + .o-grid__column--offset-3\@lg { + margin-left: 25%; + } + + .o-grid__column--offset-4\@lg { + margin-left: 33.33333%; + } + + .o-grid__column--offset-5\@lg { + margin-left: 41.66667%; + } + + .o-grid__column--offset-6\@lg { + margin-left: 50%; + } + + .o-grid__column--offset-7\@lg { + margin-left: 58.33333%; + } + + .o-grid__column--offset-8\@lg { + margin-left: 66.66667%; + } + + .o-grid__column--offset-9\@lg { + margin-left: 75%; + } + + .o-grid__column--offset-10\@lg { + margin-left: 83.33333%; + } + + .o-grid__column--offset-11\@lg { + margin-left: 91.66667%; + } + + .o-grid__column--offset-12\@lg { + margin-left: 100%; + } +} + +.o-grid__column--push-1 { + left: 8.33333%; +} + +.o-grid__column--pull-1 { + left: -8.33333%; +} + +.o-grid__column--push-2 { + left: 16.66667%; +} + +.o-grid__column--pull-2 { + left: -16.66667%; +} + +.o-grid__column--push-3 { + left: 25%; +} + +.o-grid__column--pull-3 { + left: -25%; +} + +.o-grid__column--push-4 { + left: 33.33333%; +} + +.o-grid__column--pull-4 { + left: -33.33333%; +} + +.o-grid__column--push-5 { + left: 41.66667%; +} + +.o-grid__column--pull-5 { + left: -41.66667%; +} + +.o-grid__column--push-6 { + left: 50%; +} + +.o-grid__column--pull-6 { + left: -50%; +} + +.o-grid__column--push-7 { + left: 58.33333%; +} + +.o-grid__column--pull-7 { + left: -58.33333%; +} + +.o-grid__column--push-8 { + left: 66.66667%; +} + +.o-grid__column--pull-8 { + left: -66.66667%; +} + +.o-grid__column--push-9 { + left: 75%; +} + +.o-grid__column--pull-9 { + left: -75%; +} + +.o-grid__column--push-10 { + left: 83.33333%; +} + +.o-grid__column--pull-10 { + left: -83.33333%; +} + +.o-grid__column--push-11 { + left: 91.66667%; +} + +.o-grid__column--pull-11 { + left: -91.66667%; +} + +.o-grid__column--push-12 { + left: 100%; +} + +.o-grid__column--pull-12 { + left: -100%; +} + +@media (min-width: 768px) { + .o-grid__column--push-1\@sm { + left: 8.33333%; + } + + .o-grid__column--pull-1\@sm { + left: -8.33333%; + } + + .o-grid__column--push-2\@sm { + left: 16.66667%; + } + + .o-grid__column--pull-2\@sm { + left: -16.66667%; + } + + .o-grid__column--push-3\@sm { + left: 25%; + } + + .o-grid__column--pull-3\@sm { + left: -25%; + } + + .o-grid__column--push-4\@sm { + left: 33.33333%; + } + + .o-grid__column--pull-4\@sm { + left: -33.33333%; + } + + .o-grid__column--push-5\@sm { + left: 41.66667%; + } + + .o-grid__column--pull-5\@sm { + left: -41.66667%; + } + + .o-grid__column--push-6\@sm { + left: 50%; + } + + .o-grid__column--pull-6\@sm { + left: -50%; + } + + .o-grid__column--push-7\@sm { + left: 58.33333%; + } + + .o-grid__column--pull-7\@sm { + left: -58.33333%; + } + + .o-grid__column--push-8\@sm { + left: 66.66667%; + } + + .o-grid__column--pull-8\@sm { + left: -66.66667%; + } + + .o-grid__column--push-9\@sm { + left: 75%; + } + + .o-grid__column--pull-9\@sm { + left: -75%; + } + + .o-grid__column--push-10\@sm { + left: 83.33333%; + } + + .o-grid__column--pull-10\@sm { + left: -83.33333%; + } + + .o-grid__column--push-11\@sm { + left: 91.66667%; + } + + .o-grid__column--pull-11\@sm { + left: -91.66667%; + } + + .o-grid__column--push-12\@sm { + left: 100%; + } + + .o-grid__column--pull-12\@sm { + left: -100%; + } +} + +@media (min-width: 1024px) { + .o-grid__column--push-1\@md { + left: 8.33333%; + } + + .o-grid__column--pull-1\@md { + left: -8.33333%; + } + + .o-grid__column--push-2\@md { + left: 16.66667%; + } + + .o-grid__column--pull-2\@md { + left: -16.66667%; + } + + .o-grid__column--push-3\@md { + left: 25%; + } + + .o-grid__column--pull-3\@md { + left: -25%; + } + + .o-grid__column--push-4\@md { + left: 33.33333%; + } + + .o-grid__column--pull-4\@md { + left: -33.33333%; + } + + .o-grid__column--push-5\@md { + left: 41.66667%; + } + + .o-grid__column--pull-5\@md { + left: -41.66667%; + } + + .o-grid__column--push-6\@md { + left: 50%; + } + + .o-grid__column--pull-6\@md { + left: -50%; + } + + .o-grid__column--push-7\@md { + left: 58.33333%; + } + + .o-grid__column--pull-7\@md { + left: -58.33333%; + } + + .o-grid__column--push-8\@md { + left: 66.66667%; + } + + .o-grid__column--pull-8\@md { + left: -66.66667%; + } + + .o-grid__column--push-9\@md { + left: 75%; + } + + .o-grid__column--pull-9\@md { + left: -75%; + } + + .o-grid__column--push-10\@md { + left: 83.33333%; + } + + .o-grid__column--pull-10\@md { + left: -83.33333%; + } + + .o-grid__column--push-11\@md { + left: 91.66667%; + } + + .o-grid__column--pull-11\@md { + left: -91.66667%; + } + + .o-grid__column--push-12\@md { + left: 100%; + } + + .o-grid__column--pull-12\@md { + left: -100%; + } +} + +@media (min-width: 1200px) { + .o-grid__column--push-1\@lg { + left: 8.33333%; + } + + .o-grid__column--pull-1\@lg { + left: -8.33333%; + } + + .o-grid__column--push-2\@lg { + left: 16.66667%; + } + + .o-grid__column--pull-2\@lg { + left: -16.66667%; + } + + .o-grid__column--push-3\@lg { + left: 25%; + } + + .o-grid__column--pull-3\@lg { + left: -25%; + } + + .o-grid__column--push-4\@lg { + left: 33.33333%; + } + + .o-grid__column--pull-4\@lg { + left: -33.33333%; + } + + .o-grid__column--push-5\@lg { + left: 41.66667%; + } + + .o-grid__column--pull-5\@lg { + left: -41.66667%; + } + + .o-grid__column--push-6\@lg { + left: 50%; + } + + .o-grid__column--pull-6\@lg { + left: -50%; + } + + .o-grid__column--push-7\@lg { + left: 58.33333%; + } + + .o-grid__column--pull-7\@lg { + left: -58.33333%; + } + + .o-grid__column--push-8\@lg { + left: 66.66667%; + } + + .o-grid__column--pull-8\@lg { + left: -66.66667%; + } + + .o-grid__column--push-9\@lg { + left: 75%; + } + + .o-grid__column--pull-9\@lg { + left: -75%; + } + + .o-grid__column--push-10\@lg { + left: 83.33333%; + } + + .o-grid__column--pull-10\@lg { + left: -83.33333%; + } + + .o-grid__column--push-11\@lg { + left: 91.66667%; + } + + .o-grid__column--pull-11\@lg { + left: -91.66667%; + } + + .o-grid__column--push-12\@lg { + left: 100%; + } + + .o-grid__column--pull-12\@lg { + left: -100%; + } +} + +.o-aspect { + overflow: hidden; + margin-bottom: 20px; + width: 100%; + position: relative; +} + +.o-aspect::before { + content: ""; + display: block; + width: 100%; + padding-top: 100%; +} + +.o-aspect canvas, +.o-aspect embed, +.o-aspect iframe, +.o-aspect img, +.o-aspect video { + margin: 0; + width: 100%; + height: auto; + position: absolute; + top: 0; + left: 0; +} + +.o-aspect canvas, +.o-aspect embed, +.o-aspect iframe, +.o-aspect video { + height: 100%; +} + +.o-aspect--4x3::before { + padding-top: 75%; +} + +.o-aspect--8x3::before { + padding-top: 37.5%; +} + +.o-aspect--16x9::before { + padding-top: 56.25%; +} + +.o-aspect--veteran-emote::before { + padding-top: 113.80368%; +} + +.o-aspect--level-preview::before { + padding-top: 64.75129%; +} + +.o-aspect--level-loot::before { + padding-top: 45.19774%; +} + +.o-aspect--level-progress::before { + padding-top: 55.29954%; +} + +.o-square-grid { + width: 100%; + margin: 0 auto; + max-width: 81.25vw; + position: relative; +} + +.o-square-grid::before { + content: ""; + display: block; + width: 100%; + padding-top: 100%; +} + +.o-square-grid__item { + width: 45.70312%; + height: 45.70312%; + position: absolute; +} + +@media (min-width: 1440px) { + .o-square-grid__item { + width: 41.16223%; + height: 41.16223%; + } +} + +.o-square-grid__item--1 { + top: 0; + left: 0; +} + +.o-square-grid__item--2 { + top: 0; + right: 0; +} + +.o-square-grid__item--3 { + bottom: 0; + left: 0; +} + +.o-square-grid__item--4 { + right: 0; + bottom: 0; +} + +@media (min-width: 768px) { + .o-media { + width: 100%; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: start; + -ms-flex-align: start; + align-items: flex-start; + } +} + +@media (min-width: 768px) { + .o-media--flip { + -webkit-box-orient: horizontal; + -webkit-box-direction: reverse; + -ms-flex-direction: row-reverse; + flex-direction: row-reverse; + } +} + +.o-media__graphic { + width: 100%; + height: auto; +} + +@media (min-width: 768px) { + .o-media__graphic { + width: auto; + } +} + +@media (min-width: 768px) { + .o-media__content { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + margin-left: 20px; + } +} + +@media (min-width: 768px) { + .o-media--flip .o-media__content { + margin-left: 0; + margin-right: 20px; + } +} + +.o-layer { + position: relative; + z-index: 1; +} + +@media (min-width: 768px) { + .o-left-gutter { + margin-left: 30px; + } +} + +.o-inset { + margin: auto; + width: 100%; + max-width: 824px; +} + +.o-inset--small { + max-width: 660px; +} + +.o-inset--tiny { + max-width: 550px; +} + +.o-inset--medium { + max-width: 710px; +} + +.o-inset--wide { + max-width: 940px; +} + +.o-inset--runebuilder { + max-width: 1061px; +} + +.o-badge-list { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: start; + -ms-flex-align: start; + align-items: flex-start; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + margin: 0 -20px; +} + +.o-badge-list__item { + -webkit-box-flex: 1; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + padding-right: 20px; + padding-left: 20px; + width: 100%; + max-width: 176px; +} + +@media (min-width: 768px) { + .o-badge-list__item { + width: auto; + max-width: 236px; + } +} + +.o-icon-overlay { + position: relative; +} + +.o-icon-overlay__content { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; +} + +.c-btn { + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + vertical-align: middle; + cursor: pointer; + padding: calc(0.625em + 1px) calc(1.25em + 1px); + height: 3.75em; + max-width: 100%; + border: 0; + color: #c7b184; + fill: currentColor; + -webkit-box-shadow: 0 0 28px #000; + box-shadow: 0 0 28px #000; + font-family: "Beaufort for LOL", serif; + font-size: 0.57895rem; + line-height: 1; + font-weight: 500; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + position: relative; + z-index: 1; + -webkit-transition: 0.15s; + transition: 0.15s; +} + +@media (min-width: 768px) { + .c-btn { + font-size: 1vw; + } +} + +@media (min-width: 1600px) { + .c-btn { + font-size: 0.84211rem; + } +} + +.c-btn::after, +.c-btn::before { + content: ""; + display: block; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: -1; +} + +.c-btn::before { + background: -webkit-gradient(linear, left bottom, left top, from(#72542a), to(#bd9e5e)); + background: linear-gradient(0deg, #72542a 0, #bd9e5e 100%); +} + +.c-btn::after { + margin: 1px; + background: #16181d; + -webkit-transition: 0.15s; + transition: 0.15s; +} + +@media (min-width: 1024px) { + .c-btn::after { + margin: 2px; + } +} + +.c-btn:active, +.c-btn:focus, +.c-btn:hover { + color: #fff; + text-decoration: none; + -webkit-box-shadow: 0 0 28px #000, 0 0 28px rgba(0, 0, 0, 0.6); + box-shadow: 0 0 28px #000, 0 0 28px rgba(0, 0, 0, 0.6); +} + +.c-btn:active::after, +.c-btn:focus::after, +.c-btn:hover::after { + background: #1a1d21; +} + +.c-btn--200 { + min-width: 200px; +} + +.c-btn--360 { + width: 160px; +} + +@media (min-width: 768px) { + .c-btn--360 { + width: 360px; + } +} + +.c-btn--small { + height: 2.5em; +} + +.c-btn__icon { + margin-left: 10px; + fill: currentColor; +} + +.c-heading-page { + font-size: 2.25vw; + line-height: 1; +} + +@media (min-width: 1600px) { + .c-heading-page { + font-size: 1.89474rem; + } +} + +.c-heading-65 { + font-size: 1.05263rem; + line-height: 1; +} + +@media (min-width: 768px) { + .c-heading-65 { + font-size: 4.0625vw; + } +} + +@media (min-width: 1600px) { + .c-heading-65 { + font-size: 3.42105rem; + } +} + +.c-heading-45 { + font-size: 0.89474rem; + line-height: 1; +} + +@media (min-width: 768px) { + .c-heading-45 { + font-size: 2.8125vw; + } +} + +@media (min-width: 1600px) { + .c-heading-45 { + font-size: 2.36842rem; + } +} + +.c-heading-16 { + font-size: 0.73684rem; +} + +@media (min-width: 1200px) { + .c-heading-16 { + font-size: 0.84211rem; + } +} + +.c-title-wings { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + text-align: center; +} + +.c-title-wings__wing { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + display: none; + width: 11px; + height: 11px; + position: relative; + will-change: transform; +} + +@media (min-width: 768px) { + .c-title-wings__wing { + display: block; + } +} + +.c-title-wings__wing::before { + content: ""; + display: block; + margin: -4px 10px; + width: 9px; + height: 9px; + border: 1px solid #74562c; + position: absolute; + top: 50%; + left: 0; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); +} + +.c-title-wings__wing::after { + content: ""; + display: block; + height: 1px; + position: absolute; + top: 50%; + left: 20px; + right: 20px; + background: -webkit-gradient(linear, left top, right top, from(#74562c), to(rgba(116, 86, 44, 0))); + background: linear-gradient(90deg, #74562c 0, rgba(116, 86, 44, 0)); +} + +.c-title-wings--spread .c-title-wings__wing { + margin: 0 40px; +} + +.c-title-wings__wing--left { + -webkit-transform: scale(-1, 1); + transform: scale(-1, 1); +} + +.c-title-wings__title { + display: block; +} + +.c-links { + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + margin-right: -6px; + margin-left: -6px; +} + +@media (min-width: 768px) { + .c-links { + margin-right: -17px; + margin-left: -17px; + } +} + +.c-links__item { + padding-right: 6px; + padding-left: 6px; +} + +@media (min-width: 768px) { + .c-links__item { + padding-right: 17px; + padding-left: 17px; + } +} + +.c-line { + display: block; + margin: 15px 0; + height: 7px; + width: 360px; + position: relative; +} + +@media (min-width: 768px) { + .c-line { + margin: 30px -50px; + height: 11px; + } +} + +.c-line::before { + content: ""; + display: block; + margin: -2px 0; + width: 5px; + height: 5px; + border: 1px solid #74562c; + position: absolute; + top: 50%; + left: 0; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); +} + +@media (min-width: 768px) { + .c-line::before { + margin: -4px 10px; + width: 9px; + height: 9px; + } +} + +.c-line::after { + content: ""; + display: block; + height: 1px; + position: absolute; + top: 50%; + left: 4px; + right: 14px; + background: -webkit-gradient(linear, left top, right top, from(#74562c), to(rgba(116, 86, 44, 0))); + background: linear-gradient(90deg, #74562c 0, rgba(116, 86, 44, 0)); +} + +@media (min-width: 768px) { + .c-line::after { + left: 20px; + right: 20px; + } +} + +.c-frame { + padding: 1px; + background: -webkit-gradient(linear, left bottom, left top, from(#6c5021), to(#ab8f57)); + background: linear-gradient(0deg, #6c5021 0, #ab8f57 100%); + position: relative; + -webkit-box-shadow: 0 0 80px #000; + box-shadow: 0 0 80px #000; +} + +@media (min-width: 768px) { + .c-frame { + padding: 2px; + } +} + +.c-frame--black { + background: #342a1f; +} + +.c-frame__content { + background: #000; +} + +.c-fancy-frame { + padding: 1px; + background: -webkit-gradient(linear, left bottom, left top, from(#443813), color-stop(50%, #bfb285), to(#443813)); + background: linear-gradient(0deg, #443813 0, #bfb285 50%, #443813 100%); + position: relative; + -webkit-box-shadow: 0 0 4.21053rem #000; + box-shadow: 0 0 4.21053rem #000; +} + +@media (min-width: 768px) { + .c-fancy-frame { + padding: 3px; + } +} + +.c-fancy-frame__outer { + padding: 3px; + background: #000; +} + +@media (min-width: 768px) { + .c-fancy-frame__outer { + padding: 8px; + } +} + +.c-fancy-frame__inner { + border: 1px solid #342a1f; + background: #000; +} + +.c-section-title { + margin-bottom: 0; +} + +@media (min-width: 768px) { + .c-section-title { + margin-bottom: 40px; + } +} + +.c-badge { + display: inline-block; + vertical-align: middle; + margin: 0 0 20px; + width: 80px; + max-width: 100%; + padding: 2px; + background: -webkit-gradient(linear, left top, right top, from(#72542a), to(#bd9e5e)); + background: linear-gradient(90deg, #72542a 0, #bd9e5e 100%); + border-radius: 50%; +} + +@media (min-width: 768px) { + .c-badge { + width: 200px; + padding: 3px; + } +} + +.c-badge__inner { + border-radius: inherit; + position: relative; + background: #000; +} + +.c-badge__inner::before { + content: ""; + display: block; + padding-top: 100%; + width: 100%; +} + +.c-badge__img { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + pointer-events: none; + margin: 0; + width: 204.08163%; + height: 204.08163%; + border-radius: inherit; + position: absolute; + top: 50%; + left: 50%; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); +} + +.c-anchor { + position: relative; + top: -40px; +} + +@media (min-width: 768px) { + .c-anchor { + top: -10vw; + } +} + +@media (min-width: 1200px) { + .c-anchor { + top: -160px; + } +} + +.c-decorator { + border-top: 1px solid #463714; + position: relative; +} + +@media (min-width: 768px) { + .c-decorator { + border-top-width: 2px; + } +} + +.c-decorator::before { + content: ""; + display: block; + margin: 0 -145px; + width: 290px; + height: 18px; + background: url(../img/global/decorator.png) no-repeat; + background-size: contain; + position: absolute; + top: -1px; + left: 50%; +} + +@media (min-width: 768px) { + .c-decorator::before { + margin: 0 -290px; + width: 580px; + top: -2px; + } +} + +@media (min-width: 768px) { + .c-decorator--large { + border-top: none; + } +} + +@media (min-width: 768px) { + .c-decorator--large::before { + margin: 0 -960px; + width: 1920px; + height: 35px; + background-image: url(../img/global/decorator-large.png); + top: 0; + } +} + +.c-divider { + display: block; + margin: 15px auto; + width: 58.125vw; + height: auto; +} + +@media (min-width: 768px) { + .c-divider { + width: 434px; + } +} + +.c-available { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + margin: 0 -250px; + width: 500px; + height: 4.83333em; + background: -webkit-gradient(linear, left top, right top, color-stop(20%, #000), color-stop(80%, rgba(22, 24, 29, 0.47))); + background: linear-gradient(90deg, #000 20%, rgba(22, 24, 29, 0.47) 80%); + font-size: 0.31579rem; + line-height: 1.1; + text-align: center; + position: absolute; + top: 0; + left: 2px; + z-index: 10; + -webkit-transform-origin: center top; + transform-origin: center top; + -webkit-transform: rotate(-45deg) translate(0, 3.8125em); + transform: rotate(-45deg) translate(0, 3.8125em); +} + +@media (min-width: 768px) { + .c-available { + font-size: 1vw; + height: 4em; + } +} + +@media (min-width: 1440px) { + .c-available { + font-size: 0.84211rem; + } +} + +.c-available::after, +.c-available::before { + content: ""; + opacity: 0.47; + display: block; + width: 100%; + height: 2px; + position: absolute; + left: 0; +} + +.c-available::before { + background: #161209 -webkit-gradient(linear, right top, left top, color-stop(8%, #72542a), color-stop(40%, #a5730a), color-stop(92%, #161209)) no-repeat; + background: #161209 linear-gradient(-90deg, #72542a 8%, #a5730a 40%, #161209 92%) no-repeat; + background-size: 490px 2px; + top: 0; +} + +.c-available::after { + background: #161209 -webkit-gradient(linear, right top, left top, color-stop(8%, #72542a), color-stop(40%, #a5730a), color-stop(92%, #161209)) no-repeat; + background: #161209 linear-gradient(-90deg, #72542a 8%, #a5730a 40%, #161209 92%) no-repeat; + background-size: 490px 2px; + background-position: 100px 0; + bottom: 0; +} + +.c-available__title { + display: block; + color: #c7b184; +} + +.c-available__date { + display: block; + color: #d8cfbd; + font-size: 1.33333em; +} + +@media (min-width: 768px) { + .c-available__date { + font-size: 1.1875em; + } +} + +.c-customize { + border: solid #211a14; + border-width: 2px 0 0; + background: rgba(0, 0, 0, 0.4); + -webkit-box-shadow: 0 0 80px #000; + box-shadow: 0 0 80px #000; + padding: 8px; + position: relative; + z-index: 1; +} + +@media (min-width: 768px) { + .c-customize { + padding: 1.125vw; + } +} + +@media (min-width: 1600px) { + .c-customize { + padding: 18px; + } +} + +.c-customize__runes { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + margin: 0 -5px; + height: 700px; +} + +.c-customize__runes-item { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 20%; + height: 100%; + padding: 0 5px; + position: relative; +} + +.c-customize__rune { + width: 100%; + height: 700px; + overflow: hidden; + position: relative; + border: 1px solid #31271e; + color: #b5b4b2; + font-size: 0.94737rem; + line-height: 1.55556; + text-align: center; + -webkit-transition: 0.4s; + transition: 0.4s; +} + +.c-customize__rune::after { + content: ""; + opacity: 0; + display: block; + width: 100%; + height: 100%; + position: absolute; + top: 0; + left: 0; + background: #070d10; + -webkit-transition: 0.4s; + transition: 0.4s; +} + +.c-customize:hover .c-customize__rune::after { + opacity: 0.5; +} + +.c-customize__rune:hover { + width: 128.57143%; + height: 780px; + -webkit-transform: translateX(-14.28571%) translateY(-40px); + transform: translateX(-14.28571%) translateY(-40px); + z-index: 2; + -webkit-box-shadow: 0 0 120px #000; + box-shadow: 0 0 120px #000; +} + +.c-customize:hover .c-customize__rune:hover::after { + opacity: 0; +} + +.c-customize__spash-wrap { + overflow: hidden; + height: 700px; + position: relative; +} + +.c-customize__spash-wrap::after { + content: ""; + display: block; + width: 100%; + height: 100%; + -webkit-box-shadow: inset 0 0 110px rgba(0, 0, 0, 0.8); + box-shadow: inset 0 0 110px rgba(0, 0, 0, 0.8); + position: absolute; + top: 0; + left: 0; +} + +.c-customize__spash { + width: 360px; + height: auto; + position: absolute; + top: 0; + left: 50%; + -webkit-transform: translateX(-50%); + transform: translateX(-50%); +} + +.c-customize__rune-header { + padding: 0 20px 20px; + background: #111318; + margin-left: -180px; + width: 360px; + position: absolute; + left: 50%; + top: 100%; + -webkit-transform: translateY(-80px); + transform: translateY(-80px); + -webkit-transition: 0.4s; + transition: 0.4s; +} + +.c-customize__rune-header::before { + content: ""; + display: block; + width: 100%; + height: 2px; + background: -webkit-gradient(linear, left top, right top, from(#433712), color-stop(50%, #c5b88a), to(#433712)); + background: linear-gradient(90deg, #433712 0, #c5b88a 50%, #433712 100%); + position: absolute; + top: 0; + left: 0; +} + +.c-customize__rune:hover .c-customize__rune-header { + -webkit-transform: translateY(-100%); + transform: translateY(-100%); +} + +.c-customize__rune-title { + margin: 0; + color: #d8cfbd; + font-size: 1.11111em; + line-height: 80px; +} + +.c-customize__rune-body { + opacity: 0; + -webkit-transform: translateY(20px); + transform: translateY(20px); + -webkit-transition: 0.4s 0.15s; + transition: 0.4s 0.15s; +} + +.c-customize__rune:hover .c-customize__rune-body { + opacity: 1; + -webkit-transform: none; + transform: none; +} + +@-webkit-keyframes revolve5 { + from { + -webkit-transform: rotate(0) translateY(1%) rotate(0); + transform: rotate(0) translateY(1%) rotate(0); + -webkit-filter: brightness(160%); + filter: brightness(160%); + } + 50% { + -webkit-filter: brightness(80%); + filter: brightness(80%); + } + to { + -webkit-transform: rotate(360deg) translateY(1%) rotate(-360deg); + transform: rotate(360deg) translateY(1%) rotate(-360deg); + -webkit-filter: brightness(160%); + filter: brightness(160%); + } +} + +@keyframes revolve5 { + from { + -webkit-transform: rotate(0) translateY(1%) rotate(0); + transform: rotate(0) translateY(1%) rotate(0); + -webkit-filter: brightness(160%); + filter: brightness(160%); + } + 50% { + -webkit-filter: brightness(80%); + filter: brightness(80%); + } + to { + -webkit-transform: rotate(360deg) translateY(1%) rotate(-360deg); + transform: rotate(360deg) translateY(1%) rotate(-360deg); + -webkit-filter: brightness(160%); + filter: brightness(160%); + } +} + +@-webkit-keyframes revolve8 { + from { + -webkit-transform: rotate(0) translateY(2%) rotate(0); + transform: rotate(0) translateY(2%) rotate(0); + -webkit-filter: brightness(160%); + filter: brightness(160%); + } + 50% { + -webkit-filter: brightness(80%); + filter: brightness(80%); + } + to { + -webkit-transform: rotate(360deg) translateY(2%) rotate(-360deg); + transform: rotate(360deg) translateY(2%) rotate(-360deg); + -webkit-filter: brightness(160%); + filter: brightness(160%); + } +} + +@keyframes revolve8 { + from { + -webkit-transform: rotate(0) translateY(2%) rotate(0); + transform: rotate(0) translateY(2%) rotate(0); + -webkit-filter: brightness(160%); + filter: brightness(160%); + } + 50% { + -webkit-filter: brightness(80%); + filter: brightness(80%); + } + to { + -webkit-transform: rotate(360deg) translateY(2%) rotate(-360deg); + transform: rotate(360deg) translateY(2%) rotate(-360deg); + -webkit-filter: brightness(160%); + filter: brightness(160%); + } +} + +@-webkit-keyframes wobble { + from { + -webkit-transform: rotate(-2.5deg); + transform: rotate(-2.5deg); + } + to { + -webkit-transform: rotate(2.5deg); + transform: rotate(2.5deg); + } +} + +@keyframes wobble { + from { + -webkit-transform: rotate(-2.5deg); + transform: rotate(-2.5deg); + } + to { + -webkit-transform: rotate(2.5deg); + transform: rotate(2.5deg); + } +} + +.c-blue-essence { + position: relative; + width: 100%; + max-width: 1166px; + margin: auto; + -webkit-transform: translateZ(0.01px); + transform: translateZ(0.01px); +} + +@media (min-width: 768px) { + .c-blue-essence { + width: 100%; + margin: -50px auto 0; + } +} + +.c-blue-essence__layer { + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + width: 100%; + margin: 0; + position: absolute; + top: 0; + left: 0; +} + +.c-blue-essence__layer--1 { + -webkit-animation: revolve8 8s infinite linear; + animation: revolve8 8s infinite linear; +} + +.c-blue-essence__layer--2 { + -webkit-animation: revolve5 6s 0.75s infinite linear; + animation: revolve5 6s 0.75s infinite linear; +} + +.c-blue-essence__layer--3 { + -webkit-animation: revolve5 7s 1.5s infinite linear; + animation: revolve5 7s 1.5s infinite linear; +} + +.c-hero { + height: calc(100vh - 52px); + position: relative; +} + +.c-hero__header { + padding-bottom: 70px; + width: 100%; + font-family: "Beaufort for LOL", serif; + background: -webkit-gradient(linear, left bottom, left top, from(rgba(3, 4, 5, 0.25)), to(rgba(3, 4, 5, 0))) center top no-repeat; + background: linear-gradient(0deg, rgba(3, 4, 5, 0.25) 0, rgba(3, 4, 5, 0) 100%) center top no-repeat; + font-size: 0.68421rem; + text-align: center; + position: absolute; + bottom: 0; + left: 0; + z-index: 2; +} + +@media (min-width: 768px) { + .c-hero__header { + font-size: 2.25vw; + padding-bottom: 17.77778vh; + } +} + +@media (min-width: 1440px) { + .c-hero__header { + font-size: 1.89474rem; + } +} + +.c-hero__subtitle { + margin: 0; + color: #c7b184; + font-size: inherit; + font-weight: 500; + letter-spacing: 0.1em; + text-shadow: 0 2px 10px rgba(0, 0, 0, 0.6); +} + +@media (min-width: 768px) { + .c-hero__subtitle { + margin-bottom: -0.25em; + } +} + +.c-hero__title { + margin-bottom: 15px; + font-size: 2.30769em; + font-weight: 500; + line-height: 1; + -webkit-filter: drop-shadow(0 0 15px #001e35); + filter: drop-shadow(0 0 15px #001e35); +} + +@media (min-width: 768px) { + .c-hero__title { + margin-bottom: 35px; + font-size: 2.75em; + } +} + +.c-hero__backdrop-wrap { + overflow: hidden; + width: 100%; + height: 100vh; + background: #030405; + position: absolute; + top: -52px; + left: 0; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + will-change: transform; +} + +.c-hero__backdrop { + margin: 0 auto; + display: block; + width: auto; + height: 100%; + position: absolute; + top: 0; + left: 50%; + -webkit-transform: translate(-50%); + transform: translate(-50%); +} + +@media (min-width: 768px) { + .c-hero__backdrop { + min-height: 1080px; + } +} + +.c-hero__links { + margin: 0; + width: 100%; + position: relative; + z-index: 1; +} + +@media (min-width: 768px) { + .c-hero__links { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + } +} + +@media (min-width: 768px) { + .c-hero__links::before { + content: ""; + display: block; + height: 1px; + background: -webkit-gradient(linear, left top, right top, from(rgba(116, 86, 44, 0)), color-stop(20%, #74562c), color-stop(80%, #74562c), to(rgba(116, 86, 44, 0))); + background: linear-gradient(90deg, rgba(116, 86, 44, 0) 0, #74562c 20%, #74562c 80%, rgba(116, 86, 44, 0) 100%); + position: absolute; + top: 50%; + right: 0; + left: 0; + z-index: -1; + } +} + +.c-hero__nav-inner { + -webkit-transition: 0.15s; + transition: 0.15s; +} + +.c-hero__nav-inner::before { + content: ""; + opacity: 0; + visibility: hidden; + display: block; + width: 100%; + min-height: 120px; + height: 8vh; + position: absolute; + left: 0; + top: -10px; + background: -webkit-gradient(linear, left bottom, left top, from(transparent), to(#000)); + background: linear-gradient(0deg, transparent 0, #000 100%); +} + +@media (min-width: 1024px) { + .c-hero__nav-inner.is-fixed { + width: 100%; + position: fixed; + top: 0; + left: 0; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-transform: translateY(10px); + transform: translateY(10px); + z-index: 1000; + } +} + +.c-hero__nav-inner.is-fixed::before { + opacity: 1; + visibility: visible; +} + +.c-hero__links-item { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + margin-bottom: 10px; + padding: 0 15px; +} + +@media (min-width: 768px) { + .c-hero__links-item { + margin-bottom: 0; + width: 33.33333%; + max-width: 360px; + } +} + +.c-hero__arrow { + margin: 0 -6px; + position: absolute; + bottom: 25px; + left: 50%; + fill: #d2c4a6; + z-index: 1; +} + +@media (min-width: 768px) { + .c-verteran-emotes { + position: relative; + } +} + +@media (min-width: 768px) { + .c-verteran-emotes::before { + content: ""; + display: block; + padding-top: 100%; + width: 100%; + } +} + +.c-verteran-emotes__img { + margin: auto; + width: 70%; +} + +@media (min-width: 768px) { + .c-verteran-emotes__img { + width: 100%; + position: absolute; + left: 0; + bottom: 0; + } +} + +@media (min-width: 768px) { + .c-verteran-emotes--defender .c-verteran-emotes__img { + bottom: 14%; + } +} + +@media (min-width: 768px) { + .c-verteran-emotes--conqueror .c-verteran-emotes__img { + bottom: 7%; + } +} + +.c-veterans { + margin-bottom: 60px; + text-align: center; + position: relative; + z-index: 0; +} + +@media (min-width: 768px) { + .c-veterans { + margin-bottom: 110px; + } +} + +.c-veterans::before { + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + display: block; + width: 100%; + height: 1px; + background: -webkit-gradient(linear, left top, right top, from(transparent), color-stop(50%, #74562c), to(transparent)); + background: linear-gradient(90deg, transparent 0, #74562c 50%, transparent 100%); + position: absolute; + left: 0; + content: ""; +} + +.c-veterans__header { + padding: 30px 0 10px; + position: relative; +} + +@media (min-width: 768px) { + .c-veterans__header { + padding: 60px 0 40px; + } +} + +.c-veterans__header::before { + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + display: block; + width: 100%; + height: 1px; + background: -webkit-gradient(linear, left top, right top, from(transparent), color-stop(50%, #74562c), to(transparent)); + background: linear-gradient(90deg, transparent 0, #74562c 50%, transparent 100%); + position: absolute; + left: 0; + content: ""; + bottom: 0; +} + +.c-veterans__header::after { + content: ""; + display: block; + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + opacity: 0.25; + margin-left: -320px; + width: 640px; + height: 240px; + position: absolute; + top: 100%; + left: 50%; + background: radial-gradient(ellipse farthest-side at center top, #3583a6 0, transparent 100%); + z-index: -1; + content: ""; +} + +.c-veterans__reward-block { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: stretch; + -ms-flex-align: stretch; + align-items: stretch; + -ms-flex-pack: distribute; + justify-content: space-around; + position: relative; + padding-top: 30px; +} + +@media (min-width: 768px) { + .c-veterans__reward-block { + padding-top: 0; + } +} + +.c-veterans__reward-block::before { + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + display: block; + width: 100%; + height: 1px; + background: -webkit-gradient(linear, left top, right top, from(transparent), color-stop(50%, #74562c), to(transparent)); + background: linear-gradient(90deg, transparent 0, #74562c 50%, transparent 100%); + position: absolute; + left: 0; + content: ""; + bottom: 0; +} + +.c-veterans__reward-block::after { + content: ""; + display: block; + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + opacity: 0.25; + margin-left: -320px; + width: 640px; + height: 240px; + position: absolute; + top: 100%; + left: 50%; + background: radial-gradient(ellipse farthest-side at center top, #3583a6 0, transparent 100%); + z-index: -1; + content: ""; +} + +.c-veterans__item { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + padding: 0 0 25px; + width: 40%; +} + +.c-veterans__icon-wrap { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: end; + -ms-flex-align: end; + align-items: flex-end; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + margin: auto auto 30px; + width: 100px; + height: 100px; + position: relative; +} + +@media (min-width: 768px) { + .c-veterans__icon-wrap { + width: 290px; + height: 200px; + } +} + +.c-veterans__icon { + max-width: 100%; + height: auto; + margin: 0; +} + +.c-veterans__icon--glow { + -webkit-filter: drop-shadow(0 0 50px #0b507e); + filter: drop-shadow(0 0 50px #0b507e); +} + +@media (min-width: 768px) { + .c-veterans__item-label { + font-size: 0.89474rem; + line-height: 1.2; + } +} + +.c-veterans__icon-label { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + margin: -10px -50px; + width: 50px; + height: 50px; + padding: 10px; + border-radius: 50%; + -webkit-box-shadow: 0 0 50px #0b507e; + box-shadow: 0 0 50px #0b507e; + position: absolute; + top: 0; + right: 0; + z-index: 1; +} + +@media (min-width: 768px) { + .c-veterans__icon-label { + margin: 30px 0; + width: 74px; + height: 74px; + } +} + +.c-veterans__icon-label::after, +.c-veterans__icon-label::before { + content: ""; + display: block; + position: absolute; + border-radius: inherit; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: -1; +} + +.c-veterans__icon-label::before { + background: -webkit-gradient(linear, left bottom, left top, from(#544127), to(#d1c1a2)); + background: linear-gradient(0deg, #544127 0, #d1c1a2 100%); +} + +.c-veterans__icon-label::after { + margin: 3px; + background: #082635; + -webkit-box-shadow: inset 0 0 20px #082432; + box-shadow: inset 0 0 20px #082432; +} + +@media (min-width: 768px) { + .c-veterans__icon-label::after { + margin: 4px; + } +} + +.c-veterans__icon-label-img { + margin: auto; + width: 100%; + height: auto; +} + +.c-veterans__icon-multiple { + width: 30px; + margin: 0; + position: absolute; + bottom: 10px; + left: 100%; +} + +@media (min-width: 768px) { + .c-veterans__icon-multiple { + width: auto; + bottom: 10px; + left: auto; + right: 30px; + } +} + +.c-veterans__divider { + opacity: 0.92; + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + margin: auto; + width: 24px; + height: 44px; + background: url(../img/global/veterans-divider.png) center; +} + +.c-veterans__footer { + margin-bottom: 1em; + padding: 5px 0 0; + font-size: 0.73684rem; + line-height: 1.4; +} + +@media (min-width: 768px) { + .c-veterans__footer { + margin-bottom: 0; + font-size: 0.84211rem; + } +} + +.c-wip { + width: 100%; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end; + color: #7e7b70; + font-size: 0.52632rem; + line-height: 1.41667; +} + +@media (min-width: 768px) { + .c-wip { + font-size: 0.63158rem; + text-align: right; + } +} + +.c-wip__copy { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + margin-right: 10px; +} + +@media (min-width: 768px) { + .c-wip__copy { + margin-right: 20px; + } +} + +.c-rewards-section { + padding-top: 70px; + padding-bottom: 50px; + background: radial-gradient(ellipse farthest-side at center top, rgba(53, 131, 166, 0.25) 0, transparent 100%) center top no-repeat; + background-size: 800px 400px; +} + +@media (min-width: 768px) { + .c-rewards-section { + padding-top: 12.5vw; + padding-bottom: 10vw; + } +} + +@media (min-width: 1600px) { + .c-rewards-section { + padding-top: 200px; + padding-bottom: 160px; + } +} + +.c-conclusion-section { + padding-top: 50px; + padding-bottom: 25px; + border-top: 1px solid #463714; + background: url(../img/global/conclusion-bg-top.jpg) top center no-repeat; + background-size: cover; +} + +@media (min-width: 768px) { + .c-conclusion-section { + border-top-width: 2px; + padding-top: 6.875vw; + padding-bottom: 6.25vw; + } +} + +@media (min-width: 1600px) { + .c-conclusion-section { + padding-top: 110px; + padding-bottom: 100px; + } +} + +.c-runes-section { + background: -webkit-gradient(linear, left bottom, left top, from(#030405), to(rgba(3, 4, 5, 0.25))) center top no-repeat, + -webkit-gradient(linear, left bottom, left top, from(rgba(3, 4, 5, 0)), color-stop(50%, #030405), to(rgba(3, 4, 5, 0))) center 2138px no-repeat, + url(../img/global/runes-bg-top.jpg) center 150px no-repeat, url(../img/global/runes-bg-bot.jpg) bottom center no-repeat; + background: linear-gradient(0deg, #030405 0, rgba(3, 4, 5, 0.25) 100%) center top no-repeat, linear-gradient(0deg, rgba(3, 4, 5, 0) 0, #030405 50%, rgba(3, 4, 5, 0) 100%) center 2138px no-repeat, + url(../img/global/runes-bg-top.jpg) center 150px no-repeat, url(../img/global/runes-bg-bot.jpg) bottom center no-repeat; + background-size: 100% 150px, 100% 300px, auto, auto; + padding-top: 40px; + padding-bottom: 40px; +} + +@media (min-width: 768px) { + .c-runes-section { + padding-top: 5vw; + padding-bottom: 5vw; + } +} + +@media (min-width: 1600px) { + .c-runes-section { + padding-top: 80px; + padding-bottom: 80px; + } +} + +.c-leveling-preview { + max-width: 1166px; + margin: -10px auto; +} + +@media (min-width: 768px) { + .c-leveling-preview { + margin-top: -6.00343%; + } +} + +.c-leveling-preview--loot { + max-width: 1062px; +} + +@media (min-width: 768px) { + .c-leveling-preview--loot { + margin-top: -4.7081%; + } +} + +.c-leveling-section { + overflow: hidden; + background: -webkit-gradient(linear, left bottom, left top, from(transparent), color-stop(50%, #040e18), to(transparent)) center 5450px no-repeat, + #040e18 url(../img/global/level-bg-top.jpg) top center no-repeat; + background: linear-gradient(0deg, transparent 0, #040e18 50%, transparent 100%) center 5450px no-repeat, #040e18 url(../img/global/level-bg-top.jpg) top center no-repeat; + background-size: 100% 500px, auto; + padding-top: 40px; + padding-bottom: 60px; +} + +@media (min-width: 768px) { + .c-leveling-section { + padding-top: 5vw; + padding-bottom: 5vw; + } +} + +@media (min-width: 1600px) { + .c-leveling-section { + padding-top: 80px; + padding-bottom: 80px; + } +} + +.c-footer { + padding-top: 40px; + padding-bottom: 40px; + background: #121212; + color: #a09b8c; + font-size: 0.73684rem; + line-height: 1.4; + text-align: center; + position: relative; +} + +@media (min-width: 768px) { + .c-footer { + padding-top: 6.25vw; + padding-bottom: 3.125vw; + } +} + +@media (min-width: 1440px) { + .c-footer { + padding-top: 100px; + padding-bottom: 50px; + } +} + +.c-footer__links { + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + margin-bottom: 40px; + font-size: 0.85714em; + text-transform: uppercase; +} + +.i18n-el_GR .c-footer__links, +.i18n-pl_PL .c-footer__links, +.i18n-tr_TR .c-footer__links { + text-transform: none; +} + +.c-footer__links--small { + font-size: 0.71429em; +} + +.c-footer__links-item { + margin: 0 0.25em; +} + +.c-footer__links-link { + color: #f0e6d2; +} + +.c-footer__links-link:hover { + color: #fff; + text-decoration: none; +} + +.u-hidden { + display: none; +} + +@media (min-width: 480px) { + .u-hidden\@xs { + display: none; + } +} + +@media (max-width: 479px) { + .u-hidden\@less-than-xs { + display: none; + } +} + +@media (min-width: 768px) { + .u-hidden\@sm { + display: none; + } +} + +@media (max-width: 767px) { + .u-hidden\@less-than-sm { + display: none; + } +} + +@media (min-width: 1024px) { + .u-hidden\@md { + display: none; + } +} + +@media (max-width: 1023px) { + .u-hidden\@less-than-md { + display: none; + } +} + +@media (min-width: 1200px) { + .u-hidden\@lg { + display: none; + } +} + +@media (max-width: 1199px) { + .u-hidden\@less-than-lg { + display: none; + } +} + +@media (min-width: 1440px) { + .u-hidden\@xl { + display: none; + } +} + +@media (max-width: 1439px) { + .u-hidden\@less-than-xl { + display: none; + } +} + +@media (min-width: 1600px) { + .u-hidden\@xxl { + display: none; + } +} + +@media (max-width: 1599px) { + .u-hidden\@less-than-xxl { + display: none; + } +} + +.u-sr-only { + overflow: hidden; + clip: rect(1px, 1px, 1px, 1px); + height: 1px; + width: 1px; + padding: 0; + border: 0; + position: absolute; +} + +.u-text-center { + text-align: center; +} + +.u-text-gradient { + color: #d8cfbd; + background: -webkit-linear-gradient(#d8cfbd, #d2c3a6); + background-size: 1em 100%; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; +} + +.i18n-el_GR .u-text-gradient, +.i18n-pl_PL .u-text-gradient, +.i18n-tr_TR .u-text-gradient { + background: 0 0; + -webkit-background-clip: inherit; + -webkit-text-fill-color: inherit; +} + +.u-img-respond { + max-width: 100%; + height: auto; +} + +.u-img-full { + width: 100%; + height: auto; +} + +.u-spacing-none { + margin-bottom: 0; +} + +.u-spacing-10 { + margin-bottom: 10px; +} + +.u-spacing-20 { + margin-bottom: 20px; +} + +.u-spacing-30 { + margin-bottom: 30px; +} + +.u-spacing-40 { + margin-bottom: 40px; +} + +.u-spacing-60 { + margin-bottom: 60px; +} + +.u-spacing-80 { + margin-bottom: 80px; +} + +.u-spacing-100 { + margin-bottom: 100px; +} + +.u-spacing-200 { + margin-bottom: 200px; +} + +.u-spacing-300 { + margin-bottom: 300px; +} + +@media (min-width: 480px) { + .u-spacing-none\@xs { + margin-bottom: 0; + } + + .u-spacing-10\@xs { + margin-bottom: 10px; + } + + .u-spacing-20\@xs { + margin-bottom: 20px; + } + + .u-spacing-30\@xs { + margin-bottom: 30px; + } + + .u-spacing-40\@xs { + margin-bottom: 40px; + } + + .u-spacing-60\@xs { + margin-bottom: 60px; + } + + .u-spacing-80\@xs { + margin-bottom: 80px; + } + + .u-spacing-100\@xs { + margin-bottom: 100px; + } + + .u-spacing-200\@xs { + margin-bottom: 200px; + } + + .u-spacing-300\@xs { + margin-bottom: 300px; + } +} + +@media (min-width: 768px) { + .u-spacing-none\@sm { + margin-bottom: 0; + } + + .u-spacing-10\@sm { + margin-bottom: 10px; + } + + .u-spacing-20\@sm { + margin-bottom: 20px; + } + + .u-spacing-30\@sm { + margin-bottom: 30px; + } + + .u-spacing-40\@sm { + margin-bottom: 40px; + } + + .u-spacing-60\@sm { + margin-bottom: 60px; + } + + .u-spacing-80\@sm { + margin-bottom: 80px; + } + + .u-spacing-100\@sm { + margin-bottom: 100px; + } + + .u-spacing-200\@sm { + margin-bottom: 200px; + } + + .u-spacing-300\@sm { + margin-bottom: 300px; + } +} + +@media (min-width: 1024px) { + .u-spacing-none\@md { + margin-bottom: 0; + } + + .u-spacing-10\@md { + margin-bottom: 10px; + } + + .u-spacing-20\@md { + margin-bottom: 20px; + } + + .u-spacing-30\@md { + margin-bottom: 30px; + } + + .u-spacing-40\@md { + margin-bottom: 40px; + } + + .u-spacing-60\@md { + margin-bottom: 60px; + } + + .u-spacing-80\@md { + margin-bottom: 80px; + } + + .u-spacing-100\@md { + margin-bottom: 100px; + } + + .u-spacing-200\@md { + margin-bottom: 200px; + } + + .u-spacing-300\@md { + margin-bottom: 300px; + } +} + +@media (min-width: 1200px) { + .u-spacing-none\@lg { + margin-bottom: 0; + } + + .u-spacing-10\@lg { + margin-bottom: 10px; + } + + .u-spacing-20\@lg { + margin-bottom: 20px; + } + + .u-spacing-30\@lg { + margin-bottom: 30px; + } + + .u-spacing-40\@lg { + margin-bottom: 40px; + } + + .u-spacing-60\@lg { + margin-bottom: 60px; + } + + .u-spacing-80\@lg { + margin-bottom: 80px; + } + + .u-spacing-100\@lg { + margin-bottom: 100px; + } + + .u-spacing-200\@lg { + margin-bottom: 200px; + } + + .u-spacing-300\@lg { + margin-bottom: 300px; + } +} + +@media (min-width: 1440px) { + .u-spacing-none\@xl { + margin-bottom: 0; + } + + .u-spacing-10\@xl { + margin-bottom: 10px; + } + + .u-spacing-20\@xl { + margin-bottom: 20px; + } + + .u-spacing-30\@xl { + margin-bottom: 30px; + } + + .u-spacing-40\@xl { + margin-bottom: 40px; + } + + .u-spacing-60\@xl { + margin-bottom: 60px; + } + + .u-spacing-80\@xl { + margin-bottom: 80px; + } + + .u-spacing-100\@xl { + margin-bottom: 100px; + } + + .u-spacing-200\@xl { + margin-bottom: 200px; + } + + .u-spacing-300\@xl { + margin-bottom: 300px; + } +} + +@media (min-width: 1600px) { + .u-spacing-none\@xxl { + margin-bottom: 0; + } + + .u-spacing-10\@xxl { + margin-bottom: 10px; + } + + .u-spacing-20\@xxl { + margin-bottom: 20px; + } + + .u-spacing-30\@xxl { + margin-bottom: 30px; + } + + .u-spacing-40\@xxl { + margin-bottom: 40px; + } + + .u-spacing-60\@xxl { + margin-bottom: 60px; + } + + .u-spacing-80\@xxl { + margin-bottom: 80px; + } + + .u-spacing-100\@xxl { + margin-bottom: 100px; + } + + .u-spacing-200\@xxl { + margin-bottom: 200px; + } + + .u-spacing-300\@xxl { + margin-bottom: 300px; + } +} diff --git a/src/main/resources/frontend_static/css/styles.css b/src/main/resources/frontend_static/css/styles.css new file mode 100644 index 0000000..8b589f7 --- /dev/null +++ b/src/main/resources/frontend_static/css/styles.css @@ -0,0 +1,89 @@ +body { + background-color: black; + margin: 1em; +} + +html { + background: black; +} + +.header-title { + float: right; +} + +#champion-list { + width: 100%; + height: 10%; + background-color: #111; + box-shadow: 0 0 80px #000; + border: 1px solid #ab8f57; +} + +.champion { + width: 80px; + height: 80px; + background-color: black; + display: inline-block; + margin: .8em; + cursor: pointer; +} + +.champion > img { + width: 80px; +} + +#app-header { + margin-top: 1em; +} + +.foot { + font-size: .8em; + width: 100%; + border-top: 1px solid #ab8f57; +} + +::-webkit-scrollbar { + width: 6px; +} + +::-webkit-scrollbar-track { + background: #111; +} + +::-webkit-scrollbar-thumb { + background: #ab8f57; +} + +::-webkit-scrollbar-thumb:hover { + background: #555; +} + +#loading-overlay { + left: 0; + top: 0; + width: 100%; + height: 100%; + + color: black; + font-size: 60px; + background-color: rgba(255, 255, 255, 0.7); + + z-index: 500; + position: fixed; + + display: flex; + justify-content: center; + align-items: center; +} + +.tooltip-runeName { + color: darkred; +} + +.tooltip-championName { + color: darkgreen; +} + +.tooltip-performance { + color: silver; +} \ No newline at end of file diff --git a/src/main/resources/frontend_static/fonts/BeaufortforLOL-Bold.svg b/src/main/resources/frontend_static/fonts/BeaufortforLOL-Bold.svg new file mode 100644 index 0000000..121accc --- /dev/null +++ b/src/main/resources/frontend_static/fonts/BeaufortforLOL-Bold.svg @@ -0,0 +1,1315 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/frontend_static/fonts/BeaufortforLOL-Bold.ttf b/src/main/resources/frontend_static/fonts/BeaufortforLOL-Bold.ttf new file mode 100644 index 0000000..1a82084 Binary files /dev/null and b/src/main/resources/frontend_static/fonts/BeaufortforLOL-Bold.ttf differ diff --git a/src/main/resources/frontend_static/fonts/BeaufortforLOL-Bold.woff b/src/main/resources/frontend_static/fonts/BeaufortforLOL-Bold.woff new file mode 100644 index 0000000..59ecd6e Binary files /dev/null and b/src/main/resources/frontend_static/fonts/BeaufortforLOL-Bold.woff differ diff --git a/src/main/resources/frontend_static/fonts/BeaufortforLOL-BoldItalic.svg b/src/main/resources/frontend_static/fonts/BeaufortforLOL-BoldItalic.svg new file mode 100644 index 0000000..0773c58 --- /dev/null +++ b/src/main/resources/frontend_static/fonts/BeaufortforLOL-BoldItalic.svg @@ -0,0 +1,1316 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/frontend_static/fonts/BeaufortforLOL-BoldItalic.ttf b/src/main/resources/frontend_static/fonts/BeaufortforLOL-BoldItalic.ttf new file mode 100644 index 0000000..8a27dbf Binary files /dev/null and b/src/main/resources/frontend_static/fonts/BeaufortforLOL-BoldItalic.ttf differ diff --git a/src/main/resources/frontend_static/fonts/BeaufortforLOL-BoldItalic.woff b/src/main/resources/frontend_static/fonts/BeaufortforLOL-BoldItalic.woff new file mode 100644 index 0000000..4865521 Binary files /dev/null and b/src/main/resources/frontend_static/fonts/BeaufortforLOL-BoldItalic.woff differ diff --git a/src/main/resources/frontend_static/fonts/BeaufortforLOL-BoldItalicd41d.eot b/src/main/resources/frontend_static/fonts/BeaufortforLOL-BoldItalicd41d.eot new file mode 100644 index 0000000..efdc3ab Binary files /dev/null and b/src/main/resources/frontend_static/fonts/BeaufortforLOL-BoldItalicd41d.eot differ diff --git a/src/main/resources/frontend_static/fonts/BeaufortforLOL-Boldd41d.eot b/src/main/resources/frontend_static/fonts/BeaufortforLOL-Boldd41d.eot new file mode 100644 index 0000000..ef5bca3 Binary files /dev/null and b/src/main/resources/frontend_static/fonts/BeaufortforLOL-Boldd41d.eot differ diff --git a/src/main/resources/frontend_static/fonts/BeaufortforLOL-Heavy.svg b/src/main/resources/frontend_static/fonts/BeaufortforLOL-Heavy.svg new file mode 100644 index 0000000..ef8290f --- /dev/null +++ b/src/main/resources/frontend_static/fonts/BeaufortforLOL-Heavy.svg @@ -0,0 +1,1315 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/frontend_static/fonts/BeaufortforLOL-Heavy.ttf b/src/main/resources/frontend_static/fonts/BeaufortforLOL-Heavy.ttf new file mode 100644 index 0000000..4e0b8e5 Binary files /dev/null and b/src/main/resources/frontend_static/fonts/BeaufortforLOL-Heavy.ttf differ diff --git a/src/main/resources/frontend_static/fonts/BeaufortforLOL-Heavy.woff b/src/main/resources/frontend_static/fonts/BeaufortforLOL-Heavy.woff new file mode 100644 index 0000000..1631ac0 Binary files /dev/null and b/src/main/resources/frontend_static/fonts/BeaufortforLOL-Heavy.woff differ diff --git a/src/main/resources/frontend_static/fonts/BeaufortforLOL-HeavyItalic.svg b/src/main/resources/frontend_static/fonts/BeaufortforLOL-HeavyItalic.svg new file mode 100644 index 0000000..f030d71 --- /dev/null +++ b/src/main/resources/frontend_static/fonts/BeaufortforLOL-HeavyItalic.svg @@ -0,0 +1,1319 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/frontend_static/fonts/BeaufortforLOL-HeavyItalic.ttf b/src/main/resources/frontend_static/fonts/BeaufortforLOL-HeavyItalic.ttf new file mode 100644 index 0000000..3147b78 Binary files /dev/null and b/src/main/resources/frontend_static/fonts/BeaufortforLOL-HeavyItalic.ttf differ diff --git a/src/main/resources/frontend_static/fonts/BeaufortforLOL-HeavyItalic.woff b/src/main/resources/frontend_static/fonts/BeaufortforLOL-HeavyItalic.woff new file mode 100644 index 0000000..fc491b2 Binary files /dev/null and b/src/main/resources/frontend_static/fonts/BeaufortforLOL-HeavyItalic.woff differ diff --git a/src/main/resources/frontend_static/fonts/BeaufortforLOL-HeavyItalicd41d.eot b/src/main/resources/frontend_static/fonts/BeaufortforLOL-HeavyItalicd41d.eot new file mode 100644 index 0000000..d0ecc71 Binary files /dev/null and b/src/main/resources/frontend_static/fonts/BeaufortforLOL-HeavyItalicd41d.eot differ diff --git a/src/main/resources/frontend_static/fonts/BeaufortforLOL-Heavyd41d.eot b/src/main/resources/frontend_static/fonts/BeaufortforLOL-Heavyd41d.eot new file mode 100644 index 0000000..365b4bc Binary files /dev/null and b/src/main/resources/frontend_static/fonts/BeaufortforLOL-Heavyd41d.eot differ diff --git a/src/main/resources/frontend_static/fonts/BeaufortforLOL-Italic.svg b/src/main/resources/frontend_static/fonts/BeaufortforLOL-Italic.svg new file mode 100644 index 0000000..0214879 --- /dev/null +++ b/src/main/resources/frontend_static/fonts/BeaufortforLOL-Italic.svg @@ -0,0 +1,1316 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/frontend_static/fonts/BeaufortforLOL-Italic.ttf b/src/main/resources/frontend_static/fonts/BeaufortforLOL-Italic.ttf new file mode 100644 index 0000000..8f3d7e9 Binary files /dev/null and b/src/main/resources/frontend_static/fonts/BeaufortforLOL-Italic.ttf differ diff --git a/src/main/resources/frontend_static/fonts/BeaufortforLOL-Italic.woff b/src/main/resources/frontend_static/fonts/BeaufortforLOL-Italic.woff new file mode 100644 index 0000000..8fbbe14 Binary files /dev/null and b/src/main/resources/frontend_static/fonts/BeaufortforLOL-Italic.woff differ diff --git a/src/main/resources/frontend_static/fonts/BeaufortforLOL-Italicd41d.eot b/src/main/resources/frontend_static/fonts/BeaufortforLOL-Italicd41d.eot new file mode 100644 index 0000000..5174371 Binary files /dev/null and b/src/main/resources/frontend_static/fonts/BeaufortforLOL-Italicd41d.eot differ diff --git a/src/main/resources/frontend_static/fonts/BeaufortforLOL-Light.svg b/src/main/resources/frontend_static/fonts/BeaufortforLOL-Light.svg new file mode 100644 index 0000000..4745251 --- /dev/null +++ b/src/main/resources/frontend_static/fonts/BeaufortforLOL-Light.svg @@ -0,0 +1,1314 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/frontend_static/fonts/BeaufortforLOL-Light.ttf b/src/main/resources/frontend_static/fonts/BeaufortforLOL-Light.ttf new file mode 100644 index 0000000..e2aa0ba Binary files /dev/null and b/src/main/resources/frontend_static/fonts/BeaufortforLOL-Light.ttf differ diff --git a/src/main/resources/frontend_static/fonts/BeaufortforLOL-Light.woff b/src/main/resources/frontend_static/fonts/BeaufortforLOL-Light.woff new file mode 100644 index 0000000..e547f31 Binary files /dev/null and b/src/main/resources/frontend_static/fonts/BeaufortforLOL-Light.woff differ diff --git a/src/main/resources/frontend_static/fonts/BeaufortforLOL-LightItalic.svg b/src/main/resources/frontend_static/fonts/BeaufortforLOL-LightItalic.svg new file mode 100644 index 0000000..f1456f9 --- /dev/null +++ b/src/main/resources/frontend_static/fonts/BeaufortforLOL-LightItalic.svg @@ -0,0 +1,1317 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/frontend_static/fonts/BeaufortforLOL-LightItalic.ttf b/src/main/resources/frontend_static/fonts/BeaufortforLOL-LightItalic.ttf new file mode 100644 index 0000000..4903cb0 Binary files /dev/null and b/src/main/resources/frontend_static/fonts/BeaufortforLOL-LightItalic.ttf differ diff --git a/src/main/resources/frontend_static/fonts/BeaufortforLOL-LightItalic.woff b/src/main/resources/frontend_static/fonts/BeaufortforLOL-LightItalic.woff new file mode 100644 index 0000000..9dab9e7 Binary files /dev/null and b/src/main/resources/frontend_static/fonts/BeaufortforLOL-LightItalic.woff differ diff --git a/src/main/resources/frontend_static/fonts/BeaufortforLOL-LightItalicd41d.eot b/src/main/resources/frontend_static/fonts/BeaufortforLOL-LightItalicd41d.eot new file mode 100644 index 0000000..40d58cf Binary files /dev/null and b/src/main/resources/frontend_static/fonts/BeaufortforLOL-LightItalicd41d.eot differ diff --git a/src/main/resources/frontend_static/fonts/BeaufortforLOL-Lightd41d.eot b/src/main/resources/frontend_static/fonts/BeaufortforLOL-Lightd41d.eot new file mode 100644 index 0000000..6f240a6 Binary files /dev/null and b/src/main/resources/frontend_static/fonts/BeaufortforLOL-Lightd41d.eot differ diff --git a/src/main/resources/frontend_static/fonts/BeaufortforLOL-Medium.svg b/src/main/resources/frontend_static/fonts/BeaufortforLOL-Medium.svg new file mode 100644 index 0000000..e1f6670 --- /dev/null +++ b/src/main/resources/frontend_static/fonts/BeaufortforLOL-Medium.svg @@ -0,0 +1,1317 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/frontend_static/fonts/BeaufortforLOL-Medium.ttf b/src/main/resources/frontend_static/fonts/BeaufortforLOL-Medium.ttf new file mode 100644 index 0000000..e729c18 Binary files /dev/null and b/src/main/resources/frontend_static/fonts/BeaufortforLOL-Medium.ttf differ diff --git a/src/main/resources/frontend_static/fonts/BeaufortforLOL-Medium.woff b/src/main/resources/frontend_static/fonts/BeaufortforLOL-Medium.woff new file mode 100644 index 0000000..c30ecec Binary files /dev/null and b/src/main/resources/frontend_static/fonts/BeaufortforLOL-Medium.woff differ diff --git a/src/main/resources/frontend_static/fonts/BeaufortforLOL-MediumItalic.svg b/src/main/resources/frontend_static/fonts/BeaufortforLOL-MediumItalic.svg new file mode 100644 index 0000000..ad9927b --- /dev/null +++ b/src/main/resources/frontend_static/fonts/BeaufortforLOL-MediumItalic.svg @@ -0,0 +1,1316 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/frontend_static/fonts/BeaufortforLOL-MediumItalic.ttf b/src/main/resources/frontend_static/fonts/BeaufortforLOL-MediumItalic.ttf new file mode 100644 index 0000000..d71cdc9 Binary files /dev/null and b/src/main/resources/frontend_static/fonts/BeaufortforLOL-MediumItalic.ttf differ diff --git a/src/main/resources/frontend_static/fonts/BeaufortforLOL-MediumItalic.woff b/src/main/resources/frontend_static/fonts/BeaufortforLOL-MediumItalic.woff new file mode 100644 index 0000000..973245a Binary files /dev/null and b/src/main/resources/frontend_static/fonts/BeaufortforLOL-MediumItalic.woff differ diff --git a/src/main/resources/frontend_static/fonts/BeaufortforLOL-MediumItalicd41d.eot b/src/main/resources/frontend_static/fonts/BeaufortforLOL-MediumItalicd41d.eot new file mode 100644 index 0000000..795501c Binary files /dev/null and b/src/main/resources/frontend_static/fonts/BeaufortforLOL-MediumItalicd41d.eot differ diff --git a/src/main/resources/frontend_static/fonts/BeaufortforLOL-Mediumd41d.eot b/src/main/resources/frontend_static/fonts/BeaufortforLOL-Mediumd41d.eot new file mode 100644 index 0000000..d4dbd0d Binary files /dev/null and b/src/main/resources/frontend_static/fonts/BeaufortforLOL-Mediumd41d.eot differ diff --git a/src/main/resources/frontend_static/fonts/BeaufortforLOL-Regular.svg b/src/main/resources/frontend_static/fonts/BeaufortforLOL-Regular.svg new file mode 100644 index 0000000..f23e2b3 --- /dev/null +++ b/src/main/resources/frontend_static/fonts/BeaufortforLOL-Regular.svg @@ -0,0 +1,1314 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/frontend_static/fonts/BeaufortforLOL-Regular.ttf b/src/main/resources/frontend_static/fonts/BeaufortforLOL-Regular.ttf new file mode 100644 index 0000000..05fb1ff Binary files /dev/null and b/src/main/resources/frontend_static/fonts/BeaufortforLOL-Regular.ttf differ diff --git a/src/main/resources/frontend_static/fonts/BeaufortforLOL-Regular.woff b/src/main/resources/frontend_static/fonts/BeaufortforLOL-Regular.woff new file mode 100644 index 0000000..eb0f986 Binary files /dev/null and b/src/main/resources/frontend_static/fonts/BeaufortforLOL-Regular.woff differ diff --git a/src/main/resources/frontend_static/fonts/BeaufortforLOL-Regulard41d.eot b/src/main/resources/frontend_static/fonts/BeaufortforLOL-Regulard41d.eot new file mode 100644 index 0000000..90fe0d6 Binary files /dev/null and b/src/main/resources/frontend_static/fonts/BeaufortforLOL-Regulard41d.eot differ diff --git a/src/main/resources/frontend_static/img/checkbox-sprite.png b/src/main/resources/frontend_static/img/checkbox-sprite.png new file mode 100644 index 0000000..010dc5a Binary files /dev/null and b/src/main/resources/frontend_static/img/checkbox-sprite.png differ diff --git a/src/main/resources/frontend_static/img/construct/domination/construct.png b/src/main/resources/frontend_static/img/construct/domination/construct.png new file mode 100644 index 0000000..7e280a4 Binary files /dev/null and b/src/main/resources/frontend_static/img/construct/domination/construct.png differ diff --git a/src/main/resources/frontend_static/img/construct/domination/environment.png b/src/main/resources/frontend_static/img/construct/domination/environment.png new file mode 100644 index 0000000..4fd6803 Binary files /dev/null and b/src/main/resources/frontend_static/img/construct/domination/environment.png differ diff --git a/src/main/resources/frontend_static/img/construct/inspiration/construct.png b/src/main/resources/frontend_static/img/construct/inspiration/construct.png new file mode 100644 index 0000000..a7d056c Binary files /dev/null and b/src/main/resources/frontend_static/img/construct/inspiration/construct.png differ diff --git a/src/main/resources/frontend_static/img/construct/inspiration/environment.png b/src/main/resources/frontend_static/img/construct/inspiration/environment.png new file mode 100644 index 0000000..e430fbd Binary files /dev/null and b/src/main/resources/frontend_static/img/construct/inspiration/environment.png differ diff --git a/src/main/resources/frontend_static/img/construct/precision/construct.png b/src/main/resources/frontend_static/img/construct/precision/construct.png new file mode 100644 index 0000000..dc9f24f Binary files /dev/null and b/src/main/resources/frontend_static/img/construct/precision/construct.png differ diff --git a/src/main/resources/frontend_static/img/construct/precision/environment.png b/src/main/resources/frontend_static/img/construct/precision/environment.png new file mode 100644 index 0000000..fff5f65 Binary files /dev/null and b/src/main/resources/frontend_static/img/construct/precision/environment.png differ diff --git a/src/main/resources/frontend_static/img/construct/resolve/construct.png b/src/main/resources/frontend_static/img/construct/resolve/construct.png new file mode 100644 index 0000000..fa8ccdc Binary files /dev/null and b/src/main/resources/frontend_static/img/construct/resolve/construct.png differ diff --git a/src/main/resources/frontend_static/img/construct/resolve/environment.png b/src/main/resources/frontend_static/img/construct/resolve/environment.png new file mode 100644 index 0000000..796882f Binary files /dev/null and b/src/main/resources/frontend_static/img/construct/resolve/environment.png differ diff --git a/src/main/resources/frontend_static/img/construct/sorcery/construct.png b/src/main/resources/frontend_static/img/construct/sorcery/construct.png new file mode 100644 index 0000000..a0f1bc2 Binary files /dev/null and b/src/main/resources/frontend_static/img/construct/sorcery/construct.png differ diff --git a/src/main/resources/frontend_static/img/construct/sorcery/environment.png b/src/main/resources/frontend_static/img/construct/sorcery/environment.png new file mode 100644 index 0000000..5b4cdb2 Binary files /dev/null and b/src/main/resources/frontend_static/img/construct/sorcery/environment.png differ diff --git a/src/main/resources/frontend_static/img/logo-icon.png b/src/main/resources/frontend_static/img/logo-icon.png new file mode 100644 index 0000000..6ff2ad3 Binary files /dev/null and b/src/main/resources/frontend_static/img/logo-icon.png differ diff --git a/src/main/resources/frontend_static/img/ring.png b/src/main/resources/frontend_static/img/ring.png new file mode 100644 index 0000000..722909b Binary files /dev/null and b/src/main/resources/frontend_static/img/ring.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8005.png b/src/main/resources/frontend_static/img/runes-108x108/8005.png new file mode 100644 index 0000000..bd97a7a Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8005.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8008.png b/src/main/resources/frontend_static/img/runes-108x108/8008.png new file mode 100644 index 0000000..168d738 Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8008.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8009.png b/src/main/resources/frontend_static/img/runes-108x108/8009.png new file mode 100644 index 0000000..5c745ee Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8009.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8014.png b/src/main/resources/frontend_static/img/runes-108x108/8014.png new file mode 100644 index 0000000..3864b5b Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8014.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8017.png b/src/main/resources/frontend_static/img/runes-108x108/8017.png new file mode 100644 index 0000000..1ddf393 Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8017.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8021.png b/src/main/resources/frontend_static/img/runes-108x108/8021.png new file mode 100644 index 0000000..9805f84 Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8021.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8105.png b/src/main/resources/frontend_static/img/runes-108x108/8105.png new file mode 100644 index 0000000..c0b947f Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8105.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8112.png b/src/main/resources/frontend_static/img/runes-108x108/8112.png new file mode 100644 index 0000000..66805b1 Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8112.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8120.png b/src/main/resources/frontend_static/img/runes-108x108/8120.png new file mode 100644 index 0000000..92e3aa1 Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8120.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8124.png b/src/main/resources/frontend_static/img/runes-108x108/8124.png new file mode 100644 index 0000000..aec728a Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8124.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8126.png b/src/main/resources/frontend_static/img/runes-108x108/8126.png new file mode 100644 index 0000000..f6f68ad Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8126.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8128.png b/src/main/resources/frontend_static/img/runes-108x108/8128.png new file mode 100644 index 0000000..8b51ff0 Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8128.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8134.png b/src/main/resources/frontend_static/img/runes-108x108/8134.png new file mode 100644 index 0000000..9d2c827 Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8134.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8135.png b/src/main/resources/frontend_static/img/runes-108x108/8135.png new file mode 100644 index 0000000..c2ebc0b Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8135.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8136.png b/src/main/resources/frontend_static/img/runes-108x108/8136.png new file mode 100644 index 0000000..bcd477e Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8136.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8138.png b/src/main/resources/frontend_static/img/runes-108x108/8138.png new file mode 100644 index 0000000..d3efe33 Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8138.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8139.png b/src/main/resources/frontend_static/img/runes-108x108/8139.png new file mode 100644 index 0000000..c39dff5 Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8139.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8143.png b/src/main/resources/frontend_static/img/runes-108x108/8143.png new file mode 100644 index 0000000..7f5e1f6 Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8143.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8210.png b/src/main/resources/frontend_static/img/runes-108x108/8210.png new file mode 100644 index 0000000..bfac3f1 Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8210.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8214.png b/src/main/resources/frontend_static/img/runes-108x108/8214.png new file mode 100644 index 0000000..6a55ccf Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8214.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8224.png b/src/main/resources/frontend_static/img/runes-108x108/8224.png new file mode 100644 index 0000000..52596c4 Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8224.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8226.png b/src/main/resources/frontend_static/img/runes-108x108/8226.png new file mode 100644 index 0000000..69cce2a Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8226.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8229.png b/src/main/resources/frontend_static/img/runes-108x108/8229.png new file mode 100644 index 0000000..fd895f5 Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8229.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8230.png b/src/main/resources/frontend_static/img/runes-108x108/8230.png new file mode 100644 index 0000000..76e4001 Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8230.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8232.png b/src/main/resources/frontend_static/img/runes-108x108/8232.png new file mode 100644 index 0000000..9ddb7a1 Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8232.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8233.png b/src/main/resources/frontend_static/img/runes-108x108/8233.png new file mode 100644 index 0000000..b3780f3 Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8233.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8234.png b/src/main/resources/frontend_static/img/runes-108x108/8234.png new file mode 100644 index 0000000..eab6cdb Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8234.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8236.png b/src/main/resources/frontend_static/img/runes-108x108/8236.png new file mode 100644 index 0000000..a5b5196 Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8236.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8237.png b/src/main/resources/frontend_static/img/runes-108x108/8237.png new file mode 100644 index 0000000..bd63da8 Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8237.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8242.png b/src/main/resources/frontend_static/img/runes-108x108/8242.png new file mode 100644 index 0000000..66c62dc Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8242.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8243.png b/src/main/resources/frontend_static/img/runes-108x108/8243.png new file mode 100644 index 0000000..c71972f Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8243.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8299.png b/src/main/resources/frontend_static/img/runes-108x108/8299.png new file mode 100644 index 0000000..15cc159 Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8299.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8304.png b/src/main/resources/frontend_static/img/runes-108x108/8304.png new file mode 100644 index 0000000..80ac71b Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8304.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8306.png b/src/main/resources/frontend_static/img/runes-108x108/8306.png new file mode 100644 index 0000000..d5151e8 Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8306.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8313.png b/src/main/resources/frontend_static/img/runes-108x108/8313.png new file mode 100644 index 0000000..d9cddd5 Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8313.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8316.png b/src/main/resources/frontend_static/img/runes-108x108/8316.png new file mode 100644 index 0000000..a3d39c2 Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8316.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8321.png b/src/main/resources/frontend_static/img/runes-108x108/8321.png new file mode 100644 index 0000000..3b25993 Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8321.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8326.png b/src/main/resources/frontend_static/img/runes-108x108/8326.png new file mode 100644 index 0000000..a07ffab Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8326.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8339.png b/src/main/resources/frontend_static/img/runes-108x108/8339.png new file mode 100644 index 0000000..3e14223 Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8339.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8345.png b/src/main/resources/frontend_static/img/runes-108x108/8345.png new file mode 100644 index 0000000..21418c1 Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8345.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8347.png b/src/main/resources/frontend_static/img/runes-108x108/8347.png new file mode 100644 index 0000000..3d36223 Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8347.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8351.png b/src/main/resources/frontend_static/img/runes-108x108/8351.png new file mode 100644 index 0000000..63867fe Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8351.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8359.png b/src/main/resources/frontend_static/img/runes-108x108/8359.png new file mode 100644 index 0000000..a1a2488 Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8359.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8410.png b/src/main/resources/frontend_static/img/runes-108x108/8410.png new file mode 100644 index 0000000..1578c3b Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8410.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8429.png b/src/main/resources/frontend_static/img/runes-108x108/8429.png new file mode 100644 index 0000000..1f2268a Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8429.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8430.png b/src/main/resources/frontend_static/img/runes-108x108/8430.png new file mode 100644 index 0000000..137428e Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8430.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8435.png b/src/main/resources/frontend_static/img/runes-108x108/8435.png new file mode 100644 index 0000000..01476ca Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8435.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8437.png b/src/main/resources/frontend_static/img/runes-108x108/8437.png new file mode 100644 index 0000000..ef33a82 Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8437.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8439.png b/src/main/resources/frontend_static/img/runes-108x108/8439.png new file mode 100644 index 0000000..212b928 Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8439.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8444.png b/src/main/resources/frontend_static/img/runes-108x108/8444.png new file mode 100644 index 0000000..0d272a1 Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8444.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8446.png b/src/main/resources/frontend_static/img/runes-108x108/8446.png new file mode 100644 index 0000000..35318cd Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8446.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8451.png b/src/main/resources/frontend_static/img/runes-108x108/8451.png new file mode 100644 index 0000000..0df3b04 Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8451.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8453.png b/src/main/resources/frontend_static/img/runes-108x108/8453.png new file mode 100644 index 0000000..1502e6f Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8453.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8463.png b/src/main/resources/frontend_static/img/runes-108x108/8463.png new file mode 100644 index 0000000..4c0d992 Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8463.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/8465.png b/src/main/resources/frontend_static/img/runes-108x108/8465.png new file mode 100644 index 0000000..d34a721 Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/8465.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/9101.png b/src/main/resources/frontend_static/img/runes-108x108/9101.png new file mode 100644 index 0000000..f995240 Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/9101.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/9103.png b/src/main/resources/frontend_static/img/runes-108x108/9103.png new file mode 100644 index 0000000..a4333fe Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/9103.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/9104.png b/src/main/resources/frontend_static/img/runes-108x108/9104.png new file mode 100644 index 0000000..e7ac25e Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/9104.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/9105.png b/src/main/resources/frontend_static/img/runes-108x108/9105.png new file mode 100644 index 0000000..3f87cdb Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/9105.png differ diff --git a/src/main/resources/frontend_static/img/runes-108x108/9111.png b/src/main/resources/frontend_static/img/runes-108x108/9111.png new file mode 100644 index 0000000..90c0390 Binary files /dev/null and b/src/main/resources/frontend_static/img/runes-108x108/9111.png differ diff --git a/src/main/resources/frontend_static/img/style-icons/36x36/domination.png b/src/main/resources/frontend_static/img/style-icons/36x36/domination.png new file mode 100644 index 0000000..fddbc28 Binary files /dev/null and b/src/main/resources/frontend_static/img/style-icons/36x36/domination.png differ diff --git a/src/main/resources/frontend_static/img/style-icons/36x36/inspiration.png b/src/main/resources/frontend_static/img/style-icons/36x36/inspiration.png new file mode 100644 index 0000000..2174b06 Binary files /dev/null and b/src/main/resources/frontend_static/img/style-icons/36x36/inspiration.png differ diff --git a/src/main/resources/frontend_static/img/style-icons/36x36/precision.png b/src/main/resources/frontend_static/img/style-icons/36x36/precision.png new file mode 100644 index 0000000..9693e9a Binary files /dev/null and b/src/main/resources/frontend_static/img/style-icons/36x36/precision.png differ diff --git a/src/main/resources/frontend_static/img/style-icons/36x36/resolve.png b/src/main/resources/frontend_static/img/style-icons/36x36/resolve.png new file mode 100644 index 0000000..2c45f7e Binary files /dev/null and b/src/main/resources/frontend_static/img/style-icons/36x36/resolve.png differ diff --git a/src/main/resources/frontend_static/img/style-icons/36x36/sorcery.png b/src/main/resources/frontend_static/img/style-icons/36x36/sorcery.png new file mode 100644 index 0000000..edb50cc Binary files /dev/null and b/src/main/resources/frontend_static/img/style-icons/36x36/sorcery.png differ diff --git a/src/main/resources/frontend_static/img/style-icons/domination.png b/src/main/resources/frontend_static/img/style-icons/domination.png new file mode 100644 index 0000000..7cf53d2 Binary files /dev/null and b/src/main/resources/frontend_static/img/style-icons/domination.png differ diff --git a/src/main/resources/frontend_static/img/style-icons/inspiration.png b/src/main/resources/frontend_static/img/style-icons/inspiration.png new file mode 100644 index 0000000..a8f97bd Binary files /dev/null and b/src/main/resources/frontend_static/img/style-icons/inspiration.png differ diff --git a/src/main/resources/frontend_static/img/style-icons/precision.png b/src/main/resources/frontend_static/img/style-icons/precision.png new file mode 100644 index 0000000..0bc8354 Binary files /dev/null and b/src/main/resources/frontend_static/img/style-icons/precision.png differ diff --git a/src/main/resources/frontend_static/img/style-icons/resolve.png b/src/main/resources/frontend_static/img/style-icons/resolve.png new file mode 100644 index 0000000..a737f6d Binary files /dev/null and b/src/main/resources/frontend_static/img/style-icons/resolve.png differ diff --git a/src/main/resources/frontend_static/img/style-icons/sorcery.png b/src/main/resources/frontend_static/img/style-icons/sorcery.png new file mode 100644 index 0000000..9a0210d Binary files /dev/null and b/src/main/resources/frontend_static/img/style-icons/sorcery.png differ diff --git a/src/main/resources/frontend_static/img/style-vfx/domination.png b/src/main/resources/frontend_static/img/style-vfx/domination.png new file mode 100644 index 0000000..8430f7e Binary files /dev/null and b/src/main/resources/frontend_static/img/style-vfx/domination.png differ diff --git a/src/main/resources/frontend_static/img/style-vfx/inspiration.png b/src/main/resources/frontend_static/img/style-vfx/inspiration.png new file mode 100644 index 0000000..c1079ad Binary files /dev/null and b/src/main/resources/frontend_static/img/style-vfx/inspiration.png differ diff --git a/src/main/resources/frontend_static/img/style-vfx/precision.png b/src/main/resources/frontend_static/img/style-vfx/precision.png new file mode 100644 index 0000000..feadf3b Binary files /dev/null and b/src/main/resources/frontend_static/img/style-vfx/precision.png differ diff --git a/src/main/resources/frontend_static/img/style-vfx/resolve.png b/src/main/resources/frontend_static/img/style-vfx/resolve.png new file mode 100644 index 0000000..3b97f14 Binary files /dev/null and b/src/main/resources/frontend_static/img/style-vfx/resolve.png differ diff --git a/src/main/resources/frontend_static/img/style-vfx/sorcery.png b/src/main/resources/frontend_static/img/style-vfx/sorcery.png new file mode 100644 index 0000000..f6c6653 Binary files /dev/null and b/src/main/resources/frontend_static/img/style-vfx/sorcery.png differ diff --git a/src/main/resources/frontend_static/img/tooltip-caret.png b/src/main/resources/frontend_static/img/tooltip-caret.png new file mode 100644 index 0000000..af89729 Binary files /dev/null and b/src/main/resources/frontend_static/img/tooltip-caret.png differ diff --git a/src/main/resources/frontend_static/index.html b/src/main/resources/frontend_static/index.html new file mode 100644 index 0000000..fcc1e4f --- /dev/null +++ b/src/main/resources/frontend_static/index.html @@ -0,0 +1,101 @@ + + + + + + + + RuneCoach + + + + + + + + + +
    +
    +
    + RuneCoach helps you build rune pages by trying to explain why individual runes do or don't work well on + individual champions. + Select a champion to get started, then check the tooltips in the rune builder for information about each + rune. +
    +
    +
    +

    RuneCoach

    +
    +

    Select a Champion

    +
    +
    +
    +

    Choose your Runes

    +
    +
    +
    + +

    About RuneCoach

    +

    This is where stuff goes

    +

    FAQ

    +

    Question #1

    +

    Answer to Q1

    +

    Question #2

    +

    Answer

    +
    +
    +

    + RuneCoach isn't endorsed by Riot Games and doesn't reflect the views or opinions of Riot Games or anyone + officially involved in producing or managing League of Legends. League of Legends and Riot Games are + trademarks or registered trademarks of Riot Games, Inc. League of Legends © Riot Games, Inc. +

    +
    +
    +
    + + + + + + + + diff --git a/src/main/resources/frontend_static/js/main.js b/src/main/resources/frontend_static/js/main.js new file mode 100644 index 0000000..a980c13 --- /dev/null +++ b/src/main/resources/frontend_static/js/main.js @@ -0,0 +1,212 @@ +// This is a modified version of a minified file from https://na.leagueoflegends.com/en/featured/preseason-update#builder +webpackJsonp( + [2], + { + 11: function (t, e, n) { + "use strict"; + + function r(t) { + return "" + versionedAssetPath + t; + } + + function o(t) { + } + + Object.defineProperty(e, "__esModule", {value: !0}); + var a = + Object.assign || + function (t) { + for (var e = 1; e < arguments.length; e++) { + var n = arguments[e]; + for (var r in n) Object.prototype.hasOwnProperty.call(n, r) && (t[r] = n[r]); + } + return t; + }; + (e.assetPath = r), (e.pushToDataLayer = o); + e.default = {assetPath: r, pushToDataLayer: o}; + }, + 241: function (t, e, n) { + "use strict"; + n(242), n(443), n(444), n(445), n(446), n(447), n(448); + }, + 443: function (t, e, n) { + "use strict"; + + function r() { + (i.style.transform = "translate3d(0, " + Math.floor(0.35 * a.default.viewportTop) + "px, 0)"), (c = window.requestAnimationFrame(r)); + } + + var o = n(58), + a = (function (t) { + return t && t.__esModule ? t : {default: t}; + })(o), + i = document.querySelector(".js-hero-backdrop"), + c = null; + if (i) { + var u = a.default.create(i); + u && + (u.enterViewport(r), + u.exitViewport(function () { + window.cancelAnimationFrame(c); + })); + } + }, + 444: function (t, e, n) { + "use strict"; + + function r() { + (c.style.paddingTop = u.offsetHeight + "px"), u.classList.add("is-fixed"); + } + + function o() { + (c.style.paddingTop = ""), u.classList.remove("is-fixed"); + } + + var a = n(58), + i = (function (t) { + return t && t.__esModule ? t : {default: t}; + })(a), + u = null; + }, + 445: function (t, e, n) { + "use strict"; + n(188).polyfill(), + [] + .concat( + (function (t) { + if (Array.isArray(t)) { + for (var e = 0, n = Array(t.length); e < t.length; e++) n[e] = t[e]; + return n; + } + return Array.from(t); + })(document.querySelectorAll(".js-scroll-to")) + ) + .forEach(function (t) { + t.addEventListener("click", function () { + var e = document.querySelector(t.hash); + e && window.scrollTo({ + top: e.getBoundingClientRect().top + (window.scrollY || window.pageYOffset), + left: 0, + behavior: "smooth" + }); + }); + }); + }, + 446: function (t, e, n) { + "use strict"; + var r = n(58), + o = (function (t) { + return t && t.__esModule ? t : {default: t}; + })(r); + [] + .concat( + (function (t) { + if (Array.isArray(t)) { + for (var e = 0, n = Array(t.length); e < t.length; e++) n[e] = t[e]; + return n; + } + return Array.from(t); + })(document.querySelectorAll(".js-active-in-view")) + ) + .forEach(function (t) { + var e = o.default.create(t, 0.1 * window.innerHeight); + e.enterViewport(function () { + t.classList.add("is-active"), e.destroy(); + }); + }); + }, + 447: function (t, e, n) { + "use strict"; + + function r(t) { + if (Array.isArray(t)) { + for (var e = 0, n = Array(t.length); e < t.length; e++) n[e] = t[e]; + return n; + } + return Array.from(t); + } + + function o(t) { + return new Promise(function (e, n) { + var r = new Image(), + o = t.getAttribute("data-src"); + o || n("No 'data-src' set on " + t), + (r.onload = function () { + (t.src = o), e(); + }), + (r.onerror = function () { + n(); + }), + (r.src = o); + }); + } + + function a() { + s.forEach(function (t) { + t.style.background = ""; + }); + } + + var i = n(58), + c = (function (t) { + return t && t.__esModule ? t : {default: t}; + })(i), + u = n(11), + l = [].concat(r(document.querySelectorAll(".js-lazy-image"))), + s = [].concat(r(document.querySelectorAll(".js-lazy-background"))); + l.forEach(function (t) { + var e = c.default.create(t, 0.5 * window.innerHeight), + n = window.getComputedStyle(t), + r = "all 0s ease 0s" === n.transition; + (t.style.opacity = 0), + (t.src = (0, u.assetPath)("/img/global/blank.gif")), + r && (t.style.transition = "opacity 300ms"), + e.enterViewport(function () { + o(t).then(function () { + (t.style.opacity = ""), + window.setTimeout(function () { + r && (t.style.transition = ""); + }, 300); + }); + }); + }), + window.addEventListener("load", a); + }, + 448: function (t, e, n) { + "use strict"; + + function r(t) { + if (Array.isArray(t)) { + for (var e = 0, n = Array(t.length); e < t.length; e++) n[e] = t[e]; + return n; + } + return Array.from(t); + } + + var o = n(58), + a = (function (t) { + return t && t.__esModule ? t : {default: t}; + })(o), + i = n(11), + c = [].concat(r(document.querySelectorAll(".js-scroll-marker"))); + c && + c.forEach(function (t) { + var e = a.default.create(t), + n = {eventAction: "Scroll", eventLabel: t.id}; + e.fullyEnterViewport(function () { + (0, i.pushToDataLayer)(n); + }); + }); + var u = [].concat(r(document.querySelectorAll(".js-push-click"))); + u && + u.forEach(function (t) { + var e = t.getAttribute("data-event-label"), + n = {eventAction: "Click", eventLabel: e}; + t.addEventListener("click", function () { + (0, i.pushToDataLayer)(n); + }); + }); + } + }, + [241] +); diff --git a/src/main/resources/frontend_static/js/runeBuilder.js b/src/main/resources/frontend_static/js/runeBuilder.js new file mode 100644 index 0000000..42778e4 --- /dev/null +++ b/src/main/resources/frontend_static/js/runeBuilder.js @@ -0,0 +1,4529 @@ +// This is a modified version of a minified file from https://na.leagueoflegends.com/en/featured/preseason-update#builder +webpackJsonp( + [0], + { + 11: function (e, t, n) { + "use strict"; + + function r(e) { + return "" + versionedAssetPath + e; + } + + function o(e) { + if ("function" == typeof window.dataLayer.push) { + var t = a({}, i, e); + window.dataLayer.push(t); + } + } + + Object.defineProperty(t, "__esModule", {value: !0}); + var a = + Object.assign || + function (e) { + for (var t = 1; t < arguments.length; t++) { + var n = arguments[t]; + for (var r in n) Object.prototype.hasOwnProperty.call(n, r) && (e[r] = n[r]); + } + return e; + }; + (t.assetPath = r), (t.pushToDataLayer = o); + t.default = {assetPath: r, pushToDataLayer: o}; + }, + 141: function (e, t, n) { + "use strict"; + Object.defineProperty(t, "__esModule", {value: !0}); + var r = n(11); + t.default = [ + { + slug: "resolve", + id: 8400, + landing: { + icon: (0, r.assetPath)("/img/style-icons/resolve.png"), + vfx: (0, r.assetPath)("/img/style-vfx/resolve.png") + }, + construct: (0, r.assetPath)("/img/construct/resolve"), + icon: (0, r.assetPath)("/img/style-icons/36x36/resolve.png"), + colors: {title: "#a1d586", gradient: {top: "#a1d586", bottom: "#a4d08d"}} + }, + { + slug: "domination", + id: 8100, + construct: (0, r.assetPath)("/img/construct/domination"), + landing: { + icon: (0, r.assetPath)("/img/style-icons/domination.png"), + vfx: (0, r.assetPath)("/img/style-vfx/domination.png") + }, + icon: (0, r.assetPath)("/img/style-icons/36x36/domination.png"), + colors: {title: "#d44242", gradient: {top: "#d44242", bottom: "#dc4747"}} + }, + { + slug: "precision", + id: 8e3, + construct: (0, r.assetPath)("/img/construct/precision"), + landing: { + icon: (0, r.assetPath)("/img/style-icons/precision.png"), + vfx: (0, r.assetPath)("/img/style-vfx/precision.png") + }, + icon: (0, r.assetPath)("/img/style-icons/36x36/precision.png"), + colors: {title: "#c8aa6e", gradient: {top: "#c8aa6e", bottom: "#aea789"}} + }, + { + slug: "sorcery", + id: 8200, + construct: (0, r.assetPath)("/img/construct/sorcery"), + landing: { + icon: (0, r.assetPath)("/img/style-icons/sorcery.png"), + vfx: (0, r.assetPath)("/img/style-vfx/sorcery.png") + }, + icon: (0, r.assetPath)("/img/style-icons/36x36/sorcery.png"), + colors: {title: "#9faafc", gradient: {top: "#9faafc", bottom: "#6c75f5"}} + }, + { + slug: "inspiration", + id: 8300, + construct: (0, r.assetPath)("/img/construct/inspiration"), + landing: { + icon: (0, r.assetPath)("/img/style-icons/inspiration.png"), + vfx: (0, r.assetPath)("/img/style-vfx/inspiration.png") + }, + icon: (0, r.assetPath)("/img/style-icons/36x36/inspiration.png"), + colors: {title: "#49aab9", gradient: {top: "#49aab9", bottom: "#48b4be"}} + } + ]; + }, + 142: function (e, t, n) { + "use strict"; + + function r(e) { + return e && e.__esModule ? e : {default: e}; + } + + function o(e, t) { + if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function"); + } + + function a(e, t) { + if (!e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + return !t || ("object" != typeof t && "function" != typeof t) ? e : t; + } + + function i(e, t) { + if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function, not " + typeof t); + (e.prototype = Object.create(t && t.prototype, { + constructor: { + value: e, + enumerable: !1, + writable: !0, + configurable: !0 + } + })), + t && (Object.setPrototypeOf ? Object.setPrototypeOf(e, t) : (e.__proto__ = t)); + } + + Object.defineProperty(t, "__esModule", {value: !0}); + var l = (function () { + function e(e, t) { + for (var n = 0; n < t.length; n++) { + var r = t[n]; + (r.enumerable = r.enumerable || !1), (r.configurable = !0), "value" in r && (r.writable = !0), Object.defineProperty(e, r.key, r); + } + } + + return function (t, n, r) { + return n && e(t.prototype, n), r && e(t, r), t; + }; + })(), + u = n(1), + s = r(u), + c = n(2), + f = r(c), + d = n(11), + p = n(571), + h = r(p), + m = (0, c.keyframes)(["from{opacity:0;}to{opacity:1;}"]), + y = (0, f.default)("div").withConfig({displayName: "ToolTip__ToolTipBlock"})( + [ + "pointer-events:none;width:284px;box-shadow:0 0 0 1px rgba(1,10,19,0.48);color:#a09b8c;font-size:12px;font-weight:normal;line-height:16px;letter-spacing:0.025em;position:fixed;backface-visibility:hidden;z-index:1000;animation:", + " 0.5s ease forwards;" + ], + m + ), + g = (0, f.default)("div").withConfig({displayName: "ToolTip__ToolTipContent"})(["padding:20px 20px 1px;border:2px solid #5d471d;background:#010a13;position:relative;z-index:10;"]), + v = (0, f.default)("div").withConfig({displayName: "ToolTip__ToolTipCarot"})( + ['width:24px;height:15px;background:url("', '");position:absolute;margin:-4px -12px;top:100%;left:50%;transform:translateX(', "px);"], + (0, d.assetPath)("/img/tooltip-caret.png"), + function (e) { + return e.leftOffset; + } + ), + _ = (function (e) { + function t(e) { + o(this, t); + var n = a(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e)); + return (n.state = {top: n.props.top, left: n.props.left}), n; + } + + return ( + i(t, e), + l(t, [ + { + key: "componentDidMount", + value: function () { + var e = document.querySelector("#perks-app"), + t = this.wrap.getBoundingClientRect(), + n = e.getBoundingClientRect(), + r = this.props.top - t.height - 15, + o = this.props.left - t.width / 2, + a = 0, + i = o < n.left + 25, + l = o + t.width > n.left + n.width - 25; + if (i) { + var u = n.left + 25; + (a = o - u), (o = u); + } + if (l) { + var s = n.left + n.width - t.width - 25; + (a = o - s), (o = s); + } + this.setState({top: r, left: o, leftOffset: a}); + } + }, + { + key: "render", + value: function () { + var e = this, + t = this.state, + n = t.top, + r = t.left, + o = t.leftOffset; + return s.default.createElement( + y, + { + innerRef: function (t) { + e.wrap = t; + }, + style: {top: n, left: r} + }, + this.props.children, + s.default.createElement(v, {leftOffset: o}) + ); + } + } + ]), + t + ); + })(s.default.Component), + w = (function (e) { + function t(e) { + o(this, t); + var n = a(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e)); + return (n.state = { + isOpen: !1, + top: 0, + left: 0 + }), (n.open = n.open.bind(n)), (n.close = n.close.bind(n)), n; + } + + return ( + i(t, e), + l(t, [ + { + key: "componentDidMount", + value: function () { + window.addEventListener("scroll", this.close); + } + }, + { + key: "componentWillUnmount", + value: function () { + this.close(), window.removeEventListener("scroll", this.close); + } + }, + { + key: "open", + value: function () { + var e = this._portal.getBoundingClientRect(); + this.setState({isOpen: !0, top: e.top, left: e.left + e.width / 2}); + } + }, + { + key: "close", + value: function () { + this.setState({isOpen: !1}); + } + }, + { + key: "render", + value: function () { + var e = this, + t = this.state, + n = t.left, + r = t.top, + o = t.isOpen; + return this.props.content + ? s.default.createElement( + "div", + { + ref: function (t) { + e._portal = t; + }, + onMouseEnter: this.open, + onMouseLeave: this.close + }, + this.props.children, + s.default.createElement(h.default, {isOpened: o}, s.default.createElement(_, { + top: r, + left: n + }, s.default.createElement(g, null, this.props.content))) + ) + : this.props.children; + } + } + ]), + t + ); + })(s.default.Component); + t.default = w; + }, + 143: function (e, t, n) { + "use strict"; + + function r(e) { + return e && e.__esModule ? e : {default: e}; + } + + function o(e, t) { + if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function"); + } + + function a(e, t) { + if (!e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + return !t || ("object" != typeof t && "function" != typeof t) ? e : t; + } + + function i(e, t) { + if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function, not " + typeof t); + (e.prototype = Object.create(t && t.prototype, { + constructor: { + value: e, + enumerable: !1, + writable: !0, + configurable: !0 + } + })), + t && (Object.setPrototypeOf ? Object.setPrototypeOf(e, t) : (e.__proto__ = t)); + } + + Object.defineProperty(t, "__esModule", {value: !0}); + var l = (function () { + function e(e, t) { + for (var n = 0; n < t.length; n++) { + var r = t[n]; + (r.enumerable = r.enumerable || !1), (r.configurable = !0), "value" in r && (r.writable = !0), Object.defineProperty(e, r.key, r); + } + } + + return function (t, n, r) { + return n && e(t.prototype, n), r && e(t, r), t; + }; + })(), + u = n(1), + s = r(u), + c = n(579), + f = r(c), + d = (function (e) { + function t() { + return o(this, t), a(this, (t.__proto__ || Object.getPrototypeOf(t)).apply(this, arguments)); + } + + return ( + i(t, e), + l(t, [ + { + key: "componentDidMount", + value: function () { + var e = this.props.lines, + t = void 0 === e ? 2 : e, + n = this.innerRef || this.ref; + if (n) { + var r = parseFloat(window.getComputedStyle(n).lineHeight), + o = r * t; + (0, f.default)(n, o); + } + } + }, + { + key: "shouldComponentUpdate", + value: function () { + return !1; + } + }, + { + key: "render", + value: function () { + var e = this; + return s.default.cloneElement(this.props.children, { + innerRef: function (t) { + e.innerRef = t; + }, + ref: function (t) { + e.ref = t; + } + }); + } + } + ]), + t + ); + })(s.default.Component); + t.default = d; + }, + 144: function (e, t, n) { + "use strict"; + + function r(e) { + return e && e.__esModule ? e : {default: e}; + } + + function o(e, t) { + var n = {}; + for (var r in e) t.indexOf(r) >= 0 || (Object.prototype.hasOwnProperty.call(e, r) && (n[r] = e[r])); + return n; + } + + Object.defineProperty(t, "__esModule", {value: !0}); + var a = + Object.assign || + function (e) { + for (var t = 1; t < arguments.length; t++) { + var n = arguments[t]; + for (var r in n) Object.prototype.hasOwnProperty.call(n, r) && (e[r] = n[r]); + } + return e; + }, + i = n(1), + l = r(i), + u = n(98), + s = r(u), + c = n(142), + f = r(c), + d = n(35), + p = (function (e) { + if (e && e.__esModule) return e; + var t = {}; + if (null != e) for (var n in e) Object.prototype.hasOwnProperty.call(e, n) && (t[n] = e[n]); + return (t.default = e), t; + })(d), + h = n(581), + m = r(h), + y = function (e) { + var t = e.rune; + return l.default.createElement("div", null, l.default.createElement(p.Title, null, t.name), l.default.createElement(m.default, {rune: t})); + }, + g = function (e) { + var t = e.rune, + n = o(e, ["rune"]); + return l.default.createElement(f.default, {content: t && l.default.createElement(y, {rune: t})}, l.default.createElement(s.default, a({rune: t}, n))); + }; + t.default = g; + }, + 145: function (e, t, n) { + "use strict"; + Object.defineProperty(t, "__esModule", {value: !0}), (t.RightSide = t.LeftSide = t.Block = void 0); + var r = n(2), + o = (function (e) { + return e && e.__esModule ? e : {default: e}; + })(r), + a = (0, r.keyframes)(["from{opacity:0;transform:translateX(20px);}to{opacity:1;transform:none;}"]); + (t.Block = (0, o.default)("div").withConfig({displayName: "Slot__Block"})(["display:flex;margin:0;padding:6px 0;position:relative;animation:", " 0.3s ease forwards;"], a)), + (t.LeftSide = (0, o.default)("div").withConfig({displayName: "Slot__LeftSide"})(["flex:0 0 auto;width:62px;"])), + (t.RightSide = (0, o.default)("div").withConfig({displayName: "Slot__RightSide"})( + ["flex-grow:1;display:flex;flex-direction:column;justify-content:center;animation:", " 0.3s ease forwards;"], + a + )); + }, + 216: function (e, t, n) { + "use strict"; + + function r(e) { + return e && e.__esModule ? e : {default: e}; + } + + function o(e, t) { + if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function"); + } + + function a(e, t) { + if (!e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + return !t || ("object" != typeof t && "function" != typeof t) ? e : t; + } + + function i(e, t) { + if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function, not " + typeof t); + (e.prototype = Object.create(t && t.prototype, { + constructor: { + value: e, + enumerable: !1, + writable: !0, + configurable: !0 + } + })), + t && (Object.setPrototypeOf ? Object.setPrototypeOf(e, t) : (e.__proto__ = t)); + } + + function l(e) { + return {paths: e.paths, primary: e.primary, secondary: e.secondary}; + } + + Object.defineProperty(t, "__esModule", {value: !0}); + var u = (function () { + function e(e, t) { + for (var n = 0; n < t.length; n++) { + var r = t[n]; + (r.enumerable = r.enumerable || !1), (r.configurable = !0), "value" in r && (r.writable = !0), Object.defineProperty(e, r.key, r); + } + } + + return function (t, n, r) { + return n && e(t.prototype, n), r && e(t, r), t; + }; + })(), + s = (function (e, t) { + return Object.freeze(Object.defineProperties(e, {raw: {value: Object.freeze(t)}})); + })(["\n margin-left: 10px;\n"], ["\n margin-left: 10px;\n"]), + c = n(1), + f = r(c), + d = n(40), + p = n(2), + h = r(p), + m = n(97), + y = n(217), + g = r(y), + b = (0, p.keyframes)(["from{opacity:0;}to{opacity:1;}"]), + w = g.default.extend(s), + E = w.withComponent("a"), + O = (function (e) { + function t() { + return o(this, t), a(this, (t.__proto__ || Object.getPrototypeOf(t)).apply(this, arguments)); + } + + return ( + i(t, e), + u(t, [ + { + key: "render", + value: function () { + var e = this.props, + t = e.primary, + n = e.fixed, + r = (0, m.validateBuild)(this.props); + if (!r) return null; + // TODO if there is any code that should be run only when a full rune page is setup, put it here + } + } + ]), + t + ); + })(f.default.Component); + t.default = (0, d.connect)(l)(O); + }, + 217: function (e, t, n) { + "use strict"; + Object.defineProperty(t, "__esModule", {value: !0}); + var r = n(2), + o = (function (e) { + return e && e.__esModule ? e : {default: e}; + })(r), + a = (0, o.default)("button").withConfig({displayName: "Button__Button"})( + [ + "display:inline-flex;align-items:center;justify-content:center;vertical-align:middle;cursor:pointer;padding:11px 21px;height:60px;max-width:100%;border:0;color:#c7b184;fill:currentColor;box-shadow:0 0 28px #000;font-family:\"Beaufort for LOL\",serif;font-size:16px;line-height:1;font-weight:500;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;position:relative;z-index:1;transition:0.3s;&::before,&::after{content:'';display:block;position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;}&::before{background:linear-gradient(0deg,#72542a 0%,#bd9e5e 100%);}&::after{margin:1px;background:#16181d;transition:inherit;}&:hover{color:#fff;text-decoration:none;box-shadow:0 0 28px #000,0 0 28px rgba(#000,0.6);&::after{background:#1a1d21;}}", + " & > svg{margin:auto;}" + ], + function (e) { + return e.square && "\n padding: 0;\n width: 34px;\n height: 34px;\n min-height: auto;\n "; + } + ); + t.default = a; + }, + 218: function (e, t, n) { + "use strict"; + + function r(e) { + return e && e.__esModule ? e : {default: e}; + } + + function o(e, t) { + if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function"); + } + + function a(e, t) { + if (!e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + return !t || ("object" != typeof t && "function" != typeof t) ? e : t; + } + + function i(e, t) { + if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function, not " + typeof t); + (e.prototype = Object.create(t && t.prototype, { + constructor: { + value: e, + enumerable: !1, + writable: !0, + configurable: !0 + } + })), + t && (Object.setPrototypeOf ? Object.setPrototypeOf(e, t) : (e.__proto__ = t)); + } + + Object.defineProperty(t, "__esModule", {value: !0}); + var l = (function () { + function e(e, t) { + for (var n = 0; n < t.length; n++) { + var r = t[n]; + (r.enumerable = r.enumerable || !1), (r.configurable = !0), "value" in r && (r.writable = !0), Object.defineProperty(e, r.key, r); + } + } + + return function (t, n, r) { + return n && e(t.prototype, n), r && e(t, r), t; + }; + })(), + u = n(1), + s = r(u), + c = n(2), + f = r(c), + d = n(97), + p = (0, c.keyframes)(["from{opacity:0;}to{opacity:1;}"]), + h = (0, f.default)("img").withConfig({displayName: "PreloadedImage__PreloadedImage"})(["animation:", " 0.25s ease forwards;"], p), + m = (function (e) { + function t() { + o(this, t); + var e = a(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this)); + return (e.state = {isLoaded: !1}), e; + } + + return ( + i(t, e), + l(t, [ + { + key: "componentDidMount", + value: function () { + var e = this; + (0, d.loadImage)(this.props.src) + .then(function () { + e.setState({isLoaded: !0}); + }) + .catch(function () { + console.log("no image"); + }); + } + }, + { + key: "shouldComponentUpdate", + value: function (e) { + return this.props.src === e.src; + } + }, + { + key: "render", + value: function () { + return this.state.isLoaded ? s.default.createElement(h, this.props) : null; + } + } + ]), + t + ); + })(s.default.Component); + t.default = m; + }, + 219: function (e, t, n) { + "use strict"; + + function r(e) { + return e && e.__esModule ? e : {default: e}; + } + + function o(e, t) { + if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function"); + } + + function a(e, t) { + if (!e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + return !t || ("object" != typeof t && "function" != typeof t) ? e : t; + } + + function i(e, t) { + if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function, not " + typeof t); + (e.prototype = Object.create(t && t.prototype, { + constructor: { + value: e, + enumerable: !1, + writable: !0, + configurable: !0 + } + })), + t && (Object.setPrototypeOf ? Object.setPrototypeOf(e, t) : (e.__proto__ = t)); + } + + Object.defineProperty(t, "__esModule", {value: !0}); + var l = (function () { + function e(e, t) { + for (var n = 0; n < t.length; n++) { + var r = t[n]; + (r.enumerable = r.enumerable || !1), (r.configurable = !0), "value" in r && (r.writable = !0), Object.defineProperty(e, r.key, r); + } + } + + return function (t, n, r) { + return n && e(t.prototype, n), r && e(t, r), t; + }; + })(), + u = n(1), + s = r(u), + c = n(2), + f = r(c), + d = n(220), + p = n(99), + h = r(p), + m = (0, f.default)("div").withConfig({displayName: "Drawer__Block"})(["opacity:0;visibility:hidden;position:absolute;top:0;width:100%;height:100%;will-change:transform;"]), + y = (0, f.default)("div").withConfig({displayName: "Drawer__Slide"})(["width:100%;height:100%;position:relative;z-index:5;"]), + g = (0, f.default)("div").withConfig({displayName: "Drawer__Row"})(["display:flex;justify-content:space-around;flex-wrap:wrap;align-items:center;height:100%;"]), + b = (0, f.default)("div").withConfig({displayName: "Drawer__RowItem"})(["flex:0 0 auto;display:flex;justify-content:center;", ""], function (e) { + return e.columns && "\n width: " + 100 / e.columns + "%;\n "; + }), + v = (0, f.default)("div").withConfig({displayName: "Drawer__BlurHolder"})(["width:100%;height:100%;position:absolute;z-index:1;pointer-events:none;filter:blur(10px);"]), + _ = (0, f.default)("div").withConfig({displayName: "Drawer__Blur"})(["overflow:hidden;height:100%;position:relative;"]), + w = (0, f.default)("div").withConfig({displayName: "Drawer__BlurInner"})([ + "width:100%;height:100%;background:radial-gradient(ellipse closest-side at center,#ffdc7c 0%,rgba(255,220,124,0) 100%);position:absolute;left:-100%;" + ]), + E = (function (e) { + function t() { + return o(this, t), a(this, (t.__proto__ || Object.getPrototypeOf(t)).apply(this, arguments)); + } + + return ( + i(t, e), + l(t, [ + { + key: "componentDidMount", + value: function () { + (this.timing = 0.12), + (this.animation = new d.TimelineLite({paused: !this.props.isOpen}) + .set(this.blurHolder, {zIndex: 10}) + .set(this.row.childNodes, {opacity: 0, x: -20}) + .to(this.block, this.timing, { + opacity: 1, + visibility: "visible", + ease: d.Power0.easeNone + }, 0.05) + .to([this.flourishTop, this.flourishBottom], this.timing / 2, { + color: "#c8aa6e", + ease: d.Power0.easeNone + }) + .to([this.flourishTop, this.flourishBottom], this.timing / 2, { + color: "#594620", + ease: d.Power0.easeNone + }) + .to(this.blur, this.timing, { + x: "200%", + ease: d.Power0.easeNone + }, "-=" + this.timing) + .to([this.flourishTop, this.flourishBottom], this.timing, { + width: "100%", + ease: d.Power0.easeNone + }, "-=" + this.timing) + .to([this.flourishTop, this.flourishBottom], this.timing, { + width: "100%", + ease: d.Power0.easeNone + }, "-=" + this.timing) + .staggerTo(this.row.childNodes, 0.125, { + opacity: 1, + x: 0, + ease: d.Power0.easeNone + }, 0.2 / this.row.childNodes.length, "-=" + this.timing) + .set(this.blurHolder, {zIndex: 0})); + } + }, + { + key: "componentDidUpdate", + value: function (e) { + var t = this; + this.props.isOpen && + !e.isOpen && + window.requestAnimationFrame(function () { + t.animation.play(); + }), + !this.props.isOpen && + e.isOpen && + window.requestAnimationFrame(function () { + t.animation.reverse(); + }); + } + }, + { + key: "componentWillUnmount", + value: function () { + this.animation.seek(0), this.animation.kill(), (this.animation = null); + } + }, + { + key: "render", + value: function () { + var e = this, + t = this.props, + n = t.columns, + r = t.keystone; + return s.default.createElement( + m, + { + innerRef: function (t) { + e.block = t; + } + }, + s.default.createElement( + v, + { + innerRef: function (t) { + e.blurHolder = t; + } + }, + s.default.createElement( + _, + null, + s.default.createElement(w, { + innerRef: function (t) { + e.blur = t; + } + }) + ) + ), + !r && + s.default.createElement(h.default, { + innerRef: function (t) { + e.flourishTop = t; + }, + top: 0 + }), + !r && + s.default.createElement(h.default, { + innerRef: function (t) { + e.flourishBottom = t; + }, + bottom: 0 + }), + s.default.createElement( + y, + { + innerRef: function (t) { + e.slide = t; + } + }, + s.default.createElement( + g, + { + innerRef: function (t) { + e.row = t; + } + }, + s.default.Children.map(this.props.children, function (e) { + return s.default.createElement(b, {columns: n}, e); + }) + ) + ) + ); + } + } + ]), + t + ); + })(s.default.Component); + t.default = E; + }, + 22: function (e, t, n) { + "use strict"; + + function r(e, t) { + console.log("setPrimary", e, t), p.default.dispatch({ + type: "SET_PRIMARY", + data: {path: e, firstRuneIndex: t} + }); + } + + function o(e) { + p.default.dispatch({type: "SET_SECONDARY", data: {path: e}}); + } + + function a(e, t) { + p.default.dispatch({type: "SET_PRIMARY_RUNE", data: {slotIndex: e, runeIndex: t}}); + } + + function i(e) { + p.default.dispatch({type: "TOGGLE_PRIMARY_RUNE_DRAWER", data: {slotIndex: e}}); + } + + function l(e) { + p.default.dispatch({type: "SET_SECONDARY_RUNE", data: {runeIndex: e}}); + } + + function u() { + p.default.dispatch({type: "TOGGLE_SECONDARY_PATH_DRAWER", data: {}}); + } + + function s(e) { + p.default.dispatch({type: "TOGGLE_SECONDARY_RUNE_DRAWER", data: {slotIndex: e}}); + } + + function c() { + p.default.dispatch({type: "CLEAR_PRIMARY", data: {}}); + } + + function f() { + p.default.dispatch({type: "CLEAR_SECONDARY", data: {}}); + } + + Object.defineProperty(t, "__esModule", {value: !0}), + (t.setPrimary = r), + (t.setSecondary = o), + (t.setPrimaryRune = a), + (t.togglePrimaryRuneDrawer = i), + (t.setSecondaryRune = l), + (t.toggleSecondaryPathDrawer = u), + (t.toggleSecondaryRuneDrawer = s), + (t.clearPrimary = c), + (t.clearSecondary = f); + var d = n(71), + p = (function (e) { + return e && e.__esModule ? e : {default: e}; + })(d); + }, + 221: function (e, t, n) { + "use strict"; + + function r(e) { + return e && e.__esModule ? e : {default: e}; + } + + function o(e, t) { + var n = {}; + for (var r in e) t.indexOf(r) >= 0 || (Object.prototype.hasOwnProperty.call(e, r) && (n[r] = e[r])); + return n; + } + + Object.defineProperty(t, "__esModule", {value: !0}); + var a = n(1), + i = r(a), + l = n(2), + u = r(l), + s = n(64), + c = (function (e) { + if (e && e.__esModule) return e; + var t = {}; + if (null != e) for (var n in e) Object.prototype.hasOwnProperty.call(e, n) && (t[n] = e[n]); + return (t.default = e), t; + })(s), + f = (0, u.default)(c.Button).withConfig({displayName: "PathButton__Button"})(["background:none;border:0;box-shadow:none;position:relative;"]), + d = (0, u.default)(c.Icon).withConfig({displayName: "PathButton__Icon"})(["width:36px;height:36px;"]), + p = (0, u.default)("svg").withConfig({displayName: "PathButton__Circles"})(["margin:", "px;position:absolute;top:50%;left:50%;width:64px;height:64px;"], -32), + h = (0, u.default)("circle").withConfig({displayName: "PathButton__Circle1"})(["cx:50%;cy:50%;r:43%;fill:none;stroke-width:2;transform:translateY(6%);transform-origin:50% 50%;"]), + m = (0, u.default)(h).withConfig({displayName: "PathButton__Circle2"})(["transform:rotate(120deg) translateY(6%);"]), + y = (0, u.default)(h).withConfig({displayName: "PathButton__Circle3"})(["transform:rotate(240deg) translateY(6%);"]), + g = (0, u.default)("svg").withConfig({displayName: "PathButton__Cup"})(["overflow:visible;width:86px;height:86px;position:absolute;left:-19px;bottom:-19px;"]), + b = function (e) { + var t = e.path, + n = e.rings, + r = o(e, ["path", "rings"]), + a = void 0 !== t.colors ? t.colors.gradient.top : "#cdbe91", + l = "circle-gradient-" + (t.slug || "default"), + u = "cup-gradient-" + (t.slug || "default"); + return ( + console.log(t.slug), + i.default.createElement( + f, + r, + !1 !== n && + i.default.createElement( + p, + null, + i.default.createElement( + "linearGradient", + {id: l, x1: "1", y1: "0.6", x2: "0", y2: "0"}, + i.default.createElement("stop", {stopOpacity: "1", offset: "0%", stopColor: a}), + i.default.createElement("stop", {stopOpacity: "0", offset: "70%", stopColor: a}) + ), + i.default.createElement(h, { + cx: "50%", + cy: "50%", + r: "43%", + fill: "none", + strokeWidth: "2", + stroke: "url(#" + l + ")" + }), + i.default.createElement(m, { + cx: "50%", + cy: "50%", + r: "43%", + fill: "none", + strokeWidth: "2", + stroke: "url(#" + l + ")" + }), + i.default.createElement(y, { + cx: "50%", + cy: "50%", + r: "43%", + fill: "none", + strokeWidth: "2", + stroke: "url(#" + l + ")" + }) + ), + !1 !== n && + i.default.createElement( + g, + null, + i.default.createElement( + "linearGradient", + {id: u, x1: "0", y1: "0", x2: "0", y2: "1"}, + i.default.createElement("stop", { + stopOpacity: "0", + offset: "80%", + stopColor: a + }), + i.default.createElement("stop", { + stopOpacity: "1", + offset: "100%", + stopColor: a + }) + ), + i.default.createElement("circle", { + cx: "42", + cy: "42", + r: "42", + fill: "none", + strokeWidth: "2", + stroke: "url(#" + u + ")" + }) + ), + t.slug && i.default.createElement(d, {src: t.icon, alt: ""}) + ) + ); + }; + t.default = b; + }, + 222: function (e, t, n) { + "use strict"; + + function r(e) { + return e && e.__esModule ? e : {default: e}; + } + + Object.defineProperty(t, "__esModule", {value: !0}); + var o = n(1), + a = r(o), + i = n(2), + l = r(i), + u = (0, i.keyframes)(["from{transform:translateY(-50%);}"]), + s = (0, l.default)("div").withConfig({displayName: "Progress__Block"})(["height:", ";position:absolute;top:89px;left:50%;"], function (e) { + return 100 * e.total - 39 + "px"; + }), + c = (0, l.default)("div").withConfig({displayName: "Progress__Border"})(["margin-left:-7px;width:14px;height:100%;padding:2px;border:2px solid rgba(200,170,110,0.2);"]), + f = (0, l.default)("div").withConfig({displayName: "Progress__BarOuter"})(["overflow:hidden;width:6px;height:100%;background:#1c1f21;"]), + d = (0, l.default)("div").withConfig({displayName: "Progress__BarHeight"})(["overflow:hidden;height:100%;transform:translateY(", ");transition:transform 0.3s ease;"], function (e) { + return -100 * (e.total - e.current) + "px"; + }), + p = (0, l.default)("div").withConfig({displayName: "Progress__BarInner"})(["width:100%;height:200%;background:#fff;"]), + h = (0, l.default)("div").withConfig({displayName: "Progress__BarHighlight"})( + ["width:100%;height:", ";box-shadow:inset 0 0 3px #000;", ""], + function (e) { + return 100 * e.total * 2 + "px"; + }, + function (e) { + return ( + e.isActive && + "\n background: linear-gradient(0deg, " + + e.highlight + + " 0%, transparent 50%, " + + e.highlight + + " 100%);\n background-size: auto 100px;\n animation: " + + u + + " " + + 0.5 * e.total + + "s linear forwards infinite;\n will-change: transform;\n " + ); + } + ), + m = function (e) { + var t = e.path, + n = e.total, + r = e.current, + o = e.isActive; + return a.default.createElement( + s, + {total: n}, + a.default.createElement( + c, + null, + a.default.createElement( + f, + null, + !1 !== t.hasPath && + a.default.createElement( + d, + {total: n, current: r}, + a.default.createElement(p, {total: n}, a.default.createElement(h, { + total: n, + highlight: t.colors.gradient.bottom, + isActive: o + })) + ) + ) + ) + ); + }; + t.default = m; + }, + 223: function (e, t, n) { + "use strict"; + + function r(e) { + return e && e.__esModule ? e : {default: e}; + } + + function o(e, t) { + var n = {}; + for (var r in e) t.indexOf(r) >= 0 || (Object.prototype.hasOwnProperty.call(e, r) && (n[r] = e[r])); + return n; + } + + Object.defineProperty(t, "__esModule", {value: !0}); + var a = + Object.assign || + function (e) { + for (var t = 1; t < arguments.length; t++) { + var n = arguments[t]; + for (var r in n) Object.prototype.hasOwnProperty.call(n, r) && (e[r] = n[r]); + } + return e; + }, + i = n(1), + l = r(i), + u = n(2), + s = r(u), + c = (0, s.default)("button").withConfig({displayName: "PathButton__Button"})( + ["display:flex;align-items:center;justify-content:center;width:48px;height:48px;padding:0;border:0;background:#1e2328;border-radius:50%;text-align:center;position:relative;", ""], + function (e) { + return e.small && "\n width: 40px;\n height: 40px;\n "; + } + ), + f = (0, s.default)("img").withConfig({displayName: "PathButton__Icon"})(["display:block;margin:auto;width:42px;height:42px;border-radius:50%;", ""], function (e) { + return e.small && "\n width: 36px;\n height: 36px;\n "; + }), + d = (0, s.default)("svg").withConfig({displayName: "PathButton__InnerIcon"})(["margin:-24px;width:48px;height:48px;position:absolute;top:50%;left:50%;", ""], function (e) { + return e.small && "\n margin: -20px;\n width: 40px;\n height: 40px;\n "; + }), + p = function (e) { + var t = e.icon, + n = e.path, + r = e.small, + i = o(e, ["icon", "path", "small"]); + return l.default.createElement( + c, + a({}, i, {small: r}), + t && l.default.createElement(f, {src: t, alt: "", small: r}), + l.default.createElement( + d, + {viewBox: "0 0 47 47", small: r}, + l.default.createElement("circle", { + cx: "23.5", + cy: "23.5", + r: "22.5", + strokeWidth: "2", + fill: "none", + stroke: t ? "url(#gradient-" + n.slug + ")" : "url(#gradient-yuma-dallasLight)" + }) + ) + ); + }; + t.default = p; + }, + 35: function (e, t, n) { + "use strict"; + Object.defineProperty(t, "__esModule", {value: !0}), (t.P = t.Title = t.Block = void 0); + var r = n(2), + o = (function (e) { + return e && e.__esModule ? e : {default: e}; + })(r), + a = (0, r.keyframes)(["to{opacity:1;transform:none;}"]); + (t.Block = (0, o.default)("div").withConfig({displayName: "Description__Block"})( + ["padding-top:22px;opacity:0;transform:translateX(20px);animation:", " 0.2s 0.25s linear forwards;"], + a + )), + (t.Title = (0, o.default)("div").withConfig({displayName: "Description__Title"})( + [ + "margin-bottom:3px;color:", + ';font-family:"BeaufortforLOL-Medium",sans-serif;font-size:14px;line-height:18px;letter-spacing:0.075em;text-transform:uppercase;', + " ", + " .i18n-el_GR &{text-transform:none;}" + ], + function (e) { + return e.color || "#c8aa6e"; + }, + function (e) { + return e.flush && "\n margin: 0;\n "; + }, + function (e) { + return e.small && "\n font-size: 12px;\n line-height: 16px;\n "; + } + )), + (t.P = (0, o.default)("p").withConfig({displayName: "Description__P"})(["color:#a09b8c;font-size:12px;line-height:16px;letter-spacing:0.025em;margin:0 0 20px;", ""], function (e) { + return e.flush && "\n margin: 0;\n "; + })); + }, + 449: function (e, t, n) { + "use strict"; + + function r(e) { + return e && e.__esModule ? e : {default: e}; + } + + var o = + Object.assign || + function (e) { + for (var t = 1; t < arguments.length; t++) { + var n = arguments[t]; + for (var r in n) Object.prototype.hasOwnProperty.call(n, r) && (e[r] = n[r]); + } + return e; + }, + a = n(1), + i = r(a), + l = n(1), + u = n(190), + s = r(u), + c = n(40), + f = n(60), + d = (r(f), n(11)), + p = n(71), + h = r(p), + m = n(141), + y = r(m), + g = n(563), + b = r(g), + v = document.querySelector("#app"); + v && + s.default.get((0, d.assetPath)("/getRunes")).then(function (e) { + var t = e.data.styles.map(function (e, t) { + return o({}, y.default[t], e); + }); + t = [t[2], t[1], t[3], t[0], t[4]]; + (0, l.render)(i.default.createElement(c.Provider, {store: h.default}, i.default.createElement(b.default, {data: t})), v); + }); + }, + 558: function (e, t, n) { + "use strict"; + + function r(e) { + return e && e.__esModule ? e : {default: e}; + } + + Object.defineProperty(t, "__esModule", {value: !0}); + var o = n(134), + a = n(559), + i = r(a), + l = n(560), + u = r(l), + s = n(561), + c = r(s), + f = n(562), + d = r(f); + t.default = (0, o.combineReducers)({ + paths: i.default, + primary: u.default, + secondary: c.default, + longDescriptions: d.default + }); + }, + 559: function (e, t, n) { + "use strict"; + + function r() { + var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : o, + t = arguments[1], + n = t.type, + r = t.data; + switch (n) { + case "ADD_PATHS": + return r.paths; + default: + return e; + } + } + + Object.defineProperty(t, "__esModule", {value: !0}), (t.default = r); + var o = []; + }, + 560: function (e, t, n) { + "use strict"; + + function r(e) { + return e && e.__esModule ? e : {default: e}; + } + + function o(e) { + if (Array.isArray(e)) { + for (var t = 0, n = Array(e.length); t < e.length; t++) n[t] = e[t]; + return n; + } + return Array.from(e); + } + + function a() { + var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : d, + t = arguments[1], + n = t.type, + r = t.data; + switch (n) { + case "SET_PRIMARY": + var a = c.default.getState(), + l = a.paths, + s = r.path, + p = l.find(function (e) { + return e.slug === s; + }), + h = "number" == typeof r.firstRuneIndex ? r.firstRuneIndex : -1, + m = -1 === h ? 0 : 1; + return ( + (0, f.pushToDataLayer)({eventAction: "RuneBuilder-PrimaryPath", eventLabel: p.slug}), + i({}, p, { + slots: p.slots.map(function (e, t) { + return {runes: e.runes, choice: 0 === t ? h : -1, isOpen: t === m}; + }) + }) + ); + case "ADD_PATHS": + var y = r.paths, + g = r.config; + if (void 0 === g || 8 !== g.length) return e; + var b = y[g[0]], + v = y.find(function (e) { + return e.slug === b.slug; + }); + return i({}, v, { + slots: v.slots.map(function (e, t) { + return {runes: e.runes, choice: g[t + 1], isOpen: !1}; + }) + }); + case "SET_PRIMARY_RUNE": + var _ = r.slotIndex, + w = r.runeIndex, + E = i({}, e.slots[_], {choice: w, isOpen: !1}), + x = i({}, e, {slots: [].concat(o(e.slots.slice(0, _)), [E], o(e.slots.slice(_ + 1)))}), + O = (0, u.default)(x.slots, function (e) { + return -1 === e.choice; + }); + return -1 !== O && (x = i({}, x, {slots: [].concat(o(x.slots.slice(0, O)), [i({}, x.slots[O], {isOpen: !0})], o(x.slots.slice(O + 1)))})), x; + case "TOGGLE_PRIMARY_RUNE_DRAWER": + var P = r.slotIndex, + k = r.isOpen, + C = i({}, e.slots[P], {isOpen: "boolean" == typeof k ? k : !e.slots[P].isOpen}); + return i({}, e, {slots: [].concat(o(e.slots.slice(0, P)), [C], o(e.slots.slice(P + 1)))}); + case "CLEAR_PRIMARY": + return !1; + default: + return e; + } + } + + Object.defineProperty(t, "__esModule", {value: !0}); + var i = + Object.assign || + function (e) { + for (var t = 1; t < arguments.length; t++) { + var n = arguments[t]; + for (var r in n) Object.prototype.hasOwnProperty.call(n, r) && (e[r] = n[r]); + } + return e; + }; + t.default = a; + var l = n(60), + u = r(l), + s = n(71), + c = r(s), + f = n(11), + d = !1; + }, + 561: function (e, t, n) { + "use strict"; + + function r(e) { + return e && e.__esModule ? e : {default: e}; + } + + function o(e) { + if (Array.isArray(e)) { + for (var t = 0, n = Array(e.length); t < e.length; t++) n[t] = e[t]; + return n; + } + return Array.from(e); + } + + function a() { + var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : d, + t = arguments[1], + n = t.type, + r = t.data; + switch (n) { + case "SET_PRIMARY": + return {isOpen: !1, hasPath: !1, slots: !1}; + case "SET_SECONDARY": + var a = c.default.getState(), + l = a.paths, + s = l.find(function (e) { + return e.slug === r.path; + }); + return ( + (0, f.pushToDataLayer)({eventAction: "RuneBuilder-SecondaryPath", eventLabel: s.slug}), + i({}, s, { + isOpen: !1, + hasPath: !0, + slots: { + runes: [].concat(o(s.slots[1].runes), o(s.slots[2].runes), o(s.slots[3].runes)), + slotIndex: 0, + choices: [-1, -1], + isOpen: !0 + } + }) + ); + case "ADD_PATHS": + var p = r.paths, + h = r.config; + if (void 0 === h || 8 !== h.length) return e; + var m = [].concat(o(p.slice(0, h[0])), o(p.slice(h[0] + 1))), + y = m[h[5]]; + return i({}, y, { + isOpen: !1, + hasPath: !0, + slots: { + runes: [].concat(o(y.slots[1].runes), o(y.slots[2].runes), o(y.slots[3].runes)), + slotIndex: 0, + choices: [h[6], h[7]], + isOpen: !1 + } + }); + case "TOGGLE_SECONDARY_PATH_DRAWER": + return i({}, e, {isOpen: !e.isOpen}); + case "SET_SECONDARY_RUNE": + var g = e.slots.slotIndex, + b = e.slots.choices, + v = Math.floor(r.runeIndex / 3), + _ = (0, u.default)(b, function (e) { + return Math.floor(e / 3) === v; + }); + b[-1 === _ ? g : _] = r.runeIndex; + var w = -1; + return -1 === b[0] ? (w = 0) : -1 === b[1] && (w = 1), i({}, e, { + slots: i({}, e.slots, { + choices: b, + slotIndex: w, + isOpen: -1 !== w + }) + }); + case "TOGGLE_SECONDARY_RUNE_DRAWER": + var E = e.slots.isOpen; + return i({}, e, {slots: i({}, e.slots, {slotIndex: r.slotIndex, isOpen: !E})}); + case "CLEAR_PRIMARY": + case "CLEAR_SECONDARY": + return !1; + default: + return e; + } + } + + Object.defineProperty(t, "__esModule", {value: !0}); + var i = + Object.assign || + function (e) { + for (var t = 1; t < arguments.length; t++) { + var n = arguments[t]; + for (var r in n) Object.prototype.hasOwnProperty.call(n, r) && (e[r] = n[r]); + } + return e; + }; + t.default = a; + var l = n(60), + u = r(l), + s = n(71), + c = r(s), + f = n(11), + d = !1; + }, + 562: function (e, t, n) { + "use strict"; + + function r() { + var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : a, + t = arguments[1], + n = t.type, + r = t.data; + switch (n) { + case "SET_SHIFT_DESCRIPTIONS": + return o({}, e, {shift: r.shift}); + case "TOGGLE_GLOBAL_DESCTIPTIONS": + return o({}, e, {global: !e.global}); + default: + return e; + } + } + + Object.defineProperty(t, "__esModule", {value: !0}); + var o = + Object.assign || + function (e) { + for (var t = 1; t < arguments.length; t++) { + var n = arguments[t]; + for (var r in n) Object.prototype.hasOwnProperty.call(n, r) && (e[r] = n[r]); + } + return e; + }; + t.default = r; + var a = {shift: !1, global: !1}; + }, + 563: function (e, t, n) { + "use strict"; + + function r(e) { + return e && e.__esModule ? e : {default: e}; + } + + function o(e, t) { + if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function"); + } + + function a(e, t) { + if (!e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + return !t || ("object" != typeof t && "function" != typeof t) ? e : t; + } + + function i(e, t) { + if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function, not " + typeof t); + (e.prototype = Object.create(t && t.prototype, { + constructor: { + value: e, + enumerable: !1, + writable: !0, + configurable: !0 + } + })), + t && (Object.setPrototypeOf ? Object.setPrototypeOf(e, t) : (e.__proto__ = t)); + } + + function l(e) { + return {paths: e.paths, primary: e.primary, secondary: e.secondary}; + } + + function u(e) { + var t = function (e, t) { + return {type: "ADD_PATHS", data: {paths: e, config: t}}; + }; + return { + addPaths: function (n, r) { + return e(t(n, r)); + } + }; + } + + Object.defineProperty(t, "__esModule", {value: !0}); + var s = (function () { + function e(e, t) { + for (var n = 0; n < t.length; n++) { + var r = t[n]; + (r.enumerable = r.enumerable || !1), (r.configurable = !0), "value" in r && (r.writable = !0), Object.defineProperty(e, r.key, r); + } + } + + return function (t, n, r) { + return n && e(t.prototype, n), r && e(t, r), t; + }; + })(), + c = n(1), + f = r(c), + d = n(40), + p = n(2), + h = r(p), + m = n(11), + y = n(97), + g = n(568), + b = r(g), + v = n(588), + _ = r(v), + w = n(594), + E = r(w), + x = n(595), + O = r(x), + P = (0, h.default)("div").withConfig({displayName: "App__Block"})(["*{outline:0;}h1,h2,h3,h4,h5,h6{font-weight:bold;}a{text-decoration:none;}"]), + k = (function (e) { + function t(e) { + o(this, t); + var n = a(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e)), + r = n.props.data, + i = window.runeBuilderConfig && 8 === window.runeBuilderConfig.length && window.runeBuilderConfig.split("").map(Number); + return e.addPaths(r, i), (n.buildCompleted = !1), n; + } + + return ( + i(t, e), + s(t, [ + { + key: "componentWillReceiveProps", + value: function (e) { + var t = (0, y.validateBuild)(e); + if (t && !this.buildCompleted) { + var n = {eventAction: "RuneBuilder-Completed", eventLabel: t}; + (0, m.pushToDataLayer)(n), (this.buildCompleted = !0); + } else this.buildCompleted = !1; + } + }, + { + key: "render", + value: function () { + var e = this.props.paths; + return f.default.createElement( + P, + null, + f.default.createElement(O.default, { + queryString: "(min-width: 1061px)", + PassComponent: f.default.createElement(b.default, {paths: e}), + FailComponent: f.default.createElement(_.default, {paths: e}) + }), + f.default.createElement(E.default, {paths: e}) + ); + } + } + ]), + t + ); + })(f.default.Component); + t.default = (0, d.connect)(l, u)(k); + }, + 568: function (e, t, n) { + "use strict"; + + function r(e) { + return e && e.__esModule ? e : {default: e}; + } + + Object.defineProperty(t, "__esModule", {value: !0}); + var o = n(1), + a = r(o), + i = n(2), + l = r(i), + u = n(40), + s = n(569), + c = r(s), + f = n(572), + d = r(f), + p = (0, l.default)("div").withConfig({displayName: "Desktop__AppOuter"})([ + "margin:auto;padding:2px;width:100%;max-width:1061px;height:645px;background:linear-gradient(0deg,#6c5021 0%,#ab8f57 100%);box-shadow:0 0 80px #000;position:relative;" + ]), + h = (0, l.default)("div").withConfig({displayName: "Desktop__AppInner"})(["width:100%;height:100%;background:#000;font-size:14px;line-height:1.5;"]), + m = function (e) { + var t = e.paths, + n = e.primary, + r = e.secondary; + return a.default.createElement( + p, + null, + a.default.createElement( + h, + {id: "perks-app"}, + n ? a.default.createElement(d.default, { + key: n.id, + primary: n, + secondary: r + }) : a.default.createElement(c.default, {paths: t}) + ) + ); + }, + y = function (e) { + return {primary: e.primary, secondary: e.secondary}; + }; + t.default = (0, u.connect)(y)(m); + }, + 569: function (e, t, n) { + "use strict"; + + function r(e) { + return e && e.__esModule ? e : {default: e}; + } + + Object.defineProperty(t, "__esModule", {value: !0}), (t.Paths = void 0); + var o = n(1), + a = r(o), + i = n(2), + l = r(i), + u = n(570), + s = r(u), + f = (t.Paths = (0, l.default)("div").withConfig({displayName: "PathList__Paths"})([ + "display:flex;align-items:stretch;height:100%;background:#111111;" + ])), + d = function (e) { + var t = Object.keys(e.paths).map(function (t) { + return e.paths[t]; + }); + return a.default.createElement( + f, + null, + t.map(function (e) { + return a.default.createElement(s.default, {key: e.name, path: e}); + }) + ); + }; + t.default = d; + }, + 570: function (e, t, n) { + "use strict"; + + function r(e) { + if (e && e.__esModule) return e; + var t = {}; + if (null != e) for (var n in e) Object.prototype.hasOwnProperty.call(e, n) && (t[n] = e[n]); + return (t.default = e), t; + } + + function o(e) { + return e && e.__esModule ? e : {default: e}; + } + + Object.defineProperty(t, "__esModule", {value: !0}); + + + var a = n(1), + i = o(a), + l = n(2), + u = o(l), + s = n(11), + c = n(22), + f = r(c), + d = n(142), + p = o(d), + h = n(35), + m = r(h), + y = (0, u.default)("div").withConfig({displayName: "Path__Block"})(["flex:0 0 auto;width:20%;height:100%;text-align:center;position:relative;"]), + g = (0, u.default)("div").withConfig({displayName: "Path__Perk"})([ + "display:flex;flex-direction:column;justify-content:flex-start;align-items:center;width:100%;height:100%;box-shadow:0 0 0 1px rgba(1,10,19,0.85);position:relative;" + ]), + b = (0, u.default)("img").withConfig({displayName: "Path__PerkBackground"})( + ["height:639px;width:211px;position:absolute;top:0;left:0;transition:0.1s ease-out;", ":hover &{filter:brightness(150%);}"], + g + ), + v = (0, u.default)("button").withConfig({displayName: "Path__PerkButtonOverlay"})(["border:0;background:none;padding:0;position:absolute;top:0;left:0;width:100%;height:100%;"]), + _ = (0, u.default)("div").withConfig({displayName: "Path__PathIconWrap"})(["position:relative;width:100%;height:246px;margin-top:40px;margin-bottom:46px;"]), + w = (0, u.default)("img").withConfig({displayName: "Path__PathIcon"})( + ['display:block;background:url("', '") center no-repeat;margin:0;opacity:1;transition:filter 0.15s ease-out;', ":hover &{opacity:1;filter:grayscale(0%);}"], + (0, s.assetPath)("/img/ring.png"), + g + ), + E = (0, u.default)("img").withConfig({displayName: "Path__PathVFX"})( + ["margin:0;position:absolute;top:0;left:0;opacity:0;transition:opacity 0.25s ease-out;", ":hover &{opacity:1;}"], + g + ), + x = (0, u.default)("div").withConfig({displayName: "Path__PathBody"})( + ["color:#a09b8c;font-size:10px;letter-spacing:0.075em;line-height:14px;opacity:1;transition:opacity 0.15s ease-out;", ":hover &{opacity:1;}"], + g + ), + O = (0, u.default)("header").withConfig({displayName: "Path__PathHeader"})([ + "width:100%;text-transform:uppercase;position:absolute;top:199px;left:0;.i18n-el_GR &{text-transform:none;}" + ]), + P = (0, u.default)("div").withConfig({displayName: "Path__PathTitle"})([ + 'color:#626261;font-family:"BeaufortforLOL-Medium",sans-serif;font-size:16px;letter-spacing:0.15em;line-height:19.2px;margin-bottom:4px;' + ]), + k = (0, u.default)(x).withConfig({displayName: "Path__PathFooter"})(["margin:46px 0 0;padding:0 22px;width:100%;font-size:11px;font-weight:400;letter-spacing:0.05em;"]), + C = (0, u.default)("div").withConfig({displayName: "Path__KeyStones"})([ + "display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;position:relative;z-index:10;" + ]), + j = (0, u.default)("div").withConfig({displayName: "Path__KeyStone"})(["flex:auto 0 0;width:50%;text-align:center;position:relative;z-index:1;&:nth-child(3){width:100%;}"]), + S = (0, u.default)("img").withConfig({displayName: "Path__KeyStoneImg"})(["border-radius:32px;width:62px;height:62px;cursor:pointer;"]), + M = function (e) { + var t = e.rune; + return i.default.createElement( + "div", + null, + i.default.createElement(m.Title, null, t.name), + i.default.createElement(m.P, {dangerouslySetInnerHTML: {__html: `${t.longDescription}

    ${getRuneTooltip(t)}`}}) + ); + }, + B = function (e) { + var t = e.path, + n = function () { + f.setPrimary(t.slug); + }; + return i.default.createElement( + y, + {key: t.name, onClick: n}, + i.default.createElement( + g, + null, + i.default.createElement( + _, + null, + i.default.createElement(w, {src: t.landing.icon, alt: ""}), + i.default.createElement(E, {src: t.landing.vfx, alt: ""}), + i.default.createElement(O, null, i.default.createElement(P, null, t.name), i.default.createElement(x, null, t.slogan)) + ), + i.default.createElement(v, {onClick: n}), + i.default.createElement( + C, + null, + t.slots[0].runes.map(function (e, n) { + var r = function (e) { + e.stopPropagation(), console.log("setPrimaryAndRune"), f.setPrimary(t.slug, n); + }, + o = i.default.createElement(M, {rune: e}); + return i.default.createElement( + j, + {key: "keystone-" + t.slug, onClick: r}, + i.default.createElement(p.default, {content: o}, i.default.createElement(S, { + src: (0, s.assetPath)("/img/runes-108x108/" + e.runeId + ".png"), + alt: "" + })) + ); + }) + ), + i.default.createElement(k, null, [ + t.description, + i.default.createElement("div", { + className: "styleInfo", + "data-style-id": t.id, + "data-style-name": t.name, + dangerouslySetInnerHTML: {__html: "
    " + getStyleInfo()} + }), + ]) + ) + ); + }; + t.default = B; + }, + 572: function (e, t, n) { + "use strict"; + + function r(e) { + return e && e.__esModule ? e : {default: e}; + } + + Object.defineProperty(t, "__esModule", {value: !0}); + var o = n(1), + a = r(o), + i = n(2), + l = r(i), + u = n(216), + s = r(u), + c = n(573), + f = r(c), + d = n(574), + p = r(d), + h = n(575), + m = r(h), + y = n(577), + g = r(y), + b = n(582), + v = r(b), + _ = (0, l.default)("div").withConfig({displayName: "RuneBuilder__PathBlock"})(["height:100%;background-color:#111111;position:relative;z-index:1;"]), + w = (0, l.default)("div").withConfig({displayName: "RuneBuilder__PathBody"})(["padding:30px 0 0 35px;display:flex;position:relative;z-index:1;"]), + E = (0, l.default)("div").withConfig({displayName: "RuneBuilder__PathColumn"})(["flex:0 0 auto;padding-top:55px;margin-right:50px;width:275px;position:relative;"]), + x = function (e) { + var t = e.primary, + n = e.secondary; + return a.default.createElement( + _, + null, + a.default.createElement(p.default, {primary: t, secondary: n}), + a.default.createElement( + w, + null, + a.default.createElement(E, null, a.default.createElement(g.default, null)), + a.default.createElement(E, null, a.default.createElement(v.default, null)) + ), + a.default.createElement(m.default, null), + a.default.createElement(s.default, {fixed: !0}), + a.default.createElement(f.default, {fixed: !0}) + ); + }; + t.default = x; + }, + 573: function (e, t, n) { + "use strict"; + + function r(e) { + return e && e.__esModule ? e : {default: e}; + } + + Object.defineProperty(t, "__esModule", {value: !0}); + var o = n(1), + a = r(o), + i = n(2), + l = r(i), + u = n(22), + s = (function (e) { + if (e && e.__esModule) return e; + var t = {}; + if (null != e) for (var n in e) Object.prototype.hasOwnProperty.call(e, n) && (t[n] = e[n]); + return (t.default = e), t; + })(u), + c = n(217), + f = r(c), + d = (0, l.default)("div").withConfig({displayName: "Reset__Block"})(["", ""], function (e) { + return e.fixed && "\n padding: 10px 10px 10px 40px;\n position: absolute;\n top: 0;\n right: 0;\n "; + }), + p = function (e) { + var t = e.fixed; + return a.default.createElement( + d, + {fixed: t}, + a.default.createElement( + f.default, + {square: !0, onClick: s.clearPrimary, title: window.i18n.runebuilder.reset}, + a.default.createElement( + "svg", + { + width: "16", + height: "16", + viewBox: "0 0 1792 1792", + xmlns: "http://www.w3.org/2000/svg" + }, + a.default.createElement("path", { + d: + "M1664 896q0 156-61 298t-164 245-245 164-298 61q-172 0-327-72.5t-264-204.5q-7-10-6.5-22.5t8.5-20.5l137-138q10-9 25-9 16 2 23 12 73 95 179 147t225 52q104 0 198.5-40.5t163.5-109.5 109.5-163.5 40.5-198.5-40.5-198.5-109.5-163.5-163.5-109.5-198.5-40.5q-98 0-188 35.5t-160 101.5l137 138q31 30 14 69-17 40-59 40h-448q-26 0-45-19t-19-45v-448q0-42 40-59 39-17 69 14l130 129q107-101 244.5-156.5t284.5-55.5q156 0 298 61t245 164 164 245 61 298z" + }) + ), + a.default.createElement("span", {className: "u-sr-only"}, window.i18n.runebuilder.reset) + ) + ); + }; + t.default = p; + }, + 574: function (e, t, n) { + "use strict"; + + function r(e) { + return e && e.__esModule ? e : {default: e}; + } + + function o(e, t) { + if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function"); + } + + function a(e, t) { + if (!e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + return !t || ("object" != typeof t && "function" != typeof t) ? e : t; + } + + function i(e, t) { + if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function, not " + typeof t); + (e.prototype = Object.create(t && t.prototype, { + constructor: { + value: e, + enumerable: !1, + writable: !0, + configurable: !0 + } + })), + t && (Object.setPrototypeOf ? Object.setPrototypeOf(e, t) : (e.__proto__ = t)); + } + + Object.defineProperty(t, "__esModule", {value: !0}); + var l = (function () { + function e(e, t) { + for (var n = 0; n < t.length; n++) { + var r = t[n]; + (r.enumerable = r.enumerable || !1), (r.configurable = !0), "value" in r && (r.writable = !0), Object.defineProperty(e, r.key, r); + } + } + + return function (t, n, r) { + return n && e(t.prototype, n), r && e(t, r), t; + }; + })(), + u = n(1), + s = r(u), + c = n(2), + f = r(c), + d = n(97), + p = n(218), + h = r(p), + m = (0, c.keyframes)(["from{opacity:0;}to{opacity:1;}"]), + y = (0, f.default)("div").withConfig({displayName: "Backdrop__Block"})( + [ + "width:100%;height:100%;overflow:hidden;opacity:0;position:absolute;top:0;right:0;z-index:0;pointer-events:none;user-select:none;will-change:transform;transition:0.3s;", + " &::after{content:'';display:block;width:1055px;height:100%;position:absolute;top:0;left:0;transparent 100%);}" + ], + function (e) { + return e.isLoaded && "\n opacity: 1;\n "; + } + ), + g = (0, f.default)("img").withConfig({displayName: "Backdrop__Environment"})(["margin:0;display:block;position:absolute;left:0;bottom:0;"]), + b = (0, f.default)(h.default).withConfig({displayName: "Backdrop__Splash"})(["display:block;margin:0;position:absolute;bottom:30px;right:-107px;z-index:1;"]), + v = (0, f.default)("img").withConfig({displayName: "Backdrop__Construct"})(["margin:0;display:block;position:absolute;bottom:0;right:-107px;z-index:2;"]), + _ = (0, f.default)(h.default).withConfig({displayName: "Backdrop__Keystone"})( + ["margin:0;display:block;position:absolute;bottom:30px;right:-55px;z-index:3;animation:", " 0.25s ease forwards;"], + m + ), + w = (function (e) { + function t(e) { + o(this, t); + var n = a(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e)); + return (n.state = {isLoaded: !1}), n; + } + + return ( + i(t, e), + l(t, [ + { + key: "componentDidMount", + value: function () { + var e = this, + t = this.props.primary, + n = [(0, d.loadImage)(t.construct + "/environment.png"), (0, d.loadImage)(t.construct + "/construct.png")]; + Promise.all(n).then(function () { + e.setState({isLoaded: !0}); + }); + } + }, + { + key: "render", + value: function () { + var e = this.props, + t = e.primary, + n = e.secondary, + r = t.slots[0].choice, + o = -1 !== r && t.slots[0].runes[r]; + return s.default.createElement( + y, + {isLoaded: this.state.isLoaded}, + s.default.createElement(g, { + src: t.construct + "/environment.png", + alt: "", + width: "1162", + height: "720" + }), + n.id, + s.default.createElement(v, { + src: t.construct + "/construct.png", + alt: "", + width: "700", + height: "720" + }) + ); + } + } + ]), + t + ); + })(s.default.Component); + t.default = w; + }, + 575: function (e, t, n) { + "use strict"; + + function r(e) { + return e && e.__esModule ? e : {default: e}; + } + + function o(e, t) { + if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function"); + } + + function a(e, t) { + if (!e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + return !t || ("object" != typeof t && "function" != typeof t) ? e : t; + } + + function i(e, t) { + if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function, not " + typeof t); + (e.prototype = Object.create(t && t.prototype, { + constructor: { + value: e, + enumerable: !1, + writable: !0, + configurable: !0 + } + })), + t && (Object.setPrototypeOf ? Object.setPrototypeOf(e, t) : (e.__proto__ = t)); + } + + function l(e) { + return {longDescriptions: e.longDescriptions}; + } + + Object.defineProperty(t, "__esModule", {value: !0}); + var u = (function () { + function e(e, t) { + for (var n = 0; n < t.length; n++) { + var r = t[n]; + (r.enumerable = r.enumerable || !1), (r.configurable = !0), "value" in r && (r.writable = !0), Object.defineProperty(e, r.key, r); + } + } + + return function (t, n, r) { + return n && e(t.prototype, n), r && e(t, r), t; + }; + })(), + s = n(1), + c = r(s), + f = n(40), + d = n(2), + p = r(d), + h = n(11), + m = n(576), + y = (function (e) { + if (e && e.__esModule) return e; + var t = {}; + if (null != e) for (var n in e) Object.prototype.hasOwnProperty.call(e, n) && (t[n] = e[n]); + return (t.default = e), t; + })(m), + g = (0, p.default)("div").withConfig({displayName: "Options__Block"})(["position:absolute;bottom:20px;left:30px;"]), + b = (0, p.default)("label").withConfig({displayName: "Options__Label"})([ + "color:#a09b8c;font-size:12px;font-weight:normal;line-height:16px;letter-spacing:0.025em;&:hover{color:#f0e6d2;}" + ]), + v = (0, p.default)("input").withConfig({displayName: "Options__Input"})(["display:none;"]), + _ = (0, p.default)("span").withConfig({displayName: "Options__InputMask"})( + [ + 'margin-right:7px;display:inline-block;vertical-align:middle;width:14px;height:14px;background:url("', + '");position:relative;top:-1px;', + ":hover &{background-position:0 -14px;}", + ":checked + &{background-position:0 -28px;}", + ":hover ", + ":checked + &{background-position:0 -42px;}" + ], + (0, h.assetPath)("/img/checkbox-sprite.png"), + b, + v, + b, + v + ), + w = (function (e) { + function t(e) { + o(this, t); + var n = a(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e)); + return ( + (n.longDescriptions = n.props.longDescriptions), + (n.handleKeyDown = function (e) { + 16 === e.keyCode && y.setShift(!0); + }), + (n.handleKeyUp = function (e) { + 16 === e.keyCode && y.setShift(!1); + }), + (n.handleChange = function (e) { + e.preventDefault(), y.toggleGlobal(); + }), + n + ); + } + + return ( + i(t, e), + u(t, [ + { + key: "componentDidMount", + value: function () { + window.addEventListener("keydown", this.handleKeyDown), window.addEventListener("keyup", this.handleKeyUp); + } + }, + { + key: "componentWillUnmount", + value: function () { + window.removeEventListener("keydown", this.handleKeyDown), window.addEventListener("keyup", this.handleKeyUp); + } + }, + { + key: "render", + value: function () { + var e = this.props.longDescriptions; + return c.default.createElement( + g, + null, + c.default.createElement( + b, + {htmlFor: "descriptions-checkbox"}, + c.default.createElement(v, { + id: "descriptions-checkbox", + type: "checkbox", + checked: e.global || e.shift, + onChange: this.handleChange + }), + c.default.createElement(_, null), + c.default.createElement("span", null, window.i18n.runebuilder.showDetailedDescriptions) + ) + ); + } + } + ]), + t + ); + })(c.default.Component); + t.default = (0, f.connect)(l)(w); + }, + 576: function (e, t, n) { + "use strict"; + + function r(e) { + i.default.dispatch({type: "SET_SHIFT_DESCRIPTIONS", data: {shift: e}}); + } + + function o() { + i.default.dispatch({type: "TOGGLE_GLOBAL_DESCTIPTIONS", data: {}}); + } + + Object.defineProperty(t, "__esModule", {value: !0}), (t.setShift = r), (t.toggleGlobal = o); + var a = n(71), + i = (function (e) { + return e && e.__esModule ? e : {default: e}; + })(a); + }, + 577: function (e, t, n) { + "use strict"; + + function r(e) { + return e && e.__esModule ? e : {default: e}; + } + + Object.defineProperty(t, "__esModule", {value: !0}); + var o = + Object.assign || + function (e) { + for (var t = 1; t < arguments.length; t++) { + var n = arguments[t]; + for (var r in n) Object.prototype.hasOwnProperty.call(n, r) && (e[r] = n[r]); + } + return e; + }, + a = n(1), + i = r(a), + l = n(40), + u = n(22), + s = (function (e) { + if (e && e.__esModule) return e; + var t = {}; + if (null != e) for (var n in e) Object.prototype.hasOwnProperty.call(e, n) && (t[n] = e[n]); + return (t.default = e), t; + })(u), + c = n(578), + f = r(c), + d = n(64), + p = r(d), + h = function (e) { + var t = e.primary, + n = {path: t, toggleDrawer: s.togglePrimaryRuneDrawer, setRune: s.setPrimaryRune}; + return i.default.createElement( + "section", + {id: "primary-path"}, + i.default.createElement(f.default, n), + i.default.createElement(p.default, o({ + slot: t.slots[0], + keystone: !0, + slotIndex: 0, + selectText: window.i18n.runebuilder.selectKeystone + }, n)), + i.default.createElement(p.default, o({ + slot: t.slots[1], + slotIndex: 1, + selectText: window.i18n.runebuilder.selectGreater + }, n)), + i.default.createElement(p.default, o({slot: t.slots[2], slotIndex: 2}, n)), + i.default.createElement(p.default, o({slot: t.slots[3], slotIndex: 3}, n)) + ); + }, + m = function (e) { + return {primary: e.primary}; + }; + t.default = (0, l.connect)(m)(h); + }, + 578: function (e, t, n) { + "use strict"; + + function r(e) { + if (e && e.__esModule) return e; + var t = {}; + if (null != e) for (var n in e) Object.prototype.hasOwnProperty.call(e, n) && (t[n] = e[n]); + return (t.default = e), t; + } + + function o(e) { + return e && e.__esModule ? e : {default: e}; + } + + Object.defineProperty(t, "__esModule", {value: !0}); + var a = n(1), + i = o(a), + l = n(2), + u = o(l), + s = n(60), + c = o(s), + f = n(22), + d = r(f), + p = n(35), + h = r(p), + m = n(143), + y = o(m), + g = n(64), + b = r(g), + v = n(221), + _ = o(v), + w = n(222), + E = o(w), + x = (0, u.default)(h.Title).withConfig({displayName: "KeyStoneSlot__Title"})(["font-size:18px;line-height:22px;"]), + O = function (e) { + var t = e.path, + n = t.slots.length, + r = (0, c.default)(t.slots, function (e) { + return -1 === e.choice; + }), + o = -1 !== r, + a = -1 === r ? n : r + 1; + return i.default.createElement( + b.Block, + null, + i.default.createElement( + b.LeftSide, + null, + i.default.createElement(E.default, {path: t, total: n, current: a, isActive: o}), + i.default.createElement(_.default, {path: t, onClick: d.clearPrimary}) + ), + i.default.createElement( + b.RightSide, + null, + i.default.createElement( + h.Block, + {animate: !1}, + i.default.createElement(x, {color: t.colors.title}, t.name), + i.default.createElement(y.default, null, i.default.createElement(h.P, {dangerouslySetInnerHTML: {__html: t.description}})) + ) + ) + ); + }; + t.default = O; + }, + 580: function (e, t, n) { + "use strict"; + + function r(e) { + return e && e.__esModule ? e : {default: e}; + } + + Object.defineProperty(t, "__esModule", {value: !0}); + var o = n(1), + a = r(o), + i = n(2), + l = r(i), + u = (0, i.keyframes)(["to{transform:rotate(360deg);}"]), + s = (0, l.default)("svg").withConfig({displayName: "Spinner__SVG"})( + [ + "width:100%;height:100%;opacity:", + ";visibility:", + ";pointer-events:none;position:absolute;left:0;top:0;transition:opacity 0.2s;filter:blur(1px);animation:", + " 2s linear forwards infinite;" + ], + function (e) { + return e.isActive ? "1" : "0"; + }, + function (e) { + return e.isActive ? "visible" : "hidden"; + }, + u + ), + c = function (e) { + var t = e.keystone, + n = e.isActive; + return a.default.createElement( + s, + {isActive: n}, + a.default.createElement("path", { + fill: "none", + strokeLinecap: "round", + strokeWidth: "2px", + stroke: "url(#gradient-white-transparent)", + d: t ? "M 31 1 A 30 30 0 0 0 31 61" : "M 23.5 1 A 22.5 22.5 0 0 0 23.5 46" + }), + a.default.createElement("ellipse", {cx: "50%", cy: "1px", fill: "#fff", rx: "5", ry: "2"}) + ); + }; + t.default = c; + }, + 581: function (e, t, n) { + "use strict"; + + function r(e) { + return {longDescriptions: e.longDescriptions}; + } + + Object.defineProperty(t, "__esModule", {value: !0}); + var o = n(1), + a = (function (e) { + return e && e.__esModule ? e : {default: e}; + })(o), + i = n(40), + l = function (e) { + var t = e.rune, + n = e.longDescriptions, + r = n.global || n.shift, + o = `${(r ? t.longDescription : t.shortDescription)}

    ${getRuneTooltip(e.rune)}`; + return a.default.createElement("p", {dangerouslySetInnerHTML: {__html: o}}); + }; + t.default = (0, i.connect)(r)(l); + }, + 582: function (e, t, n) { + "use strict"; + + function r(e) { + return e && e.__esModule ? e : {default: e}; + } + + Object.defineProperty(t, "__esModule", {value: !0}); + var o = n(1), + a = r(o), + i = n(40), + l = n(22), + u = ((function (e) { + if (e && e.__esModule) return e; + var t = {}; + if (null != e) for (var n in e) Object.prototype.hasOwnProperty.call(e, n) && (t[n] = e[n]); + t.default = e; + })(l), + n(583)), + s = r(u), + c = n(584), + f = r(c), + d = n(587), + p = r(d), + h = function (e) { + var t = e.paths, + n = e.primary, + r = e.secondary; + return a.default.createElement( + "section", + {id: "secondary-path"}, + a.default.createElement(s.default, {paths: t, secondary: r, primary: n}), + r.hasPath + ? a.default.createElement(f.default, {key: r.title, secondary: r}) + : a.default.createElement("div", {key: "empty-slots"}, a.default.createElement(p.default, null), a.default.createElement(p.default, null)) + ); + }, + m = function (e) { + return {paths: e.paths, primary: e.primary, secondary: e.secondary}; + }; + t.default = (0, i.connect)(m)(h); + }, + 583: function (e, t, n) { + "use strict"; + + function r(e) { + if (e && e.__esModule) return e; + var t = {}; + if (null != e) for (var n in e) Object.prototype.hasOwnProperty.call(e, n) && (t[n] = e[n]); + return (t.default = e), t; + } + + function o(e) { + return e && e.__esModule ? e : {default: e}; + } + + function a(e, t) { + if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function"); + } + + function i(e, t) { + if (!e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + return !t || ("object" != typeof t && "function" != typeof t) ? e : t; + } + + function l(e, t) { + if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function, not " + typeof t); + (e.prototype = Object.create(t && t.prototype, { + constructor: { + value: e, + enumerable: !1, + writable: !0, + configurable: !0 + } + })), + t && (Object.setPrototypeOf ? Object.setPrototypeOf(e, t) : (e.__proto__ = t)); + } + + Object.defineProperty(t, "__esModule", {value: !0}); + var u = (function () { + function e(e, t) { + for (var n = 0; n < t.length; n++) { + var r = t[n]; + (r.enumerable = r.enumerable || !1), (r.configurable = !0), "value" in r && (r.writable = !0), Object.defineProperty(e, r.key, r); + } + } + + return function (t, n, r) { + return n && e(t.prototype, n), r && e(t, r), t; + }; + })(), + s = n(1), + c = o(s), + f = n(2), + d = o(f), + p = n(22), + h = r(p), + m = n(142), + y = o(m), + g = n(35), + b = r(g), + v = n(64), + _ = r(v), + w = n(222), + E = o(w), + x = n(219), + O = o(x), + P = n(221), + k = o(P), + C = (0, d.default)("button").withConfig({displayName: "PathSlot__PathOptionButton"})(["width:48px;height:48px;background:none;border:0;padding:0;"]), + j = (0, d.default)("img").withConfig({displayName: "PathSlot__PathIcon"})(["display:block;margin:0 auto;width:26px;height:26px;"]), + S = (0, d.default)("hr").withConfig({displayName: "PathSlot__Hr"})(["margin:6px 0;width:100%;border:0;background:#515250;height:1px;"]), + M = function (e) { + var t = e.setBonus; + return c.default.createElement( + "div", + null, + c.default.createElement(b.Title, {small: !0}, t.name), + c.default.createElement(b.P, {flush: !0}, t.name), + c.default.createElement(S, null), + c.default.createElement(b.P, {dangerouslySetInnerHTML: {__html: t.value}}) + ); + }, + B = (function (e) { + function t() { + return a(this, t), i(this, (t.__proto__ || Object.getPrototypeOf(t)).apply(this, arguments)); + } + + return ( + l(t, e), + u(t, [ + { + key: "componentDidUpdate", + value: function () { + var e = this.props, + t = e.primary, + n = e.secondary; + if (!n.isOpen && !n.hasPath) { + 0 === + t.slots.filter(function (e) { + return -1 === e.choice; + }).length && h.toggleSecondaryPathDrawer(); + } + } + }, + { + key: "render", + value: function () { + var e = this.props, + t = e.paths, + n = e.primary, + r = e.secondary, + o = Object.values(t).filter(function (e) { + return e.name !== n.name; + }), + a = r.slots.choices && -1 === r.slots.choices[1], + i = r.slots.choices && (-1 !== r.slots.choices[0] ? 2 : 1); + return c.default.createElement( + _.Block, + null, + c.default.createElement( + _.LeftSide, + null, + c.default.createElement(E.default, { + path: r, + total: 2, + current: i, + isActive: a + }), + c.default.createElement(k.default, { + path: r, + onClick: h.toggleSecondaryPathDrawer + }) + ), + c.default.createElement( + _.RightSide, + null, + !r.isOpen && + c.default.createElement( + "div", + null, + r.icon + ? (function () { + var e = n.bonuses.find(function (e) { + return -1 !== e.name.indexOf(r.name); + }); + return c.default.createElement( + b.Block, + {key: e.title, animate: !0}, + c.default.createElement(b.Title, { + color: r.colors.title, + small: !0 + }, r.name), + c.default.createElement(b.P, {dangerouslySetInnerHTML: {__html: e.value}}) + ); + })() + : c.default.createElement( + b.Block, + {key: "choose-path"}, + c.default.createElement(b.Title, {small: !0}, window.i18n.runebuilder.secondary.selectSecondary) + ) + ), + c.default.createElement( + O.default, + {isOpen: r.isOpen, columns: 4}, + o.map(function (e) { + var t = n.bonuses.find(function (t) { + return -1 !== t.name.indexOf(e.name); + }); + if (void 0 === t) return console.warn("PathSlot couldn't find a setBouns for " + e.name + " in " + n.name), null; + var r = function () { + h.setSecondary(e.slug); + }; + return c.default.createElement( + y.default, + { + key: e.name, + content: t && c.default.createElement(M, {setBonus: t}) + }, + c.default.createElement(C, {onClick: r}, c.default.createElement(j, { + src: e.icon, + alt: "" + })) + ); + }) + ) + ) + ); + } + } + ]), + t + ); + })(c.default.Component); + t.default = B; + }, + 584: function (e, t, n) { + "use strict"; + + function r(e) { + if (e && e.__esModule) return e; + var t = {}; + if (null != e) for (var n in e) Object.prototype.hasOwnProperty.call(e, n) && (t[n] = e[n]); + return (t.default = e), t; + } + + function o(e) { + return e && e.__esModule ? e : {default: e}; + } + + function a(e, t) { + if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function"); + } + + function i(e, t) { + if (!e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + return !t || ("object" != typeof t && "function" != typeof t) ? e : t; + } + + function l(e, t) { + if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function, not " + typeof t); + (e.prototype = Object.create(t && t.prototype, { + constructor: { + value: e, + enumerable: !1, + writable: !0, + configurable: !0 + } + })), + t && (Object.setPrototypeOf ? Object.setPrototypeOf(e, t) : (e.__proto__ = t)); + } + + Object.defineProperty(t, "__esModule", {value: !0}); + var u = (function () { + function e(e, t) { + for (var n = 0; n < t.length; n++) { + var r = t[n]; + (r.enumerable = r.enumerable || !1), (r.configurable = !0), "value" in r && (r.writable = !0), Object.defineProperty(e, r.key, r); + } + } + + return function (t, n, r) { + return n && e(t.prototype, n), r && e(t, r), t; + }; + })(), + s = n(1), + c = o(s), + f = n(22), + d = r(f), + p = n(144), + h = o(p), + m = n(64), + y = r(m), + g = n(585), + b = o(g), + v = n(586), + _ = o(v), + w = function () { + d.toggleSecondaryRuneDrawer(0); + }, + E = function () { + d.toggleSecondaryRuneDrawer(1); + }, + x = (function (e) { + function t() { + return a(this, t), i(this, (t.__proto__ || Object.getPrototypeOf(t)).apply(this, arguments)); + } + + return ( + l(t, e), + u(t, [ + { + key: "render", + value: function () { + var e = this.props.secondary, + t = e.slots, + n = t.runes, + r = t.choices, + o = t.slotIndex, + a = t.isOpen, + i = n[r[0]], + l = n[r[1]]; + return c.default.createElement( + "div", + null, + c.default.createElement( + y.Block, + null, + c.default.createElement(y.LeftSide, null, c.default.createElement(h.default, { + rune: i, + path: e, + isActive: a && 0 === o, + onClick: w + })), + c.default.createElement( + y.RightSide, + null, + c.default.createElement(_.default, { + key: e.name, + path: e, + isOpen: a + }), + !a && c.default.createElement(b.default, {rune: i, path: e}) + ) + ), + c.default.createElement( + y.Block, + null, + c.default.createElement(y.LeftSide, null, c.default.createElement(h.default, { + rune: l, + path: e, + isActive: a && 1 === o, + onClick: E + })), + c.default.createElement(y.RightSide, null, !a && c.default.createElement(b.default, { + rune: l, + path: e + })) + ) + ); + } + } + ]), + t + ); + })(c.default.Component); + t.default = x; + }, + 585: function (e, t, n) { + "use strict"; + + function r(e) { + return e && e.__esModule ? e : {default: e}; + } + + Object.defineProperty(t, "__esModule", {value: !0}); + var o = n(1), + a = r(o), + i = n(35), + l = (function (e) { + if (e && e.__esModule) return e; + var t = {}; + if (null != e) for (var n in e) Object.prototype.hasOwnProperty.call(e, n) && (t[n] = e[n]); + return (t.default = e), t; + })(i), + u = n(143), + s = r(u), + c = function (e) { + var t = e.rune, + n = e.path; + return t + ? a.default.createElement( + l.Block, + {key: "rune2"}, + a.default.createElement(l.Title, {small: !0, color: n.colors.title}, t.name), + a.default.createElement(s.default, null, a.default.createElement(l.P, {dangerouslySetInnerHTML: {__html: t.shortDescription}})) + ) + : a.default.createElement( + l.Block, + {key: "choose-rune2"}, + a.default.createElement(l.Title, { + small: !0, + color: n.colors.title + }, window.i18n.runebuilder.secondary.selectSecondary) + ); + }; + t.default = c; + }, + 586: function (e, t, n) { + "use strict"; + + function r(e) { + return e && e.__esModule ? e : {default: e}; + } + + function o(e, t) { + if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function"); + } + + function a(e, t) { + if (!e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + return !t || ("object" != typeof t && "function" != typeof t) ? e : t; + } + + function i(e, t) { + if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function, not " + typeof t); + (e.prototype = Object.create(t && t.prototype, { + constructor: { + value: e, + enumerable: !1, + writable: !0, + configurable: !0 + } + })), + t && (Object.setPrototypeOf ? Object.setPrototypeOf(e, t) : (e.__proto__ = t)); + } + + Object.defineProperty(t, "__esModule", {value: !0}); + var l = (function () { + function e(e, t) { + var n = [], + r = !0, + o = !1, + a = void 0; + try { + for (var i, l = e[Symbol.iterator](); !(r = (i = l.next()).done) && (n.push(i.value), !t || n.length !== t); r = !0) ; + } catch (e) { + (o = !0), (a = e); + } finally { + try { + !r && l.return && l.return(); + } finally { + if (o) throw a; + } + } + return n; + } + + return function (t, n) { + if (Array.isArray(t)) return t; + if (Symbol.iterator in Object(t)) return e(t, n); + throw new TypeError("Invalid attempt to destructure non-iterable instance"); + }; + })(), + u = (function () { + function e(e, t) { + for (var n = 0; n < t.length; n++) { + var r = t[n]; + (r.enumerable = r.enumerable || !1), (r.configurable = !0), "value" in r && (r.writable = !0), Object.defineProperty(e, r.key, r); + } + } + + return function (t, n, r) { + return n && e(t.prototype, n), r && e(t, r), t; + }; + })(), + s = n(1), + c = r(s), + f = n(2), + d = r(f), + p = n(220), + h = n(22), + m = (function (e) { + if (e && e.__esModule) return e; + var t = {}; + if (null != e) for (var n in e) Object.prototype.hasOwnProperty.call(e, n) && (t[n] = e[n]); + return (t.default = e), t; + })(h), + y = n(99), + g = r(y), + b = n(144), + v = r(b), + _ = (0, d.default)("div").withConfig({displayName: "RuneDrawer__Block"})(["opacity:0;visibility:hidden;width:200px;height:220px;position:absolute;top:-10px;left:0;z-index:100;"]), + w = (0, d.default)("div").withConfig({displayName: "RuneDrawer__Row"})(["display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;width:100%;height:100%;"]), + E = (0, d.default)("div").withConfig({displayName: "RuneDrawer__Item"})(["flex-basis:", "%;display:flex;align-items:center;justify-content:center;"], 100 / 3), + x = (function (e) { + function t() { + return o(this, t), a(this, (t.__proto__ || Object.getPrototypeOf(t)).apply(this, arguments)); + } + + return ( + i(t, e), + u(t, [ + { + key: "componentDidMount", + value: function () { + (this.timing = 0.12), + (this.animation = new p.TimelineLite({paused: !this.props.isOpen}) + .set(this.row.childNodes, {opacity: 0, x: -20}) + .to(this.block, this.timing, { + opacity: 1, + visibility: "visible", + ease: p.Power0.easeNone + }, 0.05) + .to([this.flourishTop, this.flourishBottom], this.timing / 2, { + color: "#c8aa6e", + ease: p.Power0.easeNone + }, "-=" + this.timing) + .to([this.flourishTop, this.flourishBottom], this.timing / 2, { + color: "#594620", + ease: p.Power0.easeNone + }) + .to([this.flourishTop, this.flourishBottom], this.timing, { + width: "100%", + ease: p.Power0.easeNone + }, "-=" + this.timing) + .to([this.flourishTop, this.flourishBottom], this.timing, { + width: "100%", + ease: p.Power0.easeNone + }, "-=" + this.timing) + .staggerTo(this.row.childNodes, 0.125, { + opacity: 1, + x: 0, + ease: p.Power0.easeNone + }, 0.2 / this.row.childNodes.length, "-=" + this.timing)); + } + }, + { + key: "componentDidUpdate", + value: function (e) { + var t = this; + this.props.isOpen && + !e.isOpen && + window.requestAnimationFrame(function () { + t.animation.play(); + }), + !this.props.isOpen && + e.isOpen && + window.requestAnimationFrame(function () { + t.animation.reverse(); + }); + } + }, + { + key: "componentWillUnmount", + value: function () { + this.animation.seek(0), this.animation.kill(), (this.animation = null); + } + }, + { + key: "render", + value: function () { + var e = this, + t = this.props.path, + n = t.slots, + r = n.runes, + o = n.choices, + a = l(o, 2), + i = a[0], + u = a[1], + s = Math.floor(i / 3), + f = Math.floor(u / 3); + return c.default.createElement( + _, + { + innerRef: function (t) { + e.block = t; + } + }, + c.default.createElement( + w, + { + innerRef: function (t) { + e.row = t; + } + }, + r.map(function (e, n) { + var r = function () { + m.setSecondaryRune(n); + }, + o = Math.floor(n / 3), + a = o === s, + l = o === f, + d = a || l, + p = d && n !== i && n !== u; + return c.default.createElement(E, {key: e.name}, c.default.createElement(v.default, { + rune: e, + path: t, + onClick: r, + isChosen: p + })); + }) + ), + c.default.createElement(g.default, { + innerRef: function (t) { + e.flourishTop = t; + }, + top: 72 + }), + c.default.createElement(g.default, { + innerRef: function (t) { + e.flourishBottom = t; + }, + bottom: 72 + }) + ); + } + } + ]), + t + ); + })(c.default.Component); + t.default = x; + }, + 587: function (e, t, n) { + "use strict"; + + function r(e) { + if (e && e.__esModule) return e; + var t = {}; + if (null != e) for (var n in e) Object.prototype.hasOwnProperty.call(e, n) && (t[n] = e[n]); + return (t.default = e), t; + } + + function o(e) { + return e && e.__esModule ? e : {default: e}; + } + + Object.defineProperty(t, "__esModule", {value: !0}); + var a = n(1), + i = o(a), + l = n(98), + u = o(l), + s = n(35), + c = r(s), + f = n(64), + d = r(f), + p = function () { + return i.default.createElement( + d.Block, + null, + i.default.createElement(d.LeftSide, null, i.default.createElement(u.default, {isDisabled: !0})), + i.default.createElement( + d.RightSide, + null, + i.default.createElement( + c.Block, + null, + i.default.createElement(c.Title, {small: !0}, window.i18n.runebuilder.splash.title), + i.default.createElement(c.P, {small: !0}, window.i18n.runebuilder.splash.body) + ) + ) + ); + }; + t.default = p; + }, + 588: function (e, t, n) { + "use strict"; + + function r(e) { + return e && e.__esModule ? e : {default: e}; + } + + Object.defineProperty(t, "__esModule", {value: !0}); + var o = n(189), + a = r(o), + i = n(2), + l = r(i), + u = n(40), + s = n(216), + c = r(s), + f = n(589), + d = r(f), + p = n(590), + h = r(p), + m = n(592), + y = r(m), + g = (0, l.default)("div").withConfig({displayName: "Mobile__Block"})(["overflow:hidden;margin:0 -20px;padding:12px;border-bottom:1px solid #4d3d1c;background:#000;"]), + b = function (e) { + var t = e.paths, + n = e.primary, + r = e.secondary; + return a.default.createElement( + g, + null, + a.default.createElement(d.default, {paths: t, primary: n}), + a.default.createElement(h.default, {primary: n}), + a.default.createElement(y.default, {paths: t, primary: n, secondary: r}), + a.default.createElement(c.default, null) + ); + }, + v = function (e) { + return {paths: e.paths, primary: e.primary, secondary: e.secondary}; + }; + t.default = (0, u.connect)(v)(b); + }, + 589: function (e, t, n) { + "use strict"; + + function r(e) { + return e && e.__esModule ? e : {default: e}; + } + + function o(e, t) { + if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function"); + } + + function a(e, t) { + if (!e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + return !t || ("object" != typeof t && "function" != typeof t) ? e : t; + } + + function i(e, t) { + if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function, not " + typeof t); + (e.prototype = Object.create(t && t.prototype, { + constructor: { + value: e, + enumerable: !1, + writable: !0, + configurable: !0 + } + })), + t && (Object.setPrototypeOf ? Object.setPrototypeOf(e, t) : (e.__proto__ = t)); + } + + Object.defineProperty(t, "__esModule", {value: !0}); + var l = (function () { + function e(e, t) { + for (var n = 0; n < t.length; n++) { + var r = t[n]; + (r.enumerable = r.enumerable || !1), (r.configurable = !0), "value" in r && (r.writable = !0), Object.defineProperty(e, r.key, r); + } + } + + return function (t, n, r) { + return n && e(t.prototype, n), r && e(t, r), t; + }; + })(), + u = n(1), + s = r(u), + c = n(2), + f = r(c), + d = n(22), + p = (function (e) { + if (e && e.__esModule) return e; + var t = {}; + if (null != e) for (var n in e) Object.prototype.hasOwnProperty.call(e, n) && (t[n] = e[n]); + return (t.default = e), t; + })(d), + h = (0, f.default)("div").withConfig({displayName: "PathList__Block"})([ + "display:flex;align-items:center;justify-content:center;background:linear-gradient(0deg,#010a13 0%,#030e14 100%);" + ]), + m = (0, f.default)("button").withConfig({displayName: "PathList__Path"})( + [ + "flex:0 0 auto;display:flex;align-items:center;justify-content:center;width:20%;padding:10px 5px;background:#010a13;border:1px solid #9c9789;text-align:center;position:relative;z-index:2;&::after{content:'';opacity:", + ";display:block;border:2px solid #c89b3c;position:absolute;top:-1px;right:-1px;bottom:-1px;left:-1px;transition:0.2s;}" + ], + function (e) { + return e.isActive ? "1" : "0"; + } + ), + y = (0, f.default)("img").withConfig({displayName: "PathList__Icon"})(["display:block;margin:auto;max-width:100%;height:auto;"]), + g = (0, f.default)("h3").withConfig({displayName: "PathList__Title"})(["margin:0 0 5px;font-size:7px;line-height:1;text-transform:uppercase;.i18n-el_GR &{text-transform:none;}"]), + b = (function (e) { + function t() { + return o(this, t), a(this, (t.__proto__ || Object.getPrototypeOf(t)).apply(this, arguments)); + } + + return ( + i(t, e), + l(t, [ + { + key: "componentDidMount", + value: function () { + var e = this, + t = Object.keys(this.props.paths).map(function (t) { + return e.props.paths[t]; + }); + !1 === this.props.primary && p.setPrimary(t[0].slug); + } + }, + { + key: "render", + value: function () { + var e = this, + t = Object.keys(this.props.paths).map(function (t) { + return e.props.paths[t]; + }); + return s.default.createElement( + h, + null, + t.map(function (t) { + var n = function () { + p.setPrimary(t.slug); + }; + return s.default.createElement( + m, + { + key: t.slug, + isActive: t.slug === e.props.primary.slug, + onClick: n + }, + s.default.createElement(y, {src: t.icon, alt: ""}), + s.default.createElement(g, null, t.title) + ); + }) + ); + } + } + ]), + t + ); + })(s.default.Component); + t.default = b; + }, + 590: function (e, t, n) { + "use strict"; + + function r(e) { + if (e && e.__esModule) return e; + var t = {}; + if (null != e) for (var n in e) Object.prototype.hasOwnProperty.call(e, n) && (t[n] = e[n]); + return (t.default = e), t; + } + + function o(e) { + return e && e.__esModule ? e : {default: e}; + } + + function a(e, t) { + if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function"); + } + + function i(e, t) { + if (!e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + return !t || ("object" != typeof t && "function" != typeof t) ? e : t; + } + + function l(e, t) { + if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function, not " + typeof t); + (e.prototype = Object.create(t && t.prototype, { + constructor: { + value: e, + enumerable: !1, + writable: !0, + configurable: !0 + } + })), + t && (Object.setPrototypeOf ? Object.setPrototypeOf(e, t) : (e.__proto__ = t)); + } + + function u(e, t) { + return Object.freeze(Object.defineProperties(e, {raw: {value: Object.freeze(t)}})); + } + + Object.defineProperty(t, "__esModule", {value: !0}); + var s = (function () { + function e(e, t) { + for (var n = 0; n < t.length; n++) { + var r = t[n]; + (r.enumerable = r.enumerable || !1), (r.configurable = !0), "value" in r && (r.writable = !0), Object.defineProperty(e, r.key, r); + } + } + + return function (t, n, r) { + return n && e(t.prototype, n), r && e(t, r), t; + }; + })(), + c = u(["\n padding: 16px 0;\n"], ["\n padding: 16px 0;\n"]), + f = u(["\n margin-bottom: 0;\n"], ["\n margin-bottom: 0;\n"]), + d = n(1), + p = o(d), + h = n(2), + m = o(h), + y = n(22), + g = r(y), + b = n(35), + v = r(b), + _ = n(98), + w = o(_), + E = n(99), + x = o(E), + O = n(223), + P = o(O), + k = n(145), + C = r(k), + j = n(591), + S = o(j), + M = (0, m.default)("div").withConfig({displayName: "PrimaryPath__Block"})(["padding-top:40px;position:relative;z-index:1;"]), + B = C.Block.extend(c), + R = v.P.extend(f), + N = (function (e) { + function t() { + return a(this, t), i(this, (t.__proto__ || Object.getPrototypeOf(t)).apply(this, arguments)); + } + + return ( + l(t, e), + s(t, [ + { + key: "render", + value: function () { + var e = this.props.primary; + return e + ? p.default.createElement( + M, + null, + p.default.createElement( + "div", + null, + p.default.createElement(S.default, {path: e}), + p.default.createElement( + C.Block, + null, + p.default.createElement(C.LeftSide, null, p.default.createElement(P.default, { + icon: e.icon, + path: e + })), + p.default.createElement( + C.RightSide, + null, + p.default.createElement(v.Title, {color: e.colors.title}, e.name), + p.default.createElement(v.P, null, e.description) + ) + ), + e.slots.map(function (t, n) { + var r = t.runes[t.choice], + o = function () { + g.togglePrimaryRuneDrawer(n); + }; + return p.default.createElement( + B, + {key: t.slug}, + p.default.createElement(x.default, {top: 0}), + p.default.createElement(C.LeftSide, null, p.default.createElement(w.default, { + rune: r, + path: e, + isActive: t.isOpen, + onClick: o + })), + t.isOpen + ? p.default.createElement( + C.RightSide, + null, + t.runes.map(function (r, o) { + var a = function () { + g.setPrimaryRune(n, o); + }, + i = -1 !== t.choice && t.choice !== o; + return p.default.createElement( + C.Block, + {key: r.name}, + p.default.createElement( + C.LeftSide, + null, + p.default.createElement(w.default, { + rune: r, + path: e, + small: !0, + onClick: a, + isChosen: i + }) + ), + p.default.createElement( + C.RightSide, + null, + p.default.createElement(v.Title, {color: e.colors.title}, r.name), + p.default.createElement(R, {dangerouslySetInnerHTML: {__html: `${r.longDescription}

    ${getRuneTooltip(r)}`}}) + ) + ); + }) + ) + : p.default.createElement( + C.RightSide, + null, + r + ? p.default.createElement( + "div", + null, + p.default.createElement(v.Title, {color: e.colors.title}, r.name), + p.default.createElement(R, {dangerouslySetInnerHTML: {__html: `${r.longDescription}

    ${getRuneTooltip(r)}`}}) + ) + : p.default.createElement( + R, + {color: e.colors.title}, + 0 === n ? window.i18n.runebuilder.selectKeystone : window.i18n.runebuilder.selectRune + ) + ) + ); + }) + ) + ) + : null; + } + } + ]), + t + ); + })(p.default.Component); + t.default = N; + }, + 591: function (e, t, n) { + "use strict"; + + function r(e) { + return e && e.__esModule ? e : {default: e}; + } + + function o(e, t) { + if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function"); + } + + function a(e, t) { + if (!e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + return !t || ("object" != typeof t && "function" != typeof t) ? e : t; + } + + function i(e, t) { + if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function, not " + typeof t); + (e.prototype = Object.create(t && t.prototype, { + constructor: { + value: e, + enumerable: !1, + writable: !0, + configurable: !0 + } + })), + t && (Object.setPrototypeOf ? Object.setPrototypeOf(e, t) : (e.__proto__ = t)); + } + + Object.defineProperty(t, "__esModule", {value: !0}); + var l = (function () { + function e(e, t) { + for (var n = 0; n < t.length; n++) { + var r = t[n]; + (r.enumerable = r.enumerable || !1), (r.configurable = !0), "value" in r && (r.writable = !0), Object.defineProperty(e, r.key, r); + } + } + + return function (t, n, r) { + return n && e(t.prototype, n), r && e(t, r), t; + }; + })(), + u = n(1), + s = r(u), + c = n(2), + f = r(c), + d = ((0, c.keyframes)(["from{opacity:0;}to{opacity:1;}"]), + (0, f.default)("div").withConfig({displayName: "Backdrop__Block"})( + [ + "opacity:0;width:", + "vw;position:absolute;top:", + "vw;left:0;z-index:-1;transition:0.3s;", + " &::after{content:'';display:block;width:100%;height:100%;background:radial-gradient(ellipse closest-side at center,transparent 0%,#000 100%);position:absolute;top:0;left:0;}" + ], + 115.625, + -21.875, + function (e) { + return e.isLoaded && "\n opacity: 1;\n "; + } + )), + p = (0, f.default)("img").withConfig({displayName: "Backdrop__Environment"})(["width:100%;height:auto;"]), + h = (0, f.default)(p).withConfig({displayName: "Backdrop__Construct"})(["width:", "%;position:absolute;top:0;right:0;"], 700 / 1162 * 100), + m = (function (e) { + function t() { + o(this, t); + var e = a(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this)); + return (e.state = {isLoaded: !1}), e; + } + + return ( + i(t, e), + l(t, [ + { + key: "componentDidMount", + value: function () { + var e = this, + t = new Image(); + (t.onload = function () { + e.setState({isLoaded: !0}); + }), + (t.src = this.props.path.construct + "/environment.png"); + } + }, + { + key: "render", + value: function () { + var e = this.props.path; + return s.default.createElement( + d, + {isLoaded: this.state.isLoaded}, + s.default.createElement(p, { + src: e.construct + "/environment.png", + alt: "" + }), + s.default.createElement(h, {src: e.construct + "/construct.png", alt: ""}) + ); + } + } + ]), + t + ); + })(s.default.Component); + t.default = m; + }, + 592: function (e, t, n) { + "use strict"; + + function r(e) { + if (e && e.__esModule) return e; + var t = {}; + if (null != e) for (var n in e) Object.prototype.hasOwnProperty.call(e, n) && (t[n] = e[n]); + return (t.default = e), t; + } + + function o(e) { + return e && e.__esModule ? e : {default: e}; + } + + function a(e, t) { + if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function"); + } + + function i(e, t) { + if (!e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + return !t || ("object" != typeof t && "function" != typeof t) ? e : t; + } + + function l(e, t) { + if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function, not " + typeof t); + (e.prototype = Object.create(t && t.prototype, { + constructor: { + value: e, + enumerable: !1, + writable: !0, + configurable: !0 + } + })), + t && (Object.setPrototypeOf ? Object.setPrototypeOf(e, t) : (e.__proto__ = t)); + } + + function u(e, t) { + return Object.freeze(Object.defineProperties(e, {raw: {value: Object.freeze(t)}})); + } + + Object.defineProperty(t, "__esModule", {value: !0}); + var s = (function () { + function e(e, t) { + for (var n = 0; n < t.length; n++) { + var r = t[n]; + (r.enumerable = r.enumerable || !1), (r.configurable = !0), "value" in r && (r.writable = !0), Object.defineProperty(e, r.key, r); + } + } + + return function (t, n, r) { + return n && e(t.prototype, n), r && e(t, r), t; + }; + })(), + c = u(["\n border-top: 1px solid #4d3d1c;\n padding: 16px 0;\n"], ["\n border-top: 1px solid #4d3d1c;\n padding: 16px 0;\n"]), + f = u(["\n margin-bottom: 0;\n"], ["\n margin-bottom: 0;\n"]), + d = n(1), + p = o(d), + h = n(2), + m = o(h), + y = n(60), + g = o(y), + b = n(22), + v = r(b), + _ = n(35), + w = r(_), + E = n(223), + x = o(E), + O = n(145), + P = r(O), + k = n(593), + C = o(k), + j = (0, m.default)("div").withConfig({displayName: "SecondaryPath__Block"})(["position:relative;z-index:1;"]), + S = (0, m.default)("div").withConfig({displayName: "SecondaryPath__PerkList"})(["display:flex;align-items:center;"]), + M = (0, m.default)("div").withConfig({displayName: "SecondaryPath__PerkItem"})(["width:60px;"]), + B = P.Block.extend(c), + R = w.Title.extend(f), + N = w.P.extend(f), + T = (function (e) { + function t() { + return a(this, t), i(this, (t.__proto__ || Object.getPrototypeOf(t)).apply(this, arguments)); + } + + return ( + l(t, e), + s(t, [ + { + key: "componentDidMount", + value: function () { + v.toggleSecondaryPathDrawer(); + } + }, + { + key: "render", + value: function () { + var e = this.props, + t = e.paths, + n = e.primary, + r = e.secondary; + if ( + -1 !== + (0, g.default)(n.slots, function (e) { + return -1 === e.choice; + }) + ) + return null; + var o = Object.values(t).filter(function (e) { + return e.name !== n.name; + }), + a = + r.icon && + n.bonuses.find(function (e) { + return -1 !== e.name.indexOf(r.name); + }); + return p.default.createElement( + j, + null, + p.default.createElement( + B, + null, + p.default.createElement(P.LeftSide, null, p.default.createElement(x.default, { + icon: r && r.icon, + path: r, + onClick: v.toggleSecondaryPathDrawer + })), + !r.isOpen && + r.icon && + p.default.createElement( + P.RightSide, + null, + p.default.createElement(w.Title, {color: r.colors.title}, r.name), + p.default.createElement(N, null, r.description), + p.default.createElement(N, {dangerouslySetInnerHTML: {__html: a.value}}) + ), + !r.isOpen && + !r.icon && + p.default.createElement(P.RightSide, null, p.default.createElement(R, {small: !0}, window.i18n.runebuilder.secondary.selectSecondary)), + r.isOpen && + p.default.createElement( + P.RightSide, + null, + p.default.createElement( + S, + null, + o.map(function (e) { + var t = function () { + v.setSecondary(e.slug); + }; + return p.default.createElement(M, {key: e.slug}, p.default.createElement(x.default, { + icon: e.icon, + path: e, + onClick: t + })); + }) + ) + ) + ), + r.hasPath && p.default.createElement(C.default, { + key: r.title, + secondary: r + }) + ); + } + } + ]), + t + ); + })(p.default.Component); + t.default = T; + }, + 593: function (e, t, n) { + "use strict"; + + function r(e) { + if (e && e.__esModule) return e; + var t = {}; + if (null != e) for (var n in e) Object.prototype.hasOwnProperty.call(e, n) && (t[n] = e[n]); + return (t.default = e), t; + } + + function o(e) { + return e && e.__esModule ? e : {default: e}; + } + + function a(e, t) { + if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function"); + } + + function i(e, t) { + if (!e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + return !t || ("object" != typeof t && "function" != typeof t) ? e : t; + } + + function l(e, t) { + if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function, not " + typeof t); + (e.prototype = Object.create(t && t.prototype, { + constructor: { + value: e, + enumerable: !1, + writable: !0, + configurable: !0 + } + })), + t && (Object.setPrototypeOf ? Object.setPrototypeOf(e, t) : (e.__proto__ = t)); + } + + function u(e, t) { + return Object.freeze(Object.defineProperties(e, {raw: {value: Object.freeze(t)}})); + } + + Object.defineProperty(t, "__esModule", {value: !0}); + var s = (function () { + function e(e, t) { + var n = [], + r = !0, + o = !1, + a = void 0; + try { + for (var i, l = e[Symbol.iterator](); !(r = (i = l.next()).done) && (n.push(i.value), !t || n.length !== t); r = !0) ; + } catch (e) { + (o = !0), (a = e); + } finally { + try { + !r && l.return && l.return(); + } finally { + if (o) throw a; + } + } + return n; + } + + return function (t, n) { + if (Array.isArray(t)) return t; + if (Symbol.iterator in Object(t)) return e(t, n); + throw new TypeError("Invalid attempt to destructure non-iterable instance"); + }; + })(), + c = (function () { + function e(e, t) { + for (var n = 0; n < t.length; n++) { + var r = t[n]; + (r.enumerable = r.enumerable || !1), (r.configurable = !0), "value" in r && (r.writable = !0), Object.defineProperty(e, r.key, r); + } + } + + return function (t, n, r) { + return n && e(t.prototype, n), r && e(t, r), t; + }; + })(), + f = u(["\n padding: 16px 0;\n"], ["\n padding: 16px 0;\n"]), + d = u(["\n margin-bottom: 0;\n"], ["\n margin-bottom: 0;\n"]), + p = n(1), + h = o(p), + m = n(2), + y = o(m), + g = n(22), + b = r(g), + v = n(98), + _ = o(v), + w = n(99), + E = o(w), + x = n(35), + O = r(x), + P = n(145), + k = r(P), + C = (0, y.default)("div").withConfig({displayName: "RuneChooser__RuneDrawer"})(["display:flex;flex-wrap:wrap;width:180px;height:180px;z-index:100;"]), + j = (0, y.default)("div").withConfig({displayName: "RuneChooser__RuneDrawerItem"})(["flex-basis:", "%;display:flex;"], 100 / 3), + S = k.Block.extend(f), + M = O.Title.extend(d), + B = O.P.extend(d), + R = (function (e) { + function t() { + return a(this, t), i(this, (t.__proto__ || Object.getPrototypeOf(t)).apply(this, arguments)); + } + + return ( + l(t, e), + c(t, [ + { + key: "render", + value: function () { + var e = this.props.secondary, + t = e.slots, + n = t.runes, + r = t.choices, + o = t.slotIndex, + a = t.isOpen, + i = s(r, 2), + l = i[0], + u = i[1], + c = n[r[0]], + f = n[r[1]], + d = Math.floor(l / 3), + p = Math.floor(u / 3); + return h.default.createElement( + "div", + {key: e.slug || "blank"}, + h.default.createElement( + S, + null, + h.default.createElement(E.default, {top: 0}), + h.default.createElement( + k.LeftSide, + null, + h.default.createElement(_.default, { + rune: c, + path: e, + isActive: a && 0 === o, + onClick: b.toggleSecondaryRuneDrawer.bind(null, 0) + }) + ), + h.default.createElement( + k.RightSide, + null, + a && 0 === o + ? h.default.createElement( + k.Block, + null, + h.default.createElement( + C, + null, + n.map(function (t, n) { + var r = Math.floor(n / 3), + o = r === d, + a = r === p, + i = o || a, + s = i && n !== l && n !== u; + return h.default.createElement( + j, + {key: t.runeId}, + h.default.createElement(_.default, { + rune: t, + path: e, + onClick: b.setSecondaryRune.bind(null, n), + isChosen: s + }) + ); + }) + ) + ) + : c + ? h.default.createElement( + "div", + {key: "rune1"}, + h.default.createElement(O.Title, { + small: !0, + color: e.colors.title + }, c.name), + h.default.createElement(B, {dangerouslySetInnerHTML: {__html: c.longDescription}}) + ) + : h.default.createElement(M, { + key: "choose-rune1", + small: !0, + color: e.colors.title + }, "Select Secondary") + ) + ), + h.default.createElement( + S, + null, + h.default.createElement(E.default, {top: 0}), + h.default.createElement( + k.LeftSide, + null, + h.default.createElement(_.default, { + rune: f, + path: e, + isActive: a && 1 === o, + onClick: b.toggleSecondaryRuneDrawer.bind(null, 1) + }) + ), + h.default.createElement( + k.RightSide, + null, + a && 1 === o + ? h.default.createElement( + k.Block, + null, + h.default.createElement( + C, + null, + n.map(function (t, n) { + var r = Math.floor(n / 3), + o = r === d, + a = r === p, + i = o || a, + s = i && n !== l && n !== u; + return h.default.createElement( + j, + {key: t.runeId}, + h.default.createElement(_.default, { + rune: t, + path: e, + onClick: b.setSecondaryRune.bind(null, n), + isChosen: s + }) + ); + }) + ) + ) + : f + ? h.default.createElement( + "div", + {key: "rune2"}, + h.default.createElement(O.Title, { + small: !0, + color: e.colors.title + }, f.name), + h.default.createElement(B, {dangerouslySetInnerHTML: {__html: f.longDescription}}) + ) + : h.default.createElement(M, { + key: "choose-rune2", + small: !0, + color: e.colors.title + }, "Select Secondary") + ) + ) + ); + } + } + ]), + t + ); + })(h.default.Component); + t.default = R; + }, + 594: function (e, t, n) { + "use strict"; + + function r(e) { + return e && e.__esModule ? e : {default: e}; + } + + function o(e, t) { + if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function"); + } + + function a(e, t) { + if (!e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + return !t || ("object" != typeof t && "function" != typeof t) ? e : t; + } + + function i(e, t) { + if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function, not " + typeof t); + (e.prototype = Object.create(t && t.prototype, { + constructor: { + value: e, + enumerable: !1, + writable: !0, + configurable: !0 + } + })), + t && (Object.setPrototypeOf ? Object.setPrototypeOf(e, t) : (e.__proto__ = t)); + } + + Object.defineProperty(t, "__esModule", {value: !0}); + var l = (function () { + function e(e, t) { + for (var n = 0; n < t.length; n++) { + var r = t[n]; + (r.enumerable = r.enumerable || !1), (r.configurable = !0), "value" in r && (r.writable = !0), Object.defineProperty(e, r.key, r); + } + } + + return function (t, n, r) { + return n && e(t.prototype, n), r && e(t, r), t; + }; + })(), + u = n(1), + s = r(u), + c = n(2), + f = r(c), + d = (0, f.default)("svg").withConfig({displayName: "SVGGradients__SVG"})(["position:absolute;top:100%;left:100%;"]), + p = (function (e) { + function t() { + return o(this, t), a(this, (t.__proto__ || Object.getPrototypeOf(t)).apply(this, arguments)); + } + + return ( + i(t, e), + l(t, [ + { + key: "render", + value: function () { + var e = this.props.paths, + t = Object.keys(e).map(function (t) { + return e[t]; + }); + return s.default.createElement( + d, + {class: "perks-svg-gradients", width: "0", height: "0"}, + s.default.createElement( + "linearGradient", + {id: "gradient-white-transparent", x1: "0", y1: "0", x2: "0", y2: "1"}, + s.default.createElement("stop", { + stopOpacity: "1", + stopColor: "#fff", + offset: "0%" + }), + s.default.createElement("stop", { + stopOpacity: "0", + stopColor: "#fff", + offset: "100%" + }) + ), + s.default.createElement( + "linearGradient", + {id: "gradient-yuma-dallasLight", x1: "0", y1: "0", x2: "0", y2: "1"}, + s.default.createElement("stop", {stopColor: "#cdbe91", offset: "0%"}), + s.default.createElement("stop", {stopColor: "#785a28", offset: "100%"}) + ), + t.map(function (e) { + return s.default.createElement( + "linearGradient", + { + key: e.name, + id: "gradient-" + e.slug, + x1: "0", + y1: "0", + x2: "0", + y2: "1" + }, + s.default.createElement("stop", { + stopColor: e.colors.gradient.top, + offset: "0%" + }), + s.default.createElement("stop", { + stopColor: e.colors.gradient.bottom, + offset: "100%" + }) + ); + }) + ); + } + } + ]), + t + ); + })(s.default.Component); + t.default = p; + }, + 595: function (e, t, n) { + "use strict"; + + function r(e) { + return e && e.__esModule ? e : {default: e}; + } + + function o(e, t) { + if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function"); + } + + function a(e, t) { + if (!e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + return !t || ("object" != typeof t && "function" != typeof t) ? e : t; + } + + function i(e, t) { + if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function, not " + typeof t); + (e.prototype = Object.create(t && t.prototype, { + constructor: { + value: e, + enumerable: !1, + writable: !0, + configurable: !0 + } + })), + t && (Object.setPrototypeOf ? Object.setPrototypeOf(e, t) : (e.__proto__ = t)); + } + + Object.defineProperty(t, "__esModule", {value: !0}); + var l = (function () { + function e(e, t) { + for (var n = 0; n < t.length; n++) { + var r = t[n]; + (r.enumerable = r.enumerable || !1), (r.configurable = !0), "value" in r && (r.writable = !0), Object.defineProperty(e, r.key, r); + } + } + + return function (t, n, r) { + return n && e(t.prototype, n), r && e(t, r), t; + }; + })(), + u = n(1), + s = r(u), + c = n(224), + f = r(c), + d = (function (e) { + function t(e) { + o(this, t); + var n = a(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e)); + return (n.state = {match: -1}), n; + } + + return ( + i(t, e), + l(t, [ + { + key: "componentDidMount", + value: function () { + this.testMatch(), (this.handleResize = (0, f.default)(this.testMatch.bind(this), 100)), window.addEventListener("resize", this.handleResize); + } + }, + { + key: "componentWillUnmount", + value: function () { + window.removeEventListener("resize", this.handleResize); + } + }, + { + key: "testMatch", + value: function () { + var e = window.matchMedia(this.props.queryString).matches; + e !== this.state.match && this.setState({match: e}); + } + }, + { + key: "render", + value: function () { + var e = this.props, + t = e.PassComponent, + n = void 0 === t ? s.default.createElement("span", null) : t, + r = e.FailComponent, + o = void 0 === r ? s.default.createElement("span", null) : r; + return -1 === this.state.match ? null : s.default.Children.only(this.state.match ? n : o); + } + } + ]), + t + ); + })(s.default.Component); + t.default = d; + }, + 64: function (e, t, n) { + "use strict"; + + function r(e) { + return e && e.__esModule ? e : {default: e}; + } + + Object.defineProperty(t, "__esModule", {value: !0}), (t.Icon = t.Frame = t.DisabledButton = t.Button = t.RightSide = t.LeftSide = t.Block = void 0); + var o = n(1), + a = r(o), + i = n(2), + l = r(i), + u = n(35), + s = (function (e) { + if (e && e.__esModule) return e; + var t = {}; + if (null != e) for (var n in e) Object.prototype.hasOwnProperty.call(e, n) && (t[n] = e[n]); + return (t.default = e), t; + })(u), + c = n(143), + f = r(c), + d = n(144), + p = r(d), + h = n(219), + m = r(h), + y = (t.Block = (0, l.default)("div").withConfig({displayName: "Slot__Block"})(["display:flex;margin-bottom:-1px;"])), + g = (t.LeftSide = (0, l.default)("div").withConfig({displayName: "Slot__LeftSide"})([ + "flex-shrink:0;display:flex;justify-content:center;align-items:center;margin-left:-30px;width:107px;height:100px;position:relative;" + ])), + b = (t.RightSide = (0, l.default)("div").withConfig({displayName: "Slot__RightSide"})(["flex-grow:1;position:relative;height:100px;width:198px;.i18n-el_GR &{margin-right:-20px;}"])), + v = (t.Button = (0, l.default)("button").withConfig({displayName: "Slot__Button"})( + ["display:block;padding:0;width:48px;height:48px;border:0;background:#1e2328;border-radius:50%;box-shadow:inset 0 0 7px #000,0 0 1px #000;position:relative;", ""], + function (e) { + return e.large && "\n width: 62px;\n height: 62px;\n "; + } + )), + _ = ((t.DisabledButton = v.withComponent("div")), + (t.Frame = (0, l.default)("svg").withConfig({displayName: "Slot__Frame"})(["width:100%;height:100%;position:relative;"])), + (t.Icon = (0, l.default)("img").withConfig({displayName: "Slot__Icon"})( + ["margin:0;width:", ";height:", ";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);"], + function (e) { + return e.keystone ? "108px" : "46px"; + }, + function (e) { + return e.keystone ? "108px" : "46px"; + } + )), + (0, l.default)("svg").withConfig({displayName: "Slot__KeystoneFlourish"})( + ["position:absolute;right:0;width:286px;height:9px;", " ", ""], + function (e) { + return e.top && "\n top: 0;\n "; + }, + function (e) { + return e.bottom && "\n bottom: 0;\n transform: scale(1, -1);\n "; + } + )), + w = function (e) { + var t = e.slot, + n = e.path, + r = e.slotIndex, + o = e.selectTitle, + i = e.selectText, + l = e.keystone, + u = t.choice, + c = t.runes[u] || !1, + d = t.runes.length > 4 ? 3 : t.runes.length, + h = function () { + e.toggleDrawer(r); + }; + return a.default.createElement( + y, + null, + a.default.createElement( + g, + null, + a.default.createElement(p.default, { + rune: c, + path: n, + isActive: t.isOpen, + disabled: e.disabled, + onClick: h, + size: l && "large", + keystone: l + }) + ), + a.default.createElement( + b, + null, + l && + a.default.createElement( + _, + {top: !0, xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 286 9"}, + a.default.createElement( + "linearGradient", + {id: "grad1", x1: "0%", y1: "0%", x2: "100%", y2: "0%"}, + a.default.createElement("stop", { + offset: "0%", + stopColor: n.colors.gradient.bottom, + stopOpacity: "0" + }), + a.default.createElement("stop", { + offset: "50%", + stopColor: n.colors.gradient.top, + stopOpacity: "1" + }), + a.default.createElement("stop", { + offset: "100%", + stopColor: n.colors.gradient.bottom, + stopOpacity: "0" + }) + ), + a.default.createElement("path", { + fill: "none", + stroke: "url('#grad1')", + d: "M0 4.5h193l4 4" + }), + a.default.createElement("path", { + fill: "none", + stroke: "url('#grad1')", + d: "M286 8.5H62l-7-8H20l-4 4" + }) + ), + l && + a.default.createElement( + _, + {bottom: !0, xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 286 9"}, + a.default.createElement( + "linearGradient", + {id: "grad2", x1: "0%", y1: "0%", x2: "100%", y2: "0%"}, + a.default.createElement("stop", {offset: "0%", stopColor: "transparent"}), + a.default.createElement("stop", {offset: "50%", stopColor: n.colors.gradient.top}), + a.default.createElement("stop", {offset: "100%", stopColor: "transparent"}) + ), + a.default.createElement("path", { + fill: "none", + stroke: "url('#grad1')", + d: "M0 4.5h193l4 4" + }), + a.default.createElement("path", { + fill: "none", + stroke: "url('#grad1')", + d: "M286 8.5H62l-7-8H20l-4 4" + }) + ), + !t.isOpen && + a.default.createElement( + "div", + null, + c + ? a.default.createElement( + s.Block, + {key: c.name, animate: !0}, + a.default.createElement(s.Title, {color: n.colors.title}, c.name), + a.default.createElement(f.default, null, a.default.createElement(s.P, {dangerouslySetInnerHTML: {__html: c.shortDescription}})) + ) + : a.default.createElement( + s.Block, + {key: "choose-perk"}, + a.default.createElement(s.Title, {small: !0}, o || ""), + a.default.createElement(f.default, null, a.default.createElement(s.P, null, i || window.i18n.runebuilder.selectRune)) + ) + ), + a.default.createElement( + m.default, + {path: n, isOpen: t.isOpen, columns: d, keystone: l}, + t.runes.map(function (o, i) { + var u = function () { + e.setRune(r, i); + }, + s = -1 !== t.choice && t.choice !== i; + return a.default.createElement(p.default, { + key: o.name, + rune: o, + path: n, + keystone: l, + onClick: u, + isChosen: s + }); + }) + ) + ) + ); + }; + t.default = w; + }, + 71: function (e, t, n) { + "use strict"; + Object.defineProperty(t, "__esModule", {value: !0}); + var r = n(134), + o = n(558), + a = (function (e) { + return e && e.__esModule ? e : {default: e}; + })(o), + i = (0, r.createStore)(a.default); + t.default = i; + }, + 97: function (e, t, n) { + "use strict"; + + function r(e) { + return (0, f.assetPath)("/img/runes-108x108/" + e + ".png"); + } + + function o(e) { + var t = e.paths, + n = e.primary, + r = e.secondary; + if (!n.slug || !r.slug) return !1; + var o = t.filter(function (e) { + return e.name !== n.name; + }), + a = [ + (0, c.default)(t, function (e) { + return e.slug === n.slug; + }), + n.slots[0].choice, + n.slots[1].choice, + n.slots[2].choice, + n.slots[3].choice, + (0, c.default)(o, function (e) { + return e.slug === r.slug; + }), + r.slots.choices[0], + r.slots.choices[1] + ]; + return ( + -1 === + (0, c.default)(a, function (e) { + return -1 === e; + }) && a.join("") + ); + } + + Object.defineProperty(t, "__esModule", {value: !0}), (t.loadImage = t.appNode = void 0), (t.runeIconSrc = r), (t.validateBuild = o); + var s = n(60), + c = (function (e) { + return e && e.__esModule ? e : {default: e}; + })(s), + f = n(11); + (t.appNode = document.querySelector("#perks-app")), + (t.loadImage = function (e) { + return new Promise(function (t, n) { + var r = new Image(); + (r.onload = function () { + t(); + }), + (r.onerror = function () { + n(); + }), + (r.src = e); + }); + }); + }, + 98: function (e, t, n) { + "use strict"; + + function r(e) { + return e && e.__esModule ? e : {default: e}; + } + + Object.defineProperty(t, "__esModule", {value: !0}); + var o = n(1), + a = r(o), + i = n(2), + l = r(i), + u = n(11), + s = n(580), + c = r(s), + f = n(218), + d = r(f), + p = (0, l.default)("button").withConfig({displayName: "PerkButton__Button"})( + [ + "display:block;padding:0;width:48px;height:48px;border:0;background:#1e2328;border-radius:50%;box-shadow:inset 0 0 7px #000,0 0 1px #000;position:relative;transition:opacity 0.2s,filter 0.2s;", + " ", + " ", + " &:hover{opacity:1;filter:none;}" + ], + function (e) { + return "small" === e.size && "\n width: 62px;\n height: 62px;\n "; + }, + function (e) { + return "large" === e.size && "\n width: 62px;\n height: 62px;\n "; + }, + function (e) { + return e.isChosen && "\n opacity: 0.5;\n filter: grayscale(100%);\n "; + } + ), + h = p.withComponent("div"), + m = (0, l.default)("svg").withConfig({displayName: "PerkButton__OuterFrame"})( + ["opacity:0;width:62px;height:60px;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);transition:opacity 0.2s;", " ", ":hover &{opacity:0.5;}"], + function (e) { + return "large" === e.size && "\n width: 76px;\n height: 76px;\n "; + }, + p + ), + y = (0, l.default)("svg").withConfig({displayName: "PerkButton__InnerFrame"})(["width:100%;height:100%;position:relative;"]), + g = (0, l.default)(d.default).withConfig({displayName: "PerkButton__Icon"})( + ["margin:0;width:46px;height:46px;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);transition:opacity 0.2s,transform 0.2s;", " ", " ", ""], + function (e) { + return e.keystone && "\n width: 82px;\n height: 82px;\n z-index: 1;\n "; + }, + function (e) { + return e.keystone && "large" === e.size && "\n width: 108px;\n height: 108px;\n "; + }, + function (e) { + return e.isActive && "\n transform: translate(-50%, -50%) scale(0.75);\n opacity: 0.5;\n "; + } + ), + b = function (e) { + var t = e.rune, + n = e.path, + r = e.size, + o = void 0 === r ? "default" : r, + i = e.keystone, + l = e.isActive, + s = e.isDisabled, + f = e.isChosen, + d = e.onClick; + if (s) + return a.default.createElement( + h, + {size: o, keystone: i}, + a.default.createElement( + y, + {viewBox: "0 0 47 47"}, + a.default.createElement("circle", { + cx: "23.5", + cy: "23.5", + r: "22.5", + strokeWidth: "2", + fill: "none", + stroke: "url(#gradient-yuma-dallasLight)" + }) + ) + ); + var b = n ? "url(#gradient-" + n.slug + ")" : "url(#gradient-yuma-dallasLight)"; + return a.default.createElement( + p, + {size: o, keystone: i, onClick: d, isChosen: f}, + a.default.createElement(m, { + viewBox: "0 0 60 60", + size: o + }, a.default.createElement("circle", { + cx: "30", + cy: "30", + r: "28.5", + strokeWidth: "3", + fill: "none", + stroke: b + })), + t && a.default.createElement(g, { + key: t.runeId, + src: (0, u.assetPath)("/img/runes-108x108/" + t.runeId + ".png"), + alt: "", + keystone: i, + size: o, + isActive: l + }), + a.default.createElement(y, {viewBox: "0 0 47 47"}, a.default.createElement("circle", { + cx: "23.5", + cy: "23.5", + r: "22.5", + strokeWidth: "2", + fill: "none", + stroke: b + })), + a.default.createElement(c.default, {keystone: i, isActive: l}) + ); + }; + t.default = b; + }, + 99: function (e, t, n) { + "use strict"; + + function r(e) { + return e && e.__esModule ? e : {default: e}; + } + + Object.defineProperty(t, "__esModule", {value: !0}); + var o = n(1), + a = r(o), + i = n(2), + l = r(i), + u = (0, l.default)("div").withConfig({displayName: "Flourish__Block"})( + ["opacity:0.6;color:#594620;position:absolute;left:0;right:0;", " ", " ", ""], + function (e) { + return void 0 !== e.animated && "\n width: 0;\n "; + }, + function (e) { + return void 0 !== e.top && "\n top: " + e.top + "px;\n "; + }, + function (e) { + return void 0 !== e.bottom && "\n bottom: " + e.bottom + "px;\n "; + } + ), + s = (0, l.default)("div").withConfig({displayName: "Flourish__FlourishBar"})(["margin:0 3px;border-top:1px solid currentColor;"]), + c = (0, l.default)("div").withConfig({displayName: "Flourish__FlourishCap"})( + ["border:1px solid currentColor;width:5px;height:5px;position:absolute;transform:translate(-50%,-50%) rotate(45deg);", " ", ""], + function (e) { + return e.left && "\n left: 0;\n "; + }, + function (e) { + return e.right && "\n left: 100%;\n "; + } + ), + f = function (e) { + return a.default.createElement(u, e, a.default.createElement(c, {left: !0}), a.default.createElement(s, null), a.default.createElement(c, {right: !0})); + }; + t.default = f; + } + }, + [449] +); diff --git a/src/main/resources/frontend_static/js/script.js b/src/main/resources/frontend_static/js/script.js new file mode 100644 index 0000000..feeb4e5 --- /dev/null +++ b/src/main/resources/frontend_static/js/script.js @@ -0,0 +1,213 @@ +let tags, selectedChampion, bestTagsByRune = {}; + +window.addEventListener("load", function () { + loadJson("/getStaticData", (staticData) => { + // TODO load announcement info + + // Load tag list + tags = staticData.tags; + + // Populate champion list + let championList = document.getElementById("champion-list"); + staticData.champions.forEach((champion) => { + let div = document.createElement("div"); + div.className = "champion"; + let img = document.createElement("img"); + img.src = `https://ddragon.leagueoflegends.com/cdn/${staticData.ddragonVersion}/img/champion/${champion.image.full}`; + div.appendChild(img); + + div.addEventListener("click", () => { + setChampion(+champion.key); + selectedChampion = champion; + }); + + championList.appendChild(div); + }); + + // Load best tags for each perk + for (let tag of staticData.bestTags) { + bestTagsByRune[tag.perkId] = tag; + } + + }, (error, code) => { + alert(`Error occurred loading static data: ${error} (${code})`); + }); +}); + +// `success` is called with parsed response if a 200 code is received; `error` is called with the raw body as 1st arg and status code as 2nd arg if a non-200 code is received +function loadJson(url, success, error) { + let xhr = new XMLHttpRequest(); + + xhr.addEventListener("load", function () { + if (this.status === 200) { + success(JSON.parse(this.responseText)); + } else if (error) { + error(this.responseText, this.status); + } + }); + xhr.open("GET", url); + xhr.send(); +} + +/** Rune tooltip objects cached by champion ID */ +let performanceInfoByChampion = {}; + +let currentPerformanceInfo = null; + +function setChampion(championId) { + // Scroll to the rune builder + document.getElementById("app-header").scrollIntoView(); + + // Use cached tooltips if possible + if (performanceInfoByChampion[championId]) { + currentPerformanceInfo = performanceInfoByChampion[championId]; + } else { + // Enable loading indicator + let overlay = document.createElement("div"); + overlay.id = "loading-overlay"; + overlay.appendChild(document.createTextNode("Loading (This may take a moment)")); + document.body.appendChild(overlay); + + loadJson(`/getChampionInfo?championId=${championId}`, (scoreArray) => { + // Map tooltips by rune ID + // TODO add support for SUBSTYLE + currentPerformanceInfo = {"RELATIVE": {}, "SLOT": {}}; + + // Setup perk scores + scoreArray.forEach((performanceInfo) => { + currentPerformanceInfo[performanceInfo.type][performanceInfo.perkId] = performanceInfo; + }); + performanceInfoByChampion[championId] = currentPerformanceInfo; + + // Display style information + for (let styleInfo of document.getElementsByClassName("styleInfo")) { + styleInfo.innerHTML = "
    " + getStyleInfo(+styleInfo.dataset.styleId, styleInfo.dataset.styleName); + } + + document.getElementById("loading-overlay").remove(); + }, (error, code) => { + alert(`An error occurred while loading rune data for champion: ${error} (${code})`); + document.getElementById("loading-overlay").remove(); + }); + } +} + +function getRuneTooltip(rune) { + if (!currentPerformanceInfo) { + return "Select a champion to view information about this rune on them"; + } + + let tooltip = ""; + + let runeName = `${rune.name}`; + let championName = `${selectedChampion.name}`; + + // Yes, the absolute score is called relative. ty spaghetti code. + let absoluteScore = currentPerformanceInfo["RELATIVE"][rune.runeId]; + let relativeScore = currentPerformanceInfo["SLOT"][rune.runeId]; + + + if (relativeScore) { + let relativeRating = `${relativeScore.score < -0.015 ? "weak" : (relativeScore.score > 0.015) ? "strong" : "average"}`; + tooltip += `Relative to other runes in this slot, ${runeName} is ${relativeRating} on ${championName}.

    `; + } + + if (absoluteScore) { + let absoluteRating = `${absoluteScore.score < -0.015 ? "weak" : (absoluteScore.score > 0.015) ? "strong" : "average"}`; + tooltip += `Overall, ${runeName} is ${absoluteRating} on ${championName}.`; + } + + if (!absoluteScore && !relativeScore) { + tooltip += "No data about this rune on this champion is available"; + } + + if (bestTagsByRune[rune.runeId]) { + let bestTagId = bestTagsByRune[rune.runeId].tagId; + tooltip += `

    ${runeName} is usually strongest on ${getTagDescription(bestTagId)}.`; + } + return `${tooltip}`; +} + +const possibleDescriptors = ["noun", "adjective", "verb"]; + +// TODO generate these when runes are loaded so they aren't constantly changing? +/** + * Converts tag IDs into a user-friendly description of champions who have these tags + * @param tag1Id The 1st tag ID (the most important of the 2) + * @param tag2Id (optional) The 2nd tag ID + */ +function getTagDescription(tag1Id, tag2Id) { + let tag1 = tags[tag1Id]; + let tag2 = tags[tag2Id]; + + let tag1Options = Object.keys(tag1).filter((key) => possibleDescriptors.includes(key) && tag1[key]); + let descriptorType1 = tag1Options[Math.floor(Math.random() * tag1Options.length)]; + + let reasons = [{ + descriptorType: descriptorType1, + descriptor: tag1[descriptorType1] + }]; + + if (tag2) { + let tag2Options = Object.keys(tag2).filter((key) => possibleDescriptors.includes(key) && tag2[key] && key !== descriptorType1); + let descriptorType2 = tag1Options[Math.floor(Math.random() * tag2Options.length)]; + reasons.push({ + descriptorType: descriptorType2, + descriptor: tag2[descriptorType2] + }); + } + + let description = ""; + + for (let reason of reasons) { + if (reason.descriptorType === "adjective") { + description += reason.descriptor + " "; + break; + } + } + + let noun = "champions"; + for (let reason of reasons) { + if (reason.descriptorType === "noun") { + noun = reason.descriptor; + break; + } + } + description += noun; + + for (let reason of reasons) { + if (reason.descriptorType === "verb") { + description += " " + reason.descriptor; + break; + } + } + + return description; +} + +function getStyleInfo(styleId, styleName) { + if (!currentPerformanceInfo) { + return "Select a champion to view information about this style on them"; + } + + styleName = `${styleName}`; + let championName = `${selectedChampion.name}`; + + let tooltip = ""; + + let stylePerformance = currentPerformanceInfo["RELATIVE"][styleId]; + if (stylePerformance) { + let rating = `${stylePerformance.score < -0.015 ? "weak" : (stylePerformance.score > 0.01) ? "strong" : "average"}`; + tooltip += `${styleName} is ${rating} on ${championName}.`; + } else { + tooltip += "No data about this style on this champion is available"; + } + + // Styles are too versatile to be categorized into a single tag + /* + let bestTagId = bestTagsByRune[styleId].tagId; + tooltip += `

    ${styleName} is usually strongest on ${getTagDescription(bestTagId)}.`; + */ + + return `${tooltip}`; +} diff --git a/src/main/resources/frontend_static/js/vendor.js b/src/main/resources/frontend_static/js/vendor.js new file mode 100644 index 0000000..e9e6f45 --- /dev/null +++ b/src/main/resources/frontend_static/js/vendor.js @@ -0,0 +1,23 @@ +!function(t){function e(n){if(r[n])return r[n].exports;var i=r[n]={i:n,l:!1,exports:{}};return t[n].call(i.exports,i,i.exports,e),i.l=!0,i.exports}var n=window.webpackJsonp;window.webpackJsonp=function(r,o,s){for(var a,u,c,l=0,f=[];l0;)n[r]=arguments[r+2];if(!m(t))return t;var i=t.attributes||t.props,o=Object(B.h)(t.nodeName||t.type,i,t.children||i&&i.children),s=[o,e];return n&&n.length?s.push(n):e&&e.children&&s.push(e.children),v(B.cloneElement.apply(void 0,s))}function m(t){return t&&(t instanceof G||t.$$typeof===U)}function _(t,e){return e._refProxies[t]||(e._refProxies[t]=function(n){e&&e.refs&&(e.refs[t]=n,null===n&&(delete e._refProxies[t],e=null))})}function g(t){var e=t.nodeName,n=t.attributes;if(n&&"string"==typeof e){var r={};for(var i in n)r[i.toLowerCase()]=i;if(r.ondoubleclick&&(n.ondblclick=n[r.ondoubleclick],delete n[r.ondoubleclick]),r.onchange&&("textarea"===e||"input"===e.toLowerCase()&&!/^fil|che|rad/i.test(n.type))){var o=r.oninput||"oninput";n[o]||(n[o]=A([n[o],n[r.onchange]]),delete n[r.onchange])}}}function b(t){var e=t.attributes;if(e){var n=e.className||e.class;n&&(e.className=n)}}function w(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}function x(t,e){for(var n in t)if(!(n in e))return!0;for(var r in e)if(t[r]!==e[r])return!0;return!1}function T(t){return t&&t.base||t}function P(){}function O(t){function e(t,e){k(this),N.call(this,t,e,Y),j.call(this,t,e)}return t=w({constructor:e},t),t.mixins&&C(t,S(t.mixins)),t.statics&&w(e,t.statics),t.propTypes&&(e.propTypes=t.propTypes),t.defaultProps&&(e.defaultProps=t.defaultProps),t.getDefaultProps&&(e.defaultProps=t.getDefaultProps()),P.prototype=N.prototype,e.prototype=w(new P,t),e.displayName=t.displayName||"Component",e}function S(t){for(var e={},n=0;n=4;){var s=c(t,o);s=f(s,n),s^=s>>>24,s=f(s,n),r=f(r,n),r^=s,o+=4,i-=4}switch(i){case 3:r^=l(t,o),r^=t.charCodeAt(o+2)<<16,r=f(r,n);break;case 2:r^=l(t,o),r=f(r,n);break;case 1:r^=t.charCodeAt(o),r=f(r,n)}return r^=r>>>13,r=f(r,n),(r^=r>>>15)>>>0}function c(t,e){return t.charCodeAt(e++)+(t.charCodeAt(e++)<<8)+(t.charCodeAt(e++)<<16)+(t.charCodeAt(e)<<24)}function l(t,e){return t.charCodeAt(e++)+(t.charCodeAt(e++)<<8)}function f(t,e){return t|=0,e|=0,(65535&t)*e+(((t>>>16)*e&65535)<<16)|0}n.d(e,"css",function(){return D}),n.d(e,"keyframes",function(){return Ot}),n.d(e,"injectGlobal",function(){return St}),n.d(e,"ThemeProvider",function(){return dt}),n.d(e,"withTheme",function(){return wt}),n.d(e,"ServerStyleSheet",function(){return it}),n.d(e,"StyleSheetManager",function(){return tt});var h,p=n(564),d=n.n(p),v=n(566),y=n.n(v),m=n(1),_=n(59),g=n.n(_),b=n(567),w=n.n(b),x=n(196),T=n.n(x),P=/([A-Z])/g,O=r,S=O,C=/^ms-/,k=i,E=function t(e,n){var r=Object.keys(e).map(function(n){return d()(e[n])?t(e[n],n):k(n)+": "+e[n]+";"}).join(" ");return n?n+" {\n "+r+"\n}":r},A=function t(e,n){return e.reduce(function(e,r){return void 0===r||null===r||!1===r||""===r?e:Array.isArray(r)?[].concat(e,t(r,n)):r.hasOwnProperty("styledComponentId")?[].concat(e,["."+r.styledComponentId]):"function"==typeof r?n?e.concat.apply(e,t([r(n)],n)):e.concat(r):e.concat(d()(r)?E(r):r.toString())},[])},j=new y.a({global:!1,cascade:!0,keyframe:!1,prefix:!0,compress:!1,semicolon:!0}),M=function(t,e,n){var r=t.join("").replace(/^\s*\/\/.*$/gm,""),i=e&&n?n+" "+e+" { "+r+" }":r;return j(n||!e?"":e,i)},R="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".split(""),I=R.length,N=function(t){var e="",n=void 0;for(n=t;n>I;n=Math.floor(n/R.length))e=R[n%I]+e;return R[n%I]+e},F=function(t,e){return e.reduce(function(e,n,r){return e.concat(n,t[r+1])},[t[0]])},D=function(t){for(var e=arguments.length,n=Array(e>1?e-1:0),r=1;r=0||Object.prototype.hasOwnProperty.call(t,r)&&(n[r]=t[r]);return n},q=function(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e},Y=function(){function t(e,n){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"";z(this,t),this.el=e,this.isLocal=n,this.ready=!1;var i=B(r);this.size=i.length,this.components=i.reduce(function(t,e){return t[e.componentId]=e,t},{})}return t.prototype.isFull=function(){return this.size>=40},t.prototype.addComponent=function(t){if(this.ready||this.replaceElement(),this.components[t])throw new Error("Trying to add Component '"+t+"' twice!");var e={componentId:t,textNode:document.createTextNode("")};this.el.appendChild(e.textNode),this.size+=1,this.components[t]=e},t.prototype.inject=function(t,e,n){this.ready||this.replaceElement();var r=this.components[t];if(!r)throw new Error("Must add a new component before you can inject css into it");if(""===r.textNode.data&&r.textNode.appendData("\n/* sc-component-id: "+t+" */\n"),r.textNode.appendData(e),n){var i=this.el.getAttribute(G);this.el.setAttribute(G,i?i+" "+n:n)}},t.prototype.toHTML=function(){return this.el.outerHTML},t.prototype.toReactElement=function(){throw new Error("BrowserTag doesn't implement toReactElement!")},t.prototype.clone=function(){throw new Error("BrowserTag cannot be cloned!")},t.prototype.replaceElement=function(){var t=this;if(this.ready=!0,0!==this.size){var e=this.el.cloneNode();if(e.appendChild(document.createTextNode("\n")),Object.keys(this.components).forEach(function(n){var r=t.components[n];r.textNode=document.createTextNode(r.cssFromDOM),e.appendChild(r.textNode)}),!this.el.parentNode)throw new Error("Trying to replace an element that wasn't mounted!");this.el.parentNode.replaceChild(e,this.el),this.el=e}},t}(),H={create:function(){for(var t=[],e={},n=document.querySelectorAll("["+G+"]"),r=n.length,i=0;i");return document.head.appendChild(e),new Y(e,t)},t,e)}},G="data-styled-components",$="data-styled-components-is-local",K="__styled-components-stylesheet__",Z=null,Q=[],J=function(){function t(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};z(this,t),this.hashes={},this.deferredInjections={},this.tagConstructor=e,this.tags=n,this.names=r,this.constructComponentTagMap()}return t.prototype.constructComponentTagMap=function(){var t=this;this.componentTags={},this.tags.forEach(function(e){Object.keys(e.components).forEach(function(n){t.componentTags[n]=e})})},t.prototype.getName=function(t){return this.hashes[t.toString()]},t.prototype.alreadyInjected=function(t,e){return!!this.names[e]&&(this.hashes[t.toString()]=e,!0)},t.prototype.hasInjectedComponent=function(t){return!!this.componentTags[t]},t.prototype.deferredInject=function(t,e,n){this===Z&&Q.forEach(function(r){r.deferredInject(t,e,n)}),this.getOrCreateTag(t,e),this.deferredInjections[t]=n},t.prototype.inject=function(t,e,n,r,i){this===Z&&Q.forEach(function(r){r.inject(t,e,n)});var o=this.getOrCreateTag(t,e),s=this.deferredInjections[t];s&&(o.inject(t,s),delete this.deferredInjections[t]),o.inject(t,n,i),r&&i&&(this.hashes[r.toString()]=i)},t.prototype.toHTML=function(){return this.tags.map(function(t){return t.toHTML()}).join("")},t.prototype.toReactElements=function(){return this.tags.map(function(t,e){return t.toReactElement("sc-"+e)})},t.prototype.getOrCreateTag=function(t,e){var n=this.componentTags[t];if(n)return n;var r=this.tags[this.tags.length-1],i=!r||r.isFull()||r.isLocal!==e?this.createNewTag(e):r;return this.componentTags[t]=i,i.addComponent(t),i},t.prototype.createNewTag=function(t){var e=this.tagConstructor(t);return this.tags.push(e),e},t.reset=function(e){Z=t.create(e)},t.create=function(){return((arguments.length>0&&void 0!==arguments[0]?arguments[0]:"undefined"==typeof document)?it:H).create()},t.clone=function(e){var n=new t(e.tagConstructor,e.tags.map(function(t){return t.clone()}),U({},e.names));return n.hashes=U({},e.hashes),n.deferredInjections=U({},e.deferredInjections),Q.push(n),n},V(t,null,[{key:"instance",get:function(){return Z||(Z=t.create())}}]),t}(),tt=function(t){function e(){return z(this,e),q(this,t.apply(this,arguments))}return W(e,t),e.prototype.getChildContext=function(){var t;return t={},t[K]=this.props.sheet,t},e.prototype.render=function(){return m.default.Children.only(this.props.children)},e}(m.Component);tt.childContextTypes=(h={},h[K]=g.a.instanceOf(J).isRequired,h),tt.propTypes={sheet:g.a.instanceOf(J).isRequired};var et,nt,rt=function(){function t(e){z(this,t),this.isLocal=e,this.components={},this.size=0,this.names=[]}return t.prototype.isFull=function(){return!1},t.prototype.addComponent=function(t){if(this.components[t])throw new Error("Trying to add Component '"+t+"' twice!");this.components[t]={componentId:t,css:""},this.size+=1},t.prototype.inject=function(t,e,n){var r=this.components[t];if(!r)throw new Error("Must add a new component before you can inject css into it");""===r.css&&(r.css="/* sc-component-id: "+t+" */\n"),r.css+=e.replace(/\n*$/,"\n"),n&&this.names.push(n)},t.prototype.toHTML=function(){var t=this;return'"},t.prototype.toReactElement=function(t){var e,n=this,r=(e={},e[G]=this.names.join(" "),e[$]=this.isLocal.toString(),e),i=Object.keys(this.components).map(function(t){return n.components[t].css}).join("");return m.default.createElement("style",U({key:t,type:"text/css"},r,{dangerouslySetInnerHTML:{__html:i}}))},t.prototype.clone=function(){var e=this,n=new t(this.isLocal);return n.names=[].concat(this.names),n.size=this.size,n.components=Object.keys(this.components).reduce(function(t,n){return t[n]=U({},e.components[n]),t},{}),n},t}(),it=function(){function t(){z(this,t),this.instance=J.clone(J.instance)}return t.prototype.collectStyles=function(t){if(this.closed)throw new Error("Can't collect styles once you've called getStyleTags!");return m.default.createElement(tt,{sheet:this.instance},t)},t.prototype.getStyleTags=function(){return this.closed||(Q.splice(Q.indexOf(this.instance),1),this.closed=!0),this.instance.toHTML()},t.prototype.getStyleElement=function(){return this.closed||(Q.splice(Q.indexOf(this.instance),1),this.closed=!0),this.instance.toReactElements()},t.create=function(){return new J(function(t){return new rt(t)})},t}(),ot=function(t){var e={},n=!1;return function(r){n||(e[r]=!0,Object.keys(e).length>=200&&(console.warn("Over 200 classes were generated for component "+t+". Consider using style property for frequently changed styles.\nExample:\n const StyledComp = styled.div`width: 100%;`\n "),n=!0,e={}))}},st={children:!0,dangerouslySetInnerHTML:!0,key:!0,ref:!0,autoFocus:!0,defaultValue:!0,valueLink:!0,defaultChecked:!0,checkedLink:!0,innerHTML:!0,suppressContentEditableWarning:!0,onFocusIn:!0,onFocusOut:!0,className:!0,onCopy:!0,onCut:!0,onPaste:!0,onCompositionEnd:!0,onCompositionStart:!0,onCompositionUpdate:!0,onKeyDown:!0,onKeyPress:!0,onKeyUp:!0,onFocus:!0,onBlur:!0,onChange:!0,onInput:!0,onSubmit:!0,onClick:!0,onContextMenu:!0,onDoubleClick:!0,onDrag:!0,onDragEnd:!0,onDragEnter:!0,onDragExit:!0,onDragLeave:!0,onDragOver:!0,onDragStart:!0,onDrop:!0,onMouseDown:!0,onMouseEnter:!0,onMouseLeave:!0,onMouseMove:!0,onMouseOut:!0,onMouseOver:!0,onMouseUp:!0,onSelect:!0,onTouchCancel:!0,onTouchEnd:!0,onTouchMove:!0,onTouchStart:!0,onScroll:!0,onWheel:!0,onAbort:!0,onCanPlay:!0,onCanPlayThrough:!0,onDurationChange:!0,onEmptied:!0,onEncrypted:!0,onEnded:!0,onError:!0,onLoadedData:!0,onLoadedMetadata:!0,onLoadStart:!0,onPause:!0,onPlay:!0,onPlaying:!0,onProgress:!0,onRateChange:!0,onSeeked:!0,onSeeking:!0,onStalled:!0,onSuspend:!0,onTimeUpdate:!0,onVolumeChange:!0,onWaiting:!0,onLoad:!0,onAnimationStart:!0,onAnimationEnd:!0,onAnimationIteration:!0,onTransitionEnd:!0,onCopyCapture:!0,onCutCapture:!0,onPasteCapture:!0,onCompositionEndCapture:!0,onCompositionStartCapture:!0,onCompositionUpdateCapture:!0,onKeyDownCapture:!0,onKeyPressCapture:!0,onKeyUpCapture:!0,onFocusCapture:!0,onBlurCapture:!0,onChangeCapture:!0,onInputCapture:!0,onSubmitCapture:!0,onClickCapture:!0,onContextMenuCapture:!0,onDoubleClickCapture:!0,onDragCapture:!0,onDragEndCapture:!0,onDragEnterCapture:!0,onDragExitCapture:!0,onDragLeaveCapture:!0,onDragOverCapture:!0,onDragStartCapture:!0,onDropCapture:!0,onMouseDownCapture:!0,onMouseEnterCapture:!0,onMouseLeaveCapture:!0,onMouseMoveCapture:!0,onMouseOutCapture:!0,onMouseOverCapture:!0,onMouseUpCapture:!0,onSelectCapture:!0,onTouchCancelCapture:!0,onTouchEndCapture:!0,onTouchMoveCapture:!0,onTouchStartCapture:!0,onScrollCapture:!0,onWheelCapture:!0,onAbortCapture:!0,onCanPlayCapture:!0,onCanPlayThroughCapture:!0,onDurationChangeCapture:!0,onEmptiedCapture:!0,onEncryptedCapture:!0,onEndedCapture:!0,onErrorCapture:!0,onLoadedDataCapture:!0,onLoadedMetadataCapture:!0,onLoadStartCapture:!0,onPauseCapture:!0,onPlayCapture:!0,onPlayingCapture:!0,onProgressCapture:!0,onRateChangeCapture:!0,onSeekedCapture:!0,onSeekingCapture:!0,onStalledCapture:!0,onSuspendCapture:!0,onTimeUpdateCapture:!0,onVolumeChangeCapture:!0,onWaitingCapture:!0,onLoadCapture:!0,onAnimationStartCapture:!0,onAnimationEndCapture:!0,onAnimationIterationCapture:!0,onTransitionEndCapture:!0},at={accept:!0,acceptCharset:!0,accessKey:!0,action:!0,allowFullScreen:!0,allowTransparency:!0,alt:!0,as:!0,async:!0,autoComplete:!0,autoPlay:!0,capture:!0,cellPadding:!0,cellSpacing:!0,charSet:!0,challenge:!0,checked:!0,cite:!0,classID:!0,className:!0,cols:!0,colSpan:!0,content:!0,contentEditable:!0,contextMenu:!0,controls:!0,coords:!0,crossOrigin:!0,data:!0,dateTime:!0,default:!0,defer:!0,dir:!0,disabled:!0,download:!0,draggable:!0,encType:!0,form:!0,formAction:!0,formEncType:!0,formMethod:!0,formNoValidate:!0,formTarget:!0,frameBorder:!0,headers:!0,height:!0,hidden:!0,high:!0,href:!0,hrefLang:!0,htmlFor:!0,httpEquiv:!0,icon:!0,id:!0,inputMode:!0,integrity:!0,is:!0,keyParams:!0,keyType:!0,kind:!0,label:!0,lang:!0,list:!0,loop:!0,low:!0,manifest:!0,marginHeight:!0,marginWidth:!0,max:!0,maxLength:!0,media:!0,mediaGroup:!0,method:!0,min:!0,minLength:!0,multiple:!0,muted:!0,name:!0,nonce:!0,noValidate:!0,open:!0,optimum:!0,pattern:!0,placeholder:!0,playsInline:!0,poster:!0,preload:!0,profile:!0,radioGroup:!0,readOnly:!0,referrerPolicy:!0,rel:!0,required:!0,reversed:!0,role:!0,rows:!0,rowSpan:!0,sandbox:!0,scope:!0,scoped:!0,scrolling:!0,seamless:!0,selected:!0,shape:!0,size:!0,sizes:!0,span:!0,spellCheck:!0,src:!0,srcDoc:!0,srcLang:!0,srcSet:!0,start:!0,step:!0,style:!0,summary:!0,tabIndex:!0,target:!0,title:!0,type:!0,useMap:!0,value:!0,width:!0,wmode:!0,wrap:!0,about:!0,datatype:!0,inlist:!0,prefix:!0,property:!0,resource:!0,typeof:!0,vocab:!0,autoCapitalize:!0,autoCorrect:!0,autoSave:!0,color:!0,itemProp:!0,itemScope:!0,itemType:!0,itemID:!0,itemRef:!0,results:!0,security:!0,unselectable:0},ut={accentHeight:!0,accumulate:!0,additive:!0,alignmentBaseline:!0,allowReorder:!0,alphabetic:!0,amplitude:!0,arabicForm:!0,ascent:!0,attributeName:!0,attributeType:!0,autoReverse:!0,azimuth:!0,baseFrequency:!0,baseProfile:!0,baselineShift:!0,bbox:!0,begin:!0,bias:!0,by:!0,calcMode:!0,capHeight:!0,clip:!0,clipPath:!0,clipRule:!0,clipPathUnits:!0,colorInterpolation:!0,colorInterpolationFilters:!0,colorProfile:!0,colorRendering:!0,contentScriptType:!0,contentStyleType:!0,cursor:!0,cx:!0,cy:!0,d:!0,decelerate:!0,descent:!0,diffuseConstant:!0,direction:!0,display:!0,divisor:!0,dominantBaseline:!0,dur:!0,dx:!0,dy:!0,edgeMode:!0,elevation:!0,enableBackground:!0,end:!0,exponent:!0,externalResourcesRequired:!0,fill:!0,fillOpacity:!0,fillRule:!0,filter:!0,filterRes:!0,filterUnits:!0,floodColor:!0,floodOpacity:!0,focusable:!0,fontFamily:!0,fontSize:!0,fontSizeAdjust:!0,fontStretch:!0,fontStyle:!0,fontVariant:!0,fontWeight:!0,format:!0,from:!0,fx:!0,fy:!0,g1:!0,g2:!0,glyphName:!0,glyphOrientationHorizontal:!0,glyphOrientationVertical:!0,glyphRef:!0,gradientTransform:!0,gradientUnits:!0,hanging:!0,horizAdvX:!0,horizOriginX:!0,ideographic:!0,imageRendering:!0,in:!0,in2:!0,intercept:!0,k:!0,k1:!0,k2:!0,k3:!0,k4:!0,kernelMatrix:!0,kernelUnitLength:!0,kerning:!0,keyPoints:!0,keySplines:!0,keyTimes:!0,lengthAdjust:!0,letterSpacing:!0,lightingColor:!0,limitingConeAngle:!0,local:!0,markerEnd:!0,markerMid:!0,markerStart:!0,markerHeight:!0,markerUnits:!0,markerWidth:!0,mask:!0,maskContentUnits:!0,maskUnits:!0,mathematical:!0,mode:!0,numOctaves:!0,offset:!0,opacity:!0,operator:!0,order:!0,orient:!0,orientation:!0,origin:!0,overflow:!0,overlinePosition:!0,overlineThickness:!0,paintOrder:!0,panose1:!0,pathLength:!0,patternContentUnits:!0,patternTransform:!0,patternUnits:!0,pointerEvents:!0,points:!0,pointsAtX:!0,pointsAtY:!0,pointsAtZ:!0,preserveAlpha:!0,preserveAspectRatio:!0,primitiveUnits:!0,r:!0,radius:!0,refX:!0,refY:!0,renderingIntent:!0,repeatCount:!0,repeatDur:!0,requiredExtensions:!0,requiredFeatures:!0,restart:!0,result:!0,rotate:!0,rx:!0,ry:!0,scale:!0,seed:!0,shapeRendering:!0,slope:!0,spacing:!0,specularConstant:!0,specularExponent:!0,speed:!0,spreadMethod:!0,startOffset:!0,stdDeviation:!0,stemh:!0,stemv:!0,stitchTiles:!0,stopColor:!0,stopOpacity:!0,strikethroughPosition:!0,strikethroughThickness:!0,string:!0,stroke:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeLinecap:!0,strokeLinejoin:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0,surfaceScale:!0,systemLanguage:!0,tableValues:!0,targetX:!0,targetY:!0,textAnchor:!0,textDecoration:!0,textRendering:!0,textLength:!0,to:!0,transform:!0,u1:!0,u2:!0,underlinePosition:!0,underlineThickness:!0,unicode:!0,unicodeBidi:!0,unicodeRange:!0,unitsPerEm:!0,vAlphabetic:!0,vHanging:!0,vIdeographic:!0,vMathematical:!0,values:!0,vectorEffect:!0,version:!0,vertAdvY:!0,vertOriginX:!0,vertOriginY:!0,viewBox:!0,viewTarget:!0,visibility:!0,widths:!0,wordSpacing:!0,writingMode:!0,x:!0,xHeight:!0,x1:!0,x2:!0,xChannelSelector:!0,xlinkActuate:!0,xlinkArcrole:!0,xlinkHref:!0,xlinkRole:!0,xlinkShow:!0,xlinkTitle:!0,xlinkType:!0,xmlBase:!0,xmlns:!0,xmlnsXlink:!0,xmlLang:!0,xmlSpace:!0,y:!0,y1:!0,y2:!0,yChannelSelector:!0,z:!0,zoomAndPan:!0},ct=RegExp.prototype.test.bind(new RegExp("^(data|aria)-[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$")),lt={}.hasOwnProperty,ft=function(t){return lt.call(at,t)||lt.call(ut,t)||ct(t.toLowerCase())||lt.call(st,t)},ht=function(t){var e=[],n=t;return{publish:function(t){n=t,e.forEach(function(t){return t(n)})},subscribe:function(t){return e.push(t),t(n),function(){e=e.filter(function(e){return e!==t})}}}},pt="__styled-components__",dt=function(t){function e(){z(this,e);var n=q(this,t.call(this));return n.getTheme=n.getTheme.bind(n),n}return W(e,t),e.prototype.componentWillMount=function(){var t=this;if(this.context[pt]){var e=this.context[pt];this.unsubscribeToOuter=e(function(e){t.outerTheme=e})}this.broadcast=ht(this.getTheme())},e.prototype.getChildContext=function(){var t;return U({},this.context,(t={},t[pt]=this.broadcast.subscribe,t))},e.prototype.componentWillReceiveProps=function(t){this.props.theme!==t.theme&&this.broadcast.publish(this.getTheme(t.theme))},e.prototype.componentWillUnmount=function(){this.context[pt]&&this.unsubscribeToOuter()},e.prototype.getTheme=function(t){var e=t||this.props.theme;if(w()(e)){var n=e(this.outerTheme);if(!d()(n))throw new Error("[ThemeProvider] Please return an object from your theme function, i.e. theme={() => ({})}!");return n}if(!d()(e))throw new Error("[ThemeProvider] Please make your theme prop a plain object");return U({},this.outerTheme,e)},e.prototype.render=function(){return this.props.children?m.default.Children.only(this.props.children):null},e}(m.Component);dt.childContextTypes=(et={},et[pt]=g.a.func.isRequired,et),dt.contextTypes=(nt={},nt[pt]=g.a.func,nt);var vt,yt=function(t){function e(){return z(this,e),q(this,t.apply(this,arguments))}return W(e,t),e}(m.Component);yt.contextTypes=(vt={},vt[pt]=g.a.func,vt[K]=g.a.instanceOf(J),vt);var mt=/[[\].#*$><+~=|^:(),"'`]/g,_t=/--+/g,gt=["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","big","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","keygen","label","legend","li","link","main","map","mark","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rp","rt","ruby","s","samp","script","section","select","small","source","span","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","title","tr","track","u","ul","var","video","wbr","circle","clipPath","defs","ellipse","g","image","line","linearGradient","mask","path","pattern","polygon","polyline","radialGradient","rect","stop","svg","text","tspan"],bt=function(t){return t.replace(/\s|\\n/g,"")},wt=function(t){var e,n=t.displayName||t.name||"Component",r=s(t),i=function(e){function n(){var t,r,i;z(this,n);for(var o=arguments.length,s=Array(o),a=0;a2&&void 0!==arguments[2]?arguments[2]:{};if("string"!=typeof r&&"function"!=typeof r)throw new Error("Cannot create styled-component for component: "+r);var o=function(e){for(var o=arguments.length,s=Array(o>1?o-1:0),a=1;a1?i-1:0),s=1;s1?r-1:0),o=1;o0?i(r(t),9007199254740991):0}},,function(t,e,n){var r=n(29);t.exports=function(t){return Object(r(t))}},function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},function(t,e){var n={}.hasOwnProperty;t.exports=function(t,e){return n.call(t,e)}},function(t,e,n){var r=n(9),i=n(43);t.exports=n(8)?function(t,e,n){return r.f(t,e,i(1,n))}:function(t,e,n){return t[e]=n,t}},function(t,e,n){var r=n(4),i=n(15),o=n(14),s=n(44)("src"),a=Function.toString,u=(""+a).split("toString");n(27).inspectSource=function(t){return a.call(t)},(t.exports=function(t,e,n,a){var c="function"==typeof n;c&&(o(n,"name")||i(n,"name",e)),t[e]!==n&&(c&&(o(n,s)||i(n,s,t[e]?""+t[e]:u.join(String(e)))),t===r?t[e]=n:a?t[e]?t[e]=n:i(t,e,n):(delete t[e],i(t,e,n)))})(Function.prototype,"toString",function(){return"function"==typeof this&&this[s]||a.call(this)})},function(t,e,n){var r=n(0),i=n(5),o=n(29),s=/"/g,a=function(t,e,n,r){var i=String(o(t)),a="<"+e;return""!==n&&(a+=" "+n+'="'+String(r).replace(s,""")+'"'),a+">"+i+""};t.exports=function(t,e){var n={};n[t]=e(a),r(r.P+r.F*i(function(){var e=""[t]('"');return e!==e.toLowerCase()||e.split('"').length>3}),"String",n)}},function(t,e,n){var r=n(67),i=n(29);t.exports=function(t){return r(i(t))}},function(t,e,n){var r=n(68),i=n(43),o=n(18),s=n(28),a=n(14),u=n(153),c=Object.getOwnPropertyDescriptor;e.f=n(8)?c:function(t,e){if(t=o(t),e=s(e,!0),u)try{return c(t,e)}catch(t){}if(a(t,e))return i(!r.f.call(t,e),t[e])}},function(t,e,n){var r=n(14),i=n(12),o=n(108)("IE_PROTO"),s=Object.prototype;t.exports=Object.getPrototypeOf||function(t){return t=i(t),r(t,o)?t[o]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?s:null}},function(t,e,n){"use strict";function r(t){return"[object Array]"===P.call(t)}function i(t){return"[object ArrayBuffer]"===P.call(t)}function o(t){return"undefined"!=typeof FormData&&t instanceof FormData}function s(t){return"undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(t):t&&t.buffer&&t.buffer instanceof ArrayBuffer}function a(t){return"string"==typeof t}function u(t){return"number"==typeof t}function c(t){return void 0===t}function l(t){return null!==t&&"object"==typeof t}function f(t){return"[object Date]"===P.call(t)}function h(t){return"[object File]"===P.call(t)}function p(t){return"[object Blob]"===P.call(t)}function d(t){return"[object Function]"===P.call(t)}function v(t){return l(t)&&d(t.pipe)}function y(t){return"undefined"!=typeof URLSearchParams&&t instanceof URLSearchParams}function m(t){return t.replace(/^\s*/,"").replace(/\s*$/,"")}function _(){return("undefined"==typeof navigator||"ReactNative"!==navigator.product)&&("undefined"!=typeof window&&"undefined"!=typeof document)}function g(t,e){if(null!==t&&void 0!==t)if("object"==typeof t||r(t)||(t=[t]),r(t))for(var n=0,i=t.length;n0?r:n)(t)}},function(t,e,n){var r=n(0),i=n(27),o=n(5);t.exports=function(t,e){var n=(i.Object||{})[t]||Object[t],s={};s[t]=e(n),r(r.S+r.F*o(function(){n(1)}),"Object",s)}},function(t,e,n){var r=n(23),i=n(67),o=n(12),s=n(10),a=n(125);t.exports=function(t,e){var n=1==t,u=2==t,c=3==t,l=4==t,f=6==t,h=5==t||f,p=e||a;return function(e,a,d){for(var v,y,m=o(e),_=i(m),g=r(a,d,3),b=s(_.length),w=0,x=n?p(e,b):u?p(e,0):void 0;b>w;w++)if((h||w in _)&&(v=_[w],y=g(v,w,m),t))if(n)x[w]=y;else if(y)switch(t){case 3:return!0;case 5:return v;case 6:return w;case 2:x.push(v)}else if(l)return!1;return f?-1:c||l?l:x}}},function(t,e,n){var r=n(200),i="object"==typeof self&&self&&self.Object===Object&&self,o=r||i||Function("return this")();t.exports=o},function(t,e){var n=Array.isArray;t.exports=n},,function(t,e){var n=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},function(t,e){var n;n=function(){return this}();try{n=n||Function("return this")()||(0,eval)("this")}catch(t){"object"==typeof window&&(n=window)}t.exports=n},function(t,e,n){"use strict";if(n(8)){var r=n(45),i=n(4),o=n(5),s=n(0),a=n(85),u=n(131),c=n(23),l=n(51),f=n(43),h=n(15),p=n(53),d=n(30),v=n(10),y=n(179),m=n(47),_=n(28),g=n(14),b=n(69),w=n(6),x=n(12),T=n(122),P=n(48),O=n(20),S=n(49).f,C=n(124),k=n(44),E=n(7),A=n(32),j=n(76),M=n(83),R=n(127),I=n(56),N=n(80),F=n(50),D=n(126),L=n(169),B=n(9),z=n(19),V=B.f,U=z.f,W=i.RangeError,X=i.TypeError,q=i.Uint8Array,Y=Array.prototype,H=u.ArrayBuffer,G=u.DataView,$=A(0),K=A(2),Z=A(3),Q=A(4),J=A(5),tt=A(6),et=j(!0),nt=j(!1),rt=R.values,it=R.keys,ot=R.entries,st=Y.lastIndexOf,at=Y.reduce,ut=Y.reduceRight,ct=Y.join,lt=Y.sort,ft=Y.slice,ht=Y.toString,pt=Y.toLocaleString,dt=E("iterator"),vt=E("toStringTag"),yt=k("typed_constructor"),mt=k("def_constructor"),_t=a.CONSTR,gt=a.TYPED,bt=a.VIEW,wt=A(1,function(t,e){return St(M(t,t[mt]),e)}),xt=o(function(){return 1===new q(new Uint16Array([1]).buffer)[0]}),Tt=!!q&&!!q.prototype.set&&o(function(){new q(1).set({})}),Pt=function(t,e){var n=d(t);if(n<0||n%e)throw W("Wrong offset!");return n},Ot=function(t){if(w(t)&> in t)return t;throw X(t+" is not a typed array!")},St=function(t,e){if(!(w(t)&&yt in t))throw X("It is not a typed array constructor!");return new t(e)},Ct=function(t,e){return kt(M(t,t[mt]),e)},kt=function(t,e){for(var n=0,r=e.length,i=St(t,r);r>n;)i[n]=e[n++];return i},Et=function(t,e,n){V(t,e,{get:function(){return this._d[n]}})},At=function(t){var e,n,r,i,o,s,a=x(t),u=arguments.length,l=u>1?arguments[1]:void 0,f=void 0!==l,h=C(a);if(void 0!=h&&!T(h)){for(s=h.call(a),r=[],e=0;!(o=s.next()).done;e++)r.push(o.value);a=r}for(f&&u>2&&(l=c(l,arguments[2],2)),e=0,n=v(a.length),i=St(this,n);n>e;e++)i[e]=f?l(a[e],e):a[e];return i},jt=function(){for(var t=0,e=arguments.length,n=St(this,e);e>t;)n[t]=arguments[t++];return n},Mt=!!q&&o(function(){pt.call(new q(1))}),Rt=function(){return pt.apply(Mt?ft.call(Ot(this)):Ot(this),arguments)},It={copyWithin:function(t,e){return L.call(Ot(this),t,e,arguments.length>2?arguments[2]:void 0)},every:function(t){return Q(Ot(this),t,arguments.length>1?arguments[1]:void 0)},fill:function(t){return D.apply(Ot(this),arguments)},filter:function(t){return Ct(this,K(Ot(this),t,arguments.length>1?arguments[1]:void 0))},find:function(t){return J(Ot(this),t,arguments.length>1?arguments[1]:void 0)},findIndex:function(t){return tt(Ot(this),t,arguments.length>1?arguments[1]:void 0)},forEach:function(t){$(Ot(this),t,arguments.length>1?arguments[1]:void 0)},indexOf:function(t){return nt(Ot(this),t,arguments.length>1?arguments[1]:void 0)},includes:function(t){return et(Ot(this),t,arguments.length>1?arguments[1]:void 0)},join:function(t){return ct.apply(Ot(this),arguments)},lastIndexOf:function(t){return st.apply(Ot(this),arguments)},map:function(t){return wt(Ot(this),t,arguments.length>1?arguments[1]:void 0)},reduce:function(t){return at.apply(Ot(this),arguments)},reduceRight:function(t){return ut.apply(Ot(this),arguments)},reverse:function(){for(var t,e=this,n=Ot(e).length,r=Math.floor(n/2),i=0;i1?arguments[1]:void 0)},sort:function(t){return lt.call(Ot(this),t)},subarray:function(t,e){var n=Ot(this),r=n.length,i=m(t,r);return new(M(n,n[mt]))(n.buffer,n.byteOffset+i*n.BYTES_PER_ELEMENT,v((void 0===e?r:m(e,r))-i))}},Nt=function(t,e){return Ct(this,ft.call(Ot(this),t,e))},Ft=function(t){Ot(this);var e=Pt(arguments[1],1),n=this.length,r=x(t),i=v(r.length),o=0;if(i+e>n)throw W("Wrong length!");for(;o255?255:255&r),i.v[p](n*e+i.o,r,xt)},E=function(t,e){V(t,e,{get:function(){return C(this,e)},set:function(t){return k(this,e,t)},enumerable:!0})};g?(d=n(function(t,n,r,i){l(t,d,c,"_d");var o,s,a,u,f=0,p=0;if(w(n)){if(!(n instanceof H||"ArrayBuffer"==(u=b(n))||"SharedArrayBuffer"==u))return gt in n?kt(d,n):At.call(d,n);o=n,p=Pt(r,e);var m=n.byteLength;if(void 0===i){if(m%e)throw W("Wrong length!");if((s=m-p)<0)throw W("Wrong length!")}else if((s=v(i)*e)+p>m)throw W("Wrong length!");a=s/e}else a=y(n),s=a*e,o=new H(s);for(h(t,"_d",{b:o,o:p,l:s,e:a,v:new G(o)});f0&&void 0!==arguments[0]?arguments[0]:"store",n=arguments[1],s=n||e+"Subscription",a=function(t){function n(o,s){r(this,n);var a=i(this,t.call(this,o,s));return a[e]=o.store,a}return o(n,t),n.prototype.getChildContext=function(){var t;return t={},t[e]=this[e],t[s]=null,t},n.prototype.render=function(){return V.Children.only(this.props.children)},n}(V.Component);return a.propTypes={store:z.isRequired,children:W.a.element.isRequired},a.childContextTypes=(t={},t[e]=z.isRequired,t[s]=B,t),a.displayName="Provider",a}function a(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function u(){var t=[],e=[];return{clear:function(){e=q,t=q},notify:function(){for(var n=t=e,r=0;r=0||Object.prototype.hasOwnProperty.call(t,r)&&(n[r]=t[r]);return n}function p(){}function d(t,e){var n={run:function(r){try{var i=t(e.getState(),r);(i!==n.props||n.error)&&(n.shouldComponentUpdate=!0,n.props=i,n.error=null)}catch(t){n.shouldComponentUpdate=!0,n.error=t}}};return n}function v(t){var e,n,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=r.getDisplayName,o=void 0===i?function(t){return"ConnectAdvanced("+t+")"}:i,s=r.methodName,a=void 0===s?"connectAdvanced":s,u=r.renderCountProp,v=void 0===u?void 0:u,y=r.shouldHandleStateChanges,m=void 0===y||y,_=r.storeKey,g=void 0===_?"store":_,b=r.withRef,w=void 0!==b&&b,x=h(r,["getDisplayName","methodName","renderCountProp","shouldHandleStateChanges","storeKey","withRef"]),T=g+"Subscription",P=tt++,O=(e={},e[g]=z,e[T]=B,e),S=(n={},n[T]=B,n);return function(e){Z()("function"==typeof e,"You must pass a component to the function returned by connect. Instead received "+JSON.stringify(e));var n=e.displayName||e.name||"Component",r=o(n),i=J({},x,{getDisplayName:o,methodName:a,renderCountProp:v,shouldHandleStateChanges:m,storeKey:g,withRef:w,displayName:r,wrappedComponentName:n,WrappedComponent:e}),s=function(n){function o(t,e){c(this,o);var i=l(this,n.call(this,t,e));return i.version=P,i.state={},i.renderCount=0,i.store=t[g]||e[g],i.propsMode=Boolean(t[g]),i.setWrappedInstance=i.setWrappedInstance.bind(i),Z()(i.store,'Could not find "'+g+'" in either the context or props of "'+r+'". Either wrap the root component in a , or explicitly pass "'+g+'" as a prop to "'+r+'".'),i.initSelector(),i.initSubscription(),i}return f(o,n),o.prototype.getChildContext=function(){var t,e=this.propsMode?null:this.subscription;return t={},t[T]=e||this.context[T],t},o.prototype.componentDidMount=function(){m&&(this.subscription.trySubscribe(),this.selector.run(this.props),this.selector.shouldComponentUpdate&&this.forceUpdate())},o.prototype.componentWillReceiveProps=function(t){this.selector.run(t)},o.prototype.shouldComponentUpdate=function(){return this.selector.shouldComponentUpdate},o.prototype.componentWillUnmount=function(){this.subscription&&this.subscription.tryUnsubscribe(),this.subscription=null,this.notifyNestedSubs=p,this.store=null,this.selector.run=p,this.selector.shouldComponentUpdate=!1},o.prototype.getWrappedInstance=function(){return Z()(w,"To access the wrapped instance, you need to specify { withRef: true } in the options argument of the "+a+"() call."),this.wrappedInstance},o.prototype.setWrappedInstance=function(t){this.wrappedInstance=t},o.prototype.initSelector=function(){var e=t(this.store.dispatch,i);this.selector=d(e,this.store),this.selector.run(this.props)},o.prototype.initSubscription=function(){if(m){var t=(this.propsMode?this.props:this.context)[T];this.subscription=new H(this.store,t,this.onStateChange.bind(this)),this.notifyNestedSubs=this.subscription.notifyNestedSubs.bind(this.subscription)}},o.prototype.onStateChange=function(){this.selector.run(this.props),this.selector.shouldComponentUpdate?(this.componentDidUpdate=this.notifyNestedSubsOnComponentDidUpdate,this.setState(et)):this.notifyNestedSubs()},o.prototype.notifyNestedSubsOnComponentDidUpdate=function(){this.componentDidUpdate=void 0,this.notifyNestedSubs()},o.prototype.isSubscribed=function(){return Boolean(this.subscription)&&this.subscription.isSubscribed()},o.prototype.addExtraProps=function(t){if(!(w||v||this.propsMode&&this.subscription))return t;var e=J({},t);return w&&(e.ref=this.setWrappedInstance),v&&(e[v]=this.renderCount++),this.propsMode&&this.subscription&&(e[T]=this.subscription),e},o.prototype.render=function(){var t=this.selector;if(t.shouldComponentUpdate=!1,t.error)throw t.error;return Object(Q.createElement)(e,this.addExtraProps(t.props))},o}(Q.Component);return s.WrappedComponent=e,s.displayName=r,s.childContextTypes=S,s.contextTypes=O,s.propTypes=O,$()(s,e)}}function y(t,e){return t===e?0!==t||0!==e||1/t==1/e:t!==t&&e!==e}function m(t,e){if(y(t,e))return!0;if("object"!=typeof t||null===t||"object"!=typeof e||null===e)return!1;var n=Object.keys(t),r=Object.keys(e);if(n.length!==r.length)return!1;for(var i=0;i=0||Object.prototype.hasOwnProperty.call(t,r)&&(n[r]=t[r]);return n}function j(t,e,n,r){return function(i,o){return n(t(i,o),e(r,o),o)}}function M(t,e,n,r,i){function o(i,o){return d=i,v=o,y=t(d,v),m=e(r,v),_=n(y,m,v),p=!0,_}function s(){return y=t(d,v),e.dependsOnOwnProps&&(m=e(r,v)),_=n(y,m,v)}function a(){return t.dependsOnOwnProps&&(y=t(d,v)),e.dependsOnOwnProps&&(m=e(r,v)),_=n(y,m,v)}function u(){var e=t(d,v),r=!h(e,y);return y=e,r&&(_=n(y,m,v)),_}function c(t,e){var n=!f(e,v),r=!l(t,d);return d=t,v=e,n&&r?s():n?a():r?u():_}var l=i.areStatesEqual,f=i.areOwnPropsEqual,h=i.areStatePropsEqual,p=!1,d=void 0,v=void 0,y=void 0,m=void 0,_=void 0;return function(t,e){return p?c(t,e):o(t,e)}}function R(t,e){var n=e.initMapStateToProps,r=e.initMapDispatchToProps,i=e.initMergeProps,o=A(e,["initMapStateToProps","initMapDispatchToProps","initMergeProps"]),s=n(t,o),a=r(t,o),u=i(t,o);return(o.pure?M:j)(s,a,u,t,o)}function I(t,e){var n={};for(var r in t)e.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(t,r)&&(n[r]=t[r]);return n}function N(t,e,n){for(var r=e.length-1;r>=0;r--){var i=e[r](t);if(i)return i}return function(e,r){throw new Error("Invalid value of type "+typeof t+" for "+n+" argument when connecting component "+r.wrappedComponentName+".")}}function F(t,e){return t===e}Object.defineProperty(e,"__esModule",{value:!0});var D=n(59),L=n.n(D),B=L.a.shape({trySubscribe:L.a.func.isRequired,tryUnsubscribe:L.a.func.isRequired,notifyNestedSubs:L.a.func.isRequired,isSubscribed:L.a.func.isRequired}),z=L.a.shape({subscribe:L.a.func.isRequired,dispatch:L.a.func.isRequired,getState:L.a.func.isRequired}),V=n(1),U=n(59),W=n.n(U),X=s(),q=null,Y={notify:function(){}},H=function(){function t(e,n,r){a(this,t),this.store=e,this.parentSub=n,this.onStateChange=r,this.unsubscribe=null,this.listeners=Y}return t.prototype.addNestedSub=function(t){return this.trySubscribe(),this.listeners.subscribe(t)},t.prototype.notifyNestedSubs=function(){this.listeners.notify()},t.prototype.isSubscribed=function(){return Boolean(this.unsubscribe)},t.prototype.trySubscribe=function(){this.unsubscribe||(this.unsubscribe=this.parentSub?this.parentSub.addNestedSub(this.onStateChange):this.store.subscribe(this.onStateChange),this.listeners=u())},t.prototype.tryUnsubscribe=function(){this.unsubscribe&&(this.unsubscribe(),this.unsubscribe=null,this.listeners.clear(),this.listeners=Y)},t}(),G=n(196),$=n.n(G),K=n(472),Z=n.n(K),Q=n(1),J=Object.assign||function(t){for(var e=1;e0&&void 0!==arguments[0]?arguments[0]:{},e=t.connectHOC,n=void 0===e?v:e,r=t.mapStateToPropsFactories,i=void 0===r?ot:r,o=t.mapDispatchToPropsFactories,s=void 0===o?it:o,a=t.mergePropsFactories,u=void 0===a?at:a,c=t.selectorFactory,l=void 0===c?R:c;return function(t,e,r){var o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},a=o.pure,c=void 0===a||a,f=o.areStatesEqual,h=void 0===f?F:f,p=o.areOwnPropsEqual,d=void 0===p?m:p,v=o.areStatePropsEqual,y=void 0===v?m:v,_=o.areMergedPropsEqual,g=void 0===_?m:_,b=I(o,["pure","areStatesEqual","areOwnPropsEqual","areStatePropsEqual","areMergedPropsEqual"]),w=N(t,i,"mapStateToProps"),x=N(e,s,"mapDispatchToProps"),T=N(r,u,"mergeProps");return n(l,ut({methodName:"connect",getDisplayName:function(t){return"Connect("+t+")"},shouldHandleStateChanges:Boolean(t),initMapStateToProps:w,initMapDispatchToProps:x,initMergeProps:T,pure:c,areStatesEqual:h,areOwnPropsEqual:d,areStatePropsEqual:y,areMergedPropsEqual:g},b))}}();n.d(e,"Provider",function(){return X}),n.d(e,"createProvider",function(){return s}),n.d(e,"connectAdvanced",function(){return v}),n.d(e,"connect",function(){return ct})},function(t,e,n){var r=n(44)("meta"),i=n(6),o=n(14),s=n(9).f,a=0,u=Object.isExtensible||function(){return!0},c=!n(5)(function(){return u(Object.preventExtensions({}))}),l=function(t){s(t,r,{value:{i:"O"+ ++a,w:{}}})},f=function(t,e){if(!i(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!o(t,r)){if(!u(t))return"F";if(!e)return"E";l(t)}return t[r].i},h=function(t,e){if(!o(t,r)){if(!u(t))return!0;if(!e)return!1;l(t)}return t[r].w},p=function(t){return c&&d.NEED&&u(t)&&!o(t,r)&&l(t),t},d=t.exports={KEY:r,NEED:!1,fastKey:f,getWeak:h,onFreeze:p}},function(t,e,n){var r=n(7)("unscopables"),i=Array.prototype;void 0==i[r]&&n(15)(i,r,{}),t.exports=function(t){i[r][t]=!0}},function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e){var n=0,r=Math.random();t.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++n+r).toString(36))}},function(t,e){t.exports=!1},function(t,e,n){var r=n(155),i=n(109);t.exports=Object.keys||function(t){return r(t,i)}},function(t,e,n){var r=n(30),i=Math.max,o=Math.min;t.exports=function(t,e){return t=r(t),t<0?i(t+e,0):o(t,e)}},function(t,e,n){var r=n(3),i=n(156),o=n(109),s=n(108)("IE_PROTO"),a=function(){},u=function(){var t,e=n(106)("iframe"),r=o.length;for(e.style.display="none",n(110).appendChild(e),e.src="javascript:",t=e.contentWindow.document,t.open(),t.write("