From cf534f16b59d1fe8700b3e236c0a582c92f667d6 Mon Sep 17 00:00:00 2001 From: Esrin Date: Thu, 7 May 2020 08:06:28 +0100 Subject: [PATCH 01/44] Initial commit. See changelog for full details. --- README.md | 13 +-- changelog | 5 + module/actor-sheet-ffg.js | 7 +- module/actor-sheet-simple.js | 126 -------------------------- module/{simple.js => swffg-config.js} | 4 +- styles/{simple.css => swffg.css} | 0 system.json | 12 +-- template.json | 28 ++++-- templates/actor-sheet.html | 86 ------------------ templates/ffg-actor-sheet.html | 8 +- 10 files changed, 48 insertions(+), 241 deletions(-) create mode 100644 changelog delete mode 100644 module/actor-sheet-simple.js rename module/{simple.js => swffg-config.js} (84%) rename styles/{simple.css => swffg.css} (100%) delete mode 100644 templates/actor-sheet.html diff --git a/README.md b/README.md index 4e43f3d2..326a065d 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ This is an implementation of the [Fantasy Flight Games Star Wars](https://www.fa # Requirements -This Requires the "Special Dice Roller" Module to Roll the dice and calculate the results. +This Requires the "Special Dice Roller" Module to Roll the dice and calculate the results. This is most easily available from the in-game Module browser. After installing it you will need to activate it on your world. [foundry-vtt-community](https://foundry-vtt-community.github.io/wiki/Community-Modules/#special-dice-roller) or [GitHub](https://github.com/BernhardPosselt/foundryvtt-special-dice-roller) @@ -19,9 +19,10 @@ This is most easily available from the in-game Module browser. After installing https://raw.githubusercontent.com/jaxxa/StarWarsFFG/master/system.json 5. Click Install, after a few seconds the system should be installed. -# Future Plans +# Changelog -My future plans for this system are available on [Trello](https://trello.com/b/4dI4wtGP/fvtt-starwars-ffg) -Here you can see what I intend to work on next. - -Any feedback would be appreciated. +* 06/05/2020 - Esrin - Removed old SimpleWorldBuilding dependencies and fixed breakages where necessary. +* 06/05/2020 - Esrin - Renamed core files from Simple World Building to swffg naming scheme for consistency. +* 06/05/2020 - Esrin - Updated to TabsV2 class in actor-sheet-ffg.js to avoid deprecation of Tabs class in future FoundryVTT versions. +* 06/05/2020 - Esrin - Added abbreviations (abrev) to characteristics, refactored skill display on ffg-actor-sheet.html to allow for linked characteristic abbreviations in display. +* 06/05/2020 - Esrin - Added "Rolling " into the chat message for FFG dice rolls to show which skill the person was rolling on. diff --git a/changelog b/changelog new file mode 100644 index 00000000..51a6720d --- /dev/null +++ b/changelog @@ -0,0 +1,5 @@ +06/05/2020 - Esrin - Removed old SimpleWorldBuilding dependencies and fixed breakages where necessary. +06/05/2020 - Esrin - Renamed core files from Simple World Building to swffg naming scheme for consistency. +06/05/2020 - Esrin - Updated to TabsV2 class in actor-sheet-ffg.js to avoid deprecation of Tabs class in future FoundryVTT versions. +06/05/2020 - Esrin - Added abbreviations (abrev) to characteristics, refactored skill display on ffg-actor-sheet.html to allow for linked characteristic abbreviations in display. +06/05/2020 - Esrin - Added "Rolling " into the chat message for FFG dice rolls to show which skill the person was rolling on. diff --git a/module/actor-sheet-ffg.js b/module/actor-sheet-ffg.js index 928e9727..0724ac9d 100644 --- a/module/actor-sheet-ffg.js +++ b/module/actor-sheet-ffg.js @@ -37,7 +37,7 @@ export class ActorSheetFFG extends ActorSheet { // Activate tabs let tabs = html.find('.tabs'); let initial = this._sheetTab; - new Tabs(tabs, { + new TabsV2(tabs, { initial: initial, callback: clicked => this._sheetTab = clicked.data("tab") }); @@ -160,10 +160,10 @@ export class ActorSheetFFG extends ActorSheet { dicePool.upgradeDifficulty() } - await this._completeRoll(dicePool, `Rolling ${skillName}`); + await this._completeRoll(dicePool, `Rolling ${skillName}`, skillName); } - async _completeRoll(dicePool, description) { + async _completeRoll(dicePool, description, skillName) { const id = randomID(); const content = await renderTemplate("systems/starwarsffg/templates/roll-options.html", { @@ -185,6 +185,7 @@ export class ActorSheetFFG extends ActorSheet { ChatMessage.create({ user: game.user._id, speaker: this.getData(), + flavor: `Rolling ${skillName}...`, content: `/sw ${finalPool.renderDiceExpression()}` }); } diff --git a/module/actor-sheet-simple.js b/module/actor-sheet-simple.js deleted file mode 100644 index a77ea2bd..00000000 --- a/module/actor-sheet-simple.js +++ /dev/null @@ -1,126 +0,0 @@ -/** - * Extend the basic ActorSheet with some very simple modifications - * @extends {ActorSheet} - */ -export class SimpleActorSheet extends ActorSheet { - - /** @override */ - static get defaultOptions() { - return mergeObject(super.defaultOptions, { - classes: ["worldbuilding", "sheet", "actor"], - template: "systems/starwarsffg/templates/actor-sheet.html", - width: 600, - height: 600, - tabs: [{navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "description"}] - }); - } - - /* -------------------------------------------- */ - - /** @override */ - getData() { - const data = super.getData(); - data.dtypes = ["String", "Number", "Boolean"]; - for ( let attr of Object.values(data.data.attributes) ) { - attr.isCheckbox = attr.dtype === "Boolean"; - } - return data; - } - - /* -------------------------------------------- */ - - /** @override */ - activateListeners(html) { - super.activateListeners(html); - - // Activate tabs - let tabs = html.find('.tabs'); - let initial = this._sheetTab; - new Tabs(tabs, { - initial: initial, - callback: clicked => this._sheetTab = clicked.data("tab") - }); - - // Everything below here is only needed if the sheet is editable - if (!this.options.editable) return; - - // Update Inventory Item - html.find('.item-edit').click(ev => { - const li = $(ev.currentTarget).parents(".item"); - const item = this.actor.getOwnedItem(li.data("itemId")); - item.sheet.render(true); - }); - - // Delete Inventory Item - html.find('.item-delete').click(ev => { - const li = $(ev.currentTarget).parents(".item"); - this.actor.deleteOwnedItem(li.data("itemId")); - li.slideUp(200, () => this.render(false)); - }); - - // Add or Remove Attribute - html.find(".attributes").on("click", ".attribute-control", this._onClickAttributeControl.bind(this)); - } - - /* -------------------------------------------- */ - - /** - * Listen for click events on an attribute control to modify the composition of attributes in the sheet - * @param {MouseEvent} event The originating left click event - * @private - */ - async _onClickAttributeControl(event) { - event.preventDefault(); - const a = event.currentTarget; - const action = a.dataset.action; - const attrs = this.object.data.data.attributes; - const form = this.form; - - // Add new attribute - if ( action === "create" ) { - const nk = Object.keys(attrs).length + 1; - let newKey = document.createElement("div"); - newKey.innerHTML = ``; - newKey = newKey.children[0]; - form.appendChild(newKey); - await this._onSubmit(event); - } - - // Remove existing attribute - else if ( action === "delete" ) { - const li = a.closest(".attribute"); - li.parentElement.removeChild(li); - await this._onSubmit(event); - } - } - - /* -------------------------------------------- */ - - /** @override */ - _updateObject(event, formData) { - - // Handle the free-form attributes list - const formAttrs = expandObject(formData).data.attributes || {}; - const attributes = Object.values(formAttrs).reduce((obj, v) => { - let k = v["key"].trim(); - if ( /[\s\.]/.test(k) ) return ui.notifications.error("Attribute keys may not contain spaces or periods"); - delete v["key"]; - obj[k] = v; - return obj; - }, {}); - - // Remove attributes which are no longer used - for ( let k of Object.keys(this.object.data.data.attributes) ) { - if ( !attributes.hasOwnProperty(k) ) attributes[`-=${k}`] = null; - } - - // Re-combine formData - formData = Object.entries(formData).filter(e => !e[0].startsWith("data.attributes")).reduce((obj, e) => { - obj[e[0]] = e[1]; - return obj; - }, {_id: this.object._id, "data.attributes": attributes}); - - // Update the Actor - return this.object.update(formData); - } -} diff --git a/module/simple.js b/module/swffg-config.js similarity index 84% rename from module/simple.js rename to module/swffg-config.js index 85e58c0d..d96c0596 100644 --- a/module/simple.js +++ b/module/swffg-config.js @@ -6,7 +6,6 @@ // Import Modules import { SimpleItemSheet } from "./item-sheet.js"; -import { SimpleActorSheet } from "./actor-sheet-simple.js"; import { ActorSheetFFG } from "./actor-sheet-ffg.js"; import { DicePoolFFG } from "./dice-pool-ffg.js" @@ -29,9 +28,8 @@ Hooks.once("init", async function() { // Register sheet application classes Actors.unregisterSheet("core", ActorSheet); Actors.registerSheet("ffg", ActorSheetFFG, { makeDefault: true }); - Actors.registerSheet("dnd5e", SimpleActorSheet, { makeDefault: false }); Items.unregisterSheet("core", ItemSheet); - Items.registerSheet("dnd5e", SimpleItemSheet, {makeDefault: true}); + Items.registerSheet("ffg", SimpleItemSheet, {makeDefault: true}); // Add utilities to the global scope, this can be useful for macro makers window.DicePoolFFG = DicePoolFFG; diff --git a/styles/simple.css b/styles/swffg.css similarity index 100% rename from styles/simple.css rename to styles/swffg.css diff --git a/system.json b/system.json index 8c0cb01e..bd5fba69 100644 --- a/system.json +++ b/system.json @@ -6,17 +6,17 @@ "minimumCoreVersion": "0.5.5", "compatibleCoreVersion": "0.5.5", "templateVersion": 1, - "author": "Jaxxa", - "esmodules": ["module/dice-pool-ffg.js", "module/simple.js"], - "styles": ["styles/simple.css"], + "author": "Jaxxa and Esrin", + "esmodules": ["module/dice-pool-ffg.js", "module/swffg-config.js"], + "styles": ["styles/swffg.css"], "packs": [], "languages": [], "gridDistance": 5, "gridUnits": "ft", "primaryTokenAttribute": "wounds", "secondaryTokenAttribute": "strain", - "url": "https://github.com/jaxxa/StarWarsFFG/", - "manifest": "https://raw.githubusercontent.com/jaxxa/StarWarsFFG/master/system.json", - "download": "https://github.com/jaxxa/StarWarsFFG/releases/download/0.01/starwarsffg-0.01.zip", + "url": "https://github.com/Esrin/StarWarsFFG/tree/esrin-dev", + "manifest": "https://raw.githubusercontent.com/Esrin/StarWarsFFG/esrin-dev/system.json", + "download": "https://github.com/Esrin/StarWarsFFG/releases/download/0.01/esrin-dev_0.01.zip", "license": "LICENSE.txt" } diff --git a/template.json b/template.json index 8f0d2b82..5ae70806 100644 --- a/template.json +++ b/template.json @@ -36,27 +36,33 @@ "characteristics": { "Brawn": { "value": 2, - "label": "Brawn" + "label": "Brawn", + "abrev": "Br" }, "Agility": { "value": 2, - "label": "Agility" + "label": "Agility", + "abrev": "Ag" }, "Intellect": { "value": 2, - "label": "Intellect" + "label": "Intellect", + "abrev": "Int" }, "Cunning": { "value": 2, - "label": "Cunning" + "label": "Cunning", + "abrev": "Cun" }, "Willpower": { "value": 2, - "label": "Willpower" + "label": "Willpower", + "abrev": "Will" }, "Presence": { "value": 2, - "label": "Presence" + "label": "Presence", + "abrev": "Pr" } }, "skills": { @@ -205,13 +211,19 @@ }, "Item": { "types": [ - "item" + "item", + "weapon" ], "item": { "description": "", "quantity": 1, "weight": 0, "attributes": {} + }, + "weapon": { + "templates": ["item"], + "damage": 0, + "damagetype": "Piercing" } } -} \ No newline at end of file +} diff --git a/templates/actor-sheet.html b/templates/actor-sheet.html deleted file mode 100644 index 08ea23ac..00000000 --- a/templates/actor-sheet.html +++ /dev/null @@ -1,86 +0,0 @@ -
- - {{!-- Sheet Header --}} -
- -
-

-
- - / - -
-
- - / - -
-
-
- - {{!-- Sheet Tab Navigation --}} - - - {{!-- Sheet Body --}} -
- - {{!-- Biography Tab --}} -
- {{editor content=data.biography target="data.biography" button=true owner=owner editable=editable}} -
- - {{!-- Owned Items Tab --}} -
-
    - {{#each actor.items as |item id|}} -
  1. - -

    {{item.name}}

    -
    - - -
    -
  2. - {{/each}} -
-
- - {{!-- Attributes Tab --}} -
-
- Attribute Key - Value - Label - Data Type - -
- -
    - {{#each data.attributes as |attr key|}} -
  1. - - {{#if attr.isCheckbox}} - - {{else}} - - {{/if}} - - - -
  2. - {{/each}} -
-
-
-
- diff --git a/templates/ffg-actor-sheet.html b/templates/ffg-actor-sheet.html index 4d4966a7..e06c1b26 100644 --- a/templates/ffg-actor-sheet.html +++ b/templates/ffg-actor-sheet.html @@ -89,8 +89,10 @@

Strain

{{#each data.skills as |skill id|}} - - {{id}} + {{id}} {{#with (lookup ../this.data.characteristics [characteristic])~}} + ({{abrev}}) + {{/with}} + @@ -228,4 +230,4 @@

{{item.name}}

- \ No newline at end of file + From c4a60de52db4ad61c7b82d4324ded296ecf3e761 Mon Sep 17 00:00:00 2001 From: Esrin Date: Thu, 7 May 2020 13:45:46 +0100 Subject: [PATCH 02/44] First pass at character sheet styling. Next step, talents, items and derived modifiers. --- README.md | 9 +- changelog | 5 - {module => modules}/actor-sheet-ffg.js | 2 +- {module => modules}/dice-pool-ffg.js | 0 {module => modules}/item-sheet.js | 0 {module => modules}/swffg-config.js | 0 styles/swffg.css | 53 ++++-- system.json | 2 +- template.json | 3 + templates/ffg-actor-sheet.html | 221 ++++++++++++------------- 10 files changed, 163 insertions(+), 132 deletions(-) delete mode 100644 changelog rename {module => modules}/actor-sheet-ffg.js (99%) rename {module => modules}/dice-pool-ffg.js (100%) rename {module => modules}/item-sheet.js (100%) rename {module => modules}/swffg-config.js (100%) diff --git a/README.md b/README.md index 326a065d..18ea9a7c 100644 --- a/README.md +++ b/README.md @@ -21,8 +21,9 @@ https://raw.githubusercontent.com/jaxxa/StarWarsFFG/master/system.json # Changelog -* 06/05/2020 - Esrin - Removed old SimpleWorldBuilding dependencies and fixed breakages where necessary. -* 06/05/2020 - Esrin - Renamed core files from Simple World Building to swffg naming scheme for consistency. -* 06/05/2020 - Esrin - Updated to TabsV2 class in actor-sheet-ffg.js to avoid deprecation of Tabs class in future FoundryVTT versions. -* 06/05/2020 - Esrin - Added abbreviations (abrev) to characteristics, refactored skill display on ffg-actor-sheet.html to allow for linked characteristic abbreviations in display. +* 07/05/2020 - Esrin - First pass at character sheet styling. Next step, talents, items and derived modifiers. * 06/05/2020 - Esrin - Added "Rolling " into the chat message for FFG dice rolls to show which skill the person was rolling on. +* 06/05/2020 - Esrin - Added abbreviations (abrev) to characteristics, refactored skill display on ffg-actor-sheet.html to allow for linked characteristic abbreviations in display. +* 06/05/2020 - Esrin - Updated to TabsV2 class in actor-sheet-ffg.js to avoid deprecation of Tabs class in future FoundryVTT versions. +* 06/05/2020 - Esrin - Renamed remaining core files from Simple World Building to swffg naming scheme for consistency. +* 06/05/2020 - Esrin - Removed old SimpleWorldBuilding dependencies and fixed breakages where necessary. diff --git a/changelog b/changelog deleted file mode 100644 index 51a6720d..00000000 --- a/changelog +++ /dev/null @@ -1,5 +0,0 @@ -06/05/2020 - Esrin - Removed old SimpleWorldBuilding dependencies and fixed breakages where necessary. -06/05/2020 - Esrin - Renamed core files from Simple World Building to swffg naming scheme for consistency. -06/05/2020 - Esrin - Updated to TabsV2 class in actor-sheet-ffg.js to avoid deprecation of Tabs class in future FoundryVTT versions. -06/05/2020 - Esrin - Added abbreviations (abrev) to characteristics, refactored skill display on ffg-actor-sheet.html to allow for linked characteristic abbreviations in display. -06/05/2020 - Esrin - Added "Rolling " into the chat message for FFG dice rolls to show which skill the person was rolling on. diff --git a/module/actor-sheet-ffg.js b/modules/actor-sheet-ffg.js similarity index 99% rename from module/actor-sheet-ffg.js rename to modules/actor-sheet-ffg.js index 0724ac9d..750b7e14 100644 --- a/module/actor-sheet-ffg.js +++ b/modules/actor-sheet-ffg.js @@ -11,7 +11,7 @@ export class ActorSheetFFG extends ActorSheet { classes: ["worldbuilding", "sheet", "actor"], template: "systems/starwarsffg/templates/ffg-actor-sheet.html", width: 600, - height: 600, + height: 840, tabs: [{navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "characteristics"}] }); } diff --git a/module/dice-pool-ffg.js b/modules/dice-pool-ffg.js similarity index 100% rename from module/dice-pool-ffg.js rename to modules/dice-pool-ffg.js diff --git a/module/item-sheet.js b/modules/item-sheet.js similarity index 100% rename from module/item-sheet.js rename to modules/item-sheet.js diff --git a/module/swffg-config.js b/modules/swffg-config.js similarity index 100% rename from module/swffg-config.js rename to modules/swffg-config.js diff --git a/styles/swffg.css b/styles/swffg.css index 50b63098..d9000951 100644 --- a/styles/swffg.css +++ b/styles/swffg.css @@ -1,3 +1,15 @@ +.window-app .window-content { + background: #f2f2f2; +} + +div .container { + width: 100%; + height: auto; + margin: 15px 0 15px 0; + padding: 15px 0 15px 0; + text-align: left; +} + .worldbuilding.sheet .window-content { padding: 5px; overflow-y: hidden; @@ -22,26 +34,24 @@ .worldbuilding.sheet .header-fields { flex: 1; - height: 10em; + height: auto; } .worldbuilding.sheet .charname { - height: 60px; padding: 5px; margin: 0; border-bottom: 0; } .worldbuilding.sheet .charname input { - width: 100%; - height: 100%; - margin: 0; + width: auto; + margin: 0px 5px; } .worldbuilding.sheet .resource { height: 40px; - width: 50%; - padding: 3px 10px; - float: left; + padding: 5px 0 5px 10px; + margin: 0; + display: inline-block; } .worldbuilding.sheet .resource input { width: 100px; @@ -195,9 +205,11 @@ boxes at the top of the standard FFG character sheets. } .split-box h1 { - font-size: 120%; - font-weight: bold; + font-size: 100%; text-align: center; + color: #fff; + border-radius: 15px 15px 5px 5px; + background: #435a76; } .split-box input { @@ -213,6 +225,27 @@ boxes at the top of the standard FFG character sheets. text-align: center; } + +.split-box .left label { + display: block; + font-size: 90%; + color: #fff; + font-weight: bold; + background: #652825; + border-radius: 5px 0px 0px 15px; + text-align: center; +} + +.split-box .right label { + display: block; + font-size: 90%; + color: #000; + font-weight: bold; + background: #90cbdd; + border-radius: 0px 5px 15px 0px; + text-align: center; +} + .dice-pool img { border: 0; width: 2em; diff --git a/system.json b/system.json index bd5fba69..8a69db88 100644 --- a/system.json +++ b/system.json @@ -7,7 +7,7 @@ "compatibleCoreVersion": "0.5.5", "templateVersion": 1, "author": "Jaxxa and Esrin", - "esmodules": ["module/dice-pool-ffg.js", "module/swffg-config.js"], + "esmodules": ["modules/dice-pool-ffg.js", "modules/swffg-config.js"], "styles": ["styles/swffg.css"], "packs": [], "languages": [], diff --git a/template.json b/template.json index 5ae70806..6c034e57 100644 --- a/template.json +++ b/template.json @@ -5,6 +5,9 @@ ], "character": { "biography": "", + "species": "", + "career": "", + "specialisation": "", "stats": { "wounds": { "value": 0, diff --git a/templates/ffg-actor-sheet.html b/templates/ffg-actor-sheet.html index e06c1b26..117404d1 100644 --- a/templates/ffg-actor-sheet.html +++ b/templates/ffg-actor-sheet.html @@ -1,63 +1,127 @@
+ {{!-- Sheet Header --}}
- - - - {{!-- Wounds Box --}} -
-

-
-
-

Wounds

-
-
- - -
-
-
- - -
-
+ + + + +
+ + {{!-- Character Name and Player --}} +
+
+
+
+ + + {{!-- Wounds and Strain Container --}} +
+ {{!-- Wounds Box --}} +
+
+

Wounds

+
+
+ + +
+
+
+ +
- - {{!-- Strain Box --}} -
-
-
-

Strain

-
-
- - -
-
-
- - -
-
-
+
+
+ + {{!-- Strain Box --}} +
+
+

Strain

+
+
+ + +
+
+
+ +
- - +
+
+ + {{!-- Soak, Defence and Force container --}} +
+ {{!-- Soak Box --}} +
+
+

Soak

+
+
+ + +
+
+
+
+ + {{!-- Defence Box --}} +
+
+

Defence

+
+
+ + +
+
+
+ + +
+
+
+
+ + {{!-- Force Box --}} +
+
+

Force Pool

+
+
+ + +
+
+
+ + +
+
+
+
+
+ {{!-- Sheet Tab Navigation --}} {{!-- Sheet Body --}} @@ -164,70 +228,5 @@

{{item.name}}

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameValue
Soak - -
Defence - Ranged - -
Defence - Melee - -
Encumbrance - Value - -
Encumbrance - Max - -
ForcePool - Value - -
ForcePool - Max - -
- -
- From aab74b6911a01909a9545a838d9be8e58f7614fa Mon Sep 17 00:00:00 2001 From: Esrin Date: Fri, 8 May 2020 00:04:49 +0100 Subject: [PATCH 03/44] Minor tweaks to the character sheet styling. Begun restructuring the underlying data structure in template.json to introduce best practices, avoid unnecessary duplication and prepare for the addition of new actor and item types. --- README.md | 3 +- modules/swffg-config.js | 2 +- styles/swffg.css | 39 ++- system.json | 2 +- template.json | 463 ++++++++++++++++++--------------- templates/ffg-actor-sheet.html | 8 +- 6 files changed, 293 insertions(+), 224 deletions(-) diff --git a/README.md b/README.md index 18ea9a7c..99ba752e 100644 --- a/README.md +++ b/README.md @@ -16,11 +16,12 @@ This is most easily available from the in-game Module browser. After installing 2. Go to the "Game Systems" Tab 3. Click the "Install System" button 4. Copy the Following link into the "Manifest URL" section: -https://raw.githubusercontent.com/jaxxa/StarWarsFFG/master/system.json +https://raw.githubusercontent.com/Esrin/StarWarsFFG/esrin-dev/system.json 5. Click Install, after a few seconds the system should be installed. # Changelog +* 07/05/2020 - Esrin - Minor tweaks to the character sheet styling. Begun restructuring the underlying data structure in template.json to introduce best practices, avoid unnecessary duplication and prepare for the addition of new actor and item types. * 07/05/2020 - Esrin - First pass at character sheet styling. Next step, talents, items and derived modifiers. * 06/05/2020 - Esrin - Added "Rolling " into the chat message for FFG dice rolls to show which skill the person was rolling on. * 06/05/2020 - Esrin - Added abbreviations (abrev) to characteristics, refactored skill display on ffg-actor-sheet.html to allow for linked characteristic abbreviations in display. diff --git a/modules/swffg-config.js b/modules/swffg-config.js index d96c0596..5d30dfba 100644 --- a/modules/swffg-config.js +++ b/modules/swffg-config.js @@ -14,7 +14,7 @@ import { DicePoolFFG } from "./dice-pool-ffg.js" /* -------------------------------------------- */ Hooks.once("init", async function() { - console.log(`Initializing Simple Worldbuilding System`); + console.log(`Initializing SWFFG System`); /** * Set an initiative formula for the system diff --git a/styles/swffg.css b/styles/swffg.css index d9000951..d9b99f59 100644 --- a/styles/swffg.css +++ b/styles/swffg.css @@ -5,9 +5,7 @@ div .container { width: 100%; height: auto; - margin: 15px 0 15px 0; - padding: 15px 0 15px 0; - text-align: left; + margin-bottom: 10px; } .worldbuilding.sheet .window-content { @@ -23,7 +21,6 @@ div .container { flex-wrap: wrap; justify-content: flex-start; flex: 0 0 100px; - margin-bottom: 10px; } .worldbuilding.sheet .profile-img { @@ -38,21 +35,23 @@ div .container { } .worldbuilding.sheet .charname { - padding: 5px; - margin: 0; border-bottom: 0; + display: inline-grid; + padding: 5px; } + .worldbuilding.sheet .charname input { width: auto; - margin: 0px 5px; + margin: 5px 5px 10px 5px; } .worldbuilding.sheet .resource { height: 40px; - padding: 5px 0 5px 10px; + padding: 5px; margin: 0; - display: inline-block; + display: inline-table; } + .worldbuilding.sheet .resource input { width: 100px; height: 28px; @@ -210,6 +209,8 @@ boxes at the top of the standard FFG character sheets. color: #fff; border-radius: 15px 15px 5px 5px; background: #435a76; + padding: 0; + margin: 0; } .split-box input { @@ -246,6 +247,26 @@ boxes at the top of the standard FFG character sheets. text-align: center; } +.split-box .single label { + display: block; + font-size: 90%; + color: #000; + font-weight: bold; + background: #90cbdd; + border-radius: 5px 5px 15px 15px; + text-align: center; +} + +.split-box .single-clear label { + display: block; + font-size: 90%; + color: #90cbdd; + font-weight: bold; + background: #90cbdd; + border-radius: 5px 5px 15px 15px; + text-align: center; +} + .dice-pool img { border: 0; width: 2em; diff --git a/system.json b/system.json index 8a69db88..f9f2481f 100644 --- a/system.json +++ b/system.json @@ -17,6 +17,6 @@ "secondaryTokenAttribute": "strain", "url": "https://github.com/Esrin/StarWarsFFG/tree/esrin-dev", "manifest": "https://raw.githubusercontent.com/Esrin/StarWarsFFG/esrin-dev/system.json", - "download": "https://github.com/Esrin/StarWarsFFG/releases/download/0.01/esrin-dev_0.01.zip", + "download": "https://github.com/Esrin/StarWarsFFG/releases/download/esrin-dev_0.01/esrin-dev_0.01.zip", "license": "LICENSE.txt" } diff --git a/template.json b/template.json index 6c034e57..8b047ba2 100644 --- a/template.json +++ b/template.json @@ -3,230 +3,277 @@ "types": [ "character" ], - "character": { - "biography": "", - "species": "", - "career": "", - "specialisation": "", + "templates": { + "biography": { + "biography": { + "value": "", + "type": "String" + } + }, + "species": { + "species": { + "value": "", + "type": "String" + } + }, + "career": { + "career": { + "value": "", + "type": "String" + } + }, + "specialisation": { + "specialisation": { + "value": "", + "type": "String" + } + }, "stats": { - "wounds": { - "value": 0, - "min": 0, - "max": 10 - }, - "strain": { - "value": 0, - "min": 0, - "max": 10 - }, - "soak": { - "value": 2 - }, - "defence": { - "ranged": 0, - "melee": 0 - }, - "encumbrance": { - "value": 0, - "max": 0 - }, - "forcePool": { - "value": 0, - "max": 0 + "stats": { + "wounds": { + "value": 0, + "min": 0, + "max": 10 + }, + "strain": { + "value": 0, + "min": 0, + "max": 10 + }, + "soak": { + "value": 2 + }, + "defence": { + "ranged": 0, + "melee": 0 + }, + "encumbrance": { + "value": 0, + "max": 0 + }, + "forcePool": { + "value": 0, + "max": 0 + } } }, - "attributes": {}, "characteristics": { - "Brawn": { - "value": 2, - "label": "Brawn", - "abrev": "Br" - }, - "Agility": { - "value": 2, - "label": "Agility", - "abrev": "Ag" - }, - "Intellect": { - "value": 2, - "label": "Intellect", - "abrev": "Int" - }, - "Cunning": { - "value": 2, - "label": "Cunning", - "abrev": "Cun" - }, - "Willpower": { - "value": 2, - "label": "Willpower", - "abrev": "Will" - }, - "Presence": { - "value": 2, - "label": "Presence", - "abrev": "Pr" + "characteristics": { + "Brawn": { + "value": 2, + "label": "Brawn", + "abrev": "Br" + }, + "Agility": { + "value": 2, + "label": "Agility", + "abrev": "Ag" + }, + "Intellect": { + "value": 2, + "label": "Intellect", + "abrev": "Int" + }, + "Cunning": { + "value": 2, + "label": "Cunning", + "abrev": "Cun" + }, + "Willpower": { + "value": 2, + "label": "Willpower", + "abrev": "Will" + }, + "Presence": { + "value": 2, + "label": "Presence", + "abrev": "Pr" + } } }, "skills": { - "Brawl": { - "rank": 0, - "characteristic": "Brawn" - }, - "Gunnery": { - "rank": 0, - "characteristic": "Agility" - }, - "Lightsaber": { - "rank": 0, - "characteristic": "Brawn" - }, - "Melee": { - "rank": 0, - "characteristic": "Brawn" - }, - "Ranged: Light": { - "rank": 0, - "characteristic": "Agility" - }, - "Ranged: Heavy": { - "rank": 0, - "characteristic": "Agility" - }, - "Astrogation": { - "rank": 0, - "characteristic": "Intellect" - }, - "Athletics ": { - "rank": 0, - "characteristic": "Brawn" - }, - "Charm": { - "rank": 0, - "characteristic": "Presence" - }, - "Coercion": { - "rank": 0, - "characteristic": "Willpower" - }, - "Computers": { - "rank": 0, - "characteristic": "Intellect" - }, - "Cool": { - "rank": 0, - "characteristic": "Presence" - }, - "Coordination": { - "rank": 0, - "characteristic": "Agility" - }, - "Deception": { - "rank": 0, - "characteristic": "Cunning" - }, - "Discipline": { - "rank": 0, - "characteristic": "Willpower" - }, - "Leadership": { - "rank": 0, - "characteristic": "Presence" - }, - "Mechanics": { - "rank": 0, - "characteristic": "Intellect" - }, - "Medicine": { - "rank": 0, - "characteristic": "Intellect" - }, - "Negotiation": { - "rank": 0, - "characteristic": "Presence" - }, - "Perception": { - "rank": 0, - "characteristic": "Cunning" - }, - "Piloting: Planetary": { - "rank": 0, - "characteristic": "Agility" - }, - "Piloting: Space": { - "rank": 0, - "characteristic": "Agility" - }, - "Resilience": { - "rank": 0, - "characteristic": "Brawn" - }, - "Skulduggery": { - "rank": 0, - "characteristic": "Cunning" - }, - "Stealth": { - "rank": 0, - "characteristic": "Agility" - }, - "Streetwise": { - "rank": 0, - "characteristic": "Cunning" - }, - "Survival": { - "rank": 0, - "characteristic": "Cunning" - }, - "Vigilance": { - "rank": 0, - "characteristic": "Willpower" - }, - "Knowledge: Core Worlds": { - "rank": 0, - "characteristic": "Intellect" - }, - "Knowledge: Education": { - "rank": 0, - "characteristic": "Intellect" - }, - "Knowledge: Lore": { - "rank": 0, - "characteristic": "Intellect" - }, - "Knowledge: Outer Rim": { - "rank": 0, - "characteristic": "Intellect" - }, - "Knowledge: Underworld": { - "rank": 0, - "characteristic": "Intellect" - }, - "Knowledge: Warfare": { - "rank": 0, - "characteristic": "Intellect" - }, - "Knowledge: Xenology": { - "rank": 0, - "characteristic": "Intellect" + "skills": { + "Brawl": { + "rank": 0, + "characteristic": "Brawn" + }, + "Gunnery": { + "rank": 0, + "characteristic": "Agility" + }, + "Lightsaber": { + "rank": 0, + "characteristic": "Brawn" + }, + "Melee": { + "rank": 0, + "characteristic": "Brawn" + }, + "Ranged: Light": { + "rank": 0, + "characteristic": "Agility" + }, + "Ranged: Heavy": { + "rank": 0, + "characteristic": "Agility" + }, + "Astrogation": { + "rank": 0, + "characteristic": "Intellect" + }, + "Athletics ": { + "rank": 0, + "characteristic": "Brawn" + }, + "Charm": { + "rank": 0, + "characteristic": "Presence" + }, + "Coercion": { + "rank": 0, + "characteristic": "Willpower" + }, + "Computers": { + "rank": 0, + "characteristic": "Intellect" + }, + "Cool": { + "rank": 0, + "characteristic": "Presence" + }, + "Coordination": { + "rank": 0, + "characteristic": "Agility" + }, + "Deception": { + "rank": 0, + "characteristic": "Cunning" + }, + "Discipline": { + "rank": 0, + "characteristic": "Willpower" + }, + "Leadership": { + "rank": 0, + "characteristic": "Presence" + }, + "Mechanics": { + "rank": 0, + "characteristic": "Intellect" + }, + "Medicine": { + "rank": 0, + "characteristic": "Intellect" + }, + "Negotiation": { + "rank": 0, + "characteristic": "Presence" + }, + "Perception": { + "rank": 0, + "characteristic": "Cunning" + }, + "Piloting: Planetary": { + "rank": 0, + "characteristic": "Agility" + }, + "Piloting: Space": { + "rank": 0, + "characteristic": "Agility" + }, + "Resilience": { + "rank": 0, + "characteristic": "Brawn" + }, + "Skulduggery": { + "rank": 0, + "characteristic": "Cunning" + }, + "Stealth": { + "rank": 0, + "characteristic": "Agility" + }, + "Streetwise": { + "rank": 0, + "characteristic": "Cunning" + }, + "Survival": { + "rank": 0, + "characteristic": "Cunning" + }, + "Vigilance": { + "rank": 0, + "characteristic": "Willpower" + }, + "Knowledge: Core Worlds": { + "rank": 0, + "characteristic": "Intellect" + }, + "Knowledge: Education": { + "rank": 0, + "characteristic": "Intellect" + }, + "Knowledge: Lore": { + "rank": 0, + "characteristic": "Intellect" + }, + "Knowledge: Outer Rim": { + "rank": 0, + "characteristic": "Intellect" + }, + "Knowledge: Underworld": { + "rank": 0, + "characteristic": "Intellect" + }, + "Knowledge: Warfare": { + "rank": 0, + "characteristic": "Intellect" + }, + "Knowledge: Xenology": { + "rank": 0, + "characteristic": "Intellect" + } } } + }, + "character": { + "templates": ["biography", "species", "career", "specialisation", "stats", "characteristics", "skills"], + "attributes": {} } }, "Item": { "types": [ - "item", - "weapon" + "item" ], + "templates": { + "description": { + "description": { + "value": "", + "type": "String" + } + }, + "quantity": { + "quantity": { + "value": 0, + "type": "Number" + } + }, + "weight": { + "weight": { + "value": 0, + "type": "Number" + } + }, + "cost": { + "cost": { + "value": 0, + "type": "Number" + } + } + }, "item": { - "description": "", - "quantity": 1, - "weight": 0, + "templates": ["description", "quantity", "weight", "cost"], "attributes": {} - }, - "weapon": { - "templates": ["item"], - "damage": 0, - "damagetype": "Piercing" } } } diff --git a/templates/ffg-actor-sheet.html b/templates/ffg-actor-sheet.html index 117404d1..cbf35412 100644 --- a/templates/ffg-actor-sheet.html +++ b/templates/ffg-actor-sheet.html @@ -9,8 +9,8 @@
{{!-- Character Name and Player --}} -
-
+
+
@@ -65,10 +65,10 @@

Strain

Soak

-
+
- +
From 7212828ae69f0b9005df0ce5d97ad555bf6655bb Mon Sep 17 00:00:00 2001 From: Esrin Date: Sat, 9 May 2020 00:18:09 +0100 Subject: [PATCH 04/44] Lots of updates. See changelog for details. Next to do is vehicles. --- README.md | 8 + modules/actors/actor-ffg.js | 49 +++ modules/{ => sheets}/actor-sheet-ffg.js | 5 +- modules/sheets/armour-sheet-ffg.js | 112 +++++++ .../gear-sheet-ffg.js} | 12 +- modules/sheets/minion-sheet-ffg.js | 215 +++++++++++++ modules/sheets/talent-sheet-ffg.js | 113 +++++++ modules/sheets/weapon-sheet-ffg.js | 112 +++++++ modules/swffg-config.js | 75 ++++- styles/swffg.css | 95 +++++- system.json | 2 +- template.json | 276 +++++++++++++---- templates/ffg-actor-sheet.html | 248 +++++++++++++-- templates/ffg-armour-sheet.html | 88 ++++++ templates/ffg-gear-sheet.html | 76 +++++ templates/ffg-minion-sheet.html | 290 ++++++++++++++++++ ...{item-sheet.html => ffg-talent-sheet.html} | 42 ++- templates/ffg-weapon-sheet.html | 100 ++++++ 18 files changed, 1804 insertions(+), 114 deletions(-) create mode 100644 modules/actors/actor-ffg.js rename modules/{ => sheets}/actor-sheet-ffg.js (97%) create mode 100644 modules/sheets/armour-sheet-ffg.js rename modules/{item-sheet.js => sheets/gear-sheet-ffg.js} (94%) create mode 100644 modules/sheets/minion-sheet-ffg.js create mode 100644 modules/sheets/talent-sheet-ffg.js create mode 100644 modules/sheets/weapon-sheet-ffg.js create mode 100644 templates/ffg-armour-sheet.html create mode 100644 templates/ffg-gear-sheet.html create mode 100644 templates/ffg-minion-sheet.html rename templates/{item-sheet.html => ffg-talent-sheet.html} (58%) create mode 100644 templates/ffg-weapon-sheet.html diff --git a/README.md b/README.md index 99ba752e..48528d90 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,14 @@ https://raw.githubusercontent.com/Esrin/StarWarsFFG/esrin-dev/system.json # Changelog +* 08/05/2020 - Esrin - Extended Actor class to allow for calculated Minion stat values (wounds from unit wounds * quantity, and skills from group skills * quantity-1) +* 08/05/2020 - Esrin - Added data structure for minions +* 08/05/2020 - Esrin - Built character sheet for minions +* 08/05/2020 - Esrin - Updated main character sheet to correctly display all three main item types, and talents. +* 08/05/2020 - Esrin - Added data structure for talents +* 08/05/2020 - Esrin - Updated main character sheet to show XP on all pages, and obligation types on Biography page. +* 08/05/2020 - Esrin - Built very basic item sheets for the three main item types. +* 08/05/2020 - Esrin - Added data structures for the three main item types, gear, weapons, armour. * 07/05/2020 - Esrin - Minor tweaks to the character sheet styling. Begun restructuring the underlying data structure in template.json to introduce best practices, avoid unnecessary duplication and prepare for the addition of new actor and item types. * 07/05/2020 - Esrin - First pass at character sheet styling. Next step, talents, items and derived modifiers. * 06/05/2020 - Esrin - Added "Rolling " into the chat message for FFG dice rolls to show which skill the person was rolling on. diff --git a/modules/actors/actor-ffg.js b/modules/actors/actor-ffg.js new file mode 100644 index 00000000..b8967fba --- /dev/null +++ b/modules/actors/actor-ffg.js @@ -0,0 +1,49 @@ +/** + * Extend the base Actor entity. + * @extends {Actor} + */ +export class ActorFFG extends Actor { + + /** + * Augment the basic actor data with additional dynamic data. + */ + prepareData() { + super.prepareData(); + + const actorData = this.data; + const data = actorData.data; + const flags = actorData.flags; + + // Make separate methods for each Actor type (character, minion, etc.) to keep + // things organized. + if (actorData.type === 'minion') this._prepareMinionData(actorData); + } + + /** + * Prepare Minion type specific data + */ + _prepareMinionData(actorData) { + const data = actorData.data; + + // Set Wounds threshold to unit_wounds * quantity to account for minion group health. + data.stats.wounds.max = Math.floor(data.unit_wounds.value*data.quantity.value); + // Check we don't go below 0. + if (data.stats.wounds.max < 0) + { + data.stats.wounds.max = 0; + } + + // Loop through Skills, and where groupskill = true, set the rank to 1*(quantity-1). + for (let [key, skill] of Object.entries(data.skills)) { + // Check to see if this is a group skill, otherwise do nothing. + if(skill.groupskill) { + skill.rank = Math.floor(1*(data.quantity.value-1)); + // Check we don't go below 0. + if (skill.rank < 0) { + skill.rank = 0; + } + } + } + } + +} diff --git a/modules/actor-sheet-ffg.js b/modules/sheets/actor-sheet-ffg.js similarity index 97% rename from modules/actor-sheet-ffg.js rename to modules/sheets/actor-sheet-ffg.js index 750b7e14..49753b77 100644 --- a/modules/actor-sheet-ffg.js +++ b/modules/sheets/actor-sheet-ffg.js @@ -200,15 +200,14 @@ export class ActorSheetFFG extends ActorSheet { _addSkillDicePool(elem) { const data = this.getData(); - console.log(elem); const skillName = elem.dataset["ability"]; const skill = data.data.skills[skillName]; const characteristic = data.data.characteristics[skill.characteristic]; const dicePool = new DicePoolFFG({ - ability: Math.max(characteristic.value, skill.value), + ability: Math.max(characteristic.value, skill.rank), }); - dicePool.upgrade(Math.min(characteristic.value, skill.value)); + dicePool.upgrade(Math.min(characteristic.value, skill.rank)); const rollButton = elem.querySelector(".roll-button"); dicePool.renderPreview(rollButton) diff --git a/modules/sheets/armour-sheet-ffg.js b/modules/sheets/armour-sheet-ffg.js new file mode 100644 index 00000000..74068787 --- /dev/null +++ b/modules/sheets/armour-sheet-ffg.js @@ -0,0 +1,112 @@ +/** + * Extend the basic ItemSheet with some very simple modifications + * @extends {ItemSheet} + */ +export class ArmourSheetFFG extends ItemSheet { + + /** @override */ + static get defaultOptions() { + return mergeObject(super.defaultOptions, { + classes: ["worldbuilding", "sheet", "armour"], + template: "systems/starwarsffg/templates/ffg-armour-sheet.html", + width: 550, + height: 480, + tabs: [{navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "description"}] + }); + } + + /* -------------------------------------------- */ + + /** @override */ + getData() { + const data = super.getData(); + data.dtypes = ["String", "Number", "Boolean"]; + for ( let attr of Object.values(data.data.attributes) ) { + attr.isCheckbox = attr.dtype === "Boolean"; + } + return data; + } + + /* -------------------------------------------- */ + + /** @override */ + activateListeners(html) { + super.activateListeners(html); + + // Activate tabs + let tabs = html.find('.tabs'); + let initial = this._sheetTab; + new TabsV2(tabs, { + initial: initial, + callback: clicked => this._sheetTab = clicked.data("tab") + }); + + // Everything below here is only needed if the sheet is editable + if (!this.options.editable) return; + + // Add or Remove Attribute + html.find(".attributes").on("click", ".attribute-control", this._onClickAttributeControl.bind(this)); + } + + /* -------------------------------------------- */ + + /** + * Listen for click events on an attribute control to modify the composition of attributes in the sheet + * @param {MouseEvent} event The originating left click event + * @private + */ + async _onClickAttributeControl(event) { + event.preventDefault(); + const a = event.currentTarget; + const action = a.dataset.action; + const attrs = this.object.data.data.attributes; + const form = this.form; + + // Add new attribute + if ( action === "create" ) { + const nk = Object.keys(attrs).length + 1; + let newKey = document.createElement("div"); + newKey.innerHTML = ``; + newKey = newKey.children[0]; + form.appendChild(newKey); + await this._onSubmit(event); + } + + // Remove existing attribute + else if ( action === "delete" ) { + const li = a.closest(".attribute"); + li.parentElement.removeChild(li); + await this._onSubmit(event); + } + } + + /* -------------------------------------------- */ + + /** @override */ + _updateObject(event, formData) { + + // Handle the free-form attributes list + const formAttrs = expandObject(formData).data.attributes || {}; + const attributes = Object.values(formAttrs).reduce((obj, v) => { + let k = v["key"].trim(); + if ( /[\s\.]/.test(k) ) return ui.notifications.error("Attribute keys may not contain spaces or periods"); + delete v["key"]; + obj[k] = v; + return obj; + }, {}); + + // Remove attributes which are no longer used + for ( let k of Object.keys(this.object.data.data.attributes) ) { + if ( !attributes.hasOwnProperty(k) ) attributes[`-=${k}`] = null; + } + + // Re-combine formData + formData = Object.entries(formData).filter(e => !e[0].startsWith("data.attributes")).reduce((obj, e) => { + obj[e[0]] = e[1]; + return obj; + }, {_id: this.object._id, "data.attributes": attributes}); + + // Update the Item + return this.object.update(formData); + } +} diff --git a/modules/item-sheet.js b/modules/sheets/gear-sheet-ffg.js similarity index 94% rename from modules/item-sheet.js rename to modules/sheets/gear-sheet-ffg.js index eb3918b4..53d671a2 100644 --- a/modules/item-sheet.js +++ b/modules/sheets/gear-sheet-ffg.js @@ -2,14 +2,14 @@ * Extend the basic ItemSheet with some very simple modifications * @extends {ItemSheet} */ -export class SimpleItemSheet extends ItemSheet { +export class GearSheetFFG extends ItemSheet { /** @override */ static get defaultOptions() { return mergeObject(super.defaultOptions, { - classes: ["worldbuilding", "sheet", "item"], - template: "systems/worldbuilding/templates/item-sheet.html", - width: 520, + classes: ["worldbuilding", "sheet", "gear"], + template: "systems/starwarsffg/templates/ffg-gear-sheet.html", + width: 580, height: 480, tabs: [{navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "description"}] }); @@ -36,7 +36,7 @@ export class SimpleItemSheet extends ItemSheet { // Activate tabs let tabs = html.find('.tabs'); let initial = this._sheetTab; - new Tabs(tabs, { + new TabsV2(tabs, { initial: initial, callback: clicked => this._sheetTab = clicked.data("tab") }); @@ -94,7 +94,7 @@ export class SimpleItemSheet extends ItemSheet { obj[k] = v; return obj; }, {}); - + // Remove attributes which are no longer used for ( let k of Object.keys(this.object.data.data.attributes) ) { if ( !attributes.hasOwnProperty(k) ) attributes[`-=${k}`] = null; diff --git a/modules/sheets/minion-sheet-ffg.js b/modules/sheets/minion-sheet-ffg.js new file mode 100644 index 00000000..8011f74a --- /dev/null +++ b/modules/sheets/minion-sheet-ffg.js @@ -0,0 +1,215 @@ +/** + * Extend the basic ActorSheet with some very simple modifications + * @extends {ActorSheet} + */ +export class MinionSheetFFG extends ActorSheet { + pools = new Map(); + + /** @override */ + static get defaultOptions() { + return mergeObject(super.defaultOptions, { + classes: ["worldbuilding", "sheet", "minion"], + template: "systems/starwarsffg/templates/ffg-minion-sheet.html", + width: 700, + height: 620, + tabs: [{navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "characteristics"}] + }); + } + + /* -------------------------------------------- */ + + /** @override */ + getData() { + const data = super.getData(); + data.dtypes = ["String", "Number", "Boolean"]; + for ( let attr of Object.values(data.data.attributes) ) { + attr.isCheckbox = attr.dtype === "Boolean"; + } + return data; + } + + /* -------------------------------------------- */ + + /** @override */ + activateListeners(html) { + super.activateListeners(html); + + // Activate tabs + let tabs = html.find('.tabs'); + let initial = this._sheetTab; + new TabsV2(tabs, { + initial: initial, + callback: clicked => this._sheetTab = clicked.data("tab") + }); + + // Everything below here is only needed if the sheet is editable + if (!this.options.editable) return; + + // Update Inventory Item + html.find('.item-edit').click(ev => { + const li = $(ev.currentTarget).parents(".item"); + const item = this.actor.getOwnedItem(li.data("itemId")); + item.sheet.render(true); + }); + + // Delete Inventory Item + html.find('.item-delete').click(ev => { + const li = $(ev.currentTarget).parents(".item"); + this.actor.deleteOwnedItem(li.data("itemId")); + li.slideUp(200, () => this.render(false)); + }); + + // Setup dice pool image + html.find(".skill").each((_, elem) => { + this._addSkillDicePool(elem) + }); + + // Roll Skill + html.find(".roll-button").children().on("click", async (event) => { + let upgradeType = null; + if (event.ctrlKey && !event.shiftKey) { + upgradeType = "ability" + } else if (!event.ctrlKey && event.shiftKey) { + upgradeType = "difficulty"; + } + await this._rollSkill(event, upgradeType); + }); + + // Add or Remove Attribute + html.find(".attributes").on("click", ".attribute-control", this._onClickAttributeControl.bind(this)); + } + + /* -------------------------------------------- */ + + /** + * Listen for click events on an attribute control to modify the composition of attributes in the sheet + * @param {MouseEvent} event The originating left click event + * @private + */ + async _onClickAttributeControl(event) { + event.preventDefault(); + const a = event.currentTarget; + const action = a.dataset.action; + const attrs = this.object.data.data.attributes; + const form = this.form; + + // Add new attribute + if ( action === "create" ) { + const nk = Object.keys(attrs).length + 1; + let newKey = document.createElement("div"); + newKey.innerHTML = ``; + newKey = newKey.children[0]; + form.appendChild(newKey); + await this._onSubmit(event); + } + + // Remove existing attribute + else if ( action === "delete" ) { + const li = a.closest(".attribute"); + li.parentElement.removeChild(li); + await this._onSubmit(event); + } + } + + /* -------------------------------------------- */ + + /** @override */ + _updateObject(event, formData) { + + // Handle the free-form attributes list + const formAttrs = expandObject(formData).data.attributes || {}; + const attributes = Object.values(formAttrs).reduce((obj, v) => { + let k = v["key"].trim(); + if ( /[\s\.]/.test(k) ) return ui.notifications.error("Attribute keys may not contain spaces or periods"); + delete v["key"]; + obj[k] = v; + return obj; + }, {}); + + // Remove attributes which are no longer used + for ( let k of Object.keys(this.object.data.data.attributes) ) { + if ( !attributes.hasOwnProperty(k) ) attributes[`-=${k}`] = null; + } + + // Re-combine formData + formData = Object.entries(formData).filter(e => !e[0].startsWith("data.attributes")).reduce((obj, e) => { + obj[e[0]] = e[1]; + return obj; + }, {_id: this.object._id, "data.attributes": attributes}); + + // Update the Actor + return this.object.update(formData); + } + + async _rollSkill(event, upgradeType) { + const data = this.getData(); + const row = event.target.parentElement.parentElement; + const skillName = row.parentElement.dataset["ability"]; + const skill = data.data.skills[skillName]; + const characteristic = data.data.characteristics[skill.characteristic]; + + const dicePool = new DicePoolFFG({ + ability: characteristic.value, + difficulty: 2 // Default to average difficulty + }); + dicePool.upgrade(skill.value); + + if (upgradeType === "ability") { + dicePool.upgrade(); + } else if (upgradeType === "difficulty") { + dicePool.upgradeDifficulty() + } + + await this._completeRoll(dicePool, `Rolling ${skillName}`, skillName); + } + + async _completeRoll(dicePool, description, skillName) { + const id = randomID(); + + const content = await renderTemplate("systems/starwarsffg/templates/roll-options.html", { + dicePool, + id, + }); + + new Dialog({ + title: description || "Finalize your roll", + content, + buttons: { + one: { + icon: '', + label: "Roll", + callback: () => { + const container = document.getElementById(id); + const finalPool = DicePoolFFG.fromContainer(container); + + ChatMessage.create({ + user: game.user._id, + speaker: this.getData(), + flavor: `Rolling ${skillName}...`, + content: `/sw ${finalPool.renderDiceExpression()}` + }); + } + }, + two: { + icon: '', + label: "Cancel", + } + }, + }).render(true) + } + + _addSkillDicePool(elem) { + const data = this.getData(); + const skillName = elem.dataset["ability"]; + const skill = data.data.skills[skillName]; + const characteristic = data.data.characteristics[skill.characteristic]; + + const dicePool = new DicePoolFFG({ + ability: Math.max(characteristic.value, skill.rank), + }); + dicePool.upgrade(Math.min(characteristic.value, skill.rank)); + + const rollButton = elem.querySelector(".roll-button"); + dicePool.renderPreview(rollButton); + } +} diff --git a/modules/sheets/talent-sheet-ffg.js b/modules/sheets/talent-sheet-ffg.js new file mode 100644 index 00000000..6da64e45 --- /dev/null +++ b/modules/sheets/talent-sheet-ffg.js @@ -0,0 +1,113 @@ +/** + * Extend the basic ItemSheet with some very simple modifications + * @extends {ItemSheet} + */ +export class TalentSheetFFG extends ItemSheet { + + /** @override */ + static get defaultOptions() { + return mergeObject(super.defaultOptions, { + classes: ["worldbuilding", "sheet", "talent"], + template: "systems/starwarsffg/templates/ffg-talent-sheet.html", + width: 580, + height: 480, + tabs: [{navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "description"}] + }); + } + + /* -------------------------------------------- */ + + /** @override */ + getData() { + const data = super.getData(); + data.dtypes = ["String", "Number", "Boolean"]; + for ( let attr of Object.values(data.data.attributes) ) { + attr.isCheckbox = attr.dtype === "Boolean"; + } + return data; + } + + /* -------------------------------------------- */ + + /** @override */ + activateListeners(html) { + super.activateListeners(html); + + // Activate tabs + let tabs = html.find('.tabs'); + let initial = this._sheetTab; + new TabsV2(tabs, { + initial: initial, + callback: clicked => this._sheetTab = clicked.data("tab") + }); + + // Everything below here is only needed if the sheet is editable + if (!this.options.editable) return; + + // Add or Remove Attribute + html.find(".attributes").on("click", ".attribute-control", this._onClickAttributeControl.bind(this)); + } + + /* -------------------------------------------- */ + + /** + * Listen for click events on an attribute control to modify the composition of attributes in the sheet + * @param {MouseEvent} event The originating left click event + * @private + */ + async _onClickAttributeControl(event) { + event.preventDefault(); + const a = event.currentTarget; + const action = a.dataset.action; + const attrs = this.object.data.data.attributes; + const form = this.form; + + // Add new attribute + if ( action === "create" ) { + const nk = Object.keys(attrs).length + 1; + let newKey = document.createElement("div"); + newKey.innerHTML = ``; + newKey = newKey.children[0]; + form.appendChild(newKey); + await this._onSubmit(event); + } + + // Remove existing attribute + else if ( action === "delete" ) { + const li = a.closest(".attribute"); + li.parentElement.removeChild(li); + await this._onSubmit(event); + } + } + + + /* -------------------------------------------- */ + + /** @override */ + _updateObject(event, formData) { + + // Handle the free-form attributes list + const formAttrs = expandObject(formData).data.attributes || {}; + const attributes = Object.values(formAttrs).reduce((obj, v) => { + let k = v["key"].trim(); + if ( /[\s\.]/.test(k) ) return ui.notifications.error("Attribute keys may not contain spaces or periods"); + delete v["key"]; + obj[k] = v; + return obj; + }, {}); + + // Remove attributes which are no longer used + for ( let k of Object.keys(this.object.data.data.attributes) ) { + if ( !attributes.hasOwnProperty(k) ) attributes[`-=${k}`] = null; + } + + // Re-combine formData + formData = Object.entries(formData).filter(e => !e[0].startsWith("data.attributes")).reduce((obj, e) => { + obj[e[0]] = e[1]; + return obj; + }, {_id: this.object._id, "data.attributes": attributes}); + + // Update the Item + return this.object.update(formData); + } +} diff --git a/modules/sheets/weapon-sheet-ffg.js b/modules/sheets/weapon-sheet-ffg.js new file mode 100644 index 00000000..3b6f654f --- /dev/null +++ b/modules/sheets/weapon-sheet-ffg.js @@ -0,0 +1,112 @@ +/** + * Extend the basic ItemSheet with some very simple modifications + * @extends {ItemSheet} + */ +export class WeaponSheetFFG extends ItemSheet { + + /** @override */ + static get defaultOptions() { + return mergeObject(super.defaultOptions, { + classes: ["worldbuilding", "sheet", "weapon"], + template: "systems/starwarsffg/templates/ffg-weapon-sheet.html", + width: 590, + height: 500, + tabs: [{navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "description"}] + }); + } + + /* -------------------------------------------- */ + + /** @override */ + getData() { + const data = super.getData(); + data.dtypes = ["String", "Number", "Boolean"]; + for ( let attr of Object.values(data.data.attributes) ) { + attr.isCheckbox = attr.dtype === "Boolean"; + } + return data; + } + + /* -------------------------------------------- */ + + /** @override */ + activateListeners(html) { + super.activateListeners(html); + + // Activate tabs + let tabs = html.find('.tabs'); + let initial = this._sheetTab; + new TabsV2(tabs, { + initial: initial, + callback: clicked => this._sheetTab = clicked.data("tab") + }); + + // Everything below here is only needed if the sheet is editable + if (!this.options.editable) return; + + // Add or Remove Attribute + html.find(".attributes").on("click", ".attribute-control", this._onClickAttributeControl.bind(this)); + } + + /* -------------------------------------------- */ + + /** + * Listen for click events on an attribute control to modify the composition of attributes in the sheet + * @param {MouseEvent} event The originating left click event + * @private + */ + async _onClickAttributeControl(event) { + event.preventDefault(); + const a = event.currentTarget; + const action = a.dataset.action; + const attrs = this.object.data.data.attributes; + const form = this.form; + + // Add new attribute + if ( action === "create" ) { + const nk = Object.keys(attrs).length + 1; + let newKey = document.createElement("div"); + newKey.innerHTML = ``; + newKey = newKey.children[0]; + form.appendChild(newKey); + await this._onSubmit(event); + } + + // Remove existing attribute + else if ( action === "delete" ) { + const li = a.closest(".attribute"); + li.parentElement.removeChild(li); + await this._onSubmit(event); + } + } + + /* -------------------------------------------- */ + + /** @override */ + _updateObject(event, formData) { + + // Handle the free-form attributes list + const formAttrs = expandObject(formData).data.attributes || {}; + const attributes = Object.values(formAttrs).reduce((obj, v) => { + let k = v["key"].trim(); + if ( /[\s\.]/.test(k) ) return ui.notifications.error("Attribute keys may not contain spaces or periods"); + delete v["key"]; + obj[k] = v; + return obj; + }, {}); + + // Remove attributes which are no longer used + for ( let k of Object.keys(this.object.data.data.attributes) ) { + if ( !attributes.hasOwnProperty(k) ) attributes[`-=${k}`] = null; + } + + // Re-combine formData + formData = Object.entries(formData).filter(e => !e[0].startsWith("data.attributes")).reduce((obj, e) => { + obj[e[0]] = e[1]; + return obj; + }, {_id: this.object._id, "data.attributes": attributes}); + + // Update the Item + return this.object.update(formData); + } +} diff --git a/modules/swffg-config.js b/modules/swffg-config.js index 5d30dfba..d853c0e1 100644 --- a/modules/swffg-config.js +++ b/modules/swffg-config.js @@ -5,9 +5,14 @@ */ // Import Modules -import { SimpleItemSheet } from "./item-sheet.js"; -import { ActorSheetFFG } from "./actor-sheet-ffg.js"; -import { DicePoolFFG } from "./dice-pool-ffg.js" +import { ActorFFG } from "./actors/actor-ffg.js"; +import { GearSheetFFG } from "./sheets/gear-sheet-ffg.js"; +import { WeaponSheetFFG } from "./sheets/weapon-sheet-ffg.js"; +import { ArmourSheetFFG } from "./sheets/armour-sheet-ffg.js"; +import { TalentSheetFFG } from "./sheets/talent-sheet-ffg.js"; +import { ActorSheetFFG } from "./sheets/actor-sheet-ffg.js"; +import { MinionSheetFFG } from "./sheets/minion-sheet-ffg.js"; +import { DicePoolFFG } from "./dice-pool-ffg.js"; /* -------------------------------------------- */ /* Foundry VTT Initialization */ @@ -16,6 +21,17 @@ import { DicePoolFFG } from "./dice-pool-ffg.js" Hooks.once("init", async function() { console.log(`Initializing SWFFG System`); + // Place our classes in their own namespace for later reference. + game.ffg = { + ActorFFG + }; + + + // Define custom Entity classes. This will override the default Actor + // to instead use our extended version. + CONFIG.Actor.entityClass = ActorFFG; + + /** * Set an initiative formula for the system * @type {String} @@ -27,13 +43,62 @@ Hooks.once("init", async function() { // Register sheet application classes Actors.unregisterSheet("core", ActorSheet); - Actors.registerSheet("ffg", ActorSheetFFG, { makeDefault: true }); + Actors.registerSheet("ffg", ActorSheetFFG, { + types: ["character"], + makeDefault: true + }); + Actors.registerSheet("ffg", MinionSheetFFG, { + types: ["minion"], + makeDefault: true + }); Items.unregisterSheet("core", ItemSheet); - Items.registerSheet("ffg", SimpleItemSheet, {makeDefault: true}); + Items.registerSheet("ffg", GearSheetFFG, { + types: ["gear"], + makeDefault: true + }); + Items.registerSheet("ffg", WeaponSheetFFG, { + types: ["weapon"], + makeDefault: true + }); + Items.registerSheet("ffg", ArmourSheetFFG, { + types: ["armour"], + makeDefault: true + }); + Items.registerSheet("ffg", TalentSheetFFG, { + types: ["talent"], + makeDefault: true + }); // Add utilities to the global scope, this can be useful for macro makers window.DicePoolFFG = DicePoolFFG; // Register Handlebars utilities Handlebars.registerHelper("json", JSON.stringify); + + // Allows {if X = Y} type syntax in html using handlebars + Handlebars.registerHelper('iff', function (a, operator, b, opts) { + var bool = false; + switch (operator) { + case '==': + bool = a == b; + break; + case '>': + bool = a > b; + break; + case '<': + bool = a < b; + break; + case '!=': + bool = a != b; + break; + default: + throw "Unknown operator " + operator; + } + + if (bool) { + return opts.fn(this); + } else { + return opts.inverse(this); + } + }); }); diff --git a/styles/swffg.css b/styles/swffg.css index d9b99f59..1a6e2608 100644 --- a/styles/swffg.css +++ b/styles/swffg.css @@ -8,6 +8,14 @@ div .container { margin-bottom: 10px; } +div .container.attributes { + margin-top: 5px +} + +div .container.talents { + margin-top: 5px +} + .worldbuilding.sheet .window-content { padding: 5px; overflow-y: hidden; @@ -40,6 +48,12 @@ div .container { padding: 5px; } +.worldbuilding.sheet .charname.minion { + border-bottom: 0; + display: inline; + padding: 5px; +} + .worldbuilding.sheet .charname input { width: auto; margin: 5px 5px 10px 5px; @@ -53,8 +67,27 @@ div .container { } .worldbuilding.sheet .resource input { - width: 100px; - height: 28px; + width: 82px; + height: 22px; +} + +.worldbuilding.sheet .xp-box { + position: absolute; + padding: 0; + right: 10px; + height: 40px; + margin: 0; + display: inline-table; +} + +.worldbuilding.sheet .xp-box input { + width: 68px; + height: 22px; +} + +.worldbuilding.sheet .resource.small input { + width: 40px; + height: 22px; } /* Navigation Tabs */ @@ -76,9 +109,20 @@ div .container { /* Content Tabs */ .worldbuilding.sheet .sheet-body { + height: calc(100% - 22.7em); + overflow: auto; +} + +.worldbuilding.sheet .sheet-body.minion { + height: calc(100% - 11.5em); + overflow: auto; +} + +.worldbuilding.sheet .sheet-body.small { height: calc(100% - 14em); overflow: auto; } + .worldbuilding.sheet .sheet-body .tab { height: 100%; } @@ -87,6 +131,18 @@ div .container { height: 100%; } +/* Topper */ +.worldbuilding.sheet .sheet-topper { + background: #435a76; + overflow: auto; + text-align:center; + border-radius: 15px; +} +.worldbuilding.sheet .sheet-topper * > input { + background: #f2f2f2; + border-radius: 0 0 15px 15px; +} + /* This seems to be necessary to make scrolling inside the actor sheet work. There is likely a better way to do this. @@ -150,6 +206,8 @@ sheet work. There is likely a better way to do this. border: none; border-radius: 0; border-bottom: 1px solid #AAA; + text-align: center; + overflow: auto; } .worldbuilding.sheet .attribute-value.checkbox { @@ -160,6 +218,39 @@ sheet work. There is likely a better way to do this. border: none; } +/* Talents */ +.worldbuilding.sheet .talents-header { + padding: 5px; + margin: 5px 0; + background: rgba(0, 0, 0, 0.05); + border: 1px solid #AAA; + border-radius: 2px; + text-align: center; + font-weight: bold; +} +.worldbuilding.sheet .talents-label { + flex: 1.5; +} + +.worldbuilding.sheet .talents-list { + list-style: none; + margin: 0; + padding: 0; +} + +.worldbuilding.sheet .talents-list li > * { + margin: 0 3px; + height: 28px; + line-height: 24px; + background: transparent; + border: none; + border-radius: 0; + border-bottom: 1px solid #AAA; + text-align: center; + overflow: auto; +} + + .worldbuilding.sheet .characteristics-list { list-style: none; } diff --git a/system.json b/system.json index f9f2481f..177bda5f 100644 --- a/system.json +++ b/system.json @@ -17,6 +17,6 @@ "secondaryTokenAttribute": "strain", "url": "https://github.com/Esrin/StarWarsFFG/tree/esrin-dev", "manifest": "https://raw.githubusercontent.com/Esrin/StarWarsFFG/esrin-dev/system.json", - "download": "https://github.com/Esrin/StarWarsFFG/releases/download/esrin-dev_0.01/esrin-dev_0.01.zip", + "download": "https://github.com/Esrin/StarWarsFFG/releases/download/esrin-dev_0.02/esrin-dev_0.02.zip", "license": "LICENSE.txt" } diff --git a/template.json b/template.json index 8b047ba2..7c9e062a 100644 --- a/template.json +++ b/template.json @@ -1,14 +1,11 @@ { "Actor": { "types": [ - "character" + "character", "minion" ], "templates": { "biography": { - "biography": { - "value": "", - "type": "String" - } + "biography": "" }, "species": { "species": { @@ -95,184 +92,341 @@ "skills": { "Brawl": { "rank": 0, - "characteristic": "Brawn" + "characteristic": "Brawn", + "groupskill": false }, "Gunnery": { "rank": 0, - "characteristic": "Agility" + "characteristic": "Agility", + "groupskill": false }, "Lightsaber": { "rank": 0, - "characteristic": "Brawn" + "characteristic": "Brawn", + "groupskill": false }, "Melee": { "rank": 0, - "characteristic": "Brawn" + "characteristic": "Brawn", + "groupskill": false }, "Ranged: Light": { "rank": 0, - "characteristic": "Agility" + "characteristic": "Agility", + "groupskill": false }, "Ranged: Heavy": { "rank": 0, - "characteristic": "Agility" + "characteristic": "Agility", + "groupskill": false }, "Astrogation": { "rank": 0, - "characteristic": "Intellect" + "characteristic": "Intellect", + "groupskill": false }, "Athletics ": { "rank": 0, - "characteristic": "Brawn" + "characteristic": "Brawn", + "groupskill": false }, "Charm": { "rank": 0, - "characteristic": "Presence" + "characteristic": "Presence", + "groupskill": false }, "Coercion": { "rank": 0, - "characteristic": "Willpower" + "characteristic": "Willpower", + "groupskill": false }, "Computers": { "rank": 0, - "characteristic": "Intellect" + "characteristic": "Intellect", + "groupskill": false }, "Cool": { "rank": 0, - "characteristic": "Presence" + "characteristic": "Presence", + "groupskill": false }, "Coordination": { "rank": 0, - "characteristic": "Agility" + "characteristic": "Agility", + "groupskill": false }, "Deception": { "rank": 0, - "characteristic": "Cunning" + "characteristic": "Cunning", + "groupskill": false }, "Discipline": { "rank": 0, - "characteristic": "Willpower" + "characteristic": "Willpower", + "groupskill": false }, "Leadership": { "rank": 0, - "characteristic": "Presence" + "characteristic": "Presence", + "groupskill": false }, "Mechanics": { "rank": 0, - "characteristic": "Intellect" + "characteristic": "Intellect", + "groupskill": false }, "Medicine": { "rank": 0, - "characteristic": "Intellect" + "characteristic": "Intellect", + "groupskill": false }, "Negotiation": { "rank": 0, - "characteristic": "Presence" + "characteristic": "Presence", + "groupskill": false }, "Perception": { "rank": 0, - "characteristic": "Cunning" + "characteristic": "Cunning", + "groupskill": false }, "Piloting: Planetary": { "rank": 0, - "characteristic": "Agility" + "characteristic": "Agility", + "groupskill": false }, "Piloting: Space": { "rank": 0, - "characteristic": "Agility" + "characteristic": "Agility", + "groupskill": false }, "Resilience": { "rank": 0, - "characteristic": "Brawn" + "characteristic": "Brawn", + "groupskill": false }, "Skulduggery": { "rank": 0, - "characteristic": "Cunning" + "characteristic": "Cunning", + "groupskill": false }, "Stealth": { "rank": 0, - "characteristic": "Agility" + "characteristic": "Agility", + "groupskill": false }, "Streetwise": { "rank": 0, - "characteristic": "Cunning" + "characteristic": "Cunning", + "groupskill": false }, "Survival": { "rank": 0, - "characteristic": "Cunning" + "characteristic": "Cunning", + "groupskill": false }, "Vigilance": { "rank": 0, - "characteristic": "Willpower" + "characteristic": "Willpower", + "groupskill": false }, "Knowledge: Core Worlds": { "rank": 0, - "characteristic": "Intellect" + "characteristic": "Intellect", + "groupskill": false }, "Knowledge: Education": { "rank": 0, - "characteristic": "Intellect" + "characteristic": "Intellect", + "groupskill": false }, "Knowledge: Lore": { "rank": 0, - "characteristic": "Intellect" + "characteristic": "Intellect", + "groupskill": false }, "Knowledge: Outer Rim": { "rank": 0, - "characteristic": "Intellect" + "characteristic": "Intellect", + "groupskill": false }, "Knowledge: Underworld": { "rank": 0, - "characteristic": "Intellect" + "characteristic": "Intellect", + "groupskill": false }, "Knowledge: Warfare": { "rank": 0, - "characteristic": "Intellect" + "characteristic": "Intellect", + "groupskill": false }, "Knowledge: Xenology": { "rank": 0, - "characteristic": "Intellect" + "characteristic": "Intellect", + "groupskill": false } } + }, + "attributes": { + "attributes": {} } }, "character": { - "templates": ["biography", "species", "career", "specialisation", "stats", "characteristics", "skills"], - "attributes": {} + "templates": ["biography", "species", "career", "specialisation", "stats", "characteristics", "skills", "attributes"], + "encumbrance": { + "value": 0, + "type": "Number", + "label": "Encumbrance", + "abrev": "Encum" + }, + "obligation": { + "value": 0, + "type": "Number", + "label": "Obligation" + }, + "duty": { + "value": 0, + "type": "Number", + "label": "Duty" + }, + "morality": { + "value": 0, + "type": "Number", + "label": "Morality" + }, + "conflict": { + "value": 0, + "type": "Number", + "label": "Conflict" + }, + "experience": { + "total": 0, + "available": 0 + } + }, + "minion": { + "templates": ["biography", "stats", "characteristics", "skills", "attributes"], + "quantity": { + "value": 1, + "type": "Number", + "label": "Quantity", + "abrev": "Qty" + }, + "unit_wounds": { + "value": 0, + "type": "Number", + "label": "Unit Wounds" + } } }, "Item": { "types": [ - "item" + "gear", "weapon", "armour", "talent" ], "templates": { - "description": { - "description": { - "value": "", - "type": "String" - } - }, - "quantity": { + "basic": { + "description": "", "quantity": { "value": 0, - "type": "Number" - } + "type": "Number", + "label": "Quantity", + "abrev": "Qty" + }, + "encumbrance": { + "value": 0, + "type": "Number", + "label": "Encumbrance", + "abrev": "Encum" + }, + "price": { + "value": 0, + "type": "Number", + "label": "Price" + }, + "rarity": { + "value": 0, + "type": "Number", + "label": "Rarity" + }, + "attributes": {} }, - "weight": { - "weight": { + "hardpoints": { + "hardpoints": { "value": 0, - "type": "Number" + "type": "Number", + "label": "Hard Points", + "abrev": "HP" } }, - "cost": { - "cost": { - "value": 0, - "type": "Number" + "equippable": { + "equippable": { + "value": true, + "type": "Boolean", + "equipped": false } } }, - "item": { - "templates": ["description", "quantity", "weight", "cost"], + "gear": { + "templates": ["basic"] + }, + "weapon": { + "templates": ["basic", "hardpoints", "equippable"], + "skill": { + "value": "", + "type": "String", + "label": "Skill" + }, + "damage": { + "value": 0, + "type": "Number", + "label": "Damage", + "abrev": "Dam" + }, + "crit": { + "value": 0, + "type": "Number", + "label": "Critical Rating", + "abrev": "Crit" + }, + "range": { + "value": "", + "type": "String", + "label": "Range" + }, + "special": { + "value": "", + "type": "String", + "label": "Special" + } + }, + "armour": { + "templates": ["basic", "hardpoints", "equippable"], + "defence": { + "value": 0, + "type": "Number", + "label": "Defence", + "abrev": "Def" + }, + "soak": { + "value": 0, + "type": "Number", + "label": "Soak" + } + }, + "talent": { + "templates": [], + "description": "", + "activation": { + "value": "", + "type": "String", + "label": "Activation" + }, + "ranks": { + "ranked": false, + "current": 0, + "max": 0 + }, + "trees": [], "attributes": {} } } diff --git a/templates/ffg-actor-sheet.html b/templates/ffg-actor-sheet.html index cbf35412..cf192fd3 100644 --- a/templates/ffg-actor-sheet.html +++ b/templates/ffg-actor-sheet.html @@ -2,19 +2,37 @@ {{!-- Sheet Header --}}
+ {{!-- XP Box --}} +
+
+

XP

+
+
+ + +
+
+
+ + +
+
+
+
- {{!-- Character Name and Player --}}
+
- {{!-- Wounds and Strain Container --}}
{{!-- Wounds Box --}} @@ -56,6 +74,19 @@

Strain

+ {{!-- Encumbrance Box --}} +
+
+

Encum

+
+
+ + +
+
+
+
{{!-- Soak, Defence and Force container --}} @@ -116,12 +147,14 @@

Force Pool

+ {{!-- Sheet Tab Navigation --}} {{!-- Sheet Body --}} @@ -171,31 +204,204 @@

Force Pool

- {{!-- Biography Tab --}} -
- {{editor content=data.biography target="data.biography" button=true owner=owner editable=editable}} -
- {{!-- Owned Items Tab --}}
-
    + + {{!-- Weapons List --}} +
    +

    +
    + Name + Skill + Damage + Range + Crit + Special + Encum + Edit +
    +
      {{#each actor.items as |item id|}} -
    1. - -

      {{item.name}}

      -
      - - -
      -
    2. + {{#iff item.type '==' 'weapon'}} +
    3. +

      {{item.name}}

      + + + + + + +
      + + +
      +
    4. + {{/iff}} + {{/each}} +
    +
    + + {{!-- Armour List --}} +
    +

    +
    + Name + Defence + Soak + HP + Encum + Edit +
    +
      + {{#each actor.items as |item id|}} + {{#iff item.type '==' 'armour'}} +
    1. +

      {{item.name}}

      + + + + +
      + + +
      +
    2. + {{/iff}} {{/each}}
    +
    + + {{!-- Gear List --}} +
    +

    +
    + Name + Price + Rarity + Quantity + Encum + Edit +
    +
      + {{#each actor.items as |item id|}} + {{#iff item.type '==' 'gear'}} +
    1. +

      {{item.name}}

      + + + + +
      + + +
      +
    2. + {{/iff}} + {{/each}} +
    +
    +
- {{!-- Attributes Tab --}} + {{!-- Talents Tab --}} +
+ + {{!-- Talents List --}} +
+

+
+ Name + Activation + Rank + Edit +
+
    + {{#each actor.items as |item id|}} + {{#iff item.type '==' 'talent'}} +
  1. +

    {{item.name}}

    + + {{#if item.data.ranks.ranked}} + + {{else}} + + {{/if}} +
    + + +
    +
  2. + {{/iff}} + {{/each}} +
+
+
+ + + {{!-- Biography Tab --}} +
+ {{editor content=data.biography target="data.biography" button=true owner=owner editable=editable}} + {{!-- Obligations Section --}} +
+ + {{!-- Obligation Box --}} +
+
+

Obligation

+
+
+ +
+
+
+
+ + {{!-- Duty Box --}} +
+
+

Duty

+
+
+ +
+
+
+
+ + {{!-- Morality Box --}} +
+
+

Morality

+
+
+ +
+
+
+
+ + {{!-- Conflict Box --}} +
+
+

Conflict

+
+
+ +
+
+
+
+
+
+ + diff --git a/templates/ffg-armour-sheet.html b/templates/ffg-armour-sheet.html new file mode 100644 index 00000000..6617d0b9 --- /dev/null +++ b/templates/ffg-armour-sheet.html @@ -0,0 +1,88 @@ +
+
+ +
+
+

+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+ + {{!-- Sheet Tab Navigation --}} + + + {{!-- Sheet Body --}} +
+ + {{!-- Description Tab --}} +
+ {{editor content=data.description target="data.description" button=true owner=owner editable=editable}} +
+ + {{!-- Modifiers Tab --}} +
+
+ Modifier + Value + + + +
+ +
    + {{#each data.attributes as |attr key|}} +
  1. + + {{#if attr.isCheckbox}} + + {{else}} + + {{/if}} + + + +
  2. + {{/each}} +
+
+
+
diff --git a/templates/ffg-gear-sheet.html b/templates/ffg-gear-sheet.html new file mode 100644 index 00000000..05139841 --- /dev/null +++ b/templates/ffg-gear-sheet.html @@ -0,0 +1,76 @@ +
+
+ +
+
+

+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+ + {{!-- Sheet Tab Navigation --}} + + + {{!-- Sheet Body --}} +
+ + {{!-- Description Tab --}} +
+ {{editor content=data.description target="data.description" button=true owner=owner editable=editable}} +
+ + {{!-- Modifiers Tab --}} +
+
+ Modifier + Value + + + +
+ +
    + {{#each data.attributes as |attr key|}} +
  1. + + {{#if attr.isCheckbox}} + + {{else}} + + {{/if}} + + + +
  2. + {{/each}} +
+
+
+
diff --git a/templates/ffg-minion-sheet.html b/templates/ffg-minion-sheet.html new file mode 100644 index 00000000..d3c3b678 --- /dev/null +++ b/templates/ffg-minion-sheet.html @@ -0,0 +1,290 @@ +
+ + {{!-- Sheet Header --}} +
+ + + +
+ {{!-- Character Name and Player --}} +
+
+ +
+ +
+ {{!-- Soak, Wounds and Defence container --}} +
+ {{!-- Soak Box --}} +
+
+

Soak

+
+
+ + +
+
+
+
+ + {{!-- Wounds Box --}} +
+
+

Wounds

+
+
+ + +
+
+
+ + +
+
+
+
+ + {{!-- Defence Box --}} +
+
+

Defence

+
+
+ + +
+
+
+ + +
+
+
+
+ + {{!-- Individual Wounds Box --}} +
+
+

Unit Wounds

+
+
+ + +
+
+
+
+ +
+
+ + + + + {{!-- Sheet Tab Navigation --}} + + + {{!-- Sheet Body --}} +
+ {{!-- Characteristics Tab --}} +
+ + {{!-- Characteristics Scores --}} + +
    + {{#each data.characteristics as |characteristic id|}} +
  • + {{!-- If we set the type to text, we don't have to deal with hiding the number controls --}} + + +
  • + {{/each}} +
+ + + + + + + + + + + + {{#each data.skills as |skill id|}} + + + + + + + {{/each}} + +
NameGroup Skill?RankRoll
{{id}} {{#with (lookup ../this.data.characteristics [characteristic])~}} + ({{abrev}}) + {{/with}} + + + + + +
+
+
+ + {{!-- Owned Items Tab --}} +
+ + {{!-- Weapons List --}} +
+

+
+ Name + Skill + Damage + Range + Crit + Special + Encum + Edit +
+
    + {{#each actor.items as |item id|}} + {{#iff item.type '==' 'weapon'}} +
  1. +

    {{item.name}}

    + + + + + + +
    + + +
    +
  2. + {{/iff}} + {{/each}} +
+
+ + {{!-- Armour List --}} +
+

+
+ Name + Defence + Soak + HP + Encum + Edit +
+
    + {{#each actor.items as |item id|}} + {{#iff item.type '==' 'armour'}} +
  1. +

    {{item.name}}

    + + + + +
    + + +
    +
  2. + {{/iff}} + {{/each}} +
+
+ + {{!-- Gear List --}} +
+

+
+ Name + Price + Rarity + Quantity + Encum + Edit +
+
    + {{#each actor.items as |item id|}} + {{#iff item.type '==' 'gear'}} +
  1. +

    {{item.name}}

    + + + + +
    + + +
    +
  2. + {{/iff}} + {{/each}} +
+
+
+ + {{!-- Biography Tab --}} +
+ {{editor content=data.biography target="data.biography" button=true owner=owner editable=editable}} +
+ + + +
+
diff --git a/templates/item-sheet.html b/templates/ffg-talent-sheet.html similarity index 58% rename from templates/item-sheet.html rename to templates/ffg-talent-sheet.html index c8acc8e5..c9436ba9 100644 --- a/templates/item-sheet.html +++ b/templates/ffg-talent-sheet.html @@ -1,40 +1,52 @@
-
+
+

+
+
- - + +
-
- - +
+ +
+
+ + {{#if data.ranks.ranked}} + + {{else}} + + {{/if}}
+
{{!-- Sheet Tab Navigation --}} {{!-- Sheet Body --}} -
+
{{!-- Description Tab --}}
{{editor content=data.description target="data.description" button=true owner=owner editable=editable}}
- {{!-- Attributes Tab --}} + {{!-- Modifiers Tab --}}
- Attribute Key + Modifier Value - Label - Data Type + +
@@ -47,14 +59,14 @@

{{/if}} - -

+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+ + {{!-- Sheet Tab Navigation --}} + + + {{!-- Sheet Body --}} +
+ + {{!-- Description Tab --}} +
+ {{editor content=data.description target="data.description" button=true owner=owner editable=editable}} +
+ + {{!-- Modifiers Tab --}} +
+
+ Modifier + Value + + + +
+ +
    + {{#each data.attributes as |attr key|}} +
  1. + + {{#if attr.isCheckbox}} + + {{else}} + + {{/if}} + + + +
  2. + {{/each}} +
+
+
+
From 8dc3da3bcc7a32f3fd9800501cbf46cf6ef07e01 Mon Sep 17 00:00:00 2001 From: Esrin Date: Sat, 9 May 2020 20:35:44 +0100 Subject: [PATCH 05/44] All basic data types now in so system should be playable. See changelog for full details. To do: * Build Group sheet for GM use * Improve item sheets with use of dropdowns for certain fields. * Automatic initiative rolls (Vigilance and Cool options) - On hold while I figure out why I can't seem to override the default Combat entity class. * Rework Specials and Critical Injuries to be item types, add view to item sheets and character sheets. * Character creator * CSS, CSS and more CSS... --- README.md | 10 +- modules/actors/actor-ffg.js | 47 +++ .../character-sheet-ffg.js} | 31 +- .../{sheets => actors}/minion-sheet-ffg.js | 4 +- modules/actors/vehicle-sheet-ffg.js | 240 ++++++++++++ modules/combat-ffg.js | 70 ++++ .../item-sheet-ffg.js} | 18 +- modules/sheets/armour-sheet-ffg.js | 112 ------ modules/sheets/gear-sheet-ffg.js | 112 ------ modules/sheets/weapon-sheet-ffg.js | 112 ------ modules/swffg-config.js | 80 ++-- packs/star-wars-ffg-rollable-tables.db | 1 + styles/swffg.css | 1 + system.json | 14 +- template.json | 121 +++++- templates/{ => actors}/ffg-actor-sheet.html | 19 +- templates/{ => actors}/ffg-minion-sheet.html | 0 templates/actors/ffg-vehicle-sheet.html | 362 ++++++++++++++++++ templates/{ => items}/ffg-armour-sheet.html | 0 templates/{ => items}/ffg-gear-sheet.html | 0 templates/items/ffg-shipattachment-sheet.html | 80 ++++ templates/items/ffg-shipweapon-sheet.html | 100 +++++ templates/{ => items}/ffg-talent-sheet.html | 2 +- templates/{ => items}/ffg-weapon-sheet.html | 0 24 files changed, 1149 insertions(+), 387 deletions(-) rename modules/{sheets/actor-sheet-ffg.js => actors/character-sheet-ffg.js} (88%) rename modules/{sheets => actors}/minion-sheet-ffg.js (98%) create mode 100644 modules/actors/vehicle-sheet-ffg.js create mode 100644 modules/combat-ffg.js rename modules/{sheets/talent-sheet-ffg.js => items/item-sheet-ffg.js} (87%) delete mode 100644 modules/sheets/armour-sheet-ffg.js delete mode 100644 modules/sheets/gear-sheet-ffg.js delete mode 100644 modules/sheets/weapon-sheet-ffg.js create mode 100644 packs/star-wars-ffg-rollable-tables.db rename templates/{ => actors}/ffg-actor-sheet.html (96%) rename templates/{ => actors}/ffg-minion-sheet.html (100%) create mode 100644 templates/actors/ffg-vehicle-sheet.html rename templates/{ => items}/ffg-armour-sheet.html (100%) rename templates/{ => items}/ffg-gear-sheet.html (100%) create mode 100644 templates/items/ffg-shipattachment-sheet.html create mode 100644 templates/items/ffg-shipweapon-sheet.html rename templates/{ => items}/ffg-talent-sheet.html (99%) rename templates/{ => items}/ffg-weapon-sheet.html (100%) diff --git a/README.md b/README.md index 48528d90..07706dae 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,15 @@ https://raw.githubusercontent.com/Esrin/StarWarsFFG/esrin-dev/system.json 5. Click Install, after a few seconds the system should be installed. # Changelog - +* 09/05/2020 - Esrin - Rollable table for Critical Injuries +* 09/05/2020 - Esrin - Cleaned up items to just use one JS class and get dynamic template by type. +* 09/05/2020 - Esrin - Built item sheet for ship weapons and ship attachments +* 09/05/2020 - Esrin - Built character sheet for vehicles +* 09/05/2020 - Esrin - Added data structure for ship weapons and ship attachments +* 09/05/2020 - Esrin - Added data structure for vehicles (using Jaxxa's work as a template) +* 09/05/2020 - Esrin - Added currency to characters +* 09/05/2020 - Esrin - Derived encumbrance from item values. +* 09/05/2020 - Esrin - Derived soak value from brawn, equipped armour, and modifiers on weapons, gear and talents as a test case for automation. * 08/05/2020 - Esrin - Extended Actor class to allow for calculated Minion stat values (wounds from unit wounds * quantity, and skills from group skills * quantity-1) * 08/05/2020 - Esrin - Added data structure for minions * 08/05/2020 - Esrin - Built character sheet for minions diff --git a/modules/actors/actor-ffg.js b/modules/actors/actor-ffg.js index b8967fba..088de930 100644 --- a/modules/actors/actor-ffg.js +++ b/modules/actors/actor-ffg.js @@ -17,6 +17,7 @@ export class ActorFFG extends Actor { // Make separate methods for each Actor type (character, minion, etc.) to keep // things organized. if (actorData.type === 'minion') this._prepareMinionData(actorData); + if (actorData.type === 'character') this._prepareCharacterData(actorData); } /** @@ -46,4 +47,50 @@ export class ActorFFG extends Actor { } } + /** + * Prepare Character type specific data + */ + _prepareCharacterData(actorData) { + const data = actorData.data; + const items = actorData.items; + var soak = 0; + var armoursoak = 0; + var othersoak = 0; + var encum = 0; + + // Calculate soak based on Brawn value, and any Soak modifiers in weapons, armour, gear and talents. + // Start with Brawn. Also calculate total encumbrance from items. + soak = data.characteristics.Brawn.value; + + // Loop through all items + for (let [key, item] of Object.entries(items)) { + // Calculate encumbrance. + if(item.type != "talent") { + encum += item.data.encumbrance.value; + } + // For armour type, get all Soak values and add to armoursoak. + if(item.type == "armour") { + armoursoak += item.data.soak.value; + } + else { + // For all other types loop through attributes and add any Soak modifiers to othersoak. + for(let [k, mod] of Object.entries(item.data.attributes)) { + if(k == "Soak") { + othersoak += mod.value; + } + } + } + } + + // Set Encumbrance value on character. + data.stats.encumbrance.value = encum; + + // Add together all of our soak results. + soak += armoursoak + othersoak; + // Finally set Soak value on character. + data.stats.soak.value = soak; + + + } + } diff --git a/modules/sheets/actor-sheet-ffg.js b/modules/actors/character-sheet-ffg.js similarity index 88% rename from modules/sheets/actor-sheet-ffg.js rename to modules/actors/character-sheet-ffg.js index 49753b77..cd0cbaa2 100644 --- a/modules/sheets/actor-sheet-ffg.js +++ b/modules/actors/character-sheet-ffg.js @@ -2,14 +2,14 @@ * Extend the basic ActorSheet with some very simple modifications * @extends {ActorSheet} */ -export class ActorSheetFFG extends ActorSheet { +export class CharacterSheetFFG extends ActorSheet { pools = new Map(); /** @override */ static get defaultOptions() { return mergeObject(super.defaultOptions, { classes: ["worldbuilding", "sheet", "actor"], - template: "systems/starwarsffg/templates/ffg-actor-sheet.html", + template: "systems/starwarsffg/templates/actors/ffg-actor-sheet.html", width: 600, height: 840, tabs: [{navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "characteristics"}] @@ -141,6 +141,22 @@ export class ActorSheetFFG extends ActorSheet { return this.object.update(formData); } + async _rollSkillManual(skill, ability, difficulty) { + const dicePool = new DicePoolFFG({ + ability: characteristic.value, + difficulty: difficulty + }); + dicePool.upgrade(skill.rank); + + if (upgradeType === "ability") { + dicePool.upgrade(); + } else if (upgradeType === "difficulty") { + dicePool.upgradeDifficulty() + } + + await this._completeRollManual(dicePool, skillName); + } + async _rollSkill(event, upgradeType) { const data = this.getData(); const row = event.target.parentElement.parentElement; @@ -152,7 +168,7 @@ export class ActorSheetFFG extends ActorSheet { ability: characteristic.value, difficulty: 2 // Default to average difficulty }); - dicePool.upgrade(skill.value); + dicePool.upgrade(skill.rank); if (upgradeType === "ability") { dicePool.upgrade(); @@ -198,6 +214,15 @@ export class ActorSheetFFG extends ActorSheet { }).render(true) } + async _completeRollManual(dicePool, skillName) { + ChatMessage.create({ + user: game.user._id, + speaker: this.getData(), + flavor: `Rolling ${skillName}...`, + content: `/sw ${dicePool.renderDiceExpression()}` + }); + } + _addSkillDicePool(elem) { const data = this.getData(); const skillName = elem.dataset["ability"]; diff --git a/modules/sheets/minion-sheet-ffg.js b/modules/actors/minion-sheet-ffg.js similarity index 98% rename from modules/sheets/minion-sheet-ffg.js rename to modules/actors/minion-sheet-ffg.js index 8011f74a..1548a505 100644 --- a/modules/sheets/minion-sheet-ffg.js +++ b/modules/actors/minion-sheet-ffg.js @@ -8,8 +8,8 @@ export class MinionSheetFFG extends ActorSheet { /** @override */ static get defaultOptions() { return mergeObject(super.defaultOptions, { - classes: ["worldbuilding", "sheet", "minion"], - template: "systems/starwarsffg/templates/ffg-minion-sheet.html", + classes: ["worldbuilding", "sheet", "actor"], + template: "systems/starwarsffg/templates/actors/ffg-minion-sheet.html", width: 700, height: 620, tabs: [{navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "characteristics"}] diff --git a/modules/actors/vehicle-sheet-ffg.js b/modules/actors/vehicle-sheet-ffg.js new file mode 100644 index 00000000..91dcd9ee --- /dev/null +++ b/modules/actors/vehicle-sheet-ffg.js @@ -0,0 +1,240 @@ +/** + * Extend the basic ActorSheet with some very simple modifications + * @extends {ActorSheet} + */ +export class VehicleSheetFFG extends ActorSheet { + pools = new Map(); + + /** @override */ + static get defaultOptions() { + return mergeObject(super.defaultOptions, { + classes: ["worldbuilding", "sheet", "actor"], + template: "systems/starwarsffg/templates/actors/ffg-vehicle-sheet.html", + width: 710, + height: 650, + tabs: [{navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "items"}] + }); + } + + /* -------------------------------------------- */ + + /** @override */ + getData() { + const data = super.getData(); + data.dtypes = ["String", "Number", "Boolean"]; + for ( let attr of Object.values(data.data.attributes) ) { + attr.isCheckbox = attr.dtype === "Boolean"; + } + return data; + } + + /* -------------------------------------------- */ + + /** @override */ + activateListeners(html) { + super.activateListeners(html); + + // Activate tabs + let tabs = html.find('.tabs'); + let initial = this._sheetTab; + new TabsV2(tabs, { + initial: initial, + callback: clicked => this._sheetTab = clicked.data("tab") + }); + + // Everything below here is only needed if the sheet is editable + if (!this.options.editable) return; + + // Update Inventory Item + html.find('.item-edit').click(ev => { + const li = $(ev.currentTarget).parents(".item"); + const item = this.actor.getOwnedItem(li.data("itemId")); + item.sheet.render(true); + }); + + // Delete Inventory Item + html.find('.item-delete').click(ev => { + const li = $(ev.currentTarget).parents(".item"); + this.actor.deleteOwnedItem(li.data("itemId")); + li.slideUp(200, () => this.render(false)); + }); + + // Setup dice pool image + html.find(".skill").each((_, elem) => { + this._addSkillDicePool(elem) + }); + + // Roll Skill + html.find(".roll-button").children().on("click", async (event) => { + let upgradeType = null; + if (event.ctrlKey && !event.shiftKey) { + upgradeType = "ability" + } else if (!event.ctrlKey && event.shiftKey) { + upgradeType = "difficulty"; + } + await this._rollSkill(event, upgradeType); + }); + + // Add or Remove Attribute + html.find(".attributes").on("click", ".attribute-control", this._onClickAttributeControl.bind(this)); + } + + /* -------------------------------------------- */ + + /** + * Listen for click events on an attribute control to modify the composition of attributes in the sheet + * @param {MouseEvent} event The originating left click event + * @private + */ + async _onClickAttributeControl(event) { + event.preventDefault(); + const a = event.currentTarget; + const action = a.dataset.action; + const attrs = this.object.data.data.attributes; + const form = this.form; + + // Add new attribute + if ( action === "create" ) { + const nk = Object.keys(attrs).length + 1; + let newKey = document.createElement("div"); + newKey.innerHTML = ``; + newKey = newKey.children[0]; + form.appendChild(newKey); + await this._onSubmit(event); + } + + // Remove existing attribute + else if ( action === "delete" ) { + const li = a.closest(".attribute"); + li.parentElement.removeChild(li); + await this._onSubmit(event); + } + } + + /* -------------------------------------------- */ + + /** @override */ + _updateObject(event, formData) { + + // Handle the free-form attributes list + const formAttrs = expandObject(formData).data.attributes || {}; + const attributes = Object.values(formAttrs).reduce((obj, v) => { + let k = v["key"].trim(); + if ( /[\s\.]/.test(k) ) return ui.notifications.error("Attribute keys may not contain spaces or periods"); + delete v["key"]; + obj[k] = v; + return obj; + }, {}); + + // Remove attributes which are no longer used + for ( let k of Object.keys(this.object.data.data.attributes) ) { + if ( !attributes.hasOwnProperty(k) ) attributes[`-=${k}`] = null; + } + + // Re-combine formData + formData = Object.entries(formData).filter(e => !e[0].startsWith("data.attributes")).reduce((obj, e) => { + obj[e[0]] = e[1]; + return obj; + }, {_id: this.object._id, "data.attributes": attributes}); + + // Update the Actor + return this.object.update(formData); + } + + async _rollSkillManual(skill, ability, difficulty) { + const dicePool = new DicePoolFFG({ + ability: characteristic.value, + difficulty: difficulty + }); + dicePool.upgrade(skill.rank); + + if (upgradeType === "ability") { + dicePool.upgrade(); + } else if (upgradeType === "difficulty") { + dicePool.upgradeDifficulty() + } + + await this._completeRollManual(dicePool, skillName); + } + + async _rollSkill(event, upgradeType) { + const data = this.getData(); + const row = event.target.parentElement.parentElement; + const skillName = row.parentElement.dataset["ability"]; + const skill = data.data.skills[skillName]; + const characteristic = data.data.characteristics[skill.characteristic]; + + const dicePool = new DicePoolFFG({ + ability: characteristic.value, + difficulty: 2 // Default to average difficulty + }); + dicePool.upgrade(skill.rank); + + if (upgradeType === "ability") { + dicePool.upgrade(); + } else if (upgradeType === "difficulty") { + dicePool.upgradeDifficulty() + } + + await this._completeRoll(dicePool, `Rolling ${skillName}`, skillName); + } + + async _completeRoll(dicePool, description, skillName) { + const id = randomID(); + + const content = await renderTemplate("systems/starwarsffg/templates/roll-options.html", { + dicePool, + id, + }); + + new Dialog({ + title: description || "Finalize your roll", + content, + buttons: { + one: { + icon: '', + label: "Roll", + callback: () => { + const container = document.getElementById(id); + const finalPool = DicePoolFFG.fromContainer(container); + + ChatMessage.create({ + user: game.user._id, + speaker: this.getData(), + flavor: `Rolling ${skillName}...`, + content: `/sw ${finalPool.renderDiceExpression()}` + }); + } + }, + two: { + icon: '', + label: "Cancel", + } + }, + }).render(true) + } + + async _completeRollManual(dicePool, skillName) { + ChatMessage.create({ + user: game.user._id, + speaker: this.getData(), + flavor: `Rolling ${skillName}...`, + content: `/sw ${dicePool.renderDiceExpression()}` + }); + } + + _addSkillDicePool(elem) { + const data = this.getData(); + const skillName = elem.dataset["ability"]; + const skill = data.data.skills[skillName]; + const characteristic = data.data.characteristics[skill.characteristic]; + + const dicePool = new DicePoolFFG({ + ability: Math.max(characteristic.value, skill.rank), + }); + dicePool.upgrade(Math.min(characteristic.value, skill.rank)); + + const rollButton = elem.querySelector(".roll-button"); + dicePool.renderPreview(rollButton) + } +} diff --git a/modules/combat-ffg.js b/modules/combat-ffg.js new file mode 100644 index 00000000..dacd61e5 --- /dev/null +++ b/modules/combat-ffg.js @@ -0,0 +1,70 @@ +/** + * Extend the base Combat entity. + * @extends {Combat} + */ +export class CombatFFG extends Combat { + + /** + * Roll initiative for one or multiple Combatants within the Combat entity + * @param {Array|string} ids A Combatant id or Array of ids for which to roll + * @param {string|null} formula A non-default initiative formula to roll. Otherwise the system default is used. + * @param {Object} messageOptions Additional options with which to customize created Chat Messages + * @return {Promise.} A promise which resolves to the updated Combat entity once updates are complete. + */ + async rollInitiative(ids, formula=null, messageOptions={}) { + + // Structure input data + ids = typeof ids === "string" ? [ids] : ids; + const currentId = this.combatant._id; + + // Iterate over Combatants, performing an initiative roll for each + const [updates, messages] = ids.reduce((results, id, i) => { + let [updates, messages] = results; + + // Get Combatant data + const c = this.getCombatant(id); + if ( !c ) return results; + + // Roll initiative + const cf = formula || this._getInitiativeFormula(c); + const rollData = c.actor ? c.actor.getRollData() : {}; + const roll = new Roll(cf, rollData).roll(); + updates.push({_id: id, initiative: roll.total}); + + // Determine the roll mode + let rollMode = messageOptions.rollMode || game.settings.get("core", "rollMode"); + if (( c.token.hidden || c.hidden ) && (rollMode === "roll") ) rollMode = "gmroll"; + + // Construct chat message data + let messageData = mergeObject({ + speaker: { + scene: canvas.scene._id, + actor: c.actor ? c.actor._id : null, + token: c.token._id, + alias: c.token.name + }, + flavor: `${c.token.name} rolls for Initiative! This is my custom formula!` + }, messageOptions); + const chatData = roll.toMessage(messageData, {rollMode, create:false}); + if ( i > 0 ) chatData.sound = null; // Only play 1 sound for the whole set + messages.push(chatData); + + // Return the Roll and the chat data + return results; + }, [[], []]); + if ( !updates.length ) return this; + + // Update multiple combatants + await this.updateEmbeddedEntity("Combatant", updates); + + // Ensure the turn order remains with the same combatant + await this.update({turn: this.turns.findIndex(t => t._id === currentId)}); + + // Create multiple chat messages + await CONFIG.ChatMessage.entityClass.create(messages); + + // Return the updated Combat + return this; + } + +} diff --git a/modules/sheets/talent-sheet-ffg.js b/modules/items/item-sheet-ffg.js similarity index 87% rename from modules/sheets/talent-sheet-ffg.js rename to modules/items/item-sheet-ffg.js index 6da64e45..d01067fc 100644 --- a/modules/sheets/talent-sheet-ffg.js +++ b/modules/items/item-sheet-ffg.js @@ -2,19 +2,30 @@ * Extend the basic ItemSheet with some very simple modifications * @extends {ItemSheet} */ -export class TalentSheetFFG extends ItemSheet { +export class ItemSheetFFG extends ItemSheet { /** @override */ static get defaultOptions() { return mergeObject(super.defaultOptions, { - classes: ["worldbuilding", "sheet", "talent"], - template: "systems/starwarsffg/templates/ffg-talent-sheet.html", + classes: ["worldbuilding", "sheet", "item"], width: 580, height: 480, tabs: [{navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "description"}] }); } + /** @override */ + get template() { + const path = "systems/starwarsffg/templates/items"; + // Return a single sheet for all item types. + // return `${path}/item-sheet.html`; + + // Alternatively, you could use the following return statement to do a + // unique item sheet by type, like `weapon-sheet.html`. + return `${path}/ffg-${this.item.data.type}-sheet.html`; + } + + /* -------------------------------------------- */ /** @override */ @@ -80,7 +91,6 @@ export class TalentSheetFFG extends ItemSheet { } } - /* -------------------------------------------- */ /** @override */ diff --git a/modules/sheets/armour-sheet-ffg.js b/modules/sheets/armour-sheet-ffg.js deleted file mode 100644 index 74068787..00000000 --- a/modules/sheets/armour-sheet-ffg.js +++ /dev/null @@ -1,112 +0,0 @@ -/** - * Extend the basic ItemSheet with some very simple modifications - * @extends {ItemSheet} - */ -export class ArmourSheetFFG extends ItemSheet { - - /** @override */ - static get defaultOptions() { - return mergeObject(super.defaultOptions, { - classes: ["worldbuilding", "sheet", "armour"], - template: "systems/starwarsffg/templates/ffg-armour-sheet.html", - width: 550, - height: 480, - tabs: [{navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "description"}] - }); - } - - /* -------------------------------------------- */ - - /** @override */ - getData() { - const data = super.getData(); - data.dtypes = ["String", "Number", "Boolean"]; - for ( let attr of Object.values(data.data.attributes) ) { - attr.isCheckbox = attr.dtype === "Boolean"; - } - return data; - } - - /* -------------------------------------------- */ - - /** @override */ - activateListeners(html) { - super.activateListeners(html); - - // Activate tabs - let tabs = html.find('.tabs'); - let initial = this._sheetTab; - new TabsV2(tabs, { - initial: initial, - callback: clicked => this._sheetTab = clicked.data("tab") - }); - - // Everything below here is only needed if the sheet is editable - if (!this.options.editable) return; - - // Add or Remove Attribute - html.find(".attributes").on("click", ".attribute-control", this._onClickAttributeControl.bind(this)); - } - - /* -------------------------------------------- */ - - /** - * Listen for click events on an attribute control to modify the composition of attributes in the sheet - * @param {MouseEvent} event The originating left click event - * @private - */ - async _onClickAttributeControl(event) { - event.preventDefault(); - const a = event.currentTarget; - const action = a.dataset.action; - const attrs = this.object.data.data.attributes; - const form = this.form; - - // Add new attribute - if ( action === "create" ) { - const nk = Object.keys(attrs).length + 1; - let newKey = document.createElement("div"); - newKey.innerHTML = ``; - newKey = newKey.children[0]; - form.appendChild(newKey); - await this._onSubmit(event); - } - - // Remove existing attribute - else if ( action === "delete" ) { - const li = a.closest(".attribute"); - li.parentElement.removeChild(li); - await this._onSubmit(event); - } - } - - /* -------------------------------------------- */ - - /** @override */ - _updateObject(event, formData) { - - // Handle the free-form attributes list - const formAttrs = expandObject(formData).data.attributes || {}; - const attributes = Object.values(formAttrs).reduce((obj, v) => { - let k = v["key"].trim(); - if ( /[\s\.]/.test(k) ) return ui.notifications.error("Attribute keys may not contain spaces or periods"); - delete v["key"]; - obj[k] = v; - return obj; - }, {}); - - // Remove attributes which are no longer used - for ( let k of Object.keys(this.object.data.data.attributes) ) { - if ( !attributes.hasOwnProperty(k) ) attributes[`-=${k}`] = null; - } - - // Re-combine formData - formData = Object.entries(formData).filter(e => !e[0].startsWith("data.attributes")).reduce((obj, e) => { - obj[e[0]] = e[1]; - return obj; - }, {_id: this.object._id, "data.attributes": attributes}); - - // Update the Item - return this.object.update(formData); - } -} diff --git a/modules/sheets/gear-sheet-ffg.js b/modules/sheets/gear-sheet-ffg.js deleted file mode 100644 index 53d671a2..00000000 --- a/modules/sheets/gear-sheet-ffg.js +++ /dev/null @@ -1,112 +0,0 @@ -/** - * Extend the basic ItemSheet with some very simple modifications - * @extends {ItemSheet} - */ -export class GearSheetFFG extends ItemSheet { - - /** @override */ - static get defaultOptions() { - return mergeObject(super.defaultOptions, { - classes: ["worldbuilding", "sheet", "gear"], - template: "systems/starwarsffg/templates/ffg-gear-sheet.html", - width: 580, - height: 480, - tabs: [{navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "description"}] - }); - } - - /* -------------------------------------------- */ - - /** @override */ - getData() { - const data = super.getData(); - data.dtypes = ["String", "Number", "Boolean"]; - for ( let attr of Object.values(data.data.attributes) ) { - attr.isCheckbox = attr.dtype === "Boolean"; - } - return data; - } - - /* -------------------------------------------- */ - - /** @override */ - activateListeners(html) { - super.activateListeners(html); - - // Activate tabs - let tabs = html.find('.tabs'); - let initial = this._sheetTab; - new TabsV2(tabs, { - initial: initial, - callback: clicked => this._sheetTab = clicked.data("tab") - }); - - // Everything below here is only needed if the sheet is editable - if (!this.options.editable) return; - - // Add or Remove Attribute - html.find(".attributes").on("click", ".attribute-control", this._onClickAttributeControl.bind(this)); - } - - /* -------------------------------------------- */ - - /** - * Listen for click events on an attribute control to modify the composition of attributes in the sheet - * @param {MouseEvent} event The originating left click event - * @private - */ - async _onClickAttributeControl(event) { - event.preventDefault(); - const a = event.currentTarget; - const action = a.dataset.action; - const attrs = this.object.data.data.attributes; - const form = this.form; - - // Add new attribute - if ( action === "create" ) { - const nk = Object.keys(attrs).length + 1; - let newKey = document.createElement("div"); - newKey.innerHTML = ``; - newKey = newKey.children[0]; - form.appendChild(newKey); - await this._onSubmit(event); - } - - // Remove existing attribute - else if ( action === "delete" ) { - const li = a.closest(".attribute"); - li.parentElement.removeChild(li); - await this._onSubmit(event); - } - } - - /* -------------------------------------------- */ - - /** @override */ - _updateObject(event, formData) { - - // Handle the free-form attributes list - const formAttrs = expandObject(formData).data.attributes || {}; - const attributes = Object.values(formAttrs).reduce((obj, v) => { - let k = v["key"].trim(); - if ( /[\s\.]/.test(k) ) return ui.notifications.error("Attribute keys may not contain spaces or periods"); - delete v["key"]; - obj[k] = v; - return obj; - }, {}); - - // Remove attributes which are no longer used - for ( let k of Object.keys(this.object.data.data.attributes) ) { - if ( !attributes.hasOwnProperty(k) ) attributes[`-=${k}`] = null; - } - - // Re-combine formData - formData = Object.entries(formData).filter(e => !e[0].startsWith("data.attributes")).reduce((obj, e) => { - obj[e[0]] = e[1]; - return obj; - }, {_id: this.object._id, "data.attributes": attributes}); - - // Update the Item - return this.object.update(formData); - } -} diff --git a/modules/sheets/weapon-sheet-ffg.js b/modules/sheets/weapon-sheet-ffg.js deleted file mode 100644 index 3b6f654f..00000000 --- a/modules/sheets/weapon-sheet-ffg.js +++ /dev/null @@ -1,112 +0,0 @@ -/** - * Extend the basic ItemSheet with some very simple modifications - * @extends {ItemSheet} - */ -export class WeaponSheetFFG extends ItemSheet { - - /** @override */ - static get defaultOptions() { - return mergeObject(super.defaultOptions, { - classes: ["worldbuilding", "sheet", "weapon"], - template: "systems/starwarsffg/templates/ffg-weapon-sheet.html", - width: 590, - height: 500, - tabs: [{navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "description"}] - }); - } - - /* -------------------------------------------- */ - - /** @override */ - getData() { - const data = super.getData(); - data.dtypes = ["String", "Number", "Boolean"]; - for ( let attr of Object.values(data.data.attributes) ) { - attr.isCheckbox = attr.dtype === "Boolean"; - } - return data; - } - - /* -------------------------------------------- */ - - /** @override */ - activateListeners(html) { - super.activateListeners(html); - - // Activate tabs - let tabs = html.find('.tabs'); - let initial = this._sheetTab; - new TabsV2(tabs, { - initial: initial, - callback: clicked => this._sheetTab = clicked.data("tab") - }); - - // Everything below here is only needed if the sheet is editable - if (!this.options.editable) return; - - // Add or Remove Attribute - html.find(".attributes").on("click", ".attribute-control", this._onClickAttributeControl.bind(this)); - } - - /* -------------------------------------------- */ - - /** - * Listen for click events on an attribute control to modify the composition of attributes in the sheet - * @param {MouseEvent} event The originating left click event - * @private - */ - async _onClickAttributeControl(event) { - event.preventDefault(); - const a = event.currentTarget; - const action = a.dataset.action; - const attrs = this.object.data.data.attributes; - const form = this.form; - - // Add new attribute - if ( action === "create" ) { - const nk = Object.keys(attrs).length + 1; - let newKey = document.createElement("div"); - newKey.innerHTML = ``; - newKey = newKey.children[0]; - form.appendChild(newKey); - await this._onSubmit(event); - } - - // Remove existing attribute - else if ( action === "delete" ) { - const li = a.closest(".attribute"); - li.parentElement.removeChild(li); - await this._onSubmit(event); - } - } - - /* -------------------------------------------- */ - - /** @override */ - _updateObject(event, formData) { - - // Handle the free-form attributes list - const formAttrs = expandObject(formData).data.attributes || {}; - const attributes = Object.values(formAttrs).reduce((obj, v) => { - let k = v["key"].trim(); - if ( /[\s\.]/.test(k) ) return ui.notifications.error("Attribute keys may not contain spaces or periods"); - delete v["key"]; - obj[k] = v; - return obj; - }, {}); - - // Remove attributes which are no longer used - for ( let k of Object.keys(this.object.data.data.attributes) ) { - if ( !attributes.hasOwnProperty(k) ) attributes[`-=${k}`] = null; - } - - // Re-combine formData - formData = Object.entries(formData).filter(e => !e[0].startsWith("data.attributes")).reduce((obj, e) => { - obj[e[0]] = e[1]; - return obj; - }, {_id: this.object._id, "data.attributes": attributes}); - - // Update the Item - return this.object.update(formData); - } -} diff --git a/modules/swffg-config.js b/modules/swffg-config.js index d853c0e1..7d57c33e 100644 --- a/modules/swffg-config.js +++ b/modules/swffg-config.js @@ -6,13 +6,12 @@ // Import Modules import { ActorFFG } from "./actors/actor-ffg.js"; -import { GearSheetFFG } from "./sheets/gear-sheet-ffg.js"; -import { WeaponSheetFFG } from "./sheets/weapon-sheet-ffg.js"; -import { ArmourSheetFFG } from "./sheets/armour-sheet-ffg.js"; -import { TalentSheetFFG } from "./sheets/talent-sheet-ffg.js"; -import { ActorSheetFFG } from "./sheets/actor-sheet-ffg.js"; -import { MinionSheetFFG } from "./sheets/minion-sheet-ffg.js"; +import { ItemSheetFFG } from "./items/item-sheet-ffg.js"; +import { CharacterSheetFFG } from "./actors/character-sheet-ffg.js"; +import { MinionSheetFFG } from "./actors/minion-sheet-ffg.js"; +import { VehicleSheetFFG } from "./actors/vehicle-sheet-ffg.js"; import { DicePoolFFG } from "./dice-pool-ffg.js"; +import { CombatFFG } from "./combat-ffg.js"; /* -------------------------------------------- */ /* Foundry VTT Initialization */ @@ -23,27 +22,65 @@ Hooks.once("init", async function() { // Place our classes in their own namespace for later reference. game.ffg = { - ActorFFG + ActorFFG, + CombatFFG }; // Define custom Entity classes. This will override the default Actor // to instead use our extended version. CONFIG.Actor.entityClass = ActorFFG; + CONFIG.Combat.entityClass = CombatFFG; + console.log(CombatFFG); + // TURN ON OR OFF HOOK DEBUGGING + CONFIG.debug.hooks = false; /** * Set an initiative formula for the system * @type {String} */ - CONFIG.Combat.initiative = { - formula: "1d20", - decimals: 2 - }; + // Register initiative rule + game.settings.register("starwarsffg", "initiativeRule", { + name: "Initiative Type", + hint: "Choose between Vigilance or Cool for Initiative rolls.", + scope: "world", + config: true, + default: "v", + type: String, + choices: { + "v": "Use Vigilance", + "c": "Use Cool", + }, + onChange: rule => _setffgInitiative(rule) + }); + _setffgInitiative(game.settings.get("starwarsffg", "initiativeRule")); + + + function _setffgInitiative(initMethod) + { + let formula; + switch (initMethod) + { + case "v": + formula = "@_rollSkillManual(@skills.Vigilance.rank, @characteristics.Willpower.value, 0)"; + break; + + case "c": + formula = "@_rollSkillManual(@skills.Cool.rank, @characteristics.Presence.value, 0)"; + break; + } + + CONFIG.Combat.initiative = { + // formula: formula, + formula: "1d20", + decimals: 0 + } + } // Register sheet application classes Actors.unregisterSheet("core", ActorSheet); - Actors.registerSheet("ffg", ActorSheetFFG, { + Actors.registerSheet("ffg", CharacterSheetFFG, { types: ["character"], makeDefault: true }); @@ -51,23 +88,12 @@ Hooks.once("init", async function() { types: ["minion"], makeDefault: true }); - Items.unregisterSheet("core", ItemSheet); - Items.registerSheet("ffg", GearSheetFFG, { - types: ["gear"], - makeDefault: true - }); - Items.registerSheet("ffg", WeaponSheetFFG, { - types: ["weapon"], - makeDefault: true - }); - Items.registerSheet("ffg", ArmourSheetFFG, { - types: ["armour"], - makeDefault: true - }); - Items.registerSheet("ffg", TalentSheetFFG, { - types: ["talent"], + Actors.registerSheet("ffg", VehicleSheetFFG, { + types: ["vehicle"], makeDefault: true }); + Items.unregisterSheet("core", ItemSheet); + Items.registerSheet("ffg", ItemSheetFFG, {makeDefault: true}); // Add utilities to the global scope, this can be useful for macro makers window.DicePoolFFG = DicePoolFFG; diff --git a/packs/star-wars-ffg-rollable-tables.db b/packs/star-wars-ffg-rollable-tables.db new file mode 100644 index 00000000..71665fdb --- /dev/null +++ b/packs/star-wars-ffg-rollable-tables.db @@ -0,0 +1 @@ +{"name":"Critical Injuries","permission":{"default":0,"81MMlKz23svlMJDQ":3},"flags":{},"description":"A rollable table for critical injuries characters can sustain.","results":[{"_id":"mGX2GqY6nIzMlsUS","flags":{},"type":0,"text":"Minor Nick: The target suffers 1 strain.","img":"icons/svg/d20-black.svg","resultId":"","weight":1,"range":[1,5],"drawn":false},{"_id":"iiadMQCr320XrXci","flags":{},"type":0,"text":"Slowed Down: The target can only act during the last allied initiative slot on their next turn.","img":"icons/svg/d20-black.svg","resultId":"","weight":1,"range":[6,10],"drawn":false},{"_id":"sKGM1Q17wJPOzcXu","flags":{},"type":0,"text":"Sudden Jolt: The target drops whatever is in hand.","img":"icons/svg/d20-black.svg","resultId":"","weight":1,"range":[11,15],"drawn":false},{"_id":"tM5D4auZHBVWV6xV","flags":{},"type":0,"text":"Distracted: The target cannot perform a free maneuver during their next turn.","img":"icons/svg/d20-black.svg","resultId":"","weight":1,"range":[16,20],"drawn":false},{"_id":"prs08Ei272xWp8Qr","flags":{},"type":0,"text":"Off-Balance: Add one setback dice to their next skill check.","img":"icons/svg/d20-black.svg","resultId":"","weight":1,"range":[21,25],"drawn":false},{"_id":"EHl36Qwc3KjC0dsW","flags":{},"type":0,"text":"Discouraging Wound: Flip one light side Destiny point to a dark side Destiny point (reverse if NPC).","img":"icons/svg/d20-black.svg","resultId":"","weight":1,"range":[26,30],"drawn":false},{"_id":"ugQA5fzXcqIpHAxU","flags":{},"type":0,"text":"Stunned: The target is staggered until the end of their next turn.","img":"icons/svg/d20-black.svg","resultId":"","weight":1,"range":[31,35],"drawn":false},{"_id":"NLZJQdq8s8sw9Y1U","flags":{},"type":0,"text":"Stinger: Increase difficulty of next check by one.","img":"icons/svg/d20-black.svg","resultId":"","weight":1,"range":[36,40],"drawn":false},{"_id":"ye6Io41FlJ8AtOWR","flags":{},"type":0,"text":"Bowled Over: The target is knocked prone and suffers 1 strain.","img":"icons/svg/d20-black.svg","resultId":"","weight":1,"range":[41,45],"drawn":false},{"_id":"kyaEg2Sh3GuaZXrn","flags":{},"type":0,"text":"Head Ringer: The target increases the difficulty of all Intellect and Cunning checks by one until the end of the encounter. ","img":"icons/svg/d20-black.svg","resultId":"","weight":1,"range":[46,50],"drawn":false},{"_id":"b3WgOa9QtaRgU2ZW","flags":{},"type":0,"text":"Fearsome Wound: The target increases the difficulty of all Presence and Willpower checks by one until the end of the encounter.","img":"icons/svg/d20-black.svg","resultId":"","weight":1,"range":[51,55],"drawn":false},{"_id":"rhubXb57ju68PYjj","flags":{},"type":0,"text":"Agonising Wound: The target increases the difficulty of all Brawn and Agility checks by one until the end of the encounter.","img":"icons/svg/d20-black.svg","resultId":"","weight":1,"range":[56,60],"drawn":false},{"_id":"AzTYMaeuWzo9heE2","flags":{},"type":0,"text":"Slightly Dazed: The target is disoriented until the end of the encounter.","img":"icons/svg/d20-black.svg","resultId":"","weight":1,"range":[61,65],"drawn":false},{"_id":"kNVvY9ywaHtZaWrd","flags":{},"type":0,"text":"Scattered Senses: The target removes all boost dice from skill checks until the end of the encounter.","img":"icons/svg/d20-black.svg","resultId":"","weight":1,"range":[66,70],"drawn":false},{"_id":"ArtgLt0vjOPOZ2ws","flags":{},"type":0,"text":"Hamstrung: The target loses his free maneuver until the end of the encounter.","img":"icons/svg/d20-black.svg","resultId":"","weight":1,"range":[71,75],"drawn":false},{"_id":"6wNrQY3hnmd4Wpte","flags":{},"type":0,"text":"Overpowered: The target leaves themselves open, and the attacker may immediately attempt another free attack against them, using the exact same pool as the original attack.","img":"icons/svg/d20-black.svg","resultId":"","weight":1,"range":[76,80],"drawn":false},{"_id":"2PzvPdvRpE70rHdN","flags":{},"type":0,"text":"Winded: Until the end of the encounter, the target cannot voluntarily suffer strain to activate any abilities or gain additional maneuvers.","img":"icons/svg/d20-black.svg","resultId":"","weight":1,"range":[81,85],"drawn":false},{"_id":"2qOHyQDA50chYBOu","flags":{},"type":0,"text":"Compromised: Increase difficulty of all skill checks by one until the end of the encounter.","img":"icons/svg/d20-black.svg","resultId":"","weight":1,"range":[86,90],"drawn":false},{"_id":"rRPsUHWkodrUylCR","flags":{},"type":0,"text":"At the Brink: The target suffers 1 strain each time he performs an action.","img":"icons/svg/d20-black.svg","resultId":"","weight":1,"range":[91,95],"drawn":false},{"_id":"NpQNs8XdSQsdC2id","flags":{},"type":0,"text":"Crippled: One of the target's limbs (selected by the GM) is crippled until healed or replaced. Increase difficulty of all checks that require the use of that limb by one.","img":"icons/svg/d20-black.svg","resultId":"","weight":1,"range":[96,100],"drawn":false},{"_id":"PbNmmrHHJpTQBGUv","flags":{},"type":0,"text":"Maimed: One of the target's limbs (selected by the GM) is permanently lost. Unless the target has a cybernetic replacement, the target cannot perform actions that would require the use of that limb. All other actions gain one setback dice.","img":"icons/svg/d20-black.svg","resultId":"","weight":1,"range":[101,105],"drawn":false},{"_id":"2DeZ3S8oEJFr1zh7","flags":{},"type":0,"text":"Horrific Injury: Randomly roll 1d10 to determine one of the target's characteristics - 1-3 for Brawn, 4-6 for Agility, 7 for Intellect, 8 for Cunning, 9 for Presence, 10 for Willpower. Until this Critical Injury is healed, treat that characteristic as one point lower.","img":"icons/svg/d20-black.svg","resultId":"","weight":1,"range":[106,110],"drawn":false},{"_id":"ppXwx2kYjgLnnOyQ","flags":{},"type":0,"text":"Temporarily Lame: Until this Critical Injury is healed, the target cannot perform more than one maneuver during their turn.","img":"icons/svg/d20-black.svg","resultId":"","weight":1,"range":[111,115],"drawn":false},{"_id":"MkT2riEpWxtjOF3r","flags":{},"type":0,"text":"Blinded: The target can no longer see. Upgrade the difficulty of all checks twice. Upgrade the difficulty of Perception and Vigilance checks three times.","img":"icons/svg/d20-black.svg","resultId":"","weight":1,"range":[116,120],"drawn":false},{"_id":"U2F7iNRvu3vBALPP","flags":{},"type":0,"text":"Knocked Senseless: The target is staggered for the remainder of the encounter.","img":"icons/svg/d20-black.svg","resultId":"","weight":1,"range":[121,125],"drawn":false},{"_id":"zPNhBPnFTBZFb04l","flags":{},"type":0,"text":"Gruesome Injury: Randomly roll 1d10 to determine one of the target's characteristics - 1-3 for Brawn, 4-6 for Agility, 7 for Intellect, 8 for Cunning, 9 for Presence, 10 for Willpower. That characteristic is permanetly reduced by one, to a minimum of one.","img":"icons/svg/d20-black.svg","resultId":"","weight":1,"range":[126,130],"drawn":false},{"_id":"4NWuqR6lDVCxNAZk","flags":{},"type":0,"text":"Bleeding Out: Every round, the target suffers 1 wound and 1 strain at the beginning of their turn. For every five wounds they suffer beyond their wound threshold, they suffer one additional Critical Injury. Roll on the chart, suffering the injury (if they suffer this result a second time due to this, roll again).","img":"icons/svg/d20-black.svg","resultId":"","weight":1,"range":[131,140],"drawn":false},{"_id":"LuaqfkvH2wnnRQwS","flags":{},"type":0,"text":"The End is Nigh: The target will die after the last Initiative slot during the next round.","img":"icons/svg/d20-black.svg","resultId":"","weight":1,"range":[141,150],"drawn":false},{"_id":"X5k7CJp4paFrdgWA","flags":{},"type":0,"text":"Dead: Complete, obliterated death.","img":"icons/svg/d20-black.svg","resultId":"","weight":1,"range":[151,500],"drawn":false}],"formula":"1d100","replacement":true,"displayRoll":true,"_id":"DWjn64CeC7zxibbF"} diff --git a/styles/swffg.css b/styles/swffg.css index 1a6e2608..07ec4f4e 100644 --- a/styles/swffg.css +++ b/styles/swffg.css @@ -141,6 +141,7 @@ div .container.talents { .worldbuilding.sheet .sheet-topper * > input { background: #f2f2f2; border-radius: 0 0 15px 15px; + width: auto; } /* diff --git a/system.json b/system.json index 177bda5f..b321a971 100644 --- a/system.json +++ b/system.json @@ -2,14 +2,22 @@ "name": "starwarsffg", "title": "Star Wars FFG", "description": "A system for playing Star Wars FFG games.", - "version": 0.01, + "version": 0.03, "minimumCoreVersion": "0.5.5", "compatibleCoreVersion": "0.5.5", "templateVersion": 1, "author": "Jaxxa and Esrin", "esmodules": ["modules/dice-pool-ffg.js", "modules/swffg-config.js"], "styles": ["styles/swffg.css"], - "packs": [], + "packs": [{ + "name": "rollabletables", + "label": "Star Wars FFG: Rollable Tables", + "system": "starwarsffg", + "module": "starwarsffg", + "path": "packs/star-wars-ffg-rollable-tables.db", + "entity": "RollTable", + "tag" : "rolltable" + }], "languages": [], "gridDistance": 5, "gridUnits": "ft", @@ -17,6 +25,6 @@ "secondaryTokenAttribute": "strain", "url": "https://github.com/Esrin/StarWarsFFG/tree/esrin-dev", "manifest": "https://raw.githubusercontent.com/Esrin/StarWarsFFG/esrin-dev/system.json", - "download": "https://github.com/Esrin/StarWarsFFG/releases/download/esrin-dev_0.02/esrin-dev_0.02.zip", + "download": "https://github.com/Esrin/StarWarsFFG/releases/download/esrin-dev_0.03/esrin-dev_0.03.zip", "license": "LICENSE.txt" } diff --git a/template.json b/template.json index 7c9e062a..2b87915f 100644 --- a/template.json +++ b/template.json @@ -1,7 +1,7 @@ { "Actor": { "types": [ - "character", "minion" + "character", "minion", "vehicle" ], "templates": { "biography": { @@ -51,6 +51,11 @@ "forcePool": { "value": 0, "max": 0 + }, + "credits": { + "value": 0, + "type": "Number", + "label": "Credits" } } }, @@ -317,11 +322,86 @@ "type": "Number", "label": "Unit Wounds" } + }, + "vehicle": { + "templates": ["biography", "attributes"], + "stats": { + "silhouette": { + "value": 1, + "type": "Number", + "label": "Silhouette" + }, + "speed": { + "value": 0, + "max": 0, + "type": "Number", + "label": "Speed" + }, + "handling": { + "value": 0, + "type": "Number", + "label": "Handling" + }, + "hullTrauma": { + "value": 0, + "min": 0, + "max": 10, + "label": "Hull Trauma" + }, + "systemStrain": { + "value": 0, + "min": 0, + "max": 10, + "label": "System Strain" + }, + "shields": { + "fore": 0, + "port": 0, + "starboard": 0, + "aft": 0, + "label": "Shields" + }, + "armour": { + "value": 0, + "type": "Number", + "label": "Armour" + }, + "sensorRange":{ + "value": "Short", + "type": "String" + }, + "crew":{}, + "passengerCapacity":{ + "value": 0, + "type": "Number", + "label": "Passenger Capacity" + }, + "encumbrance": { + "value": 0, + "min": 0, + "max": 10 + }, + "cost":{ + "value": 0, + "type": "Number", + "label": "Cost" + }, + "rarity":{ + "value": 0, + "type": "Number", + "label": "Rarity" + }, + "customizationHardPoints": { + "value": 0, + "type": "Number", + "label": "Hard Points" + } + } } }, "Item": { "types": [ - "gear", "weapon", "armour", "talent" + "gear", "weapon", "armour", "talent", "shipweapon", "shipattachment" ], "templates": { "basic": { @@ -428,6 +508,41 @@ }, "trees": [], "attributes": {} - } + }, + "shipweapon": { + "templates": ["basic", "hardpoints", "equippable"], + "label": "Ship Weapon", + "firingarc": { + "value": "", + "type": "String", + "label": "Skill" + }, + "damage": { + "value": 0, + "type": "Number", + "label": "Damage", + "abrev": "Dam" + }, + "crit": { + "value": 0, + "type": "Number", + "label": "Critical Rating", + "abrev": "Crit" + }, + "range": { + "value": "", + "type": "String", + "label": "Range" + }, + "special": { + "value": "", + "type": "String", + "label": "Special" + } + }, + "shipattachment": { + "templates": ["basic", "hardpoints", "equippable"], + "label": "Ship Attachment" + } } } diff --git a/templates/ffg-actor-sheet.html b/templates/actors/ffg-actor-sheet.html similarity index 96% rename from templates/ffg-actor-sheet.html rename to templates/actors/ffg-actor-sheet.html index cf192fd3..0ecffe0e 100644 --- a/templates/ffg-actor-sheet.html +++ b/templates/actors/ffg-actor-sheet.html @@ -80,8 +80,8 @@

Strain

Encum

- +
@@ -98,7 +98,7 @@

Soak

+ data-dtype="Number" disabled />
@@ -191,7 +191,7 @@

Force Pool

{{/with}} - @@ -207,6 +207,11 @@

Force Pool

{{!-- Owned Items Tab --}}
+ {{!-- Credits Box --}} +
+
+ {{!-- Weapons List --}}

@@ -398,8 +403,8 @@

Conf

- + diff --git a/templates/ffg-minion-sheet.html b/templates/actors/ffg-minion-sheet.html similarity index 100% rename from templates/ffg-minion-sheet.html rename to templates/actors/ffg-minion-sheet.html diff --git a/templates/actors/ffg-vehicle-sheet.html b/templates/actors/ffg-vehicle-sheet.html new file mode 100644 index 00000000..9bb0c884 --- /dev/null +++ b/templates/actors/ffg-vehicle-sheet.html @@ -0,0 +1,362 @@ +
+ + {{!-- Sheet Header --}} +
+ + + +
+ {{!-- Ship Name --}} +
+
+
+ + {{!-- Defence Grid --}} +
+ {{!-- Fore and Aft Box --}} +
+
+

Defence

+
+
+ + +
+
+
+ + +
+
+
+
+ + +
+
+
+ + +
+
+
+
+
+ + {{!-- Silhouette, Speed and Handling Container --}} +
+ + {{!-- Silhouette Box --}} +
+
+

Silhouette

+
+
+ + +
+
+
+
+ + {{!-- Speed Box --}} +
+
+

Speed

+
+
+ + +
+
+
+ + +
+
+
+
+ + {{!-- Handling Box --}} +
+
+

Handling

+
+
+ + +
+
+
+
+
+ + {{!-- Armour, Hull Trauma and System Strain container --}} +
+ {{!-- Armour Box --}} +
+
+

Armour

+
+
+ + +
+
+
+
+ + {{!-- Hull Trauma Box --}} +
+
+

Hull Trauma

+
+
+ + +
+
+
+ + +
+
+
+
+ + {{!-- System Strain Box --}} +
+
+

System Strain

+
+
+ + +
+
+
+ + +
+
+
+
+
+ + + {{!-- Sheet Tab Navigation --}} + + + {{!-- Sheet Body --}} +
+ + {{!-- Owned Items Tab --}} +
+ + {{!-- Ship Weapons List --}} +
+

+
+ Name + Firing Arc + Damage + Range + Crit + Special + Edit +
+
    + {{#each actor.items as |item id|}} + {{#iff item.type '==' 'shipweapon'}} +
  1. +

    {{item.name}}

    + + + + + +
    + + +
    +
  2. + {{/iff}} + {{/each}} +
+
+ + {{!-- Ship Attachments List --}} +
+

+
+ Name + Hardpoints Required + Edit +
+
    + {{#each actor.items as |item id|}} + {{#iff item.type '==' 'shipattachment'}} +
  1. +

    {{item.name}}

    + +
    + + +
    +
  2. + {{/iff}} + {{/each}} +
+
+ + {{!-- Cargo Hold --}} +
+

+
+ Name + Price + Rarity + Quantity + Encum + Edit +
+
    + {{#each actor.items as |item id|}} + {{#iff item.type '!=' 'shipweapon'}} + {{#iff item.type '!=' 'shipattachment'}} + {{#iff item.type '!=' 'talent'}} +
  1. +

    {{item.name}}

    + + + + +
    + + +
    +
  2. + {{/iff}} + {{/iff}} + {{/iff}} + {{/each}} +
+
+ +
+ + {{!-- Biography Tab --}} +
+ {{editor content=data.biography target="data.biography" button=true owner=owner editable=editable}} + {{!-- Obligations Section --}} +
+ + {{!-- Hard Points Box --}} +
+
+

Hard Points

+
+
+ +
+
+
+
+ + {{!-- Encumbrance Capacity Box --}} +
+
+

Encumbrance Capacity

+
+
+ +
+
+
+
+ + {{!-- Sensor Range Box --}} +
+
+

Sensor Range

+
+
+ +
+
+
+
+ + {{!-- Passenger Capacity Box --}} +
+
+

Passenger Capacity

+
+
+ +
+
+
+
+
+
+ + {{!-- Modifiers Tab --}} + + +
+
diff --git a/templates/ffg-armour-sheet.html b/templates/items/ffg-armour-sheet.html similarity index 100% rename from templates/ffg-armour-sheet.html rename to templates/items/ffg-armour-sheet.html diff --git a/templates/ffg-gear-sheet.html b/templates/items/ffg-gear-sheet.html similarity index 100% rename from templates/ffg-gear-sheet.html rename to templates/items/ffg-gear-sheet.html diff --git a/templates/items/ffg-shipattachment-sheet.html b/templates/items/ffg-shipattachment-sheet.html new file mode 100644 index 00000000..1670c080 --- /dev/null +++ b/templates/items/ffg-shipattachment-sheet.html @@ -0,0 +1,80 @@ +
+
+ +
+
+

+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+ + {{!-- Sheet Tab Navigation --}} + + + {{!-- Sheet Body --}} +
+ + {{!-- Description Tab --}} +
+ {{editor content=data.description target="data.description" button=true owner=owner editable=editable}} +
+ + {{!-- Modifiers Tab --}} +
+
+ Modifier + Value + + + +
+ +
    + {{#each data.attributes as |attr key|}} +
  1. + + {{#if attr.isCheckbox}} + + {{else}} + + {{/if}} + + + +
  2. + {{/each}} +
+
+
+
diff --git a/templates/items/ffg-shipweapon-sheet.html b/templates/items/ffg-shipweapon-sheet.html new file mode 100644 index 00000000..34856bbc --- /dev/null +++ b/templates/items/ffg-shipweapon-sheet.html @@ -0,0 +1,100 @@ +
+
+ +
+
+

+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+ + {{!-- Sheet Tab Navigation --}} + + + {{!-- Sheet Body --}} +
+ + {{!-- Description Tab --}} +
+ {{editor content=data.description target="data.description" button=true owner=owner editable=editable}} +
+ + {{!-- Modifiers Tab --}} +
+
+ Modifier + Value + + + +
+ +
    + {{#each data.attributes as |attr key|}} +
  1. + + {{#if attr.isCheckbox}} + + {{else}} + + {{/if}} + + + +
  2. + {{/each}} +
+
+
+
diff --git a/templates/ffg-talent-sheet.html b/templates/items/ffg-talent-sheet.html similarity index 99% rename from templates/ffg-talent-sheet.html rename to templates/items/ffg-talent-sheet.html index c9436ba9..a549011e 100644 --- a/templates/ffg-talent-sheet.html +++ b/templates/items/ffg-talent-sheet.html @@ -57,7 +57,7 @@

{{else}} - + {{/if}} + Mod Type + Modifier Value - Label - Data Type
    - {{#each data.attributes as |attr key|}} + {{#each data.attributes as |attr key|}}
  1. - - {{#if attr.isCheckbox}} - - {{else}} - - {{/if}} - - + + + +
  2. - {{/each}} + {{/each}}
diff --git a/templates/actors/ffg-minion-sheet.html b/templates/actors/ffg-minion-sheet.html index d3c3b678..2e4c2fb1 100644 --- a/templates/actors/ffg-minion-sheet.html +++ b/templates/actors/ffg-minion-sheet.html @@ -114,19 +114,31 @@

Unit Wounds

{{/each}} - +
+
+ + + + +
+ +
+ + +
+
- + {{#each data.skills as |skill id|}} - +
NameGroup Skill?Group Skill Rank Roll
{{id}} {{#with (lookup ../this.data.characteristics [characteristic])~}} ({{abrev}}) {{/with}} @@ -250,41 +262,58 @@

{{item.name}}

{{editor content=data.biography target="data.biography" button=true owner=owner editable=editable}} - + Mod Type + Modifier Value - Label - Data Type
    - {{#each data.attributes as |attr key|}} + {{#each data.attributes as |attr key|}}
  1. - - {{#if attr.isCheckbox}} - - {{else}} - - {{/if}} - - + + + +
  2. - {{/each}} + {{/each}}
- --> + diff --git a/templates/actors/ffg-vehicle-sheet.html b/templates/actors/ffg-vehicle-sheet.html index 9bb0c884..6c358f83 100644 --- a/templates/actors/ffg-vehicle-sheet.html +++ b/templates/actors/ffg-vehicle-sheet.html @@ -90,9 +90,10 @@

Speed

Handling

- + {{log data.stats.handling.value}}
@@ -323,38 +324,55 @@

Pass {{!-- Modifiers Tab --}} -

- @@ -245,12 +245,13 @@

{{#each actor.items as |item id|}} {{#iff item.type '==' 'weapon'}}
  • -

    {{item.name}}

    + {{ log item }} +

    {{item.name}}
    {{item.data.description}}

    - +
    @@ -435,7 +436,7 @@

    Conf

  • - +
    @@ -278,7 +277,7 @@

    {{item.name}}

    `; - form.appendChild(newKey); - await this._onSubmit(event); - } - - // Remove existing attribute - else if ( action === "delete" ) { - const li = a.closest(".attribute"); - li.parentElement.removeChild(li); - await this._onSubmit(event); - } - } - - /** - * Listen for click events on a filter control to modify the selected filter option. - * @param {MouseEvent} event The originating left click event - * @private - */ - async _onClickFilterControl(event) { - event.preventDefault(); - const a = event.currentTarget; - const filters = this._filters.skills; - var filter = a.id; - $(a).prop("checked", true); - filters.filter = filter; - await this._onSubmit(event); - } - - /* -------------------------------------------- */ - - /** @override */ - _updateObject(event, formData) { - - // Handle the free-form attributes list - const formAttrs = expandObject(formData).data.attributes || {}; - const attributes = Object.values(formAttrs).reduce((obj, v) => { - let k = v["key"].trim(); - if ( /[\s\.]/.test(k) ) return ui.notifications.error("Attribute keys may not contain spaces or periods"); - delete v["key"]; - obj[k] = v; - return obj; - }, {}); - - // Remove attributes which are no longer used - for ( let k of Object.keys(this.object.data.data.attributes) ) { - if ( !attributes.hasOwnProperty(k) ) attributes[`-=${k}`] = null; - } - - // Re-combine formData - formData = Object.entries(formData).filter(e => !e[0].startsWith("data.attributes")).reduce((obj, e) => { - obj[e[0]] = e[1]; - return obj; - }, {_id: this.object._id, "data.attributes": attributes}); - - // Update the Actor - return this.object.update(formData); - } - - async _rollSkillManual(skill, ability, difficulty) { - const dicePool = new DicePoolFFG({ - ability: characteristic.value, - difficulty: difficulty - }); - dicePool.upgrade(skill.rank); - - if (upgradeType === "ability") { - dicePool.upgrade(); - } else if (upgradeType === "difficulty") { - dicePool.upgradeDifficulty() - } - - await this._completeRollManual(dicePool, skillName); - } - - async _rollSkill(event, upgradeType) { - const data = this.getData(); - const row = event.target.parentElement.parentElement; - const skillName = row.parentElement.dataset["ability"]; - const skill = data.data.skills[skillName]; - const characteristic = data.data.characteristics[skill.characteristic]; - - const dicePool = new DicePoolFFG({ - ability: characteristic.value, - difficulty: 2 // Default to average difficulty - }); - dicePool.upgrade(skill.rank); - - if (upgradeType === "ability") { - dicePool.upgrade(); - } else if (upgradeType === "difficulty") { - dicePool.upgradeDifficulty() - } - - await this._completeRoll(dicePool, `Rolling ${skillName}`, skillName); - } - - async _completeRoll(dicePool, description, skillName) { - const id = randomID(); - - const content = await renderTemplate("systems/starwarsffg/templates/roll-options.html", { - dicePool, - id, - }); - - new Dialog({ - title: description || "Finalize your roll", - content, - buttons: { - one: { - icon: '', - label: "Roll", - callback: () => { - const container = document.getElementById(id); - const finalPool = DicePoolFFG.fromContainer(container); - - ChatMessage.create({ - user: game.user._id, - speaker: this.getData(), - flavor: `Rolling ${skillName}...`, - content: `/sw ${finalPool.renderDiceExpression()}` - }); - } - }, - two: { - icon: '', - label: "Cancel", - } - }, - }).render(true) - } - - async _completeRollManual(dicePool, skillName) { - ChatMessage.create({ - user: game.user._id, - speaker: this.getData(), - flavor: `Rolling ${skillName}...`, - content: `/sw ${dicePool.renderDiceExpression()}` - }); - } - - _addSkillDicePool(elem) { - const data = this.getData(); - const skillName = elem.dataset["ability"]; - const skill = data.data.skills[skillName]; - const characteristic = data.data.characteristics[skill.characteristic]; - - const dicePool = new DicePoolFFG({ - ability: Math.max(characteristic.value, skill.rank), - }); - dicePool.upgrade(Math.min(characteristic.value, skill.rank)); - - const rollButton = elem.querySelector(".roll-button"); - dicePool.renderPreview(rollButton) - } -} diff --git a/modules/actors/vehicle-sheet-ffg.js b/modules/actors/vehicle-sheet-ffg.js deleted file mode 100644 index e4cdb29e..00000000 --- a/modules/actors/vehicle-sheet-ffg.js +++ /dev/null @@ -1,240 +0,0 @@ -/** - * Extend the basic ActorSheet with some very simple modifications - * @extends {ActorSheet} - */ -export class VehicleSheetFFG extends ActorSheet { - pools = new Map(); - - /** @override */ - static get defaultOptions() { - return mergeObject(super.defaultOptions, { - classes: ["worldbuilding", "sheet", "actor"], - template: "systems/starwarsffg/templates/actors/ffg-vehicle-sheet.html", - width: 710, - height: 650, - tabs: [{navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "items"}] - }); - } - - /* -------------------------------------------- */ - - /** @override */ - getData() { - const data = super.getData(); - data.dtypes = ["String", "Number", "Boolean"]; - for ( let attr of Object.values(data.data.attributes) ) { - attr.isCheckbox = attr.dtype === "Boolean"; - } - data.FFG = CONFIG.FFG; - return data; - } - - /* -------------------------------------------- */ - - /** @override */ - activateListeners(html) { - super.activateListeners(html); - - // Activate tabs - let tabs = html.find('.tabs'); - let initial = this._sheetTab; - new TabsV2(tabs, { - initial: initial, - callback: clicked => this._sheetTab = clicked.data("tab") - }); - - // Everything below here is only needed if the sheet is editable - if (!this.options.editable) return; - - // Update Inventory Item - html.find('.item-edit').click(ev => { - const li = $(ev.currentTarget).parents(".item"); - const item = this.actor.getOwnedItem(li.data("itemId")); - item.sheet.render(true); - }); - - // Delete Inventory Item - html.find('.item-delete').click(ev => { - const li = $(ev.currentTarget).parents(".item"); - this.actor.deleteOwnedItem(li.data("itemId")); - li.slideUp(200, () => this.render(false)); - }); - - // Setup dice pool image - html.find(".skill").each((_, elem) => { - this._addSkillDicePool(elem) - }); - - // Roll Skill - html.find(".roll-button").children().on("click", async (event) => { - let upgradeType = null; - if (event.ctrlKey && !event.shiftKey) { - upgradeType = "ability" - } else if (!event.ctrlKey && event.shiftKey) { - upgradeType = "difficulty"; - } - await this._rollSkill(event, upgradeType); - }); - - // Add or Remove Attribute - html.find(".attributes").on("click", ".attribute-control", this._onClickAttributeControl.bind(this)); - } - - /* -------------------------------------------- */ - - /** - * Listen for click events on an attribute control to modify the composition of attributes in the sheet - * @param {MouseEvent} event The originating left click event - * @private - */ - async _onClickAttributeControl(event) { - event.preventDefault(); - const a = event.currentTarget; - const action = a.dataset.action; - const attrs = this.object.data.data.attributes; - const form = this.form; - - // Add new attribute - if ( action === "create" ) { - const nk = Object.keys(attrs).length + 1; - let newKey = document.createElement("div"); - newKey.innerHTML = ``; - form.appendChild(newKey); - await this._onSubmit(event); - } - - // Remove existing attribute - else if ( action === "delete" ) { - const li = a.closest(".attribute"); - li.parentElement.removeChild(li); - await this._onSubmit(event); - } - } - - /* -------------------------------------------- */ - - /** @override */ - _updateObject(event, formData) { - - // Handle the free-form attributes list - const formAttrs = expandObject(formData).data.attributes || {}; - const attributes = Object.values(formAttrs).reduce((obj, v) => { - let k = v["key"].trim(); - if ( /[\s\.]/.test(k) ) return ui.notifications.error("Attribute keys may not contain spaces or periods"); - delete v["key"]; - obj[k] = v; - return obj; - }, {}); - - // Remove attributes which are no longer used - for ( let k of Object.keys(this.object.data.data.attributes) ) { - if ( !attributes.hasOwnProperty(k) ) attributes[`-=${k}`] = null; - } - - // Re-combine formData - formData = Object.entries(formData).filter(e => !e[0].startsWith("data.attributes")).reduce((obj, e) => { - obj[e[0]] = e[1]; - return obj; - }, {_id: this.object._id, "data.attributes": attributes}); - - // Update the Actor - return this.object.update(formData); - } - - async _rollSkillManual(skill, ability, difficulty) { - const dicePool = new DicePoolFFG({ - ability: characteristic.value, - difficulty: difficulty - }); - dicePool.upgrade(skill.rank); - - if (upgradeType === "ability") { - dicePool.upgrade(); - } else if (upgradeType === "difficulty") { - dicePool.upgradeDifficulty() - } - - await this._completeRollManual(dicePool, skillName); - } - - async _rollSkill(event, upgradeType) { - const data = this.getData(); - const row = event.target.parentElement.parentElement; - const skillName = row.parentElement.dataset["ability"]; - const skill = data.data.skills[skillName]; - const characteristic = data.data.characteristics[skill.characteristic]; - - const dicePool = new DicePoolFFG({ - ability: characteristic.value, - difficulty: 2 // Default to average difficulty - }); - dicePool.upgrade(skill.rank); - - if (upgradeType === "ability") { - dicePool.upgrade(); - } else if (upgradeType === "difficulty") { - dicePool.upgradeDifficulty() - } - - await this._completeRoll(dicePool, `Rolling ${skillName}`, skillName); - } - - async _completeRoll(dicePool, description, skillName) { - const id = randomID(); - - const content = await renderTemplate("systems/starwarsffg/templates/roll-options.html", { - dicePool, - id, - }); - - new Dialog({ - title: description || "Finalize your roll", - content, - buttons: { - one: { - icon: '', - label: "Roll", - callback: () => { - const container = document.getElementById(id); - const finalPool = DicePoolFFG.fromContainer(container); - - ChatMessage.create({ - user: game.user._id, - speaker: this.getData(), - flavor: `Rolling ${skillName}...`, - content: `/sw ${finalPool.renderDiceExpression()}` - }); - } - }, - two: { - icon: '', - label: "Cancel", - } - }, - }).render(true) - } - - async _completeRollManual(dicePool, skillName) { - ChatMessage.create({ - user: game.user._id, - speaker: this.getData(), - flavor: `Rolling ${skillName}...`, - content: `/sw ${dicePool.renderDiceExpression()}` - }); - } - - _addSkillDicePool(elem) { - const data = this.getData(); - const skillName = elem.dataset["ability"]; - const skill = data.data.skills[skillName]; - const characteristic = data.data.characteristics[skill.characteristic]; - - const dicePool = new DicePoolFFG({ - ability: Math.max(characteristic.value, skill.rank), - }); - dicePool.upgrade(Math.min(characteristic.value, skill.rank)); - - const rollButton = elem.querySelector(".roll-button"); - dicePool.renderPreview(rollButton) - } -} diff --git a/modules/combat-ffg.js b/modules/combat-ffg.js deleted file mode 100644 index 004c490b..00000000 --- a/modules/combat-ffg.js +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Extend the base Combat entity. - * @extends {Combat} - */ -export class CombatFFG extends Combat { - - /** - * Roll initiative for one or multiple Combatants within the Combat entity - * @param {Array|string} ids A Combatant id or Array of ids for which to roll - * @param {string|null} formula A non-default initiative formula to roll. Otherwise the system default is used. - * @param {Object} messageOptions Additional options with which to customize created Chat Messages - * @return {Promise.} A promise which resolves to the updated Combat entity once updates are complete. - /** @override */ - rollInitiative(ids, formula=null, messageOptions={}) { - console.log("This happened"); - super.rollInitiative(ids, formula=null, messageOptions={}) - } - -} diff --git a/modules/items/item-ffg.js b/modules/items/item-ffg.js new file mode 100644 index 00000000..12c50414 --- /dev/null +++ b/modules/items/item-ffg.js @@ -0,0 +1,20 @@ +/** + * Extend the basic Item with some very simple modifications. + * @extends {Item} + */ +export class ItemFFG extends Item { + /** + * Augment the basic Item data model with additional dynamic data. + */ + prepareData() { + super.prepareData(); + + // Get the Item's data + const itemData = this.data; + const actorData = this.actor ? this.actor.data : {}; + const data = itemData.data; + + itemData.safe_desc = data.description.replace(/(<([^>]+)>)/ig,""); + + } +} diff --git a/modules/items/item-sheet-ffg.js b/modules/items/item-sheet-ffg.js index 8450b3ac..e423ae72 100644 --- a/modules/items/item-sheet-ffg.js +++ b/modules/items/item-sheet-ffg.js @@ -8,7 +8,7 @@ export class ItemSheetFFG extends ItemSheet { static get defaultOptions() { return mergeObject(super.defaultOptions, { classes: ["worldbuilding", "sheet", "item"], - width: 580, + width: 640, height: 480, tabs: [{navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "description"}] }); @@ -33,7 +33,7 @@ export class ItemSheetFFG extends ItemSheet { data.FFG = CONFIG.FFG; return data; } - + /* -------------------------------------------- */ /** @override */ diff --git a/modules/swffg-config.js b/modules/swffg-config.js index cd1050b6..2df28d47 100644 --- a/modules/swffg-config.js +++ b/modules/swffg-config.js @@ -90,6 +90,15 @@ FFG.combat_skills = { "Ranged: Heavy": "Ranged: Heavy" }; +FFG.combat_skills.abrev = { + "Brawl": "B", + "Gunnery": "G", + "Lightsaber": "LS", + "Melee": "M", + "Ranged: Light": "RL", + "Ranged: Heavy": "RH" +} + FFG.activations = { "Passive": "Passive", "Active (Incidental)": "Active (Incidental)", diff --git a/modules/swffg-main.js b/modules/swffg-main.js index 51d27fb7..4cd34743 100644 --- a/modules/swffg-main.js +++ b/modules/swffg-main.js @@ -7,12 +7,10 @@ // Import Modules import { FFG } from "./swffg-config.js"; import { ActorFFG } from "./actors/actor-ffg.js"; +import { ItemFFG } from "./items/item-ffg.js"; import { ItemSheetFFG } from "./items/item-sheet-ffg.js"; -import { CharacterSheetFFG } from "./actors/character-sheet-ffg.js"; -import { MinionSheetFFG } from "./actors/minion-sheet-ffg.js"; -import { VehicleSheetFFG } from "./actors/vehicle-sheet-ffg.js"; +import { ActorSheetFFG } from "./actors/actor-sheet-ffg.js"; import { DicePoolFFG } from "./dice-pool-ffg.js"; -import { CombatFFG } from "./combat-ffg.js"; /* -------------------------------------------- */ /* Foundry VTT Initialization */ @@ -24,14 +22,14 @@ Hooks.once("init", async function() { // Place our classes in their own namespace for later reference. game.ffg = { ActorFFG, - CombatFFG + ItemFFG }; // Define custom Entity classes. This will override the default Actor // to instead use our extended version. CONFIG.Actor.entityClass = ActorFFG; - CONFIG.Combat.entityClass = CombatFFG; + CONFIG.Item.entityClass = ItemFFG; // TURN ON OR OFF HOOK DEBUGGING CONFIG.debug.hooks = false; @@ -83,18 +81,7 @@ Hooks.once("init", async function() { // Register sheet application classes Actors.unregisterSheet("core", ActorSheet); - Actors.registerSheet("ffg", CharacterSheetFFG, { - types: ["character"], - makeDefault: true - }); - Actors.registerSheet("ffg", MinionSheetFFG, { - types: ["minion"], - makeDefault: true - }); - Actors.registerSheet("ffg", VehicleSheetFFG, { - types: ["vehicle"], - makeDefault: true - }); + Actors.registerSheet("ffg", ActorSheetFFG, {makeDefault: true}); Items.unregisterSheet("core", ItemSheet); Items.registerSheet("ffg", ItemSheetFFG, {makeDefault: true}); diff --git a/styles/swffg.css b/styles/swffg.css index 69c3dfa0..fbe961aa 100644 --- a/styles/swffg.css +++ b/styles/swffg.css @@ -17,6 +17,11 @@ z-index: -500; } +.item:hover .hover { + text-decoration: underline; + text-decoration-style: double; +} + .hover:hover .tooltip { opacity:1; z-index: 500; @@ -187,10 +192,18 @@ div .container.talents { position: relative; } +.worldbuilding.sheet .attributes-list .attribute.item label { + overflow: hidden; +} + .worldbuilding.sheet .attributes-list .attribute.item:hover { background: rgb(25, 24, 19, 0.12); margin: +2px; - text-decoration: underline; +} + +.worldbuilding.sheet .talents-list .talents.item:hover { + background: rgb(25, 24, 19, 0.12); + margin: +2px; } /* Content Tabs */ @@ -260,6 +273,7 @@ sheet work. There is likely a better way to do this. } .worldbuilding.sheet .items-list .item-controls { flex: 0 0 36px; + z-index: 500; } /* Attributes */ diff --git a/system.json b/system.json index f4e51b05..0707101d 100644 --- a/system.json +++ b/system.json @@ -2,7 +2,7 @@ "name": "starwarsffg", "title": "Star Wars FFG", "description": "A system for playing Star Wars FFG games.", - "version": 0.041, + "version": 0.042, "minimumCoreVersion": "0.5.5", "compatibleCoreVersion": "0.5.6", "templateVersion": 1, @@ -25,6 +25,6 @@ "secondaryTokenAttribute": "strain", "url": "https://github.com/Esrin/StarWarsFFG/tree/esrin-dev", "manifest": "https://raw.githubusercontent.com/Esrin/StarWarsFFG/esrin-dev/system.json", - "download": "https://github.com/Esrin/StarWarsFFG/releases/download/esrin-dev_0.041/esrin-dev_0.041.zip", + "download": "https://github.com/Esrin/StarWarsFFG/releases/download/esrin-dev_0.042_/esrin-dev_0.042.zip", "license": "LICENSE.txt" } diff --git a/template.json b/template.json index fcb4b8ba..e0e894f1 100644 --- a/template.json +++ b/template.json @@ -524,7 +524,6 @@ "templates": { "basic": { "description": "", - "safe_desc": "", "quantity": { "value": 1, "type": "Number", diff --git a/templates/actors/ffg-character-sheet.html b/templates/actors/ffg-character-sheet.html index 45442b77..e3d259e2 100644 --- a/templates/actors/ffg-character-sheet.html +++ b/templates/actors/ffg-character-sheet.html @@ -239,23 +239,22 @@

    Crit Special Encum - Edit + Del
      {{#each actor.items as |item id|}} {{#iff item.type '==' 'weapon'}}
    1. - {{ log item }} -

      {{item.name}}
      {{item.data.description}}

      - +

      {{item.name}}
      {{item.safe_desc}}

      + -
      - - +
      + +
    2. {{/iff}} @@ -272,20 +271,20 @@

      Soak HP Encum - Edit + Del
        {{#each actor.items as |item id|}} {{#iff item.type '==' 'armour'}}
      1. -

        {{item.name}}

        +

        {{item.name}}
        {{item.safe_desc}}

        -
        - - +
        + +
      2. {{/iff}} @@ -302,20 +301,20 @@

        Rarity Quantity Encum - Edit + Del
          {{#each actor.items as |item id|}} {{#iff item.type '==' 'gear'}}
        1. -

          {{item.name}}

          +

          {{item.name}}
          {{item.safe_desc}}

          -
          - - +
          + +
        2. {{/iff}} @@ -335,22 +334,22 @@

          Name Activation Rank - Edit + Del
            {{#each actor.items as |item id|}} {{#iff item.type '==' 'talent'}}
          1. -

            {{item.name}}

            +

            {{item.name}}
            {{item.safe_desc}}

            {{#if item.data.ranks.ranked}} {{else}} {{/if}} -
            - - +
            + +
          2. {{/iff}} diff --git a/templates/actors/ffg-minion-sheet.html b/templates/actors/ffg-minion-sheet.html index cdd8d603..f7630b31 100644 --- a/templates/actors/ffg-minion-sheet.html +++ b/templates/actors/ffg-minion-sheet.html @@ -161,6 +161,11 @@

            Unit Wounds

            {{!-- Owned Items Tab --}}
            + {{!-- Credits Box --}} +
            +
            + {{!-- Weapons List --}}

            @@ -172,22 +177,22 @@

            Crit Special Encum - Edit + Del
              {{#each actor.items as |item id|}} {{#iff item.type '==' 'weapon'}}
            1. -

              {{item.name}}

              - +

              {{item.name}}
              {{item.safe_desc}}

              + - + -
              - - +
              + +
            2. {{/iff}} @@ -204,20 +209,20 @@

              Soak HP Encum - Edit + Del
                {{#each actor.items as |item id|}} {{#iff item.type '==' 'armour'}}
              1. -

                {{item.name}}

                +

                {{item.name}}
                {{item.safe_desc}}

                -
                - - +
                + +
              2. {{/iff}} @@ -234,26 +239,27 @@

                Rarity Quantity Encum - Edit + Del
                  {{#each actor.items as |item id|}} {{#iff item.type '==' 'gear'}}
                1. -

                  {{item.name}}

                  +

                  {{item.name}}
                  {{item.safe_desc}}

                  -
                  - - +
                  + +
                2. {{/iff}} {{/each}}
            +
            {{!-- Biography Tab --}} diff --git a/templates/actors/ffg-vehicle-sheet.html b/templates/actors/ffg-vehicle-sheet.html index f67b932f..83f86f6a 100644 --- a/templates/actors/ffg-vehicle-sheet.html +++ b/templates/actors/ffg-vehicle-sheet.html @@ -168,21 +168,21 @@

            Range Crit Special - Edit + Del
              {{#each actor.items as |item id|}} {{#iff item.type '==' 'shipweapon'}}
            1. -

              {{item.name}}

              +

              {{item.name}}
              {{item.safe_desc}}

              - +
              - +
            2. {{/iff}} @@ -196,17 +196,17 @@

              Name Hardpoints Required - Edit + Del
                {{#each actor.items as |item id|}} {{#iff item.type '==' 'shipattachment'}}
              1. -

                {{item.name}}

                +

                {{item.name}}
                {{item.safe_desc}}

                - +
              2. {{/iff}} @@ -223,7 +223,7 @@

                Rarity Quantity Encum - Edit + Del
                  {{#each actor.items as |item id|}} @@ -231,14 +231,14 @@

                  {{#iff item.type '!=' 'shipattachment'}} {{#iff item.type '!=' 'talent'}}
                1. -

                  {{item.name}}

                  +

                  {{item.name}}
                  {{item.safe_desc}}

                  - +
                2. {{/iff}} From 2968eaa32f1b0574a2f34c691647fa9f351d95ba Mon Sep 17 00:00:00 2001 From: Esrin Date: Wed, 13 May 2020 20:41:44 +0100 Subject: [PATCH 10/44] Sheet design tweaks. --- README.md | 1 + modules/actors/actor-sheet-ffg.js | 1 - modules/items/item-sheet-ffg.js | 4 +- styles/swffg.css | 52 ++-- system.json | 4 +- templates/actors/ffg-character-sheet.html | 346 +++++++++++----------- templates/actors/ffg-minion-sheet.html | 6 +- templates/actors/ffg-vehicle-sheet.html | 14 +- 8 files changed, 218 insertions(+), 210 deletions(-) diff --git a/README.md b/README.md index 9c99241f..a6da090e 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ https://raw.githubusercontent.com/Esrin/StarWarsFFG/esrin-dev/system.json 5. Click Install, after a few seconds the system should be installed. # Changelog +* 13/05/2020 - Esrin - Continued sheet design tweaks. * 12/05/2020 - Esrin - Reworked actorsheet entities back down to a single entity with dynamic options based on actor.type. Now much easier to maintain in single place. * 12/05/2020 - Esrin - First pass at improvements to inventory display to show more info on hover of certain areas (hover name for description, hover special for full text, etc). Still much more styling and layout work needed for sheets in general. * 11/05/2020 - Esrin - First pass on some quality of life improvements to the inventory display (work in progress). Minor bugfixes. diff --git a/modules/actors/actor-sheet-ffg.js b/modules/actors/actor-sheet-ffg.js index 349a8bf7..a60fefd2 100644 --- a/modules/actors/actor-sheet-ffg.js +++ b/modules/actors/actor-sheet-ffg.js @@ -43,7 +43,6 @@ export class ActorSheetFFG extends ActorSheet { attr.isCheckbox = attr.dtype === "Boolean"; } data.FFG = CONFIG.FFG; - console.log(this); switch(this.actor.data.type) { case 'character': this.position.width = 600; diff --git a/modules/items/item-sheet-ffg.js b/modules/items/item-sheet-ffg.js index e423ae72..175d08b4 100644 --- a/modules/items/item-sheet-ffg.js +++ b/modules/items/item-sheet-ffg.js @@ -8,8 +8,8 @@ export class ItemSheetFFG extends ItemSheet { static get defaultOptions() { return mergeObject(super.defaultOptions, { classes: ["worldbuilding", "sheet", "item"], - width: 640, - height: 480, + width: 784, + height: 484, tabs: [{navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "description"}] }); } diff --git a/styles/swffg.css b/styles/swffg.css index fbe961aa..24bb9226 100644 --- a/styles/swffg.css +++ b/styles/swffg.css @@ -1,5 +1,6 @@ .window-app .window-content { background: #f2f2f2; + font-size: 9pt; } .tooltip { @@ -86,7 +87,8 @@ table thead th { div .container { width: 100%; height: auto; - margin-bottom: 10px; + display: flex; + flex-wrap: wrap; } div .container.attributes { @@ -114,7 +116,8 @@ div .container.talents { .worldbuilding.sheet .profile-img { flex: 0 0 100px; - height: 100px; + height: 110px; + width: auto; margin-right: 10px; } @@ -125,14 +128,12 @@ div .container.talents { .worldbuilding.sheet .charname { border-bottom: 0; - display: inline-grid; - padding: 5px; + display: flex; } .worldbuilding.sheet .charname.minion { border-bottom: 0; - display: inline; - padding: 5px; + display: flex; } .worldbuilding.sheet .charname input { @@ -142,7 +143,8 @@ div .container.talents { .worldbuilding.sheet .resource { height: 40px; - padding: 5px; + padding-bottom: 4px; + padding-left: 2px; margin: 0; display: inline-table; } @@ -153,17 +155,19 @@ div .container.talents { } .worldbuilding.sheet .xp-box { - position: absolute; + position: absolute; padding: 0; - right: 10px; - height: 40px; + left: 5px; + height: auto; margin: 0; - display: inline-table; + bottom: 6px; + font-size: smaller; + display: flex; } .worldbuilding.sheet .xp-box input { - width: 68px; - height: 22px; + width: 61px; + height: 14px; } .worldbuilding.sheet .resource.small input { @@ -208,17 +212,23 @@ div .container.talents { /* Content Tabs */ .worldbuilding.sheet .sheet-body { - height: calc(100% - 22.7em); + height: calc(100% - 22em); overflow: auto; + border: 1px solid #868686; } .worldbuilding.sheet .sheet-body.minion { - height: calc(100% - 11.5em); + height: calc(100% - 12.5em); + overflow: auto; +} + +.worldbuilding.sheet .sheet-body.vehicle { + height: calc(100% - 22.5em); overflow: auto; } .worldbuilding.sheet .sheet-body.small { - height: calc(100% - 14em); + height: calc(100% - 16em); overflow: auto; } @@ -399,7 +409,7 @@ boxes at the top of the standard FFG character sheets. font-size: 100%; text-align: center; color: #fff; - border-radius: 15px 15px 5px 5px; + border-radius: 50px 50px 0px 0px; background: #435a76; padding: 0; margin: 0; @@ -425,7 +435,7 @@ boxes at the top of the standard FFG character sheets. color: #fff; font-weight: bold; background: #652825; - border-radius: 5px 0px 0px 15px; + border-radius: 0px 0px 0px 50px; text-align: center; } @@ -435,7 +445,7 @@ boxes at the top of the standard FFG character sheets. color: #000; font-weight: bold; background: #90cbdd; - border-radius: 0px 5px 15px 0px; + border-radius: 0px 0px 50px 0px; text-align: center; } @@ -445,7 +455,7 @@ boxes at the top of the standard FFG character sheets. color: #000; font-weight: bold; background: #90cbdd; - border-radius: 5px 5px 15px 15px; + border-radius: 0px 0px 50px 50px; text-align: center; } @@ -455,7 +465,7 @@ boxes at the top of the standard FFG character sheets. color: #90cbdd; font-weight: bold; background: #90cbdd; - border-radius: 5px 5px 15px 15px; + border-radius: 0px 0px 50px 50px; text-align: center; } diff --git a/system.json b/system.json index 0707101d..f4f02b08 100644 --- a/system.json +++ b/system.json @@ -2,7 +2,7 @@ "name": "starwarsffg", "title": "Star Wars FFG", "description": "A system for playing Star Wars FFG games.", - "version": 0.042, + "version": 0.043, "minimumCoreVersion": "0.5.5", "compatibleCoreVersion": "0.5.6", "templateVersion": 1, @@ -25,6 +25,6 @@ "secondaryTokenAttribute": "strain", "url": "https://github.com/Esrin/StarWarsFFG/tree/esrin-dev", "manifest": "https://raw.githubusercontent.com/Esrin/StarWarsFFG/esrin-dev/system.json", - "download": "https://github.com/Esrin/StarWarsFFG/releases/download/esrin-dev_0.042_/esrin-dev_0.042.zip", + "download": "https://github.com/Esrin/StarWarsFFG/releases/download/esrin-dev_0.043/esrin-dev_0.043.zip", "license": "LICENSE.txt" } diff --git a/templates/actors/ffg-character-sheet.html b/templates/actors/ffg-character-sheet.html index e3d259e2..cda5d77b 100644 --- a/templates/actors/ffg-character-sheet.html +++ b/templates/actors/ffg-character-sheet.html @@ -2,8 +2,9 @@ {{!-- Sheet Header --}}
                  - {{!-- XP Box --}} + {{!-- Footer info --}}
                  + {{!-- XP Box --}}

                  XP

                  @@ -20,133 +21,190 @@

                  XP

                  - - - - - -
                  - {{!-- Character Name and Player --}} -
                  -
                  -
                  -
                  + {{!-- Credits Box --}} +
                  +
                  +
                  +

                  Credits

                  +
                  +
                  +
                  - {{!-- Wounds and Strain Container --}} -
                  - {{!-- Wounds Box --}} -
                  -
                  -

                  Wounds

                  + {{!-- Obligation Box --}} +
                  +

                  Obligation

                  -
                  - - -
                  -
                  -
                  - - +
                  +
                  -
                  -
                  +
                  - {{!-- Strain Box --}} -
                  -
                  -

                  Strain

                  + {{!-- Duty Box --}} +
                  +

                  Duty

                  -
                  - - -
                  -
                  -
                  - - -
                  +
                  + +
                  -
                  -
                  - {{!-- Encumbrance Box --}} -
                  -
                  -

                  Encum

                  -
                  -
                  - - -
                  +
                  + + {{!-- Morality Box --}} +
                  +

                  Morality

                  +
                  +
                  +
                  +
                  -
                  -
                  - - {{!-- Soak, Defence and Force container --}} -
                  - {{!-- Soak Box --}} -
                  -
                  -

                  Soak

                  + + {{!-- Conflict Box --}} +
                  +

                  Conflict

                  -
                  - - -
                  +
                  + +
                  +
                  +
                  -
                  - {{!-- Defence Box --}} -
                  -
                  -

                  Defence

                  -
                  -
                  - - -
                  -
                  -
                  - - + + +
                  + + {{!-- Character Details Container --}} +
                  + + + +
                  + + {{!-- Primary Stats Container --}} +
                  + +
                  + {{!-- Wounds Box --}} +
                  +
                  +

                  Wounds

                  +
                  +
                  + + +
                  +
                  +
                  + + +
                  -
                  - {{!-- Force Box --}} -
                  -
                  -

                  Force Pool

                  -
                  -
                  - - -
                  -
                  -
                  - - + {{!-- Strain Box --}} +
                  +
                  +

                  Strain

                  +
                  +
                  + + +
                  +
                  +
                  + + +
                  +
                  + + {{!-- Soak Box --}} +
                  +
                  +

                  Soak

                  +
                  +
                  + + +
                  +
                  +
                  +
                  + + {{!-- Defence Box --}} +
                  +
                  +

                  Defence

                  +
                  +
                  + + +
                  +
                  +
                  + + +
                  +
                  +
                  +
                  + + {{!-- Force Box --}} +
                  +
                  +

                  Force Pool

                  +
                  +
                  + + +
                  +
                  +
                  + + +
                  +
                  +
                  +
                  + + {{!-- Encumbrance Box --}} +
                  +
                  +

                  Encum

                  +
                  +
                  + + +
                  +
                  +
                  +
                  +
                  -
                  - + {{!-- Sheet Tab Navigation --}} {{!-- Sheet Body --}} -
                  +
                  {{!-- Owned Items Tab --}}
                  {{!-- Ship Weapons List --}} -
                  -

                  +
                  +

                  Name Firing Arc @@ -191,8 +191,8 @@

                  {{item.name}}
                  {{item.safe_desc}}
                  {{!-- Ship Attachments List --}} -
                  -

                  +
                  +

                  Name Hardpoints Required @@ -215,8 +215,8 @@

                  {{item.name}}
                  {{item.safe_desc}}
                  {{!-- Cargo Hold --}} -
                  -

                  +
                  +

                  Name Price From 5f14532f0430b2ea40db1cf4aa185a3bfbcacffe Mon Sep 17 00:00:00 2001 From: Esrin Date: Thu, 14 May 2020 18:47:24 +0100 Subject: [PATCH 11/44] Minor sheet tweaks. --- modules/actors/actor-sheet-ffg.js | 2 +- modules/swffg-config.js | 10 + styles/swffg.css | 34 ++- system.json | 4 +- templates/actors/ffg-character-sheet.html | 285 ++++++++++++++-------- templates/actors/ffg-minion-sheet.html | 133 ++++++++-- 6 files changed, 328 insertions(+), 140 deletions(-) diff --git a/modules/actors/actor-sheet-ffg.js b/modules/actors/actor-sheet-ffg.js index a60fefd2..3a6391be 100644 --- a/modules/actors/actor-sheet-ffg.js +++ b/modules/actors/actor-sheet-ffg.js @@ -45,7 +45,7 @@ export class ActorSheetFFG extends ActorSheet { data.FFG = CONFIG.FFG; switch(this.actor.data.type) { case 'character': - this.position.width = 600; + this.position.width = 610; this.position.height = 840; break; case 'minion': diff --git a/modules/swffg-config.js b/modules/swffg-config.js index 2df28d47..15bc0141 100644 --- a/modules/swffg-config.js +++ b/modules/swffg-config.js @@ -57,6 +57,16 @@ FFG.skills = { "Knowledge: Xenology": "Knowledge: Xenology" }; +FFG.skills.knowledgestripped = { + "Knowledge: Core Worlds": "Core Worlds", + "Knowledge: Education": "Education", + "Knowledge: Lore": "Lore", + "Knowledge: Outer Rim": "Outer Rim", + "Knowledge: Underworld": "Underworld", + "Knowledge: Warfare": "Warfare", + "Knowledge: Xenology": "Xenology" +} + FFG.ranges = { "Engaged": "Engaged", "Short": "Short", diff --git a/styles/swffg.css b/styles/swffg.css index 24bb9226..778dee25 100644 --- a/styles/swffg.css +++ b/styles/swffg.css @@ -3,6 +3,14 @@ font-size: 9pt; } +.tableWithHeader { + overflow-y: auto; + margin: -1px; + height: calc(100% - 6em); + display: flex; + margin-top: -5px; +} + .tooltip { top:30px; background-color:rgb(25, 24, 19, 0.8); @@ -89,6 +97,7 @@ div .container { height: auto; display: flex; flex-wrap: wrap; + font-size: 11pt; } div .container.attributes { @@ -116,9 +125,12 @@ div .container.talents { .worldbuilding.sheet .profile-img { flex: 0 0 100px; - height: 110px; + height: 124px; width: auto; + max-width: 124px; margin-right: 10px; + margin-left: 10px; + border-radius: 15px; } .worldbuilding.sheet .header-fields { @@ -157,10 +169,10 @@ div .container.talents { .worldbuilding.sheet .xp-box { position: absolute; padding: 0; - left: 5px; + left: 25px; height: auto; margin: 0; - bottom: 6px; + bottom: 10px; font-size: smaller; display: flex; } @@ -180,6 +192,7 @@ div .container.talents { flex: 0 0 40px; border-top: 1px solid #AAA; border-bottom: 1px solid #AAA; + margin-top: 3px; } .worldbuilding.sheet .tabs .item { @@ -212,7 +225,7 @@ div .container.talents { /* Content Tabs */ .worldbuilding.sheet .sheet-body { - height: calc(100% - 22em); + height: calc(100% - 19em); overflow: auto; border: 1px solid #868686; } @@ -287,9 +300,13 @@ sheet work. There is likely a better way to do this. } /* Attributes */ +.worldbuilding.sheet .attributes { + margin: 0 5px 0 5px; +} + .worldbuilding.sheet .attributes-header { padding: 5px; - margin: 5px 0; + margin: 0 0 5px 0; background: rgba(0, 0, 0, 0.05); border: 1px solid #AAA; border-radius: 2px; @@ -330,6 +347,10 @@ sheet work. There is likely a better way to do this. } /* Talents */ +.worldbuilding.sheet .talents { + margin: 0 5px 0 5px; +} + .worldbuilding.sheet .talents-header { padding: 5px; margin: 5px 0; @@ -364,6 +385,7 @@ sheet work. There is likely a better way to do this. .worldbuilding.sheet .characteristics-list { list-style: none; + box-shadow: 0px 1px 1px 0px #999; } .worldbuilding.sheet .characteristics-list input { @@ -392,7 +414,7 @@ boxes at the top of the standard FFG character sheets. */ .split-box { border: 2px solid black; - border-radius: 15px; + border-radius: 19px; width: max-content; } diff --git a/system.json b/system.json index f4f02b08..e16a7e93 100644 --- a/system.json +++ b/system.json @@ -2,7 +2,7 @@ "name": "starwarsffg", "title": "Star Wars FFG", "description": "A system for playing Star Wars FFG games.", - "version": 0.043, + "version": 0.0435, "minimumCoreVersion": "0.5.5", "compatibleCoreVersion": "0.5.6", "templateVersion": 1, @@ -25,6 +25,6 @@ "secondaryTokenAttribute": "strain", "url": "https://github.com/Esrin/StarWarsFFG/tree/esrin-dev", "manifest": "https://raw.githubusercontent.com/Esrin/StarWarsFFG/esrin-dev/system.json", - "download": "https://github.com/Esrin/StarWarsFFG/releases/download/esrin-dev_0.043/esrin-dev_0.043.zip", + "download": "https://github.com/Esrin/StarWarsFFG/releases/download/esrin-dev_0.043/esrin-dev_0.0435.zip", "license": "LICENSE.txt" } diff --git a/templates/actors/ffg-character-sheet.html b/templates/actors/ffg-character-sheet.html index cda5d77b..cf5e909a 100644 --- a/templates/actors/ffg-character-sheet.html +++ b/templates/actors/ffg-character-sheet.html @@ -2,80 +2,6 @@ {{!-- Sheet Header --}}
                  - {{!-- Footer info --}} -
                  - {{!-- XP Box --}} -
                  -

                  XP

                  -
                  -
                  - - -
                  -
                  -
                  - - -
                  -
                  -
                  - - {{!-- Credits Box --}} -
                  -
                  -
                  -

                  Credits

                  -
                  -
                  -
                  - - {{!-- Obligation Box --}} -
                  -

                  Obligation

                  -
                  -
                  - -
                  -
                  -
                  - - {{!-- Duty Box --}} -
                  -

                  Duty

                  -
                  -
                  - -
                  -
                  -
                  - - {{!-- Morality Box --}} -
                  -

                  Morality

                  -
                  -
                  - -
                  -
                  -
                  - - {{!-- Conflict Box --}} -
                  -

                  Conflict

                  -
                  -
                  - -
                  -
                  -
                  - -
                  @@ -217,35 +143,74 @@

                  Encum

                  {{!-- Sheet Body --}}
                  - {{!-- Characteristics Tab --}} -
                  - - {{!-- Characteristics Scores --}} - -
                    - {{#each data.characteristics as |characteristic id|}} -
                  • - {{!-- If we set the type to text, we don't have to deal with hiding the number controls --}} - - -
                  • - {{/each}} -
                  -
                  -
                  - - - - -
                  - -
                  - - -
                  -
                  + {{!-- Characteristics Tab --}} +
                  + + {{!-- Characteristics Scores --}} + +
                    + {{#each data.characteristics as |characteristic id|}} +
                  • + {{!-- If we set the type to text, we don't have to deal with hiding the number controls --}} + + +
                  • + {{/each}} +
                  + +
                  +
                  + +

                  General

                  + + + + + + + + + + {{#each data.skills as |skill id|}} + {{#iff skill.type '==' 'General'}} + + + + + + + {{/iff}} + {{/each}} + +
                  NameCareer SkillRankRoll
                  {{id}} {{#with (lookup ../this.data.characteristics [characteristic])~}} + ({{abrev}}) + {{/with}} + + + + + + +
                  +
                  +
                  +
                  +

                  Combat

                  @@ -256,6 +221,7 @@

                  Encum

                  {{#each data.skills as |skill id|}} + {{#iff skill.type '==' 'Combat'}} + {{/iff}} {{/each}}
                  Name
                  {{id}} {{#with (lookup ../this.data.characteristics [characteristic])~}} ({{abrev}}) @@ -273,9 +239,46 @@

                  Encum

                  + +

                  Knowledge

                  + + + + + + + + + + {{#each data.skills as |skill id|}} + {{#iff skill.type '==' 'Knowledge'}} + + + + + + + {{/iff}} + {{/each}} + +
                  NameCareer SkillRankRoll
                  {{lookup ../this.FFG.skills.knowledgestripped [id]~}} {{#with (lookup ../this.data.characteristics [characteristic])~}} + ({{abrev}}) + {{/with}} + + + + + + +
                  +
                  +
                  +
                  {{!-- Owned Items Tab --}} @@ -413,8 +416,82 @@

                  {{item.name}}
                  {{item.safe_desc}} {{!-- Biography Tab --}} -
                  +
                  {{editor content=data.biography target="data.biography" button=true owner=owner editable=editable}} + {{!-- Footer info --}} +
                  + {{!-- XP Box --}} +
                  +

                  XP

                  +
                  +
                  + + +
                  +
                  +
                  + + +
                  +
                  +
                  + + {{!-- Credits Box --}} +
                  +
                  +
                  +

                  Credits

                  +
                  +
                  +
                  + + {{!-- Obligation Box --}} +
                  +

                  Obligation

                  +
                  +
                  + +
                  +
                  +
                  + + {{!-- Duty Box --}} +
                  +

                  Duty

                  +
                  +
                  + +
                  +
                  +
                  + + {{!-- Morality Box --}} +
                  +

                  Morality

                  +
                  +
                  + +
                  +
                  +
                  + + {{!-- Conflict Box --}} +
                  +

                  Conflict

                  +
                  +
                  + +
                  +
                  +
                  + +
                  {{!-- Modifiers Tab --}} @@ -462,7 +539,7 @@

                  {{item.name}}
                  {{item.safe_desc}} {{/iff}} {{/select}} - + diff --git a/templates/actors/ffg-minion-sheet.html b/templates/actors/ffg-minion-sheet.html index 1a88f98a..a74bc926 100644 --- a/templates/actors/ffg-minion-sheet.html +++ b/templates/actors/ffg-minion-sheet.html @@ -99,35 +99,74 @@

                  Unit Wounds

                  {{!-- Sheet Body --}}
                  - {{!-- Characteristics Tab --}} -
                  + {{!-- Characteristics Tab --}} +
                  - {{!-- Characteristics Scores --}} + {{!-- Characteristics Scores --}} -
                    - {{#each data.characteristics as |characteristic id|}} -
                  • - {{!-- If we set the type to text, we don't have to deal with hiding the number controls --}} - - -
                  • - {{/each}} -
                  -
                  -
                  - - - - -
                  - -
                  - - -
                  -
                  +
                    + {{#each data.characteristics as |characteristic id|}} +
                  • + {{!-- If we set the type to text, we don't have to deal with hiding the number controls --}} + + +
                  • + {{/each}} +
                  + +
                  +
                  + +

                  General

                  + + + + + + + + + + {{#each data.skills as |skill id|}} + {{#iff skill.type '==' 'General'}} + + + + + + + {{/iff}} + {{/each}} + +
                  NameGroup SkillRankRoll
                  {{id}} {{#with (lookup ../this.data.characteristics [characteristic])~}} + ({{abrev}}) + {{/with}} + + + + + + +
                  +
                  +
                  +
                  +

                  Combat

                  @@ -138,6 +177,7 @@

                  Unit Wounds

                  {{#each data.skills as |skill id|}} + {{#iff skill.type '==' 'Combat'}} + {{/iff}} {{/each}}
                  Name
                  {{id}} {{#with (lookup ../this.data.characteristics [characteristic])~}} ({{abrev}}) @@ -147,15 +187,54 @@

                  Unit Wounds

                  - + +
                  + +

                  Knowledge

                  + + + + + + + + + + {{#each data.skills as |skill id|}} + {{#iff skill.type '==' 'Knowledge'}} + + + + + + + {{/iff}} + {{/each}} + +
                  NameGroup SkillRankRoll
                  {{lookup ../this.FFG.skills.knowledgestripped [id]~}} {{#with (lookup ../this.data.characteristics [characteristic])~}} + ({{abrev}}) + {{/with}} + + + + + + +
                  +
                  +
                  +
                  {{!-- Owned Items Tab --}} From db6cd402e13ae2084536ad067240e86d92ca9d1b Mon Sep 17 00:00:00 2001 From: Esrin Date: Mon, 18 May 2020 13:12:11 +0100 Subject: [PATCH 12/44] A very hacky method has been introduced to allow the built in FoundryVTT combat tracker to roll initiative using FFG dice results. The resulting number is made up of successes and advantages. For example 1 success and 2 advantage would result in 1.02 for the initiative tracker. Warning, there might be bugs with this solution! Initiative can be switched between Vigilance and Cool via the System Settings section of the world configuration. --- README.md | 1 + modules/actors/actor-sheet-ffg.js | 13 ++-- modules/combat-ffg.js | 69 ++++++++++++++++++++ modules/swffg-main.js | 78 +++++++++++++++++++++-- styles/swffg.css | 9 ++- system.json | 10 +-- templates/actors/ffg-character-sheet.html | 2 +- 7 files changed, 160 insertions(+), 22 deletions(-) create mode 100644 modules/combat-ffg.js diff --git a/README.md b/README.md index a6da090e..b4a19481 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ https://raw.githubusercontent.com/Esrin/StarWarsFFG/esrin-dev/system.json 5. Click Install, after a few seconds the system should be installed. # Changelog +* 18/05/2020 - Esrin - A very hacky method has been introduced to allow the built in FoundryVTT combat tracker to roll initiative using FFG dice results. The resulting number is made up of successes and advantages. For example 1 success and 2 advantage would result in 1.02 for the initiative tracker. Warning, there might be bugs with this solution! Initiative can be switched between Vigilance and Cool via the System Settings section of the world configuration. * 13/05/2020 - Esrin - Continued sheet design tweaks. * 12/05/2020 - Esrin - Reworked actorsheet entities back down to a single entity with dynamic options based on actor.type. Now much easier to maintain in single place. * 12/05/2020 - Esrin - First pass at improvements to inventory display to show more info on hover of certain areas (hover name for description, hover special for full text, etc). Still much more styling and layout work needed for sheets in general. diff --git a/modules/actors/actor-sheet-ffg.js b/modules/actors/actor-sheet-ffg.js index 3a6391be..c3eed161 100644 --- a/modules/actors/actor-sheet-ffg.js +++ b/modules/actors/actor-sheet-ffg.js @@ -232,17 +232,10 @@ export class ActorSheetFFG extends ActorSheet { async _rollSkillManual(skill, ability, difficulty) { const dicePool = new DicePoolFFG({ - ability: characteristic.value, + ability: ability, difficulty: difficulty }); - dicePool.upgrade(skill.rank); - - if (upgradeType === "ability") { - dicePool.upgrade(); - } else if (upgradeType === "difficulty") { - dicePool.upgradeDifficulty() - } - + dicePool.upgrade(skill); await this._completeRollManual(dicePool, skillName); } @@ -291,6 +284,7 @@ export class ActorSheetFFG extends ActorSheet { user: game.user._id, speaker: this.getData(), flavor: `Rolling ${skillName}...`, + sound: CONFIG.sounds.dice, content: `/sw ${finalPool.renderDiceExpression()}` }); } @@ -308,6 +302,7 @@ export class ActorSheetFFG extends ActorSheet { user: game.user._id, speaker: this.getData(), flavor: `Rolling ${skillName}...`, + sound: CONFIG.sounds.dice, content: `/sw ${dicePool.renderDiceExpression()}` }); } diff --git a/modules/combat-ffg.js b/modules/combat-ffg.js new file mode 100644 index 00000000..e17e35af --- /dev/null +++ b/modules/combat-ffg.js @@ -0,0 +1,69 @@ +/** + * Extend the base Combat entity. + * @extends {Combat} + */ +export class CombatFFG extends Combat { + + /** @override */ + _getInitiativeRoll(combatant, formula) { + const cData = combatant.actor.data.data; + const origFormula = formula; + + if (combatant.actor.data.type === "vehicle") { return new Roll("0"); } + + if (formula === "Vigilance") { + formula = _getInitiativeFormula(cData.skills.Vigilance.rank, cData.characteristics.Willpower.value, 0); + } + else if (formula === "Cool") { + formula = _getInitiativeFormula(cData.skills.Cool.rank, cData.characteristics.Presence.value, 0); + } + + const rollData = combatant.actor ? combatant.actor.getRollData() : {}; + const letters = formula.split(''); + const rolls = []; + const getSuc = new RegExp('Successes: ([0-9]+)', 'g'); + const getAdv = new RegExp('Advantages: ([0-9]+)', 'g'); + + for (const letter of letters) { + rolls.push(game.ffg.StarWars.letterToRolls(letter, 1)); + } + + let newformula = combineAll(rolls, game.ffg.StarWars.rollValuesMonoid); + + let rolling = game.specialDiceRoller.starWars.roll(newformula); + + let results = game.specialDiceRoller.starWars.formatRolls(rolling); + + let success = 0; + let advantage = 0; + + success = getSuc.exec(results); + if (success) { success = success[1]; } + advantage = getAdv.exec(results); + if (advantage) { advantage = advantage[1]; } + + let total = +success+(advantage*0.01); + + console.log(`Total is: ${total}`); + + let roll = new Roll(origFormula, rollData).roll(); + roll._result = total; + roll._total = total; + + return roll; + } +} + +function combineAll(values, monoid) { + return values + .reduce((prev, curr) => monoid.combine(prev, curr), monoid.identity); +} + +function _getInitiativeFormula(skill, ability, difficulty) { + const dicePool = new DicePoolFFG({ + ability: ability, + difficulty: difficulty + }); + dicePool.upgrade(skill); + return dicePool.renderDiceExpression(); +} diff --git a/modules/swffg-main.js b/modules/swffg-main.js index 4cd34743..9cad6cfa 100644 --- a/modules/swffg-main.js +++ b/modules/swffg-main.js @@ -7,6 +7,7 @@ // Import Modules import { FFG } from "./swffg-config.js"; import { ActorFFG } from "./actors/actor-ffg.js"; +import { CombatFFG } from "./combat-ffg.js"; import { ItemFFG } from "./items/item-ffg.js"; import { ItemSheetFFG } from "./items/item-sheet-ffg.js"; import { ActorSheetFFG } from "./actors/actor-sheet-ffg.js"; @@ -22,14 +23,68 @@ Hooks.once("init", async function() { // Place our classes in their own namespace for later reference. game.ffg = { ActorFFG, - ItemFFG + ItemFFG, + CombatFFG }; + game.ffg.StarWars = game.specialDiceRoller.starWars.parsers[0]; // Define custom Entity classes. This will override the default Actor // to instead use our extended version. CONFIG.Actor.entityClass = ActorFFG; CONFIG.Item.entityClass = ItemFFG; + CONFIG.Combat.entityClass = CombatFFG; + + + // A very hacky temporary workaround to override how initiative functions and provide the results of a FFG roll to the initiative tracker. + /** @override */ + Combat.prototype._getInitiativeRoll = function(combatant, formula) { + const cData = combatant.actor.data.data; + const origFormula = formula; + + if (combatant.actor.data.type === "vehicle") { return new Roll("0"); } + + if (formula === "Vigilance") { + formula = _getInitiativeFormula(cData.skills.Vigilance.rank, cData.characteristics.Willpower.value, 0); + } + else if (formula === "Cool") { + formula = _getInitiativeFormula(cData.skills.Cool.rank, cData.characteristics.Presence.value, 0); + } + + const rollData = combatant.actor ? combatant.actor.getRollData() : {}; + const letters = formula.split(''); + const rolls = []; + const getSuc = new RegExp('Successes: ([0-9]+)', 'g'); + const getAdv = new RegExp('Advantages: ([0-9]+)', 'g'); + + for (const letter of letters) { + rolls.push(game.ffg.StarWars.letterToRolls(letter, 1)); + } + + let newformula = combineAll(rolls, game.ffg.StarWars.rollValuesMonoid); + + let rolling = game.specialDiceRoller.starWars.roll(newformula); + + let results = game.specialDiceRoller.starWars.formatRolls(rolling); + + let success = 0; + let advantage = 0; + + success = getSuc.exec(results); + if (success) { success = success[1]; } + advantage = getAdv.exec(results); + if (advantage) { advantage = advantage[1]; } + + let total = +success+(advantage*0.01); + + console.log(`Total is: ${total}`); + + let roll = new Roll(origFormula, rollData).roll(); + roll._result = total; + roll._total = total; + + return roll; + } // TURN ON OR OFF HOOK DEBUGGING CONFIG.debug.hooks = false; @@ -64,21 +119,34 @@ Hooks.once("init", async function() { switch (initMethod) { case "v": - formula = "@_rollSkillManual(@skills.Vigilance.rank, @characteristics.Willpower.value, 0)"; + formula = "Vigilance"; break; case "c": - formula = "@_rollSkillManual(@skills.Cool.rank, @characteristics.Presence.value, 0)"; + formula = "Cool"; break; } CONFIG.Combat.initiative = { - // formula: formula, - formula: "1d20", + formula: formula, decimals: 2 } } + function combineAll(values, monoid) { + return values + .reduce((prev, curr) => monoid.combine(prev, curr), monoid.identity); + } + + function _getInitiativeFormula(skill, ability, difficulty) { + const dicePool = new DicePoolFFG({ + ability: ability, + difficulty: difficulty + }); + dicePool.upgrade(skill); + return dicePool.renderDiceExpression(); + } + // Register sheet application classes Actors.unregisterSheet("core", ActorSheet); Actors.registerSheet("ffg", ActorSheetFFG, {makeDefault: true}); diff --git a/styles/swffg.css b/styles/swffg.css index 778dee25..c825fb49 100644 --- a/styles/swffg.css +++ b/styles/swffg.css @@ -1,5 +1,6 @@ .window-app .window-content { - background: #f2f2f2; + /* background: #f2f2f2; */ + background: rgba(255, 255, 255, 0.7); font-size: 9pt; } @@ -113,6 +114,11 @@ div .container.talents { overflow-y: hidden; } +.worldbuilding.sheet.actor { + min-width: 575px; + min-height: 489px; +} + /* Sheet Header */ .worldbuilding.sheet .sheet-header { overflow: hidden; @@ -173,7 +179,6 @@ div .container.talents { height: auto; margin: 0; bottom: 10px; - font-size: smaller; display: flex; } diff --git a/system.json b/system.json index e16a7e93..85fa5e8b 100644 --- a/system.json +++ b/system.json @@ -2,11 +2,11 @@ "name": "starwarsffg", "title": "Star Wars FFG", "description": "A system for playing Star Wars FFG games.", - "version": 0.0435, - "minimumCoreVersion": "0.5.5", - "compatibleCoreVersion": "0.5.6", + "version": 0.05, + "minimumCoreVersion": "0.5.6", + "compatibleCoreVersion": "0.5.7", "templateVersion": 1, - "author": "Jaxxa and Esrin", + "author": "Esrin", "esmodules": ["modules/dice-pool-ffg.js", "modules/swffg-main.js"], "styles": ["styles/swffg.css"], "packs": [{ @@ -25,6 +25,6 @@ "secondaryTokenAttribute": "strain", "url": "https://github.com/Esrin/StarWarsFFG/tree/esrin-dev", "manifest": "https://raw.githubusercontent.com/Esrin/StarWarsFFG/esrin-dev/system.json", - "download": "https://github.com/Esrin/StarWarsFFG/releases/download/esrin-dev_0.043/esrin-dev_0.0435.zip", + "download": "https://github.com/Esrin/StarWarsFFG/releases/download/esrin-dev_0.05/esrin-dev_0.05.zip", "license": "LICENSE.txt" } diff --git a/templates/actors/ffg-character-sheet.html b/templates/actors/ffg-character-sheet.html index cf5e909a..1369d142 100644 --- a/templates/actors/ffg-character-sheet.html +++ b/templates/actors/ffg-character-sheet.html @@ -416,7 +416,7 @@

                  {{item.name}}
                  {{item.safe_desc}} {{!-- Biography Tab --}} -
                  +
                  {{editor content=data.biography target="data.biography" button=true owner=owner editable=editable}} {{!-- Footer info --}}
                  From 05bcf7a28a7ddcbfd12d8362300648c4b366b569 Mon Sep 17 00:00:00 2001 From: Esrin Date: Fri, 22 May 2020 18:07:41 +0100 Subject: [PATCH 13/44] Compatibility with FVTT 0.6.0 and other tweaks, see changelog for details. Thanks to alfarobl for the change to dice display orders. --- README.md | 77 +- modules/dice-pool-ffg.js | 28 +- modules/swffg-config.js | 36 +- modules/swffg-main.js | 183 +++-- styles/swffg.css | 427 +++++----- system.json | 26 +- template.json | 4 +- templates/actors/ffg-character-sheet.html | 957 ++++++++++------------ templates/actors/ffg-vehicle-sheet.html | 18 +- templates/items/ffg-talent-sheet.html | 2 +- templates/roll-options.html | 16 +- 11 files changed, 872 insertions(+), 902 deletions(-) diff --git a/README.md b/README.md index b4a19481..a047db46 100644 --- a/README.md +++ b/README.md @@ -16,43 +16,46 @@ This is most easily available from the in-game Module browser. After installing 2. Go to the "Game Systems" Tab 3. Click the "Install System" button 4. Copy the Following link into the "Manifest URL" section: -https://raw.githubusercontent.com/Esrin/StarWarsFFG/esrin-dev/system.json + https://raw.githubusercontent.com/Esrin/StarWarsFFG/esrin-dev/system.json 5. Click Install, after a few seconds the system should be installed. # Changelog -* 18/05/2020 - Esrin - A very hacky method has been introduced to allow the built in FoundryVTT combat tracker to roll initiative using FFG dice results. The resulting number is made up of successes and advantages. For example 1 success and 2 advantage would result in 1.02 for the initiative tracker. Warning, there might be bugs with this solution! Initiative can be switched between Vigilance and Cool via the System Settings section of the world configuration. -* 13/05/2020 - Esrin - Continued sheet design tweaks. -* 12/05/2020 - Esrin - Reworked actorsheet entities back down to a single entity with dynamic options based on actor.type. Now much easier to maintain in single place. -* 12/05/2020 - Esrin - First pass at improvements to inventory display to show more info on hover of certain areas (hover name for description, hover special for full text, etc). Still much more styling and layout work needed for sheets in general. -* 11/05/2020 - Esrin - First pass on some quality of life improvements to the inventory display (work in progress). Minor bugfixes. -* 11/05/2020 - Esrin - Fixed bug on vehicle sheet that was preventing data entry to some fields. -* 11/05/2020 - Esrin - Reworked the modifier tabs to be more foolproof and user friendly. Only Soak modifiers are calculated automatically at present. Automatic calculation of other stat / characteristic / skill modifiers is not a priority right now so putting on the backburner. -* 11/05/2020 - Esrin - Improved vehicle sheet design to have Defence in fore, aft, port, starboard cross pattern. -* 11/05/2020 - Esrin - Added Range, Skill, Firing Arc and Activation dropdowns to item and talent sheets where appropriate. -* 11/05/2020 - Esrin - Added skills filter to character and minion sheets, allowing filtering by General, Combat and Knowledge. -* 11/05/2020 - Esrin - Added career skills checkbox to character sheet. -* 11/05/2020 - Esrin - Fixed Handling on vehicle sheet. Now displays a + for positive values. -* 09/05/2020 - Esrin - Rollable table for Critical Injuries -* 09/05/2020 - Esrin - Cleaned up items to just use one JS class and get dynamic template by type. -* 09/05/2020 - Esrin - Built item sheet for ship weapons and ship attachments -* 09/05/2020 - Esrin - Built character sheet for vehicles -* 09/05/2020 - Esrin - Added data structure for ship weapons and ship attachments -* 09/05/2020 - Esrin - Added data structure for vehicles (using Jaxxa's work as a template) -* 09/05/2020 - Esrin - Added currency to characters -* 09/05/2020 - Esrin - Derived encumbrance from item values. -* 09/05/2020 - Esrin - Derived soak value from brawn, equipped armour, and modifiers on weapons, gear and talents as a test case for automation. -* 08/05/2020 - Esrin - Extended Actor class to allow for calculated Minion stat values (wounds from unit wounds * quantity, and skills from group skills * quantity-1) -* 08/05/2020 - Esrin - Added data structure for minions -* 08/05/2020 - Esrin - Built character sheet for minions -* 08/05/2020 - Esrin - Updated main character sheet to correctly display all three main item types, and talents. -* 08/05/2020 - Esrin - Added data structure for talents -* 08/05/2020 - Esrin - Updated main character sheet to show XP on all pages, and obligation types on Biography page. -* 08/05/2020 - Esrin - Built very basic item sheets for the three main item types. -* 08/05/2020 - Esrin - Added data structures for the three main item types, gear, weapons, armour. -* 07/05/2020 - Esrin - Minor tweaks to the character sheet styling. Begun restructuring the underlying data structure in template.json to introduce best practices, avoid unnecessary duplication and prepare for the addition of new actor and item types. -* 07/05/2020 - Esrin - First pass at character sheet styling. Next step, talents, items and derived modifiers. -* 06/05/2020 - Esrin - Added "Rolling " into the chat message for FFG dice rolls to show which skill the person was rolling on. -* 06/05/2020 - Esrin - Added abbreviations (abrev) to characteristics, refactored skill display on ffg-actor-sheet.html to allow for linked characteristic abbreviations in display. -* 06/05/2020 - Esrin - Updated to TabsV2 class in actor-sheet-ffg.js to avoid deprecation of Tabs class in future FoundryVTT versions. -* 06/05/2020 - Esrin - Renamed remaining core files from Simple World Building to swffg naming scheme for consistency. -* 06/05/2020 - Esrin - Removed old SimpleWorldBuilding dependencies and fixed breakages where necessary. + +- 22/05/2020 - Esrin - Minor bug fixes and tweaks, compatibility check with FVTT 0.6.0 stable release. +- 18/05/2020 - alfarobl - Tweak to dice display orders to match the chat order, kindly provided by alfarobl. +- 18/05/2020 - Esrin - A very hacky method has been introduced to allow the built in FoundryVTT combat tracker to roll initiative using FFG dice results. The resulting number is made up of successes and advantages. For example 1 success and 2 advantage would result in 1.02 for the initiative tracker. Warning, there might be bugs with this solution! Initiative can be switched between Vigilance and Cool via the System Settings section of the world configuration. +- 13/05/2020 - Esrin - Continued sheet design tweaks. +- 12/05/2020 - Esrin - Reworked actorsheet entities back down to a single entity with dynamic options based on actor.type. Now much easier to maintain in single place. +- 12/05/2020 - Esrin - First pass at improvements to inventory display to show more info on hover of certain areas (hover name for description, hover special for full text, etc). Still much more styling and layout work needed for sheets in general. +- 11/05/2020 - Esrin - First pass on some quality of life improvements to the inventory display (work in progress). Minor bugfixes. +- 11/05/2020 - Esrin - Fixed bug on vehicle sheet that was preventing data entry to some fields. +- 11/05/2020 - Esrin - Reworked the modifier tabs to be more foolproof and user friendly. Only Soak modifiers are calculated automatically at present. Automatic calculation of other stat / characteristic / skill modifiers is not a priority right now so putting on the backburner. +- 11/05/2020 - Esrin - Improved vehicle sheet design to have Defence in fore, aft, port, starboard cross pattern. +- 11/05/2020 - Esrin - Added Range, Skill, Firing Arc and Activation dropdowns to item and talent sheets where appropriate. +- 11/05/2020 - Esrin - Added skills filter to character and minion sheets, allowing filtering by General, Combat and Knowledge. +- 11/05/2020 - Esrin - Added career skills checkbox to character sheet. +- 11/05/2020 - Esrin - Fixed Handling on vehicle sheet. Now displays a + for positive values. +- 09/05/2020 - Esrin - Rollable table for Critical Injuries +- 09/05/2020 - Esrin - Cleaned up items to just use one JS class and get dynamic template by type. +- 09/05/2020 - Esrin - Built item sheet for ship weapons and ship attachments +- 09/05/2020 - Esrin - Built character sheet for vehicles +- 09/05/2020 - Esrin - Added data structure for ship weapons and ship attachments +- 09/05/2020 - Esrin - Added data structure for vehicles (using Jaxxa's work as a template) +- 09/05/2020 - Esrin - Added currency to characters +- 09/05/2020 - Esrin - Derived encumbrance from item values. +- 09/05/2020 - Esrin - Derived soak value from brawn, equipped armour, and modifiers on weapons, gear and talents as a test case for automation. +- 08/05/2020 - Esrin - Extended Actor class to allow for calculated Minion stat values (wounds from unit wounds _ quantity, and skills from group skills _ quantity-1) +- 08/05/2020 - Esrin - Added data structure for minions +- 08/05/2020 - Esrin - Built character sheet for minions +- 08/05/2020 - Esrin - Updated main character sheet to correctly display all three main item types, and talents. +- 08/05/2020 - Esrin - Added data structure for talents +- 08/05/2020 - Esrin - Updated main character sheet to show XP on all pages, and obligation types on Biography page. +- 08/05/2020 - Esrin - Built very basic item sheets for the three main item types. +- 08/05/2020 - Esrin - Added data structures for the three main item types, gear, weapons, armour. +- 07/05/2020 - Esrin - Minor tweaks to the character sheet styling. Begun restructuring the underlying data structure in template.json to introduce best practices, avoid unnecessary duplication and prepare for the addition of new actor and item types. +- 07/05/2020 - Esrin - First pass at character sheet styling. Next step, talents, items and derived modifiers. +- 06/05/2020 - Esrin - Added "Rolling " into the chat message for FFG dice rolls to show which skill the person was rolling on. +- 06/05/2020 - Esrin - Added abbreviations (abrev) to characteristics, refactored skill display on ffg-actor-sheet.html to allow for linked characteristic abbreviations in display. +- 06/05/2020 - Esrin - Updated to TabsV2 class in actor-sheet-ffg.js to avoid deprecation of Tabs class in future FoundryVTT versions. +- 06/05/2020 - Esrin - Renamed remaining core files from Simple World Building to swffg naming scheme for consistency. +- 06/05/2020 - Esrin - Removed old SimpleWorldBuilding dependencies and fixed breakages where necessary. diff --git a/modules/dice-pool-ffg.js b/modules/dice-pool-ffg.js index c999f961..72590920 100644 --- a/modules/dice-pool-ffg.js +++ b/modules/dice-pool-ffg.js @@ -1,9 +1,9 @@ -const ABILITY_ICON = "modules/special-dice-roller/public/images/sw/green.png"; const PROFICIENCY_ICON = "modules/special-dice-roller/public/images/sw/yellow.png"; +const ABILITY_ICON = "modules/special-dice-roller/public/images/sw/green.png"; +const CHALLENGE_ICON = "modules/special-dice-roller/public/images/sw/red.png"; +const DIFFICULTY_ICON = "modules/special-dice-roller/public/images/sw/purple.png"; const BOOST_ICON = "modules/special-dice-roller/public/images/sw/blue.png"; const SETBACK_ICON = "modules/special-dice-roller/public/images/sw/black.png"; -const DIFFICULTY_ICON = "modules/special-dice-roller/public/images/sw/purple.png"; -const CHALLENGE_ICON = "modules/special-dice-roller/public/images/sw/red.png"; const FORCE_ICON = "modules/special-dice-roller/public/images/sw/whiteHex.png"; /** @@ -17,12 +17,12 @@ export class DicePoolFFG { if (typeof(obj) === "string") { obj = JSON.parse(obj); } - this.ability = obj.ability || 0; this.proficiency = obj.proficiency || 0; + this.ability = obj.ability || 0; + this.challenge = obj.challenge || 0; + this.difficulty = obj.difficulty || 0; this.boost = obj.boost || 0; this.setback = obj.setback || 0; - this.difficulty = obj.difficulty || 0; - this.challenge = obj.challenge || 0; this.force = obj.force || 0; } @@ -69,12 +69,12 @@ export class DicePoolFFG { */ renderDiceExpression() { return [ - "a".repeat(this.ability), "p".repeat(this.proficiency), + "a".repeat(this.ability), + "c".repeat(this.challenge), + "d".repeat(this.difficulty), "b".repeat(this.boost), "s".repeat(this.setback), - "d".repeat(this.difficulty), - "c".repeat(this.challenge), "f".repeat(this.force) ].join(""); } @@ -89,12 +89,12 @@ export class DicePoolFFG { container = document.createElement("div"); container.classList.add("dice-pool"); } - this._addIcons(container, ABILITY_ICON, this.ability); this._addIcons(container, PROFICIENCY_ICON, this.proficiency); + this._addIcons(container, ABILITY_ICON, this.ability); + this._addIcons(container, CHALLENGE_ICON, this.challenge); + this._addIcons(container, DIFFICULTY_ICON, this.difficulty); this._addIcons(container, BOOST_ICON, this.boost); this._addIcons(container, SETBACK_ICON, this.setback); - this._addIcons(container, DIFFICULTY_ICON, this.difficulty); - this._addIcons(container, CHALLENGE_ICON, this.challenge); this._addIcons(container, FORCE_ICON, this.force); return container; } @@ -116,10 +116,10 @@ export class DicePoolFFG { */ static fromContainer(container) { return new DicePoolFFG({ - ability: container.querySelector('[name="ability"]').value, proficiency: container.querySelector('[name="proficiency"]').value, - difficulty: container.querySelector('[name="difficulty"]').value, + ability: container.querySelector('[name="ability"]').value, challenge: container.querySelector('[name="challenge"]').value, + difficulty: container.querySelector('[name="difficulty"]').value, boost: container.querySelector('[name="boost"]').value, setback: container.querySelector('[name="setback"]').value, force: container.querySelector('[name="force"]').value, diff --git a/modules/swffg-config.js b/modules/swffg-config.js index 15bc0141..4c749112 100644 --- a/modules/swffg-config.js +++ b/modules/swffg-config.js @@ -6,7 +6,7 @@ FFG.characteristics = { "Intellect": "Intellect", "Cunning": "Cunning", "Willpower": "Willpower", - "Presence": "Presence" + "Presence": "Presence", }; FFG.character_stats = { @@ -16,7 +16,7 @@ FFG.character_stats = { "defence": "Defence", "encumbrance": "Encumbrance", "forcePool": "Force Pool", - "credits": "Credits" + "credits": "Credits", }; FFG.skills = { @@ -54,7 +54,7 @@ FFG.skills = { "Knowledge: Outer Rim": "Knowledge: Outer Rim", "Knowledge: Underworld": "Knowledge: Underworld", "Knowledge: Warfare": "Knowledge: Warfare", - "Knowledge: Xenology": "Knowledge: Xenology" + "Knowledge: Xenology": "Knowledge: Xenology", }; FFG.skills.knowledgestripped = { @@ -64,15 +64,15 @@ FFG.skills.knowledgestripped = { "Knowledge: Outer Rim": "Outer Rim", "Knowledge: Underworld": "Underworld", "Knowledge: Warfare": "Warfare", - "Knowledge: Xenology": "Xenology" -} + "Knowledge: Xenology": "Xenology", +}; FFG.ranges = { "Engaged": "Engaged", "Short": "Short", "Medium": "Medium", "Long": "Long", - "Extreme": "Extreme" + "Extreme": "Extreme", }; FFG.vehicle_ranges = { @@ -80,7 +80,7 @@ FFG.vehicle_ranges = { "Short": "Short", "Medium": "Medium", "Long": "Long", - "Extreme": "Extreme" + "Extreme": "Extreme", }; FFG.fire_arcs = { @@ -88,7 +88,7 @@ FFG.fire_arcs = { "Aft": "Aft", "Port": "Port", "Starboard": "Starboard", - "All": "All" + "All": "All", }; FFG.combat_skills = { @@ -97,7 +97,7 @@ FFG.combat_skills = { "Lightsaber": "Lightsaber", "Melee": "Melee", "Ranged: Light": "Ranged: Light", - "Ranged: Heavy": "Ranged: Heavy" + "Ranged: Heavy": "Ranged: Heavy", }; FFG.combat_skills.abrev = { @@ -106,27 +106,21 @@ FFG.combat_skills.abrev = { "Lightsaber": "LS", "Melee": "M", "Ranged: Light": "RL", - "Ranged: Heavy": "RH" -} + "Ranged: Heavy": "RH", +}; FFG.activations = { "Passive": "Passive", "Active (Incidental)": "Active (Incidental)", "Active (Incidental, Out of Turn)": "Active (Incidental, Out of Turn)", "Active (Action)": "Active (Action)", - "Active (Maneuver)": "Active (Maneuver)" + "Active (Maneuver)": "Active (Maneuver)", }; FFG.mod_types = ["Characteristic", "Skill Rank", "Skill Boost", "Stat"]; -FFG.species = { - -}; +FFG.species = {}; -FFG.careers = { +FFG.careers = {}; -}; - -FFG.specialisations = { - -}; +FFG.specialisations = {}; diff --git a/modules/swffg-main.js b/modules/swffg-main.js index 9cad6cfa..e32fb277 100644 --- a/modules/swffg-main.js +++ b/modules/swffg-main.js @@ -1,6 +1,6 @@ /** - * A simple and flexible system for world-building using an arbitrary collection of character and item attributes - * Author: Atropos + * A systems implementation of the Star Wars RPG by Fantasy Flight Games. + * Author: Esrin * Software License: GNU GPLv3 */ @@ -17,17 +17,17 @@ import { DicePoolFFG } from "./dice-pool-ffg.js"; /* Foundry VTT Initialization */ /* -------------------------------------------- */ -Hooks.once("init", async function() { +Hooks.once("init", async function () { console.log(`Initializing SWFFG System`); // Place our classes in their own namespace for later reference. - game.ffg = { - ActorFFG, - ItemFFG, - CombatFFG - }; + game.ffg = { + ActorFFG, + ItemFFG, + CombatFFG, + }; - game.ffg.StarWars = game.specialDiceRoller.starWars.parsers[0]; + game.ffg.StarWars = game.specialDiceRoller.starWars.parsers[0]; // Define custom Entity classes. This will override the default Actor // to instead use our extended version. @@ -35,27 +35,28 @@ Hooks.once("init", async function() { CONFIG.Item.entityClass = ItemFFG; CONFIG.Combat.entityClass = CombatFFG; - // A very hacky temporary workaround to override how initiative functions and provide the results of a FFG roll to the initiative tracker. + // Currently overriding the prototype due to a bug with overriding the core Combat entity which resets to default after page refresh. /** @override */ - Combat.prototype._getInitiativeRoll = function(combatant, formula) { + Combat.prototype._getInitiativeRoll = function (combatant, formula) { const cData = combatant.actor.data.data; const origFormula = formula; - if (combatant.actor.data.type === "vehicle") { return new Roll("0"); } + if (combatant.actor.data.type === "vehicle") { + return new Roll("0"); + } if (formula === "Vigilance") { formula = _getInitiativeFormula(cData.skills.Vigilance.rank, cData.characteristics.Willpower.value, 0); - } - else if (formula === "Cool") { + } else if (formula === "Cool") { formula = _getInitiativeFormula(cData.skills.Cool.rank, cData.characteristics.Presence.value, 0); } const rollData = combatant.actor ? combatant.actor.getRollData() : {}; - const letters = formula.split(''); + const letters = formula.split(""); const rolls = []; - const getSuc = new RegExp('Successes: ([0-9]+)', 'g'); - const getAdv = new RegExp('Advantages: ([0-9]+)', 'g'); + const getSuc = new RegExp("Successes: ([0-9]+)", "g"); + const getAdv = new RegExp("Advantages: ([0-9]+)", "g"); for (const letter of letters) { rolls.push(game.ffg.StarWars.letterToRolls(letter, 1)); @@ -71,11 +72,15 @@ Hooks.once("init", async function() { let advantage = 0; success = getSuc.exec(results); - if (success) { success = success[1]; } + if (success) { + success = success[1]; + } advantage = getAdv.exec(results); - if (advantage) { advantage = advantage[1]; } + if (advantage) { + advantage = advantage[1]; + } - let total = +success+(advantage*0.01); + let total = +success + advantage * 0.01; console.log(`Total is: ${total}`); @@ -84,7 +89,7 @@ Hooks.once("init", async function() { roll._total = total; return roll; - } + }; // TURN ON OR OFF HOOK DEBUGGING CONFIG.debug.hooks = false; @@ -92,66 +97,62 @@ Hooks.once("init", async function() { // Give global access to FFG config. CONFIG.FFG = FFG; - /** - * Set an initiative formula for the system - * @type {String} - */ - // Register initiative rule - game.settings.register("starwarsffg", "initiativeRule", { - name: "Initiative Type", - hint: "Choose between Vigilance or Cool for Initiative rolls.", - scope: "world", - config: true, - default: "v", - type: String, - choices: { - "v": "Use Vigilance", - "c": "Use Cool", - }, - onChange: rule => _setffgInitiative(rule) - }); - _setffgInitiative(game.settings.get("starwarsffg", "initiativeRule")); - - - function _setffgInitiative(initMethod) - { - let formula; - switch (initMethod) - { - case "v": - formula = "Vigilance"; - break; - - case "c": - formula = "Cool"; - break; - } - - CONFIG.Combat.initiative = { - formula: formula, - decimals: 2 - } - } - - function combineAll(values, monoid) { - return values - .reduce((prev, curr) => monoid.combine(prev, curr), monoid.identity); - } - - function _getInitiativeFormula(skill, ability, difficulty) { - const dicePool = new DicePoolFFG({ - ability: ability, - difficulty: difficulty - }); - dicePool.upgrade(skill); - return dicePool.renderDiceExpression(); - } + /** + * Set an initiative formula for the system + * @type {String} + */ + // Register initiative rule + game.settings.register("starwarsffg", "initiativeRule", { + name: "Initiative Type", + hint: "Choose between Vigilance or Cool for Initiative rolls.", + scope: "world", + config: true, + default: "v", + type: String, + choices: { + v: "Use Vigilance", + c: "Use Cool", + }, + onChange: (rule) => _setffgInitiative(rule), + }); + _setffgInitiative(game.settings.get("starwarsffg", "initiativeRule")); + + function _setffgInitiative(initMethod) { + let formula; + switch (initMethod) { + case "v": + formula = "Vigilance"; + break; + + case "c": + formula = "Cool"; + break; + } + + CONFIG.Combat.initiative = { + formula: formula, + decimals: 2, + }; + } + + function combineAll(values, monoid) { + return values.reduce((prev, curr) => monoid.combine(prev, curr), monoid.identity); + } + + function _getInitiativeFormula(skill, ability, difficulty) { + const dicePool = new DicePoolFFG({ + ability: ability, + difficulty: difficulty, + }); + dicePool.upgrade(skill); + return dicePool.renderDiceExpression(); + } // Register sheet application classes Actors.unregisterSheet("core", ActorSheet); - Actors.registerSheet("ffg", ActorSheetFFG, {makeDefault: true}); + Actors.registerSheet("ffg", ActorSheetFFG, { makeDefault: true }); Items.unregisterSheet("core", ItemSheet); - Items.registerSheet("ffg", ItemSheetFFG, {makeDefault: true}); + Items.registerSheet("ffg", ItemSheetFFG, { makeDefault: true }); // Add utilities to the global scope, this can be useful for macro makers window.DicePoolFFG = DicePoolFFG; @@ -160,19 +161,19 @@ Hooks.once("init", async function() { Handlebars.registerHelper("json", JSON.stringify); // Allows {if X = Y} type syntax in html using handlebars - Handlebars.registerHelper('iff', function (a, operator, b, opts) { + Handlebars.registerHelper("iff", function (a, operator, b, opts) { var bool = false; switch (operator) { - case '==': + case "==": bool = a == b; break; - case '>': + case ">": bool = a > b; break; - case '<': + case "<": bool = a < b; break; - case '!=': + case "!=": bool = a != b; break; default: @@ -186,3 +187,21 @@ Hooks.once("init", async function() { } }); }); + +// /* -------------------------------------------- */ +// /* Set up control buttons */ +// /* -------------------------------------------- */ + +// Hooks.on("getSceneControlButtons", (controls) => { +// if (game.user.isGM) { +// controls.push({ +// name: "groupmanager", +// title: "Group Manager", +// icon: "fas fa-users", +// onClick: () => { +// new GroupManager().render(true); +// }, +// button: true, +// }); +// } +// }); diff --git a/styles/swffg.css b/styles/swffg.css index c825fb49..c918b71c 100644 --- a/styles/swffg.css +++ b/styles/swffg.css @@ -13,17 +13,17 @@ } .tooltip { - top:30px; - background-color:rgb(25, 24, 19, 0.8); - color:white; - border-radius:5px; - opacity:0; - position:absolute; + top: 30px; + background-color: rgb(25, 24, 19, 0.8); + color: white; + border-radius: 5px; + opacity: 0; + position: absolute; -webkit-transition: opacity 0.5s; - -moz-transition: opacity 0.5s; + -moz-transition: opacity 0.5s; -ms-transition: opacity 0.5s; - -o-transition: opacity 0.5s; - transition: opacity 0.5s; + -o-transition: opacity 0.5s; + transition: opacity 0.5s; z-index: -500; } @@ -33,13 +33,13 @@ } .hover:hover .tooltip { - opacity:1; - z-index: 500; + opacity: 1; + z-index: 500; } table thead th { - padding: 0.25em 0; - text-align: left; + padding: 0.25em 0; + text-align: left; } .skillfilter { display: flex; @@ -93,25 +93,29 @@ table thead th { display: grid; } +.special-dice-roller form input[type="checkbox"] { + margin: 0; +} + div .container { - width: 100%; - height: auto; - display: flex; - flex-wrap: wrap; - font-size: 11pt; + width: 100%; + height: auto; + display: flex; + flex-wrap: wrap; + font-size: 11pt; } div .container.attributes { - margin-top: 5px + margin-top: 5px; } div .container.talents { - margin-top: 5px + margin-top: 5px; } .worldbuilding.sheet .window-content { - padding: 5px; - overflow-y: hidden; + padding: 5px; + overflow-y: hidden; } .worldbuilding.sheet.actor { @@ -121,93 +125,93 @@ div .container.talents { /* Sheet Header */ .worldbuilding.sheet .sheet-header { - overflow: hidden; - display: flex; - flex-direction: row; - flex-wrap: wrap; - justify-content: flex-start; - flex: 0 0 100px; + overflow: hidden; + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: flex-start; + flex: 0 0 100px; } .worldbuilding.sheet .profile-img { - flex: 0 0 100px; - height: 124px; - width: auto; - max-width: 124px; - margin-right: 10px; - margin-left: 10px; - border-radius: 15px; + flex: 0 0 100px; + height: 124px; + width: auto; + max-width: 124px; + margin-right: 10px; + margin-left: 10px; + border-radius: 15px; } .worldbuilding.sheet .header-fields { - flex: 1; - height: auto; + flex: 1; + height: auto; } .worldbuilding.sheet .charname { - border-bottom: 0; - display: flex; + border-bottom: 0; + display: flex; } .worldbuilding.sheet .charname.minion { - border-bottom: 0; - display: flex; + border-bottom: 0; + display: flex; } .worldbuilding.sheet .charname input { - width: auto; - margin: 5px 5px 10px 5px; + width: auto; + margin: 5px 5px 10px 5px; } .worldbuilding.sheet .resource { - height: 40px; - padding-bottom: 4px; - padding-left: 2px; - margin: 0; - display: inline-table; + height: 40px; + padding-bottom: 4px; + padding-left: 2px; + margin: 0; + display: inline-table; } .worldbuilding.sheet .resource input { - width: 82px; - height: 22px; + width: 82px; + height: 22px; } .worldbuilding.sheet .xp-box { - position: absolute; - padding: 0; - left: 25px; - height: auto; - margin: 0; - bottom: 10px; - display: flex; + position: absolute; + padding: 0; + left: 25px; + height: auto; + margin: 0; + bottom: 10px; + display: flex; } .worldbuilding.sheet .xp-box input { - width: 61px; - height: 14px; + width: 61px; + height: 14px; } .worldbuilding.sheet .resource.small input { - width: 40px; - height: 22px; + width: 40px; + height: 22px; } /* Navigation Tabs */ .worldbuilding.sheet .tabs { - flex: 0 0 40px; - border-top: 1px solid #AAA; - border-bottom: 1px solid #AAA; - margin-top: 3px; + flex: 0 0 40px; + border-top: 1px solid #aaa; + border-bottom: 1px solid #aaa; + margin-top: 3px; } .worldbuilding.sheet .tabs .item { - line-height: 40px; - font-weight: bold; + line-height: 40px; + font-weight: bold; } .worldbuilding.sheet .tabs .item.active { - text-decoration: underline; - text-shadow: none; + text-decoration: underline; + text-shadow: none; } .worldbuilding.sheet .attributes-list .attribute.item { @@ -230,45 +234,46 @@ div .container.talents { /* Content Tabs */ .worldbuilding.sheet .sheet-body { - height: calc(100% - 19em); - overflow: auto; - border: 1px solid #868686; + height: calc(100% - 19em); + overflow: auto; + border: 1px solid #868686; } .worldbuilding.sheet .sheet-body.minion { - height: calc(100% - 12.5em); - overflow: auto; + height: calc(100% - 14em); + overflow: auto; } .worldbuilding.sheet .sheet-body.vehicle { - height: calc(100% - 22.5em); - overflow: auto; + height: calc(100% - 25em); + overflow: auto; } .worldbuilding.sheet .sheet-body.small { - height: calc(100% - 16em); - overflow: auto; + height: calc(100% - 16em); + overflow: auto; } .worldbuilding.sheet .sheet-body .tab { - height: 100%; + height: 100%; } .worldbuilding.sheet .sheet-body .editor { - width: 100%; - height: 100%; + width: 100%; + height: 100%; } /* Topper */ .worldbuilding.sheet .sheet-topper { - background: #435a76; - overflow: auto; - text-align:center; - border-radius: 15px; + background: #435a76; + overflow: auto; + text-align: center; + border-radius: 15px; + justify-content: center; } .worldbuilding.sheet .sheet-topper * > input { - background: #f2f2f2; - border-radius: 0 0 15px 15px; - width: auto; + background: #f2f2f2; + border-radius: 0 0 15px 15px; + width: auto; } /* @@ -276,140 +281,139 @@ This seems to be necessary to make scrolling inside the actor sheet work. There is likely a better way to do this. */ .editable { - max-height: 100%; + max-height: 100%; } /* Items */ .worldbuilding.sheet .items-list { - list-style: none; - margin: 7px 0; - padding: 0; - overflow-y: auto; + list-style: none; + margin: 7px 0; + padding: 0; + overflow-y: auto; } .worldbuilding.sheet .items-list .item { - height: 30px; - line-height: 24px; - padding: 3px 0; - border-bottom: 1px solid #BBB; + height: 30px; + line-height: 24px; + padding: 3px 0; + border-bottom: 1px solid #bbb; } .worldbuilding.sheet .items-list .item img { - flex: 0 0 24px; - margin-right: 5px; + flex: 0 0 24px; + margin-right: 5px; } .worldbuilding.sheet .items-list .item-name { - margin: 0; + margin: 0; } .worldbuilding.sheet .items-list .item-controls { - flex: 0 0 36px; - z-index: 500; + flex: 0 0 36px; + z-index: 500; } /* Attributes */ .worldbuilding.sheet .attributes { - margin: 0 5px 0 5px; + margin: 0 5px 0 5px; } .worldbuilding.sheet .attributes-header { - padding: 5px; - margin: 0 0 5px 0; - background: rgba(0, 0, 0, 0.05); - border: 1px solid #AAA; - border-radius: 2px; - text-align: center; - font-weight: bold; + padding: 5px; + margin: 0 0 5px 0; + background: rgba(0, 0, 0, 0.05); + border: 1px solid #aaa; + border-radius: 2px; + text-align: center; + font-weight: bold; } .worldbuilding.sheet .attribute-label { - flex: 1.5; + flex: 1.5; } .worldbuilding.sheet .attribute-control { - flex: 0 0 20px; + flex: 0 0 20px; } .worldbuilding.sheet .attributes-list { - list-style: none; - margin: 0; - padding: 0; + list-style: none; + margin: 0; + padding: 0; } .worldbuilding.sheet .attributes-list li > * { - margin: 0 3px; - height: 28px; - line-height: 24px; - background: transparent; - border: none; - border-radius: 0; - border-bottom: 1px solid #AAA; - text-align: center; - overflow: auto; + margin: 0 3px; + height: 28px; + line-height: 24px; + background: transparent; + border: none; + border-radius: 0; + border-bottom: 1px solid #aaa; + text-align: center; + overflow: auto; } .worldbuilding.sheet .attribute-value.checkbox { - text-align: center; + text-align: center; } .worldbuilding.sheet .attributes-list li a.attribute-control { - border: none; + border: none; } /* Talents */ .worldbuilding.sheet .talents { - margin: 0 5px 0 5px; + margin: 0 5px 0 5px; } .worldbuilding.sheet .talents-header { - padding: 5px; - margin: 5px 0; - background: rgba(0, 0, 0, 0.05); - border: 1px solid #AAA; - border-radius: 2px; - text-align: center; - font-weight: bold; + padding: 5px; + margin: 5px 0; + background: rgba(0, 0, 0, 0.05); + border: 1px solid #aaa; + border-radius: 2px; + text-align: center; + font-weight: bold; } .worldbuilding.sheet .talents-label { - flex: 1.5; + flex: 1.5; } .worldbuilding.sheet .talents-list { - list-style: none; - margin: 0; - padding: 0; + list-style: none; + margin: 0; + padding: 0; } .worldbuilding.sheet .talents-list li > * { - margin: 0 3px; - height: 28px; - line-height: 24px; - background: transparent; - border: none; - border-radius: 0; - border-bottom: 1px solid #AAA; - text-align: center; - overflow: auto; + margin: 0 3px; + height: 28px; + line-height: 24px; + background: transparent; + border: none; + border-radius: 0; + border-bottom: 1px solid #aaa; + text-align: center; + overflow: auto; } - .worldbuilding.sheet .characteristics-list { - list-style: none; - box-shadow: 0px 1px 1px 0px #999; + list-style: none; + box-shadow: 0px 1px 1px 0px #999; } .worldbuilding.sheet .characteristics-list input { - border-radius: 100%; - width: 2em; - height: 2em; - text-align: center;; - display: block;; - font-size: 18pt; + border-radius: 100%; + width: 2em; + height: 2em; + text-align: center; + display: block; + font-size: 18pt; } .worldbuilding.sheet .characteristics-list input:invalid { - border: 2px solid red; + border: 2px solid red; } .worldbuilding.sheet .characteristics-list label { - display: block; - width: 3em; - text-align: center; + display: block; + width: 3em; + text-align: center; } /* @@ -418,86 +422,85 @@ This is designed to mimic the threshold, wound and other boxes at the top of the standard FFG character sheets. */ .split-box { - border: 2px solid black; - border-radius: 19px; - width: max-content; + border: 2px solid black; + border-radius: 19px; + width: max-content; } .split-box .divider { - width: 1px; - background: darkgray; + width: 1px; + background: darkgray; } .split-box > .content { - display: flex; + display: flex; } .split-box h1 { - font-size: 100%; - text-align: center; - color: #fff; - border-radius: 50px 50px 0px 0px; - background: #435a76; - padding: 0; - margin: 0; + font-size: 100%; + text-align: center; + color: #fff; + border-radius: 50px 50px 0px 0px; + background: #435a76; + padding: 0; + margin: 0; } .split-box input { - border: 0; - text-align: center; - background: transparent; + border: 0; + text-align: center; + background: transparent; } .split-box label { - display: block; - font-size: 90%; - color: #222; - text-align: center; + display: block; + font-size: 90%; + color: #222; + text-align: center; } - .split-box .left label { - display: block; - font-size: 90%; - color: #fff; - font-weight: bold; - background: #652825; - border-radius: 0px 0px 0px 50px; - text-align: center; + display: block; + font-size: 90%; + color: #fff; + font-weight: bold; + background: #652825; + border-radius: 0px 0px 0px 50px; + text-align: center; } .split-box .right label { - display: block; - font-size: 90%; - color: #000; - font-weight: bold; - background: #90cbdd; - border-radius: 0px 0px 50px 0px; - text-align: center; + display: block; + font-size: 90%; + color: #000; + font-weight: bold; + background: #90cbdd; + border-radius: 0px 0px 50px 0px; + text-align: center; } .split-box .single label { - display: block; - font-size: 90%; - color: #000; - font-weight: bold; - background: #90cbdd; - border-radius: 0px 0px 50px 50px; - text-align: center; + display: block; + font-size: 90%; + color: #000; + font-weight: bold; + background: #90cbdd; + border-radius: 0px 0px 50px 50px; + text-align: center; } .split-box .single-clear label { - display: block; - font-size: 90%; - color: #90cbdd; - font-weight: bold; - background: #90cbdd; - border-radius: 0px 0px 50px 50px; - text-align: center; + display: block; + font-size: 90%; + color: #90cbdd; + font-weight: bold; + background: #90cbdd; + border-radius: 0px 0px 50px 50px; + text-align: center; } .dice-pool img { - border: 0; - width: 2em; - height: 2em; + border: 0; + width: 2em; + height: 2em; } diff --git a/system.json b/system.json index 85fa5e8b..f3069742 100644 --- a/system.json +++ b/system.json @@ -2,22 +2,24 @@ "name": "starwarsffg", "title": "Star Wars FFG", "description": "A system for playing Star Wars FFG games.", - "version": 0.05, + "version": 0.051, "minimumCoreVersion": "0.5.6", - "compatibleCoreVersion": "0.5.7", + "compatibleCoreVersion": "0.6.0", "templateVersion": 1, "author": "Esrin", "esmodules": ["modules/dice-pool-ffg.js", "modules/swffg-main.js"], "styles": ["styles/swffg.css"], - "packs": [{ - "name": "rollabletables", - "label": "Star Wars FFG: Rollable Tables", - "system": "starwarsffg", - "module": "starwarsffg", - "path": "packs/star-wars-ffg-rollable-tables.db", - "entity": "RollTable", - "tag" : "rolltable" - }], + "packs": [ + { + "name": "rollabletables", + "label": "Star Wars FFG: Rollable Tables", + "system": "starwarsffg", + "module": "starwarsffg", + "path": "packs/star-wars-ffg-rollable-tables.db", + "entity": "RollTable", + "tag": "rolltable" + } + ], "languages": [], "gridDistance": 5, "gridUnits": "ft", @@ -25,6 +27,6 @@ "secondaryTokenAttribute": "strain", "url": "https://github.com/Esrin/StarWarsFFG/tree/esrin-dev", "manifest": "https://raw.githubusercontent.com/Esrin/StarWarsFFG/esrin-dev/system.json", - "download": "https://github.com/Esrin/StarWarsFFG/releases/download/esrin-dev_0.05/esrin-dev_0.05.zip", + "download": "https://github.com/Esrin/StarWarsFFG/releases/download/esrin-dev_0.05/esrin-dev_0.051.zip", "license": "LICENSE.txt" } diff --git a/template.json b/template.json index e0e894f1..2a3e2fbc 100644 --- a/template.json +++ b/template.json @@ -621,8 +621,8 @@ }, "ranks": { "ranked": false, - "current": 0, - "max": 0 + "current": 1, + "min": 0 }, "trees": [], "attributes": {} diff --git a/templates/actors/ffg-character-sheet.html b/templates/actors/ffg-character-sheet.html index 1369d142..88239bb4 100644 --- a/templates/actors/ffg-character-sheet.html +++ b/templates/actors/ffg-character-sheet.html @@ -1,551 +1,500 @@
                  + {{!-- Sheet Header --}} +
                  + + +
                  + {{!-- Character Details Container --}} +
                  + + + + +
                  - {{!-- Sheet Header --}} -
                  - - - -
                  - - {{!-- Character Details Container --}} -
                  - - - -
                  - - {{!-- Primary Stats Container --}} -
                  - -
                  + {{!-- Primary Stats Container --}} +
                  + +
                  {{!-- Wounds Box --}}
                  -
                  -

                  Wounds

                  -
                  -
                  - - -
                  -
                  -
                  - - -
                  -
                  +
                  +

                  Wounds

                  +
                  +
                  + + +
                  +
                  +
                  + + +
                  +
                  {{!-- Strain Box --}}
                  -
                  -

                  Strain

                  -
                  -
                  - - -
                  -
                  -
                  - - -
                  -
                  +
                  +

                  Strain

                  +
                  +
                  + + +
                  +
                  +
                  + + +
                  +
                  - {{!-- Soak Box --}} -
                  -
                  -

                  Soak

                  -
                  -
                  - - -
                  -
                  + {{!-- Soak Box --}} +
                  +
                  +

                  Soak

                  +
                  +
                  + +
                  +
                  +
                  - {{!-- Defence Box --}} -
                  -
                  -

                  Defence

                  -
                  -
                  - - -
                  -
                  -
                  - - -
                  -
                  + {{!-- Defence Box --}} +
                  +
                  +

                  Defence

                  +
                  +
                  + +
                  +
                  +
                  + + +
                  +
                  +
                  - {{!-- Force Box --}} -
                  -
                  -

                  Force Pool

                  -
                  -
                  - - -
                  -
                  -
                  - - -
                  -
                  + {{!-- Force Box --}} +
                  +
                  +

                  Force Pool

                  +
                  +
                  + + +
                  +
                  +
                  + +
                  +
                  +
                  - {{!-- Encumbrance Box --}} -
                  -
                  -

                  Encum

                  -
                  -
                  - - -
                  -
                  + {{!-- Encumbrance Box --}} +
                  +
                  +

                  Encum

                  +
                  +
                  + +
                  +
                  +
                  +
                  +
                  + + {{!-- Sheet Tab Navigation --}} + + + {{!-- Sheet Body --}} +
                  + {{!-- Characteristics Tab --}} +
                  + {{!-- Characteristics Scores --}} + +
                    + {{#each data.characteristics as |characteristic id|}} +
                  • + {{!-- If we set the type to text, we don't have to deal with hiding the number controls --}} + + +
                  • + {{/each}} +
                  + +
                  +
                  + +

                  General

                  + + + + + + + + + + {{#each data.skills as |skill id|}} {{#iff skill.type '==' 'General'}} + + + + + + + {{/iff}} {{/each}} + +
                  NameCareer SkillRankRoll
                  {{id}} {{#with (lookup ../this.data.characteristics [characteristic])~}} ({{abrev}}) {{/with}} + + + + + +
                  +
                  +
                  +
                  + +

                  Combat

                  + + + + + + + + + + {{#each data.skills as |skill id|}} {{#iff skill.type '==' 'Combat'}} + + + + + + + {{/iff}} {{/each}} + +
                  NameCareer SkillRankRoll
                  {{id}} {{#with (lookup ../this.data.characteristics [characteristic])~}} ({{abrev}}) {{/with}} + + + + + +
                  +
                  + +

                  Knowledge

                  + + + + + + + + + + {{#each data.skills as |skill id|}} {{#iff skill.type '==' 'Knowledge'}} + + + + + + + {{/iff}} {{/each}} + +
                  NameCareer SkillRankRoll
                  {{lookup ../this.FFG.skills.knowledgestripped [id]~}} {{#with (lookup ../this.data.characteristics [characteristic])~}} ({{abrev}}) {{/with}} + + + + + +
                  +
                  +
                  +
                  +
                  + + {{!-- Owned Items Tab --}} +
                  + {{!-- Weapons List --}} +
                  +

                  +
                  + Name + Skill + Damage + Range + Crit + Special + Encum + Del +
                  +
                    + {{#each actor.items as |item id|}} {{#iff item.type '==' 'weapon'}} +
                  1. +

                    + {{item.name}} +
                    {{item.safe_desc}}
                    +

                    + + + + + + +
                    + + +
                    +
                  2. + {{/iff}} {{/each}} +
                  -
                  - - {{!-- Sheet Tab Navigation --}} - - - {{!-- Sheet Body --}} -
                  - {{!-- Characteristics Tab --}} -
                  - - {{!-- Characteristics Scores --}} + {{!-- Armour List --}} +
                  +

                  +
                  + Name + Defence + Soak + HP + Encum + Del +
                  +
                    + {{#each actor.items as |item id|}} {{#iff item.type '==' 'armour'}} +
                  1. +

                    + {{item.name}} +
                    {{item.safe_desc}}
                    +

                    + + + + +
                    + + +
                    +
                  2. + {{/iff}} {{/each}} +
                  +
                  -
                    - {{#each data.characteristics as |characteristic id|}} -
                  • - {{!-- If we set the type to text, we don't have to deal with hiding the number controls --}} - - -
                  • - {{/each}} -
                  - -
                  -
                  - -

                  General

                  - - - - - - - - - - {{#each data.skills as |skill id|}} - {{#iff skill.type '==' 'General'}} - - - - - - - {{/iff}} - {{/each}} - -
                  NameCareer SkillRankRoll
                  {{id}} {{#with (lookup ../this.data.characteristics [characteristic])~}} - ({{abrev}}) - {{/with}} - - - - - - -
                  -
                  + + {{/iff}} {{/each}} +

                + + + + {{!-- Talents Tab --}} +
                + {{!-- Talents List --}} +
                +

                +
                + Name + Activation + Rank + Del +
                +
                  + {{#each actor.items as |item id|}} {{#iff item.type '==' 'talent'}} +
                1. +

                  + {{item.name}} +
                  {{item.safe_desc}}
                  +

                  + + {{#if item.data.ranks.ranked}} + + {{else}} + + {{/if}} +
                  + + +
                  +
                2. + {{/iff}} {{/each}} +
                +
                +
                + + {{!-- Biography Tab --}} +
                + {{editor content=data.biography target="data.biography" button=true owner=owner editable=editable}} {{!-- Footer info --}} +
                + {{!-- XP Box --}} +
                +

                XP

                +
                +
                + +
                -
                - -

                Combat

                - - - - - - - - - - {{#each data.skills as |skill id|}} - {{#iff skill.type '==' 'Combat'}} - - - - - - - {{/iff}} - {{/each}} - -
                NameCareer SkillRankRoll
                {{id}} {{#with (lookup ../this.data.characteristics [characteristic])~}} - ({{abrev}}) - {{/with}} - - - - - - -
                -
                - -

                Knowledge

                - - - - - - - - - - {{#each data.skills as |skill id|}} - {{#iff skill.type '==' 'Knowledge'}} - - - - - - - {{/iff}} - {{/each}} - -
                NameCareer SkillRankRoll
                {{lookup ../this.FFG.skills.knowledgestripped [id]~}} {{#with (lookup ../this.data.characteristics [characteristic])~}} - ({{abrev}}) - {{/with}} - - - - - - -
                -
                +
                +
                + +
                - {{!-- Owned Items Tab --}} -
                - - {{!-- Weapons List --}} -
                -

                -
                - Name - Skill - Damage - Range - Crit - Special - Encum - Del -
                -
                  - {{#each actor.items as |item id|}} - {{#iff item.type '==' 'weapon'}} -
                1. -

                  {{item.name}}
                  {{item.safe_desc}}

                  - - - - - - -
                  - - -
                  -
                2. - {{/iff}} - {{/each}} -
                -
                - - {{!-- Armour List --}} -
                -

                -
                - Name - Defence - Soak - HP - Encum - Del -
                -
                  - {{#each actor.items as |item id|}} - {{#iff item.type '==' 'armour'}} -
                1. -

                  {{item.name}}
                  {{item.safe_desc}}

                  - - - - -
                  - - -
                  -
                2. - {{/iff}} - {{/each}} -
                + {{!-- Credits Box --}} +
                +
                +
                +

                Credits

                + +
                +
                - {{!-- Gear List --}} -
                -

                -
                - Name - Price - Rarity - Quantity - Encum - Del -
                -
                  - {{#each actor.items as |item id|}} - {{#iff item.type '==' 'gear'}} -
                1. -

                  {{item.name}}
                  {{item.safe_desc}}

                  - - - - -
                  - - -
                  -
                2. - {{/iff}} - {{/each}} -
                + {{!-- Obligation Box --}} +
                +

                Obligation

                +
                +
                + +
                -
                - {{!-- Talents Tab --}} -
                - - {{!-- Talents List --}} -
                -

                -
                - Name - Activation - Rank - Del -
                -
                  - {{#each actor.items as |item id|}} - {{#iff item.type '==' 'talent'}} -
                1. -

                  {{item.name}}
                  {{item.safe_desc}}

                  - - {{#if item.data.ranks.ranked}} - - {{else}} - - {{/if}} -
                  - - -
                  -
                2. - {{/iff}} - {{/each}} -
                + {{!-- Duty Box --}} +
                +

                Duty

                +
                +
                + +
                - - {{!-- Biography Tab --}} -
                - {{editor content=data.biography target="data.biography" button=true owner=owner editable=editable}} - {{!-- Footer info --}} -
                - {{!-- XP Box --}} -
                -

                XP

                -
                -
                - - -
                -
                -
                - - -
                -
                -
                - - {{!-- Credits Box --}} -
                -
                -
                -

                Credits

                -
                -
                -
                - - {{!-- Obligation Box --}} -
                -

                Obligation

                -
                -
                - -
                -
                -
                - - {{!-- Duty Box --}} -
                -

                Duty

                -
                -
                - -
                -
                -
                - - {{!-- Morality Box --}} -
                -

                Morality

                -
                -
                - -
                -
                -
                - - {{!-- Conflict Box --}} -
                -

                Conflict

                -
                -
                - -
                -
                -
                - + {{!-- Morality Box --}} +
                +

                Morality

                +
                +
                +
                +
                - {{!-- Modifiers Tab --}} -
                -
                - - Mod Type - Modifier - Value - -
                - -
                  - {{#each data.attributes as |attr key|}} -
                1. - - - - - - -
                2. - {{/each}} -
                + {{!-- Conflict Box --}} +
                +

                Conflict

                +
                +
                + +
                +
                - - +
                +
                + + {{!-- Modifiers Tab --}} +
                +
                + + Mod Type + Modifier + Value + +
                + +
                  + {{#each data.attributes as |attr key|}} +
                1. + + + + + + +
                2. + {{/each}} +
                +
                + diff --git a/templates/actors/ffg-vehicle-sheet.html b/templates/actors/ffg-vehicle-sheet.html index 7d64651e..1d08b783 100644 --- a/templates/actors/ffg-vehicle-sheet.html +++ b/templates/actors/ffg-vehicle-sheet.html @@ -180,8 +180,8 @@

                {{item.name}}
                {{item.safe_desc}} -
                - +
                +
                @@ -204,8 +204,8 @@

              3. {{item.name}}
                {{item.safe_desc}}

                -
                - +
                +
              4. @@ -223,7 +223,7 @@

                Rarity Quantity Encum - Del + Del
                  {{#each actor.items as |item id|}} @@ -236,9 +236,9 @@

                  {{item.name}}
                  {{item.safe_desc}} -
                  - - +
                  + +
                  {{/iff}} @@ -251,7 +251,7 @@

                  {{item.name}}
                  {{item.safe_desc}}
                  {{!-- Biography Tab --}} -
                  +
                  {{editor content=data.biography target="data.biography" button=true owner=owner editable=editable}} {{!-- Obligations Section --}}
                  diff --git a/templates/items/ffg-talent-sheet.html b/templates/items/ffg-talent-sheet.html index 52e25a84..9251cf90 100644 --- a/templates/items/ffg-talent-sheet.html +++ b/templates/items/ffg-talent-sheet.html @@ -23,7 +23,7 @@

                  {{#if data.ranks.ranked}} - + {{else}} {{/if}} diff --git a/templates/roll-options.html b/templates/roll-options.html index 58fe76fd..fab17307 100644 --- a/templates/roll-options.html +++ b/templates/roll-options.html @@ -1,22 +1,22 @@
                  - - - - - - + + + + + + @@ -55,10 +55,10 @@ const pool = new DicePoolFFG({{{json dicePool}}}); updatePreview(scope, pool); - setupInput(scope, pool, "ability"); setupInput(scope, pool, "proficiency"); - setupInput(scope, pool, "difficulty"); + setupInput(scope, pool, "ability"); setupInput(scope, pool, "challenge"); + setupInput(scope, pool, "difficulty"); setupInput(scope, pool, "boost"); setupInput(scope, pool, "setback"); setupInput(scope, pool, "force"); From a977081afb9d023dabedc9ebd4df5ab2c2cfa784 Mon Sep 17 00:00:00 2001 From: Esrin Date: Mon, 25 May 2020 18:31:04 +0100 Subject: [PATCH 14/44] Character sheet tweaks. Continued improvements to the inventory display in advance of equipable item support. Group Management screen is work in progress. --- README.md | 23 +++ modules/actors/actor-sheet-ffg.js | 188 +++++++++++----------- modules/groupmanager-ffg.js | 67 ++++++++ modules/items/item-sheet-ffg.js | 144 +++++++++-------- modules/swffg-main.js | 48 ++++-- styles/swffg.css | 156 +++++++++--------- system.json | 4 +- templates/actors/ffg-character-sheet.html | 180 ++++++++++----------- templates/group-manager.html | 5 + 9 files changed, 469 insertions(+), 346 deletions(-) create mode 100644 modules/groupmanager-ffg.js create mode 100644 templates/group-manager.html diff --git a/README.md b/README.md index a047db46..555db620 100644 --- a/README.md +++ b/README.md @@ -19,8 +19,31 @@ This is most easily available from the in-game Module browser. After installing https://raw.githubusercontent.com/Esrin/StarWarsFFG/esrin-dev/system.json 5. Click Install, after a few seconds the system should be installed. +# To-do + +NEEDED FOR RELEASE V1: + +- Group Management sheet for GM use (currently in progress). +- Create equipable item functionality and rework inventory to suit. Continue to improve inventory display in the process. +- Add talents to minion sheet. +- Add Forcepower item type (based on talent). +- Redo the dice selection popup to be more functional and provide upgrade ability and upgrade difficulty buttons. +- Rebuild dice functionality to use Foundry Dice instead of chat content, remove requirement for Special-Dice-Roller. +- Localisation hooks +- Look into drag-and-drop item behaviours for things like transferring items between characters, or into a vehicle cargo hold. +- SASS refactor + +NICE TO HAVE: + +- Create JS data models for species, careers and specialisations and use those in prepareData to define career skills and starting characteristics. +- Attempt to fix display of wound and strain bars so that they suit FFG system. +- Genesys cross-compatibility (dice, sheets) +- Rework Special Qualities and Critical Injuries to be item type, add view to item sheets and character sheets. +- Character creator + # Changelog +- 25/05/2020 - Esrin - Character sheet tweaks. Continued improvements to the inventory display in advance of equipable item support. - 22/05/2020 - Esrin - Minor bug fixes and tweaks, compatibility check with FVTT 0.6.0 stable release. - 18/05/2020 - alfarobl - Tweak to dice display orders to match the chat order, kindly provided by alfarobl. - 18/05/2020 - Esrin - A very hacky method has been introduced to allow the built in FoundryVTT combat tracker to roll initiative using FFG dice results. The resulting number is made up of successes and advantages. For example 1 success and 2 advantage would result in 1.02 for the initiative tracker. Warning, there might be bugs with this solution! Initiative can be switched between Vigilance and Cool via the System Settings section of the world configuration. diff --git a/modules/actors/actor-sheet-ffg.js b/modules/actors/actor-sheet-ffg.js index c3eed161..286beee2 100644 --- a/modules/actors/actor-sheet-ffg.js +++ b/modules/actors/actor-sheet-ffg.js @@ -10,20 +10,20 @@ export class ActorSheetFFG extends ActorSheet { * @type {Set} */ this._filters = { - skills: new Set() + skills: new Set(), }; } pools = new Map(); /** @override */ - static get defaultOptions() { - return mergeObject(super.defaultOptions, { - classes: ["worldbuilding", "sheet", "actor"], - template: "systems/starwarsffg/templates/actors/ffg-character-sheet.html", + static get defaultOptions() { + return mergeObject(super.defaultOptions, { + classes: ["starwarsffg", "sheet", "actor"], + template: "systems/starwarsffg/templates/actors/ffg-character-sheet.html", width: 710, height: 650, - tabs: [{navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "characteristics"}] + tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "characteristics" }], }); } @@ -38,23 +38,23 @@ export class ActorSheetFFG extends ActorSheet { /** @override */ getData() { const data = super.getData(); - data.dtypes = ["String", "Number", "Boolean"]; - for ( let attr of Object.values(data.data.attributes) ) { - attr.isCheckbox = attr.dtype === "Boolean"; - } - data.FFG = CONFIG.FFG; - switch(this.actor.data.type) { - case 'character': + data.dtypes = ["String", "Number", "Boolean"]; + for (let attr of Object.values(data.data.attributes)) { + attr.isCheckbox = attr.dtype === "Boolean"; + } + data.FFG = CONFIG.FFG; + switch (this.actor.data.type) { + case "character": this.position.width = 610; this.position.height = 840; break; - case 'minion': + case "minion": this.position.width = 700; this.position.height = 620; break; - case 'vehicle': + case "vehicle": this.position.width = 710; - this.position.height= 650; + this.position.height = 650; default: } return data; @@ -63,29 +63,22 @@ export class ActorSheetFFG extends ActorSheet { /* -------------------------------------------- */ /** @override */ - activateListeners(html) { + activateListeners(html) { super.activateListeners(html); // Activate tabs - let tabs = html.find('.tabs'); + let tabs = html.find(".tabs"); let initial = this._sheetTab; new TabsV2(tabs, { initial: initial, - callback: clicked => this._sheetTab = clicked.data("tab") + callback: (clicked) => (this._sheetTab = clicked.data("tab")), }); // Everything below here is only needed if the sheet is editable if (!this.options.editable) return; - // // Update Inventory Item - // html.find('.item-edit').click(ev => { - // const li = $(ev.currentTarget).parents(".item"); - // const item = this.actor.getOwnedItem(li.data("itemId")); - // item.sheet.render(true); - // }); - // Update Inventory Item - By clicking entire line - html.find('.attribute.item').click(ev => { + html.find(".item").click((ev) => { if (!$(ev.target).hasClass("fa-trash")) { const li = $(ev.currentTarget); const item = this.actor.getOwnedItem(li.data("itemId")); @@ -93,7 +86,7 @@ export class ActorSheetFFG extends ActorSheet { } }); // Update Talent - By clicking entire line - html.find('.talents.item').click(ev => { + html.find(".talents.item").click((ev) => { if (!$(ev.target).hasClass("fa-trash")) { const li = $(ev.currentTarget); const item = this.actor.getOwnedItem(li.data("itemId")); @@ -102,7 +95,7 @@ export class ActorSheetFFG extends ActorSheet { }); // Delete Inventory Item - html.find('.item-delete').click(ev => { + html.find(".item-delete").click((ev) => { const li = $(ev.currentTarget).parents(".item"); this.actor.deleteOwnedItem(li.data("itemId")); li.slideUp(200, () => this.render(false)); @@ -111,79 +104,84 @@ export class ActorSheetFFG extends ActorSheet { // Set skill filter element. html.find(".skillfilter").each((_, elem) => { const filters = this._filters.skills; - if (!filters.filter) { filters.filter = "all"; } + if (!filters.filter) { + filters.filter = "all"; + } }); // Update radio button checked status for skill filter controls. html.find(".filter-control").each((_, elem) => { - if(elem.id == this._filters.skills.filter) { elem.checked = true; } - else { elem.checked = false; } + if (elem.id == this._filters.skills.filter) { + elem.checked = true; + } else { + elem.checked = false; + } }); // Setup dice pool image and hide filtered skills html.find(".skill").each((_, elem) => { - this._addSkillDicePool(elem) + this._addSkillDicePool(elem); const filters = this._filters.skills; if (filters.filter != "all") { if (elem.dataset["skilltype"] != filters.filter) { elem.style.display = "none"; - } - else { + } else { elem.style.display = ""; } } }); // Roll Skill - html.find(".roll-button").children().on("click", async (event) => { - let upgradeType = null; - if (event.ctrlKey && !event.shiftKey) { - upgradeType = "ability" - } else if (!event.ctrlKey && event.shiftKey) { - upgradeType = "difficulty"; - } - await this._rollSkill(event, upgradeType); - }); + html + .find(".roll-button") + .children() + .on("click", async (event) => { + let upgradeType = null; + if (event.ctrlKey && !event.shiftKey) { + upgradeType = "ability"; + } else if (!event.ctrlKey && event.shiftKey) { + upgradeType = "difficulty"; + } + await this._rollSkill(event, upgradeType); + }); // Add or Remove Attribute html.find(".attributes").on("click", ".attribute-control", this._onClickAttributeControl.bind(this)); // Update Filter value. html.find(".skillfilter").on("click", ".filter-control", this._onClickFilterControl.bind(this)); - } /* -------------------------------------------- */ - /** * Listen for click events on an attribute control to modify the composition of attributes in the sheet * @param {MouseEvent} event The originating left click event * @private */ - async _onClickAttributeControl(event) { - event.preventDefault(); - const a = event.currentTarget; - const action = a.dataset.action; - const attrs = this.object.data.data.attributes; - const form = this.form; - - // Add new attribute - if ( action === "create" ) { - const nk = Object.keys(attrs).length + 1; - let newKey = document.createElement("div"); - newKey.innerHTML = ``; - form.appendChild(newKey); - await this._onSubmit(event); - } - - // Remove existing attribute - else if ( action === "delete" ) { - const li = a.closest(".attribute"); - li.parentElement.removeChild(li); - await this._onSubmit(event); - } - } + async _onClickAttributeControl(event) { + event.preventDefault(); + const a = event.currentTarget; + const action = a.dataset.action; + const attrs = this.object.data.data.attributes; + const form = this.form; + + // Add new attribute + if (action === "create") { + const nk = Object.keys(attrs).length + 1; + let newKey = document.createElement("div"); + newKey.innerHTML = ``; + form.appendChild(newKey); + await this._onSubmit(event); + } + + // Remove existing attribute + else if (action === "delete") { + const li = a.closest(".attribute"); + li.parentElement.removeChild(li); + await this._onSubmit(event); + } + } /** * Listen for click events on a filter control to modify the selected filter option. @@ -204,27 +202,31 @@ export class ActorSheetFFG extends ActorSheet { /** @override */ _updateObject(event, formData) { - // Handle the free-form attributes list const formAttrs = expandObject(formData).data.attributes || {}; const attributes = Object.values(formAttrs).reduce((obj, v) => { let k = v["key"].trim(); - if ( /[\s\.]/.test(k) ) return ui.notifications.error("Attribute keys may not contain spaces or periods"); + if (/[\s\.]/.test(k)) return ui.notifications.error("Attribute keys may not contain spaces or periods"); delete v["key"]; obj[k] = v; return obj; }, {}); // Remove attributes which are no longer used - for ( let k of Object.keys(this.object.data.data.attributes) ) { - if ( !attributes.hasOwnProperty(k) ) attributes[`-=${k}`] = null; + for (let k of Object.keys(this.object.data.data.attributes)) { + if (!attributes.hasOwnProperty(k)) attributes[`-=${k}`] = null; } // Re-combine formData - formData = Object.entries(formData).filter(e => !e[0].startsWith("data.attributes")).reduce((obj, e) => { - obj[e[0]] = e[1]; - return obj; - }, {_id: this.object._id, "data.attributes": attributes}); + formData = Object.entries(formData) + .filter((e) => !e[0].startsWith("data.attributes")) + .reduce( + (obj, e) => { + obj[e[0]] = e[1]; + return obj; + }, + { _id: this.object._id, "data.attributes": attributes } + ); // Update the Actor return this.object.update(formData); @@ -233,7 +235,7 @@ export class ActorSheetFFG extends ActorSheet { async _rollSkillManual(skill, ability, difficulty) { const dicePool = new DicePoolFFG({ ability: ability, - difficulty: difficulty + difficulty: difficulty, }); dicePool.upgrade(skill); await this._completeRollManual(dicePool, skillName); @@ -248,14 +250,14 @@ export class ActorSheetFFG extends ActorSheet { const dicePool = new DicePoolFFG({ ability: characteristic.value, - difficulty: 2 // Default to average difficulty + difficulty: 2, // Default to average difficulty }); dicePool.upgrade(skill.rank); if (upgradeType === "ability") { dicePool.upgrade(); - } else if (upgradeType === "difficulty") { - dicePool.upgradeDifficulty() + } else if (upgradeType === "difficulty") { + dicePool.upgradeDifficulty(); } await this._completeRoll(dicePool, `Rolling ${skillName}`, skillName); @@ -285,26 +287,26 @@ export class ActorSheetFFG extends ActorSheet { speaker: this.getData(), flavor: `Rolling ${skillName}...`, sound: CONFIG.sounds.dice, - content: `/sw ${finalPool.renderDiceExpression()}` + content: `/sw ${finalPool.renderDiceExpression()}`, }); - } + }, }, two: { icon: '', label: "Cancel", - } + }, }, - }).render(true) + }).render(true); } async _completeRollManual(dicePool, skillName) { - ChatMessage.create({ - user: game.user._id, - speaker: this.getData(), - flavor: `Rolling ${skillName}...`, - sound: CONFIG.sounds.dice, - content: `/sw ${dicePool.renderDiceExpression()}` - }); + ChatMessage.create({ + user: game.user._id, + speaker: this.getData(), + flavor: `Rolling ${skillName}...`, + sound: CONFIG.sounds.dice, + content: `/sw ${dicePool.renderDiceExpression()}`, + }); } _addSkillDicePool(elem) { @@ -319,6 +321,6 @@ export class ActorSheetFFG extends ActorSheet { dicePool.upgrade(Math.min(characteristic.value, skill.rank)); const rollButton = elem.querySelector(".roll-button"); - dicePool.renderPreview(rollButton) + dicePool.renderPreview(rollButton); } } diff --git a/modules/groupmanager-ffg.js b/modules/groupmanager-ffg.js new file mode 100644 index 00000000..8b3866a1 --- /dev/null +++ b/modules/groupmanager-ffg.js @@ -0,0 +1,67 @@ +export class GroupManagerLayer extends TokenLayer { + constructor() { + super(); + } + + static get layerOptions() { + return mergeObject(super.layerOptions, { + canDragCreate: false, + }); + } + /* -------------------------------------------- */ + /* Methods + /* -------------------------------------------- */ + + activate() { + super.activate(); + } + + deactivate() { + super.deactivate(); + } + + async draw() { + super.draw(); + } + + /* -------------------------------------------- */ +} + +export class GroupManager extends FormApplication { + static get defaultOptions() { + return mergeObject(super.defaultOptions, { + classes: ["form", "groupmanager", "sidebar-popout"], + closeOnSubmit: false, + submitOnChange: true, + submitOnClose: true, + popOut: true, + editable: game.user.isGM, + width: 300, + height: 450, + template: "systems/starwarsffg/templates/group-manager.html", + id: "group-manager", + title: "Group Manager", + }); + } + + /* -------------------------------------------- */ + + /** + * Obtain module metadata and merge it with game settings which track current module visibility + * @return {Object} The data provided to the template when rendering the form + */ + getData() { + // Return data to the template + return {}; + } + + /** + * This method is called upon form submission after form data is validated + * @param event {Event} The initial triggering submission event + * @param formData {Object} The object of validated form data with which to update the object + * @private + */ + _updateObject(event, formData) { + return formData; + } +} diff --git a/modules/items/item-sheet-ffg.js b/modules/items/item-sheet-ffg.js index 175d08b4..03a42392 100644 --- a/modules/items/item-sheet-ffg.js +++ b/modules/items/item-sheet-ffg.js @@ -3,49 +3,47 @@ * @extends {ItemSheet} */ export class ItemSheetFFG extends ItemSheet { - /** @override */ - static get defaultOptions() { - return mergeObject(super.defaultOptions, { - classes: ["worldbuilding", "sheet", "item"], - width: 784, - height: 484, - tabs: [{navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "description"}] - }); + static get defaultOptions() { + return mergeObject(super.defaultOptions, { + classes: ["starwarsffg", "sheet", "item"], + width: 784, + height: 484, + tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "description" }], + }); } - /** @override */ + /** @override */ get template() { const path = "systems/starwarsffg/templates/items"; return `${path}/ffg-${this.item.data.type}-sheet.html`; } - /* -------------------------------------------- */ /** @override */ getData() { const data = super.getData(); - data.dtypes = ["String", "Number", "Boolean"]; - for ( let attr of Object.values(data.data.attributes) ) { - attr.isCheckbox = attr.dtype === "Boolean"; - } - data.FFG = CONFIG.FFG; + data.dtypes = ["String", "Number", "Boolean"]; + for (let attr of Object.values(data.data.attributes)) { + attr.isCheckbox = attr.dtype === "Boolean"; + } + data.FFG = CONFIG.FFG; return data; } /* -------------------------------------------- */ /** @override */ - activateListeners(html) { + activateListeners(html) { super.activateListeners(html); // Activate tabs - let tabs = html.find('.tabs'); + let tabs = html.find(".tabs"); let initial = this._sheetTab; new TabsV2(tabs, { initial: initial, - callback: clicked => this._sheetTab = clicked.data("tab") + callback: (clicked) => (this._sheetTab = clicked.data("tab")), }); // Everything below here is only needed if the sheet is editable @@ -62,57 +60,61 @@ export class ItemSheetFFG extends ItemSheet { * @param {MouseEvent} event The originating left click event * @private */ - async _onClickAttributeControl(event) { - event.preventDefault(); - const a = event.currentTarget; - const action = a.dataset.action; - const attrs = this.object.data.data.attributes; - const form = this.form; - - // Add new attribute - if ( action === "create" ) { - const nk = Object.keys(attrs).length + 1; - let newKey = document.createElement("div"); - newKey.innerHTML = ``; - form.appendChild(newKey); - await this._onSubmit(event); - } - - // Remove existing attribute - else if ( action === "delete" ) { - const li = a.closest(".attribute"); - li.parentElement.removeChild(li); - await this._onSubmit(event); - } - } - - /* -------------------------------------------- */ - - /** @override */ - _updateObject(event, formData) { - - // Handle the free-form attributes list - const formAttrs = expandObject(formData).data.attributes || {}; - const attributes = Object.values(formAttrs).reduce((obj, v) => { - let k = v["key"].trim(); - if ( /[\s\.]/.test(k) ) return ui.notifications.error("Attribute keys may not contain spaces or periods"); - delete v["key"]; - obj[k] = v; - return obj; - }, {}); - - // Remove attributes which are no longer used - for ( let k of Object.keys(this.object.data.data.attributes) ) { - if ( !attributes.hasOwnProperty(k) ) attributes[`-=${k}`] = null; - } - - // Re-combine formData - formData = Object.entries(formData).filter(e => !e[0].startsWith("data.attributes")).reduce((obj, e) => { - obj[e[0]] = e[1]; - return obj; - }, {_id: this.object._id, "data.attributes": attributes}); - - // Update the Actor - return this.object.update(formData); - } + async _onClickAttributeControl(event) { + event.preventDefault(); + const a = event.currentTarget; + const action = a.dataset.action; + const attrs = this.object.data.data.attributes; + const form = this.form; + + // Add new attribute + if (action === "create") { + const nk = Object.keys(attrs).length + 1; + let newKey = document.createElement("div"); + newKey.innerHTML = ``; + form.appendChild(newKey); + await this._onSubmit(event); + } + + // Remove existing attribute + else if (action === "delete") { + const li = a.closest(".attribute"); + li.parentElement.removeChild(li); + await this._onSubmit(event); + } + } + + /* -------------------------------------------- */ + + /** @override */ + _updateObject(event, formData) { + // Handle the free-form attributes list + const formAttrs = expandObject(formData).data.attributes || {}; + const attributes = Object.values(formAttrs).reduce((obj, v) => { + let k = v["key"].trim(); + if (/[\s\.]/.test(k)) return ui.notifications.error("Attribute keys may not contain spaces or periods"); + delete v["key"]; + obj[k] = v; + return obj; + }, {}); + + // Remove attributes which are no longer used + for (let k of Object.keys(this.object.data.data.attributes)) { + if (!attributes.hasOwnProperty(k)) attributes[`-=${k}`] = null; + } + + // Re-combine formData + formData = Object.entries(formData) + .filter((e) => !e[0].startsWith("data.attributes")) + .reduce( + (obj, e) => { + obj[e[0]] = e[1]; + return obj; + }, + { _id: this.object._id, "data.attributes": attributes } + ); + + // Update the Actor + return this.object.update(formData); + } } diff --git a/modules/swffg-main.js b/modules/swffg-main.js index e32fb277..5a2b2046 100644 --- a/modules/swffg-main.js +++ b/modules/swffg-main.js @@ -12,6 +12,8 @@ import { ItemFFG } from "./items/item-ffg.js"; import { ItemSheetFFG } from "./items/item-sheet-ffg.js"; import { ActorSheetFFG } from "./actors/actor-sheet-ffg.js"; import { DicePoolFFG } from "./dice-pool-ffg.js"; +import { GroupManagerLayer } from "./groupmanager-ffg.js"; +import { GroupManager } from "./groupmanager-ffg.js"; /* -------------------------------------------- */ /* Foundry VTT Initialization */ @@ -188,20 +190,32 @@ Hooks.once("init", async function () { }); }); -// /* -------------------------------------------- */ -// /* Set up control buttons */ -// /* -------------------------------------------- */ - -// Hooks.on("getSceneControlButtons", (controls) => { -// if (game.user.isGM) { -// controls.push({ -// name: "groupmanager", -// title: "Group Manager", -// icon: "fas fa-users", -// onClick: () => { -// new GroupManager().render(true); -// }, -// button: true, -// }); -// } -// }); +/* -------------------------------------------- */ +/* Set up control buttons */ +/* -------------------------------------------- */ + +Hooks.on("getSceneControlButtons", (controls) => { + if (game.user.isGM) { + controls.push({ + name: "groupmanager", + title: "Group Manager", + icon: "fas fa-users", + layer: "GroupManagerLayer", + tools: [ + { + name: "groupsheet", + title: "Open Group Sheet", + icon: "fas fa-users", + onClick: () => { + new GroupManager().render(true); + }, + button: true, + }, + ], + }); + } +}); + +Hooks.once("canvasInit", (canvas) => { + canvas.groupmanager = canvas.stage.addChildAt(new GroupManagerLayer(canvas), 8); +}); diff --git a/styles/swffg.css b/styles/swffg.css index c918b71c..c59c07de 100644 --- a/styles/swffg.css +++ b/styles/swffg.css @@ -29,7 +29,6 @@ .item:hover .hover { text-decoration: underline; - text-decoration-style: double; } .hover:hover .tooltip { @@ -113,18 +112,18 @@ div .container.talents { margin-top: 5px; } -.worldbuilding.sheet .window-content { +.starwarsffg.sheet .window-content { padding: 5px; overflow-y: hidden; } -.worldbuilding.sheet.actor { +.starwarsffg.sheet.actor { min-width: 575px; min-height: 489px; } /* Sheet Header */ -.worldbuilding.sheet .sheet-header { +.starwarsffg.sheet .sheet-header { overflow: hidden; display: flex; flex-direction: row; @@ -133,7 +132,7 @@ div .container.talents { flex: 0 0 100px; } -.worldbuilding.sheet .profile-img { +.starwarsffg.sheet .profile-img { flex: 0 0 100px; height: 124px; width: auto; @@ -143,27 +142,27 @@ div .container.talents { border-radius: 15px; } -.worldbuilding.sheet .header-fields { +.starwarsffg.sheet .header-fields { flex: 1; height: auto; } -.worldbuilding.sheet .charname { +.starwarsffg.sheet .charname { border-bottom: 0; display: flex; } -.worldbuilding.sheet .charname.minion { +.starwarsffg.sheet .charname.minion { border-bottom: 0; display: flex; } -.worldbuilding.sheet .charname input { +.starwarsffg.sheet .charname input { width: auto; margin: 5px 5px 10px 5px; } -.worldbuilding.sheet .resource { +.starwarsffg.sheet .resource { height: 40px; padding-bottom: 4px; padding-left: 2px; @@ -171,12 +170,12 @@ div .container.talents { display: inline-table; } -.worldbuilding.sheet .resource input { +.starwarsffg.sheet .resource input { width: 82px; height: 22px; } -.worldbuilding.sheet .xp-box { +.starwarsffg.sheet .xp-box { position: absolute; padding: 0; left: 25px; @@ -186,91 +185,73 @@ div .container.talents { display: flex; } -.worldbuilding.sheet .xp-box input { +.starwarsffg.sheet .xp-box input { width: 61px; height: 14px; } -.worldbuilding.sheet .resource.small input { +.starwarsffg.sheet .resource.small input { width: 40px; height: 22px; } /* Navigation Tabs */ -.worldbuilding.sheet .tabs { +.starwarsffg.sheet .tabs { flex: 0 0 40px; border-top: 1px solid #aaa; border-bottom: 1px solid #aaa; margin-top: 3px; } -.worldbuilding.sheet .tabs .item { +.starwarsffg.sheet .tabs .item { line-height: 40px; font-weight: bold; } -.worldbuilding.sheet .tabs .item.active { +.starwarsffg.sheet .tabs .item.active { text-decoration: underline; text-shadow: none; } -.worldbuilding.sheet .attributes-list .attribute.item { - position: relative; -} - -.worldbuilding.sheet .attributes-list .attribute.item label { - overflow: hidden; -} - -.worldbuilding.sheet .attributes-list .attribute.item:hover { - background: rgb(25, 24, 19, 0.12); - margin: +2px; -} - -.worldbuilding.sheet .talents-list .talents.item:hover { - background: rgb(25, 24, 19, 0.12); - margin: +2px; -} - /* Content Tabs */ -.worldbuilding.sheet .sheet-body { +.starwarsffg.sheet .sheet-body { height: calc(100% - 19em); overflow: auto; border: 1px solid #868686; } -.worldbuilding.sheet .sheet-body.minion { +.starwarsffg.sheet .sheet-body.minion { height: calc(100% - 14em); overflow: auto; } -.worldbuilding.sheet .sheet-body.vehicle { +.starwarsffg.sheet .sheet-body.vehicle { height: calc(100% - 25em); overflow: auto; } -.worldbuilding.sheet .sheet-body.small { +.starwarsffg.sheet .sheet-body.small { height: calc(100% - 16em); overflow: auto; } -.worldbuilding.sheet .sheet-body .tab { +.starwarsffg.sheet .sheet-body .tab { height: 100%; } -.worldbuilding.sheet .sheet-body .editor { +.starwarsffg.sheet .sheet-body .editor { width: 100%; height: 100%; } /* Topper */ -.worldbuilding.sheet .sheet-topper { +.starwarsffg.sheet .sheet-topper { background: #435a76; overflow: auto; text-align: center; border-radius: 15px; justify-content: center; } -.worldbuilding.sheet .sheet-topper * > input { +.starwarsffg.sheet .sheet-topper * > input { background: #f2f2f2; border-radius: 0 0 15px 15px; width: auto; @@ -285,58 +266,70 @@ sheet work. There is likely a better way to do this. } /* Items */ -.worldbuilding.sheet .items-list { - list-style: none; - margin: 7px 0; - padding: 0; +.starwarsffg.sheet .items { + margin: 0; + border: 0; +} + +.starwarsffg.sheet .items-header { + border: 1px solid #aaa; + border-radius: 2px; +} +.starwarsffg.sheet .items-list { overflow-y: auto; } -.worldbuilding.sheet .items-list .item { +.starwarsffg.sheet .items-list .item { height: 30px; line-height: 24px; padding: 3px 0; border-bottom: 1px solid #bbb; } -.worldbuilding.sheet .items-list .item img { +.starwarsffg.sheet .items-list .item img { flex: 0 0 24px; margin-right: 5px; } -.worldbuilding.sheet .items-list .item-name { +.starwarsffg.sheet .items-list .item-name { margin: 0; } -.worldbuilding.sheet .items-list .item-controls { - flex: 0 0 36px; +.starwarsffg.sheet .items-list .item-controls { z-index: 500; + width: 20px; + text-align: end; +} + +.starwarsffg.sheet .items-list .item:hover { + background: rgb(25, 24, 19, 0.12); + margin: +2px; } /* Attributes */ -.worldbuilding.sheet .attributes { - margin: 0 5px 0 5px; +.starwarsffg.sheet .attributes { + margin: 0; + border: 0; } -.worldbuilding.sheet .attributes-header { +.starwarsffg.sheet .attributes-header { padding: 5px; margin: 0 0 5px 0; background: rgba(0, 0, 0, 0.05); border: 1px solid #aaa; border-radius: 2px; - text-align: center; font-weight: bold; } -.worldbuilding.sheet .attribute-label { +.starwarsffg.sheet .attribute-label { flex: 1.5; } -.worldbuilding.sheet .attribute-control { +.starwarsffg.sheet .attribute-control { flex: 0 0 20px; } -.worldbuilding.sheet .attributes-list { +.starwarsffg.sheet .attributes-list { list-style: none; margin: 0; padding: 0; } -.worldbuilding.sheet .attributes-list li > * { +.starwarsffg.sheet .attributes-list tr > * { margin: 0 3px; height: 28px; line-height: 24px; @@ -344,24 +337,32 @@ sheet work. There is likely a better way to do this. border: none; border-radius: 0; border-bottom: 1px solid #aaa; - text-align: center; overflow: auto; } -.worldbuilding.sheet .attribute-value.checkbox { +.starwarsffg.sheet .attribute-value.checkbox { text-align: center; } -.worldbuilding.sheet .attributes-list li a.attribute-control { +.starwarsffg.sheet .attributes-list tr a.attribute-control { border: none; } +.starwarsffg.sheet .attributes-list .attribute.item { + position: relative; +} + +.starwarsffg.sheet .attributes-list .attribute.item:hover { + background: rgb(25, 24, 19, 0.12); + margin: +2px; +} + /* Talents */ -.worldbuilding.sheet .talents { +.starwarsffg.sheet .talents { margin: 0 5px 0 5px; } -.worldbuilding.sheet .talents-header { +.starwarsffg.sheet .talents-header { padding: 5px; margin: 5px 0; background: rgba(0, 0, 0, 0.05); @@ -370,17 +371,17 @@ sheet work. There is likely a better way to do this. text-align: center; font-weight: bold; } -.worldbuilding.sheet .talents-label { +.starwarsffg.sheet .talents-label { flex: 1.5; } -.worldbuilding.sheet .talents-list { +.starwarsffg.sheet .talents-list { list-style: none; margin: 0; padding: 0; } -.worldbuilding.sheet .talents-list li > * { +.starwarsffg.sheet .talents-list li > * { margin: 0 3px; height: 28px; line-height: 24px; @@ -392,12 +393,21 @@ sheet work. There is likely a better way to do this. overflow: auto; } -.worldbuilding.sheet .characteristics-list { +.starwarsffg.sheet .talents-list .talents.item { + position: relative; +} + +.starwarsffg.sheet .talents-list .talents.item:hover { + background: rgb(25, 24, 19, 0.12); + margin: +2px; +} + +.starwarsffg.sheet .characteristics-list { list-style: none; box-shadow: 0px 1px 1px 0px #999; } -.worldbuilding.sheet .characteristics-list input { +.starwarsffg.sheet .characteristics-list input { border-radius: 100%; width: 2em; height: 2em; @@ -406,11 +416,11 @@ sheet work. There is likely a better way to do this. font-size: 18pt; } -.worldbuilding.sheet .characteristics-list input:invalid { +.starwarsffg.sheet .characteristics-list input:invalid { border: 2px solid red; } -.worldbuilding.sheet .characteristics-list label { +.starwarsffg.sheet .characteristics-list label { display: block; width: 3em; text-align: center; @@ -449,7 +459,7 @@ boxes at the top of the standard FFG character sheets. .split-box input { border: 0; text-align: center; - background: transparent; + background: #ffffff78; } .split-box label { diff --git a/system.json b/system.json index f3069742..1a88a54b 100644 --- a/system.json +++ b/system.json @@ -2,7 +2,7 @@ "name": "starwarsffg", "title": "Star Wars FFG", "description": "A system for playing Star Wars FFG games.", - "version": 0.051, + "version": 0.052, "minimumCoreVersion": "0.5.6", "compatibleCoreVersion": "0.6.0", "templateVersion": 1, @@ -27,6 +27,6 @@ "secondaryTokenAttribute": "strain", "url": "https://github.com/Esrin/StarWarsFFG/tree/esrin-dev", "manifest": "https://raw.githubusercontent.com/Esrin/StarWarsFFG/esrin-dev/system.json", - "download": "https://github.com/Esrin/StarWarsFFG/releases/download/esrin-dev_0.05/esrin-dev_0.051.zip", + "download": "https://github.com/Esrin/StarWarsFFG/releases/download/esrin-dev_0.05/esrin-dev_0.052.zip", "license": "LICENSE.txt" } diff --git a/templates/actors/ffg-character-sheet.html b/templates/actors/ffg-character-sheet.html index 88239bb4..9cbd5230 100644 --- a/templates/actors/ffg-character-sheet.html +++ b/templates/actors/ffg-character-sheet.html @@ -156,13 +156,16 @@

                  Encum

                  -
                  +
                  Ability
                  Proficiency
                  DifficultyAbility
                  Challenge
                  Difficulty
                  Boost

                  General

                  - + @@ -172,7 +175,7 @@

                  General

                  NameCareer Skill + CS +
                  Career Skill
                  +
                  Rank Roll
                  {{id}} {{#with (lookup ../this.data.characteristics [characteristic])~}} ({{abrev}}) {{/with}} - + @@ -186,13 +189,16 @@

                  General

                  -
                  +

                  Combat

                  - + @@ -202,7 +208,7 @@

                  Combat

                  - + @@ -230,7 +239,7 @@

                  Knowledge

                  @@ -239,106 +239,133 @@

                  Knowledge

                  {{!-- Owned Items Tab --}}
                  - - {{!-- Credits Box --}} -
                  -
                  - {{!-- Weapons List --}} -
                  -

                  -
                  - Name - Skill - Damage - Range - Crit - Special - Encum - Del -
                  -
                    - {{#each actor.items as |item id|}} - {{#iff item.type '==' 'weapon'}} -
                  1. -

                    {{item.name}}
                    {{item.safe_desc}}

                    - - - - - - -
                    - - -
                    -
                  2. - {{/iff}} - {{/each}} -
                  -
                  - +
                  NameCareer Skill + CS +
                  Career Skill
                  +
                  Rank Roll
                  {{id}} {{#with (lookup ../this.data.characteristics [characteristic])~}} ({{abrev}}) {{/with}} - + @@ -220,7 +226,10 @@

                  Knowledge

                  NameCareer Skill + CS +
                  Career Skill
                  +
                  Rank Roll
                  {{lookup ../this.FFG.skills.knowledgestripped [id]~}} {{#with (lookup ../this.data.characteristics [characteristic])~}} ({{abrev}}) {{/with}} - + @@ -250,107 +259,98 @@

                  Knowledge

                  {{!-- Owned Items Tab --}}
                  {{!-- Weapons List --}} -
                  +

                  -
                  - Name - Skill - Damage - Range - Crit - Special - Encum - Del -
                  -
                    +
                  + + + + + + + + + + + + {{#each actor.items as |item id|}} {{#iff item.type '==' 'weapon'}} -
                1. -

                  - {{item.name}} -
                  {{item.safe_desc}}
                  -

                  - - - - - - -
                  +
                2. + + + + + + + + + {{/iff}} {{/each}} - - + +
                  NameSkillDamageRangeCritSpecialEncumDel
                  {{item.name}}{{lookup ../this.FFG.combat_skills.abrev item.data.skill.value}}{{item.data.damage.value}}{{item.data.range.value}}{{item.data.crit.value}}{{item.data.special.value}}{{item.data.encumbrance.value}} - - +
                  {{!-- Armour List --}} -
                  +

                  -
                  - Name - Defence - Soak - HP - Encum - Del -
                  -
                    +
                  + + + + + + + + + + {{#each actor.items as |item id|}} {{#iff item.type '==' 'armour'}} -
                3. -

                  - {{item.name}} -
                  {{item.safe_desc}}
                  -

                  - - - - -
                  +
                4. + + + + + + + {{/iff}} {{/each}} - - + +
                  NameDefenceSoakHPEncumDel
                  {{item.name}}{{item.data.defence.value}}{{item.data.soak.value}}{{item.data.hardpoints.value}}{{item.data.encumbrance.value}} - - +
                  {{!-- Gear List --}} -
                  +

                  -
                  - Name - Price - Rarity - Quantity - Encum - Del -
                  -
                    +
                  + + + + + + + + + + {{#each actor.items as |item id|}} {{#iff item.type '==' 'gear'}} -
                5. -

                  - {{item.name}} -
                  {{item.safe_desc}}
                  -

                  - - - - -
                  +
                6. + + + + + + + {{/iff}} {{/each}} - - + +
                  NamePriceRarityQtyEncumDel
                  {{item.name}}{{item.data.price.value}}{{item.data.rarity.value}}{{item.data.quantity.value}}{{item.data.encumbrance.value}} - - +
                  {{!-- Talents Tab --}} diff --git a/templates/group-manager.html b/templates/group-manager.html new file mode 100644 index 00000000..b686fadb --- /dev/null +++ b/templates/group-manager.html @@ -0,0 +1,5 @@ +
                  +
                  + Coming Soon +
                  +
                  From 19f845235e3a32013e155dd998f45a8fda93bd3f Mon Sep 17 00:00:00 2001 From: Esrin Date: Thu, 28 May 2020 18:19:19 +0100 Subject: [PATCH 15/44] Brought the Minion sheet inventory in line with the latest Character sheet changes. Added talents to Minion sheet. Fixed a minor bug with group skill calculations (thanks Alex | HDScurox for the bug report). --- README.md | 2 +- modules/actors/actor-ffg.js | 27 ++-- system.json | 4 +- templates/actors/ffg-minion-sheet.html | 215 ++++++++++++++----------- 4 files changed, 136 insertions(+), 112 deletions(-) diff --git a/README.md b/README.md index 555db620..0f3988e8 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,6 @@ NEEDED FOR RELEASE V1: - Group Management sheet for GM use (currently in progress). - Create equipable item functionality and rework inventory to suit. Continue to improve inventory display in the process. -- Add talents to minion sheet. - Add Forcepower item type (based on talent). - Redo the dice selection popup to be more functional and provide upgrade ability and upgrade difficulty buttons. - Rebuild dice functionality to use Foundry Dice instead of chat content, remove requirement for Special-Dice-Roller. @@ -43,6 +42,7 @@ NICE TO HAVE: # Changelog +- 28/05/2020 - Esrin - Brought the Minion sheet inventory in line with the latest Character sheet changes. Added talents to Minion sheet. Fixed a minor bug with group skill calculations (thanks Alex | HDScurox for the bug report). - 25/05/2020 - Esrin - Character sheet tweaks. Continued improvements to the inventory display in advance of equipable item support. - 22/05/2020 - Esrin - Minor bug fixes and tweaks, compatibility check with FVTT 0.6.0 stable release. - 18/05/2020 - alfarobl - Tweak to dice display orders to match the chat order, kindly provided by alfarobl. diff --git a/modules/actors/actor-ffg.js b/modules/actors/actor-ffg.js index 81f76738..45b7c8c0 100644 --- a/modules/actors/actor-ffg.js +++ b/modules/actors/actor-ffg.js @@ -3,7 +3,6 @@ * @extends {Actor} */ export class ActorFFG extends Actor { - /** * Augment the basic actor data with additional dynamic data. */ @@ -16,8 +15,8 @@ export class ActorFFG extends Actor { // Make separate methods for each Actor type (character, minion, etc.) to keep // things organized. - if (actorData.type === 'minion') this._prepareMinionData(actorData); - if (actorData.type === 'character') this._prepareCharacterData(actorData); + if (actorData.type === "minion") this._prepareMinionData(actorData); + if (actorData.type === "character") this._prepareCharacterData(actorData); } /** @@ -27,22 +26,23 @@ export class ActorFFG extends Actor { const data = actorData.data; // Set Wounds threshold to unit_wounds * quantity to account for minion group health. - data.stats.wounds.max = Math.floor(data.unit_wounds.value*data.quantity.value); + data.stats.wounds.max = Math.floor(data.unit_wounds.value * data.quantity.value); // Check we don't go below 0. - if (data.stats.wounds.max < 0) - { + if (data.stats.wounds.max < 0) { data.stats.wounds.max = 0; } // Loop through Skills, and where groupskill = true, set the rank to 1*(quantity-1). for (let [key, skill] of Object.entries(data.skills)) { // Check to see if this is a group skill, otherwise do nothing. - if(skill.groupskill) { - skill.rank = Math.floor(1*(data.quantity.value-1)); + if (skill.groupskill) { + skill.rank = Math.floor(1 * (data.quantity.value - 1)); // Check we don't go below 0. if (skill.rank < 0) { skill.rank = 0; } + } else if (!skill.groupskill) { + skill.rank = 0; } } } @@ -65,18 +65,18 @@ export class ActorFFG extends Actor { // Loop through all items for (let [key, item] of Object.entries(items)) { // For armour type, get all Soak values and add to armoursoak. - if(item.type == "armour") { + if (item.type == "armour") { armoursoak += +item.data.soak.value; } // Loop through all item attributes and add any modifiers to our collection. - for(let [k, mod] of Object.entries(item.data.attributes)) { - if(mod.mod == "Soak") { + for (let [k, mod] of Object.entries(item.data.attributes)) { + if (mod.mod == "Soak") { othersoak += +mod.value; } } // Calculate encumbrance. - if(item.type != "talent") { + if (item.type != "talent") { encum += +item.data.encumbrance.value; } } @@ -90,8 +90,5 @@ export class ActorFFG extends Actor { // Finally set Soak value on character. data.stats.soak.value = soak; - - } - } diff --git a/system.json b/system.json index 1a88a54b..d296d246 100644 --- a/system.json +++ b/system.json @@ -2,7 +2,7 @@ "name": "starwarsffg", "title": "Star Wars FFG", "description": "A system for playing Star Wars FFG games.", - "version": 0.052, + "version": 0.053, "minimumCoreVersion": "0.5.6", "compatibleCoreVersion": "0.6.0", "templateVersion": 1, @@ -27,6 +27,6 @@ "secondaryTokenAttribute": "strain", "url": "https://github.com/Esrin/StarWarsFFG/tree/esrin-dev", "manifest": "https://raw.githubusercontent.com/Esrin/StarWarsFFG/esrin-dev/system.json", - "download": "https://github.com/Esrin/StarWarsFFG/releases/download/esrin-dev_0.05/esrin-dev_0.052.zip", + "download": "https://github.com/Esrin/StarWarsFFG/releases/download/esrin-dev_0.05/esrin-dev_0.053.zip", "license": "LICENSE.txt" } diff --git a/templates/actors/ffg-minion-sheet.html b/templates/actors/ffg-minion-sheet.html index a74bc926..86380388 100644 --- a/templates/actors/ffg-minion-sheet.html +++ b/templates/actors/ffg-minion-sheet.html @@ -93,6 +93,7 @@

                  Unit Wounds

                  @@ -191,7 +192,6 @@

                  Combat

                  data-dtype="Number" placeholder="0" />
                  -
                  +

                  + + + + + + + + + + + + + + {{#each actor.items as |item id|}} {{#iff item.type '==' 'weapon'}} + + + + + + + + + + + {{/iff}} {{/each}} + +
                  NameSkillDamageRangeCritSpecialEncumDel
                  {{item.name}}{{lookup ../this.FFG.combat_skills.abrev item.data.skill.value}}{{item.data.damage.value}}{{item.data.range.value}}{{item.data.crit.value}}{{item.data.special.value}}{{item.data.encumbrance.value}} + + +
                  + {{!-- Armour List --}} -
                  -

                  -
                  - Name - Defence - Soak - HP - Encum - Del -
                  -
                    - {{#each actor.items as |item id|}} - {{#iff item.type '==' 'armour'}} -
                  1. -

                    {{item.name}}
                    {{item.safe_desc}}

                    - - - - -
                    - - -
                    -
                  2. - {{/iff}} - {{/each}} -
                  -
                  - + +

                  + + + + + + + + + + + + {{#each actor.items as |item id|}} {{#iff item.type '==' 'armour'}} + + + + + + + + + {{/iff}} {{/each}} + +
                  NameDefenceSoakHPEncumDel
                  {{item.name}}{{item.data.defence.value}}{{item.data.soak.value}}{{item.data.hardpoints.value}}{{item.data.encumbrance.value}} + + +
                  + {{!-- Gear List --}} -
                  -

                  -
                  + +

                  + + + + + + + + + + + + {{#each actor.items as |item id|}} {{#iff item.type '==' 'gear'}} + + + + + + + + + {{/iff}} {{/each}} + +
                  NamePriceRarityQtyEncumDel
                  {{item.name}}{{item.data.price.value}}{{item.data.rarity.value}}{{item.data.quantity.value}}{{item.data.encumbrance.value}} + + +
                  +
                  + + {{!-- Talents Tab --}} +
                  + {{!-- Talents List --}} +
                  +

                  +
                  Name - Price - Rarity - Quantity - Encum - Del + Activation + Rank + Del
                  -
                    - {{#each actor.items as |item id|}} - {{#iff item.type '==' 'gear'}} -
                  1. -

                    {{item.name}}
                    {{item.safe_desc}}

                    - - - - -
                    - - -
                    -
                  2. - {{/iff}} - {{/each}} +
                      + {{#each actor.items as |item id|}} {{#iff item.type '==' 'talent'}} +
                    1. +

                      + {{item.name}} +
                      {{item.safe_desc}}
                      +

                      + + {{#if item.data.ranks.ranked}} + + {{else}} + + {{/if}} +
                      + + +
                      +
                    2. + {{/iff}} {{/each}}
                  -
                  {{!-- Biography Tab --}} From 2551c5e96050c0404aa57ffa1ed7d35330ee2694 Mon Sep 17 00:00:00 2001 From: Chris Stadther Date: Sat, 30 May 2020 20:14:22 -0400 Subject: [PATCH 16/44] Added condition for .item click event, tabs also have .item class which was causing a console error, but not impacting functionality. --- modules/actors/actor-sheet-ffg.js | 5 ++++- modules/items/item-sheet-ffg.js | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/modules/actors/actor-sheet-ffg.js b/modules/actors/actor-sheet-ffg.js index 286beee2..79790067 100644 --- a/modules/actors/actor-sheet-ffg.js +++ b/modules/actors/actor-sheet-ffg.js @@ -66,6 +66,7 @@ export class ActorSheetFFG extends ActorSheet { activateListeners(html) { super.activateListeners(html); + // TODO: This is not needed in Foundry 0.6.0 // Activate tabs let tabs = html.find(".tabs"); let initial = this._sheetTab; @@ -82,7 +83,9 @@ export class ActorSheetFFG extends ActorSheet { if (!$(ev.target).hasClass("fa-trash")) { const li = $(ev.currentTarget); const item = this.actor.getOwnedItem(li.data("itemId")); - item.sheet.render(true); + if(item?.sheet) { + item.sheet.render(true); + } } }); // Update Talent - By clicking entire line diff --git a/modules/items/item-sheet-ffg.js b/modules/items/item-sheet-ffg.js index 03a42392..0cdda9b2 100644 --- a/modules/items/item-sheet-ffg.js +++ b/modules/items/item-sheet-ffg.js @@ -38,6 +38,7 @@ export class ItemSheetFFG extends ItemSheet { activateListeners(html) { super.activateListeners(html); + // TODO: This is not needed in Foundry 0.6.0 // Activate tabs let tabs = html.find(".tabs"); let initial = this._sheetTab; From 7ea028722756414c751b3b73fe66bfc15375ed57 Mon Sep 17 00:00:00 2001 From: Chris Stadther Date: Sat, 30 May 2020 21:42:10 -0400 Subject: [PATCH 17/44] Added localization for character sheet. --- lang/en.json | 64 ++++++++++ modules/actors/actor-ffg.js | 16 +++ modules/actors/actor-sheet-ffg.js | 1 + system.json | 8 +- templates/actors/ffg-character-sheet.html | 144 +++++++++++----------- 5 files changed, 160 insertions(+), 73 deletions(-) create mode 100644 lang/en.json diff --git a/lang/en.json b/lang/en.json new file mode 100644 index 00000000..218c3427 --- /dev/null +++ b/lang/en.json @@ -0,0 +1,64 @@ +{ + "SWFFG.Name": "Name", + "SWFFG.Species": "Species", + "SWFFG.Career": "Career", + "SWFFG.Specializations": "Specializations", + "SWFFG.Wounds": "Wounds", + "SWFFG.Strain": "Strain", + "SWFFG.Soak": "Soak", + "SWFFG.Threshold": "Threshold", + "SWFFG.Current": "Current", + "SWFFG.Defense": "Defense", + "SWFFG.DefenseRanged": "Ranged", + "SWFFG.DefenseMelee": "Melee", + "SWFFG.ForcePool": "Force Pool", + "SWFFG.ForcePoolCommitted": "Committed", + "SWFFG.ForcePoolAvailable": "Available", + "SWFFG.Encumbrance": "Encum", + "SWFFG.TabCharacteristics": "Characteristics", + "SWFFG.TabGear": "Gear & Equipment", + "SWFFG.TabTalents": "Talents", + "SWFFG.TabBiography": "Biography", + "SWFFG.CharacteristicBrawn": "Brawn", + "SWFFG.CharacteristicAgility": "Agility", + "SWFFG.CharacteristicIntellect": "Intellect", + "SWFFG.CharacteristicCunning": "Cunning", + "SWFFG.CharacteristicWillpower": "Willpower", + "SWFFG.CharacteristicPresence": "Presence", + "SWFFG.SkillsGeneral": "General", + "SWFFG.SkillsCombat": "Combat", + "SWFFG.SkillsKnowledge": "Knowledge", + "SWFFG.SkillsName": "Name", + "SWFFG.SkillsCS": "CS", + "SWFFG.SkillsCareerSkill": "Career Skill", + "SWFFG.SkillsRank": "Rank", + "SWFFG.SkillsRoll": "Roll", + "SWFFG.ItemsWeapons": "Weapons", + "SWFFG.ItemsArmor": "Armor", + "SWFFG.ItemsGear": "Gear", + "SWFFG.ItemsName": "Name", + "SWFFG.ItemsSkill": "Skill", + "SWFFG.ItemsDamage": "Damage", + "SWFFG.ItemsRange": "Range", + "SWFFG.ItemsCrit": "Crit", + "SWFFG.ItemsSpecial": "Special", + "SWFFG.ItemsEncum": "Encum", + "SWFFG.ItemsDefense": "Defense", + "SWFFG.ItemsSoak": "Soak", + "SWFFG.ItemsHP": "HP", + "SWFFG.ItemsPrice": "Price", + "SWFFG.ItemsRarity": "Rarity", + "SWFFG.ItemsQuantity": "Qty", + "SWFFG.Talents": "Talents", + "SWFFG.TalentsName": "Name", + "SWFFG.TalentsActivation": "Activation", + "SWFFG.TalentsRank": "Rank", + "SWFFG.DescriptionXP": "XP", + "SWFFG.DescriptionXPAvailable": "Available", + "SWFFG.DescriptionXPTotal": "Total", + "SWFFG.DescriptionCredits": "Credits", + "SWFFG.DescriptionObligation": "Obligation", + "SWFFG.DescriptionDuty": "Duty", + "SWFFG.DescriptionMorality": "Morality", + "SWFFG.DescriptionConflict": "Conflict" +} diff --git a/modules/actors/actor-ffg.js b/modules/actors/actor-ffg.js index 45b7c8c0..db26ab73 100644 --- a/modules/actors/actor-ffg.js +++ b/modules/actors/actor-ffg.js @@ -62,6 +62,13 @@ export class ActorFFG extends Actor { // Start with Brawn. Also calculate total encumbrance from items. soak = +data.characteristics.Brawn.value; + for (let characteristic of Object.keys(data.characteristics)) { + const strId = `SWFFG.Characteristic${this._capitalize(characteristic)}`; + const localizedField = game.i18n.localize(strId); + + data.characteristics[characteristic].label = localizedField; + } + // Loop through all items for (let [key, item] of Object.entries(items)) { // For armour type, get all Soak values and add to armoursoak. @@ -91,4 +98,13 @@ export class ActorFFG extends Actor { // Finally set Soak value on character. data.stats.soak.value = soak; } + + /** + * Capitalize string + * @param {String} s String value to capitalize + */ + _capitalize(s) { + if (typeof s !== 'string') return '' + return s.charAt(0).toUpperCase() + s.slice(1) + } } diff --git a/modules/actors/actor-sheet-ffg.js b/modules/actors/actor-sheet-ffg.js index 79790067..53768a96 100644 --- a/modules/actors/actor-sheet-ffg.js +++ b/modules/actors/actor-sheet-ffg.js @@ -43,6 +43,7 @@ export class ActorSheetFFG extends ActorSheet { attr.isCheckbox = attr.dtype === "Boolean"; } data.FFG = CONFIG.FFG; + switch (this.actor.data.type) { case "character": this.position.width = 610; diff --git a/system.json b/system.json index d296d246..4cba18e7 100644 --- a/system.json +++ b/system.json @@ -20,7 +20,13 @@ "tag": "rolltable" } ], - "languages": [], + "languages": [ + { + "lang": "en", + "name": "English", + "path": "lang/en.json" + } + ], "gridDistance": 5, "gridUnits": "ft", "primaryTokenAttribute": "wounds", diff --git a/templates/actors/ffg-character-sheet.html b/templates/actors/ffg-character-sheet.html index 9cbd5230..99d002f2 100644 --- a/templates/actors/ffg-character-sheet.html +++ b/templates/actors/ffg-character-sheet.html @@ -6,10 +6,10 @@
                  {{!-- Character Details Container --}}
                  - - - - + + + +
                  {{!-- Primary Stats Container --}} @@ -19,16 +19,16 @@ {{!-- Wounds Box --}}
                  -

                  Wounds

                  +

                  {{localize "SWFFG.Wounds"}}

                  - +
                  - +
                  @@ -37,16 +37,16 @@

                  Wounds

                  {{!-- Strain Box --}}
                  -

                  Strain

                  +

                  {{localize "SWFFG.Strain"}}

                  - +
                  - +
                  @@ -55,7 +55,7 @@

                  Strain

                  {{!-- Soak Box --}}
                  -

                  Soak

                  +

                  {{localize "SWFFG.Soak"}}

                  @@ -68,16 +68,16 @@

                  Soak

                  {{!-- Defence Box --}}
                  -

                  Defence

                  +

                  {{localize "SWFFG.Defense"}}

                  - +
                  - +
                  @@ -86,16 +86,16 @@

                  Defence

                  {{!-- Force Box --}}
                  -

                  Force Pool

                  +

                  {{localize "SWFFG.ForcePool"}}

                  - +
                  - +
                  @@ -104,7 +104,7 @@

                  Force Pool

                  {{!-- Encumbrance Box --}}
                  -

                  Encum

                  +

                  {{localize "SWFFG.Encumbrance"}}

                  @@ -120,10 +120,10 @@

                  Encum

                  {{!-- Sheet Tab Navigation --}} @@ -158,16 +158,16 @@

                  Encum

                  -

                  General

                  +

                  {{localize "SWFFG.SkillsGeneral"}}

                  - + - - + + @@ -191,16 +191,16 @@

                  General

                  Name{{localize "SWFFG.SkillsName"}} - CS -
                  Career Skill
                  + {{localize "SWFFG.SkillsCS"}} +
                  {{localize "SWFFG.SkillsCareerSkill"}}
                  RankRoll{{localize "SWFFG.SkillsRank"}}{{localize "SWFFG.SkillsRoll"}}
                  -

                  Combat

                  +

                  {{localize "SWFFG.SkillsCombat"}}

                  - + - - + + @@ -222,16 +222,16 @@

                  Combat

                  Name{{localize "SWFFG.SkillsName"}} - CS -
                  Career Skill
                  + {{localize "SWFFG.SkillsCS"}} +
                  {{localize "SWFFG.SkillsCareerSkill"}}
                  RankRoll{{localize "SWFFG.SkillsRank"}}{{localize "SWFFG.SkillsRoll"}}
                  -

                  Knowledge

                  +

                  {{localize "SWFFG.SkillsKnowledge"}}

                  - + - - + + @@ -260,16 +260,16 @@

                  Knowledge

                  {{!-- Weapons List --}}
                  Name{{localize "SWFFG.SkillsName"}} - CS -
                  Career Skill
                  + {{localize "SWFFG.SkillsCS"}} +
                  {{localize "SWFFG.SkillsCareerSkill"}}
                  RankRoll{{localize "SWFFG.SkillsRank"}}{{localize "SWFFG.SkillsRoll"}}
                  -

                  +

                  - - - - - - - + + + + + + + @@ -294,14 +294,14 @@

                  {{!-- Armour List --}}
                  NameSkillDamageRangeCritSpecialEncum{{localize "SWFFG.ItemsName"}}{{localize "SWFFG.ItemsSkill"}}{{localize "SWFFG.ItemsDamage"}}{{localize "SWFFG.ItemsRange"}}{{localize "SWFFG.ItemsCrit"}}{{localize "SWFFG.ItemsSpecial"}}{{localize "SWFFG.ItemsEncum"}} Del
                  -

                  +

                  - - - - - + + + + + @@ -324,14 +324,14 @@

                  {{!-- Gear List --}}
                  NameDefenceSoakHPEncum{{localize "SWFFG.ItemsName"}}{{localize "SWFFG.ItemsDefense"}}{{localize "SWFFG.ItemsSoak"}}{{localize "SWFFG.ItemsHP"}}{{localize "SWFFG.ItemsEncum"}} Del
                  -

                  +

                  - - - - - + + + + + @@ -357,11 +357,11 @@

                  {{!-- Talents List --}}
                  -

                  +

                  - Name - Activation - Rank + {{localize "SWFFG.TalentsName"}} + {{localize "SWFFG.TalentsActivation"}} + {{localize "SWFFG.TalentsRank"}} Del
                    @@ -393,16 +393,16 @@

                    {{!-- XP Box --}}
                    -

                    XP

                    +

                    {{localize "SWFFG.DescriptionXP"}}

                    - +
                    - +
                    @@ -411,7 +411,7 @@

                    XP

                    -

                    Credits

                    +

                    {{localize "SWFFG.DescriptionCredits"}}

                    @@ -419,7 +419,7 @@

                    Credits

                    {{!-- Obligation Box --}}
                    -

                    Obligation

                    +

                    {{localize "SWFFG.DescriptionObligation"}}

                    @@ -429,7 +429,7 @@

                    Obligation

                    {{!-- Duty Box --}}
                    -

                    Duty

                    +

                    {{localize "SWFFG.DescriptionDuty"}}

                    @@ -439,7 +439,7 @@

                    Duty

                    {{!-- Morality Box --}}
                    -

                    Morality

                    +

                    {{localize "SWFFG.DescriptionMorality"}}

                    @@ -449,7 +449,7 @@

                    Morality

                    {{!-- Conflict Box --}}
                    -

                    Conflict

                    +

                    {{localize "SWFFG.DescriptionConflict"}}

                    From 592e9d3c832332a128ec74f0efb330b40117aff6 Mon Sep 17 00:00:00 2001 From: Chris Stadther Date: Sat, 30 May 2020 22:37:29 -0400 Subject: [PATCH 18/44] Added SASS configuration using Gulp. --- .gitignore | 3 +- fonts/Roboto-Regular.ttf | Bin 0 -> 158604 bytes fonts/Signika-Regular.ttf | Bin 0 -> 141164 bytes fonts/StarJedi-Regular.ttf | Bin 0 -> 25656 bytes gulpfile.js | 50 + package-lock.json | 3953 +++++++++++++++++++++ package.json | 17 + scss/components/_form.scss | 3 + scss/components/_resource.scss | 4 + scss/components/_tabs.scss | 34 + scss/global/_flex.scss | 9 + scss/global/_grid.scss | 79 + scss/global/_window.scss | 17 + scss/starwarsffg.scss | 14 + scss/utils/_colors.scss | 2 + scss/utils/_mixins.scss | 16 + scss/utils/_typography.scss | 17 + scss/utils/_variables.scss | 3 + styles/starwarsffg.css | 120 + system.json | 2 +- templates/actors/ffg-character-sheet.html | 2 +- 21 files changed, 4342 insertions(+), 3 deletions(-) create mode 100644 fonts/Roboto-Regular.ttf create mode 100644 fonts/Signika-Regular.ttf create mode 100644 fonts/StarJedi-Regular.ttf create mode 100644 gulpfile.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 scss/components/_form.scss create mode 100644 scss/components/_resource.scss create mode 100644 scss/components/_tabs.scss create mode 100644 scss/global/_flex.scss create mode 100644 scss/global/_grid.scss create mode 100644 scss/global/_window.scss create mode 100644 scss/starwarsffg.scss create mode 100644 scss/utils/_colors.scss create mode 100644 scss/utils/_mixins.scss create mode 100644 scss/utils/_typography.scss create mode 100644 scss/utils/_variables.scss create mode 100644 styles/starwarsffg.css diff --git a/.gitignore b/.gitignore index 723ef36f..7dc4f0e4 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -.idea \ No newline at end of file +.idea +node_modules \ No newline at end of file diff --git a/fonts/Roboto-Regular.ttf b/fonts/Roboto-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..7d9a6c4c32d7e920b549caf531e390733496b6e0 GIT binary patch literal 158604 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
                    v%Q*Qgy;tdJj4ZONjTx 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

                    sDMz7$^SDZV4x`K*fov0l~+M89O^^Om^v{t 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 literal 0 HcmV?d00001 diff --git a/fonts/Signika-Regular.ttf b/fonts/Signika-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..4acb5dc2da1fe266860243ed56d9f742652c0a52 GIT binary patch literal 141164 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π%Utr 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 UYMYk6o;CN~)IB(NE_mbr1(}kViU0rr literal 0 HcmV?d00001 diff --git a/fonts/StarJedi-Regular.ttf b/fonts/StarJedi-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1f4020b58abd72f8791626094b726eecfa1374bf GIT binary patch literal 25656 zcmdVD34B!5**|{Hy>suKB$G*Ixw%r%D2w4(JzOBFIV|L?gofv{+OKX3c~`k&;? z+`0EG&w0-CJm-0y^PDq;5<<*m9pTCJD;x8RMx1P%g*zva#?=k4ZTiP&AB-b}mf?HJ z%!RETdxxIdkMBzf;hvefY^lq%BlcE83?V%KYEH-8g`DM?RzidVC);MX&RV#=7I|B~Wc9V-M)EDDuLzkm2;Vc?7A{@!r0vrm;(HzHKfIuQW-CdX zb%KzoiTHkGVe5(xx{s?MWcsVf?^@KlaCUglZ-(MK>f?rXv|qC{W_8RcLS`1@`G*}# zW_P4iq)3F!a^QO^;F?c26M+!k&%H-TPgUeI)=rKZGSQ1TS9zu-Om7X0o!oL|Rb73< z$i}AeQ>To&qH_4S5jB&BO{{KCb)*e0=beLm1FSB0hN5O><>e-)B-+yLNdql8a`x!j zG5-Fo{V%UC2L3x%XP|qKGl?VuFCr-*gUNN|3DQd&X)9epuXDM2d-2>w3P~yM|B^P) z>A1hvmCWwhbH-VIpAPJ!+FDWBK$q-UO z^1%xQs6C!sMLc90Ng&fnD+!RXWHMlGWRgurlUg!{_{lypkIW|vNjq6gt|8Zw{9ayR)Q`4QPkeoXEoKOt9>1!NKFAWO(nvW%=CtH>JQbsf2pbdp=hda{9Z zk=w~;vW475wxawtvYqT8_mExWUb36qPiB%?I_hSVIb<%b+K@zI1g@Nbx4x&Ur@MC_ zxcnnyO58)H#Q4ShNBkT76Z~!b4g5;JjUUA;d@L_=pK*WT{=f~Uf1+>DeRMnBN*B{M zj9`%F(*e{idmjMw;{@ipUbjC+jN8?P}=HI6n8HM)%{Mx&8P zUrHZIk4e*|W@&&Vif@a*5xd29agOK~iSUu|hVX*0((nhvRs84tRvnJD{I&dIejz`L zpU&3-q9AYPH0~wtH{8?QE^Y_6jk}e*o?Feeb91=STn(4SrO>bF=YaJFx|Xh_b#w@W zurf)u+pLzv1arJ8E;hy}iGqRWC>it^@HyPIVa5ivYR*-;gC6q{GQ4R;HyPNh44$Ze zl<6PcvA&7jba>)Lw{iy!#D6#E%N-PXqcggRTJAsd^VP4@^3}hf zZ8X&V4Yjw<`o^3>R#nAcE-75`wSLQDRR-q{dK%pZ#|?KeAU9NZ^TS)`O&>A6DtAz| ztD9G=9;2KveA#ey_y!dZx(#Yoa(5i-FgluCJ+Hg6)uqGTJuD5^?6SKit$WnOiQR%) zg(|38HLsgftGZ3Tb4QNgPsJt2)&1^(5c5P0%4yn*P|T2p-SzhtyMKZSY=al zcjfenti9Ypcr@HH9N-p`+(CJ{gPzMBRMBnsO;akkAT2YPNWkG@fW32SqD0gdeJRc6kUe8@CU(pD~_&sQhV!>@_X*Q;%Cb!d0^?a z8-?9k_n*WCzwPXPWrEpZr=thnH*2h$2aOPS??*y2Fyv(8KrMN^njy--`?)4Exj?Zs z(_h51ArWOeuvlVvEoIusd1YOP{X5%l{9xnb+Mj;%d+isG9HEon)$WX|^TJnj`eQxbtL9!kt?ud$^eqLWzdK4LIy&4bhK*q@ zd^gt`UJJOdIr|rb0t!w6oYMiP3-b>2En8w%APMO6T z9@zjnnL5Id-gx7rj=Lv$uXyy1n|I`M2KOVkFWEKKH|~j#8|KU%-!y+A_q{Pw>9mp6 z)20|M#%Iuy4){s}qMDHhnvMW#mF*np&8A~gA31S%X!^R^4bLok^@bB&^Y*{H=7-eq zoCp0(JPczeT2}$PlcQ?;}b@RHX*AAWgOYI*&{7T#T82`udZC6jL zpVvMbt>*(vhkzvuW@KV3ww7Sv3`x-zGr24~gNHFe9#u2UG=Itg8vF2lRQh@Az1lC| zdsq9f`?(b3fHCD))>KevcxR>swmftOG`<3?TgYRjN9DIs4y}4k0$B4xbY~H$O z!NLbHf|Kb=ZacJ3p7EI5GMOvKxZ4`a|`MtFJH@DE&wXK?un-$(6><(|{I#@cxcoBAk z(1r5Qto@9GW&O`mW_UeJ=;vA@zY0X#aDUJJ8tWx;i=&Y{0Xh-OpH7t|GnEt+q$!-c zNbg=5zjxoe#o43w?^!^*!_R9abb)gOCyY!Mb|-FIclgDw>Y#eCT6r?}q~8Ntx9xCMo5RGH#2RGf19H(6NQSE3WCh`gQ|-onQR0 zc6Qgz+NZy7M>P*^Sz_Q;+|FOs^XUFJHrE;W;hW!og0Dl3*{DfFjf_SBY&Ot~cF#N@F zgAxml@7K!ujlx}>yLNRQOuKLdV8KZy)P}i{GC9sV78wf8N=MVz!ykUm8+w*#cVSFk z#hCbTD^Gh1LkUuijt;2N_(Zgh^VDc@^B2=2cUJ4@y_g``FoPzwYoZMhq{* zUX)Bg-EJ30ld@2Crj>dGw_$J3N$q4Co&1XSf%YQIy^u*ebbwL{dJKQ89lqbFH57Bn z)UnmLi($RDM_h`UOt29c)^&j-a-zWtZ0SSGsbzfA!_@f1%D6>OXkS0C-A`>(mW+z! z$1IyB?4Go+R0tb219w+cjf9`TQ*)989jqnjv^=1 zFc_y~^wF0a;AB9%NaqbkdL+E=6Rq>jn?9zw57DkKwX$tnmNZMk)3i{0c_m+AVC<`N!y~Gm|-E_$vU#%77R7 zMJQuoWmGVh1est-g5DFf@QX%^P4{-Ke`v#rxMRbH#ET-DkI33tIS= zXz!VJ#pGCj>N`h!x+nqdT}*i>6Om#rT)}ey6yUE6V4A_gu}nJaqc6UT=g?N7no6IX zD-)~{L1#F|XgDhB-bR^+_+0un%0%aZhp3;=<(7wU!#u$FU#P<~j1|~~vKFa3TgVPq zb5ET)&OH^b);oHTF$XtlR6n@|yvA^lS&@H8E=VfK$k(+$hM&jPXMHj(oEOfcztF0< zm${dj9HVHpZ``3{uqOZK!>%=4X3)C<9pkHg=nr&TsJ0BaI@-haa(wu|wEY^!<;-MZ zH&cXxjj~=%tVdoeZ0AfJ-)t5TB{`jEN*v>Yq>@01N2T()3E>Z){v$P}>&I8#GO6eh z?b9RLOggM_jktK0_Ded|S;-ly6=65G>(J)i0YmJti5(?B?JnWCeC_Z2xWN^pIOWZu z{vibn18lb18o@ip87;9lj5R2lk!J%K_5|kuaXP{$ERk{2=POVZ@&oH^pj2vsz@}xi zR4?>$s`fI(ILU&tO`E z<~ToxagaLqqQzgKB(r@$bG%zZU+(3y>a^8PMkk>4Yqo0FllY#2;bZo*F|R_>DbPhS z;7J(*ugGZlM8=cZ@G@Wqy;uS=K-ix?_7RDSTbG^OV=ynUjzQ0W@U`jI(`8Foct}HC zAGoMBzx`~_7rMNCRXd^mp67LWyPp!;{Kam4#y@DK?{G)ydr@&d4C0*I{!L27=SwJw zsyE>i!j#{@`Q{ zfL&H&VxKzlMUQarnW_3L(-b}uhLUlSep3_CZ|KyBx&lqkrh=2K6WG=P(ms6XHhdb}R5q){DP02HN(9W-a?JyVC zh;}Kh)@N4BrTbeP8S=($@-|7jW7)Qr9JyRFtdR>Ga)H_5lkJW7YbRu>JtO{ zcZPzF0!K@RRIu$~+P-#fXK-1o!(k4}Ida=gA#<>i+vdn{NOE;fLAfmDpL4&*=(<^Y59bjKcS>ta@=3LUshXA^|VX&jcHqgJLQ`kQZLb-;Wo7U#0~01IVAfU zYlAIvP%2cVM#)j_Yg|((6-wrbW6yLJ$Spx%hA+6tE*IX>8Z@U>q_r=zo6R}Fg4S|# ztx9)_H|^Yb?NjmwS;`1$U)%4Nq>#Na!)HE`L*sqH*6JPN46 zC0K&KD@ouQ@E6PN6}=ujmBB6m7aa~MO)99_;Be$f zs&C8Moc3x}t_>AP!DWv2R&!gqFO(zII_#ZIlH`zmX4&3Upw^_B3k&U%ueHr5o6Y6z zIleZqnQAT=dq;&?uC6EuIjT24<@3EE%g?r`_F$+Gyj0WfkR=uDQ;}h>a1?}U&9XTs zBa~AE%H9~iwkcy$8u+-;?2sJ*5JF(aQ)WkjRAV;ORmdmHCj|@T8uP|&YKS}QXls+r zV_STpb`PLwZLL`*7nVEPe7k}b<+4oo$!WXL*QbI~?bu*NP;Hc|eHrRlvrlbRb6R~4 zIm2vTTi7Vel0$OTcB*oDx!h=8hA-`oAb2R$D5Z5&`*x~wj$>_MxmqCA`f^lrg%46O zBV?|1WTBly=SEFOK)H%cVK;i&`g_^`KYt3Szsw8Q%JJO zZU|lhq8yVfCtwZ9o5=^<`tujwQHPb@@a9-G(`5bPP3^Gq zn_V|H29}@HTD1q?e8DPO*K>9GTDdj(u4T6$gKjuh+be3)B75>zG+U&4xfecq9XpL55^cpdv3T zV1Xq3qwBKd4S+ov@8Fw=Z{Qn`1a`t54--U;3H=JYKs{g|Fp`Qni?s&U@dQg)^A(tv z6p><5O5nk*0S{`m`N6RX9FJPLKt3Pv1d62+#>9+i1zo_2-hd?d%a@zeY8|2Kn`@+8H$&Qtfriz@Ty*5C5;xW#+_K%UGG+ zX%EV@RF)0_d-=RAn8BnPNlx=M$zvy#&p_AG95cYQ zp|R~9KD!)p_#EZ(b!mkaGG<-}CRvoLP_;K}eWA{=ZIV1ABjj+jN#Kh@FfZnGRRR;N zl~tb802$_O3fCiI-Y=V%P+602KqF9S9 z)p?>~v5KmxI>%D%%oar@!<20rQ#rwzXDM~gh_l?RD2nLJ&Z~E3S2{(-q^Jw4Oo(%uEZHU#o?7y(qSGV@7KTjNVeZA=_(UN1WP~$2pJC|0ND%3HS;+6E*&N0`N znkvWSsTMIWPuy@lK*_7mFpW{1*(S9!e_>mmGow0Av|0d|Wobo@#px`LD;-lI-h78p zTEDPfapsA|;!;dOqSF~ytSW;|rG7QLcq6Xka*7qp(u^G8dZ2{H{9Gt)a}Hiwk%yLw z+r~_oQLMHVTe7b&b!rP7CX=a6gf_nN@q6=1v$Ja)YAFzzT%A#08UCocxKypISHueO z@!u*tDikpr_;cpfZyfW(F-lzcaWQY@%IZbc&eFK->b5+^I)=tpIH9qP>iq%tn)n*? zx(IGhEDa=5w;3jQI>)`H-8O#h2*~&4rB@AcI0s)f?{?~^Wk06R(?8CC=Wm~{Sbpl{ z+swzIqKiC# zXfJC|-+Qn2wD!s?@YcN(^{&DjMlJ9IQMf|Hh8XW`=D;0L# zOl=o>SYhx^yU@qlyMsS1+I5SUz?5XZ_K1Uq`E%fZk^YEh@Kx%TYt*v$!@WD2ZtmHx z9nqd=t}2?BO7mE;3(b32;_z8X%p=6Soy=2dIqy0DjCs!YYp-%!qrUT(v>!%Xm3mG6 zyyv|PZ(XQG_bcg;^!b&vS4A%3SmIapb1X%?w$eQ)^Id)Dy3_Ta`q0^0zzjkR%rDr_ zhi*7}86WzJs1F@p2w;{1xy%c(o(_W7=Qy_v?x;U%@GD>FgaFpd!kVx~hn)CRfHGDp zDQFSl@?kz0-A7E1mbaXl6FyCs8VVvV;&9PqQET9y;LgB=j*Ol7P6TJH>GOa53Vse8 zA^p6J%+NmXXVkIHygz+w6?$>Bt-T84BkBRthv=LSh{9*g#t6N^NJsp&QOCvwesb+q z!|{EWc*lUK;=h|T(niqu41w1^G| zeL>eLk}*}lb`C00-9&+^1KUEkF#LAd*EHydX~A?TCi*3>8o(4PWkzlM!RUt_5`d{9+5kpAWjQeMVV1JN$P0K?X7L1-Ag?g}6c3Y7BPP#4(2J>% z2K-9UF9Tk$ME#y%0x#>jpjQE;(4i`z4dO~Sgy3mFp9O{0j;i$XnA6Y#kRvf5f&fGI zOT0tM6F>Oy;QuHTkgTKVuW6F0zQ z&a@iRE!NdGA^czQF7bAolfJfPsQZzUJvK3q18)E?I~_Cne*BV>4QsC-E>f@FvgT% zF_{t*Y0rw%cw4TxD%Bs~6rZYON%oi_l(;f7W8zIT-JH(FQK!Nu8e{28@g7&aM|6pj zG|28UdE-Czcym2om&q3Iv89U771!9~TT(?=i_0@CSG46e#mBFb;^&GBt6Z zGKADK&u9yTgQc9$q|N6Bx+IU7o2%`2(`<1-s>$nWjJJ%{T4}Pm)Z;a(rkvzh?RrDJ zAHa!T(eF#5ElEzv!=>j^zR+qdOvFpu?D{Cxv(E;cHQ82DaXeRl?Wh9DV6kyYS;hhO zq*$|%QI(o24zr0VKv!z6$1d7{0aMBxyT>ENHyYrx7JJVa^QAu`nyUnU(Izqjkyq;w zW%UEZQtc(rlHZfJB03|Dp$?jfV2~+vHeE=U&^7c%dMoXschFsQH+_IUN)OV*;Bcl= z!b@VML^stuL6~aL3ZYO!Z-e)M>6l;{l9fOW(A(fffINVqB6&;vCCo=qA~5qwgwa$Y zpstA5fO!%WKg(I7*uh<*7alcy=EDKw4X6^NNs`3ar&v<#e&)0j!Q-MAwhR z4Wa_g9@XYk8@lF|VboDT92~%T83G`*7=SRcvWl1>^Lk(nmMF}{ftq23N#5do_yz~S zO9=xv0AEHBPQn2kQ-t9@2|}{i1a!k)LS;w~_(yCIk^w3gNkxzt9(a22kr9OG^V$@D zK4c;!8f;E~zCn_MUZ~jt#jDT+gHplqN)}|9+pB*Fl3~T)4nJ~jjcmVG`>pnpw(`Kd z@Q5j*@(8!{ww@Z!$XVkWt}R`6{BOUSxg{>J`o3#t##tL?Y9DLfA05@+|JeqEC(mSY zLUR^NhlnOivDGrfN;_scO+!j^n&aZ=)%hmNI<-bDZBRw)x@3!0otc-HlQXYaEqxw3 zq^OE{R#mJtHB_2RIRWKCDCV`QqF8gR&SuN4&UDpOIYbe+6)X3t#d*m&aWChHN8P zn)32ZIR{kd*~ctmKoyfMIojZB<0^BeT1;Yb0661bk1@w5yh@$X4jSkEG8O#e5T%;j{DN zroL=dlpJfIW{U^{P*5}{&tz&YMfQBB=*+RKs>~_DdTW5;O7EuXU#Cgrl zv(gutl$zv9G1*z)o@^@JazLpmRxn^W;*?vSR%%T{vgr_O=~TsP>Y^q=Ocv6MQPO%J z^;s)T&K#>LC*M?Qs%&^r%rnhXrlMq?5^&bulAPx(P8OZ&VN-ryvZ>*bc}h->2um$z zrW2m|nKk)w4O_(3e_Oq-vNqtxHy$28Mx$FPDqTUaogESK2)d~(7o7d7&H#HlFyVXeJvkrX!=?{*B842 zRg^8~yD9etR(#I>)o`e9ML&Foj%5q^^cdY2S=Q%IqjozqJGNqenKgaE+H*_antsm- z!^v}N`p;t#=E61o515V^UDG$S_$_?}`Le6}P!rdE!@54});Fx|>l!G7vrli0MAwIgN4#>CncYu3!FOa%6N&l99!=v8ZjiHBs6P%z2Bf(lFGTD#gKGHEZhF^p&iXvkIvJV`g^$h*RLo? z#1xm9S=AzBM_2mwIFoN&>Fj!PHXhK-|-6Cl_1f8NZ%W9$9U`6KJIhCpPs zl;vYR#44@6l8%*HZVy|pbt30;d@j#czV&t0K0I)%sXwgrE%>uVf6xeaJ&2{q8KGCK zf--uw;g52EenDGeNIE-0b8;Dz=);pZQG5JSdL?-2tI^T*`~K^zYycvwrCf3NDF5+= z0aW4B{IW<073<`Mi;VpAR0yFc)vO2Au=uld4na;qiZF~kj)kH1rycr^v3b>+bseLq zW6hTzzx&~P*Iz(DtD3p@SFET>G!~a>M;JBDf0V{`??a$SKPswOp#l$O;jcslS?G}f zELJWZac&Z`2=yQU;OBfi*vqx9(fjw%rJ19&_nX7}!l${|zLi&IDJFK^c<7z3?C`E) z44`oZzwmr$65+v}k%$93qB=d%asQ_=2Z&J;{%O{r+ZZrr77*4<=3Y~&ZnyU?!xLjFenLCzxLO`&OY zI6M!{i1}Jfm(lB>UvEbg@lpCNA|0X%pFiNFQ2O|bl~SmWP-gpUrdcx9t@~@IwhQ%I z+c{-2cuw`TU82C+A_l1(913f+e+s~C_x4KxKC0?MQ-zTpdB$H}*XA$Mbs4Bskg~i% zw<2eiC`|Rug599^Q&-xV&V8|^0F(qMa(;tiozP zsC8okjechXB#W)sa8WA>Yju5E zIA>wpaDm0}Bpl%pOQP~S8XjN&0ovSo8>jMO6X)r5hC#Z8B&y6pdPBSByoJQS%hbWY ziwt2Vif3Z1I!+b znkZn{@F9xL77K7~!t#PBa>F7TaQH1euv)EgaXnvLUi;>DUZnoc6Gb@Iog$1li@+Mn zN0rUo2k2(cl87QNJa)0w5bm^^MEd)0(YHPNFoQqD=jkzym@uF< zD45vjA35z9G@k+v;c;beBhQ{_9HgGdra)8K!y!XH$1T^ML%HYpJY9oA1^SFYsGC(3 zgT(LEMswQlvG(u;dyiHc-oUCx$!DXwSO1cz9-4%OTZxj?f77{!v?HuJh3PrHCqx!u z2Tg#g0nB3oY?2UJAh*6hAjtsLz@0}~94yvCN(?)n;qKCQXDoek<|EqClegXa84c{a zn~vDuWY%g&uiv%4uF^1T&2R6a?`Yx7Wd-GKe%9d+&U91T&n6k#_8%=?6Dn?Av!-*~ zD0@+n-ug%4JhYyH*4-jP$j?P#GK&EXbCCeta%xyX|64q%9e(Yxwt^SB69$zDB z35hMkH{VrPfJLEgca53FB^GGiyM?{9CDLm1VXdcNR!e$8^MbCfZKI6Iqi=)`)Xl6V z$pF1KmTBz$VxOUeUK;)!PNB!T&qbKQbTYh!aHD@wJ+u1NgPjk$1>weCpNRd2(K`IbA7%}uhV*Aog#soodhqf z_3FE{d+#h8PwPJKU#($Q7rjn9mH&Wt*T?_9nhnGdp+ND34s#Nt|9+UDMM-ens2K>P zC~^0@zO)zG4gO)m@S=jMD%#z5bwPg)4KEs6UR4wt(f9cu(Y924*?#lrs~x+cSihCN z-DJUH&!zo7+_-Rg!<7pcT~$(5RZuis7}mejf@x8G!?jm8Olq$k5h|)GA6kTEqbSDz zAGECRvoNxKJ{)X2LV2wAsgXs}=<+7_<%=)=c@o?*Z;I7@tDJ@z;pfB0Su`wLI*jfZ zVpQ`lsR?pF{Dr{m+hRhpF12c<^CqvpaSnsxMZiRKr<}y?pLMCBYwTwTZ=K)vyImF2 z6MUt!Mvg1Bq#2Btw|iIgvyI~x+ozA1e4BBCi7PMhg!mFRKLAR$28+0^Eb-EP8Gg)H zmxb^1?_GYc#s=);ICU{>hRcNUYYiP2LbC*;$KvI?Fl)rIb#C1TjSe6tjec9a&Q|EN zMRe4dl>T>>g@3PKy9+T*oFf*!*>7w2JC{vCe-RbYzrXri(641})p;2m?e@7D;2aG9 z+j_89g5e)BGfqEG-~x!gNo4i|vgd(53E5v(M!^+N^a;qmPk0IbZ`URQfLYuxFQx?W+$?4S3gh+N0&tSIpYx^A)1T@17H} zB4~R6V2te6anm>~BPlwV^wgIZ1@9oijv5CxUh@DXZ@XQ6CZze9Hd)i*rw2ODOC2Jp_ z-`U2c_i!67aDi*@Xir48w_yj%|7BY`A8eJb!-z-Z0BjK!=t85)RlglW^h`gs>ip&* zvFp5A6_p47y83v1w{R!uoSiDd{IwVF5`}nX`-Q)Kqv)BDklNZa-@03rAFDkRCebaU z4$vptr~IGVa@;@fGa|8yy0?D!E`O&U|2x~w!x-z@@+D)ePf7p0$Klt(M(@!KIw1V$ zxAvPGLkDTEmLK?eSd5N$@wwjrXFzcyaFGmO@nz^e%9!5)9q*pw*YKoo$HyPevvAMU zzFpIO9Ppn2iy^{|m^av7@oc8qUP2|`q$cRcEnrzkKThDX`^dw8>YG|LvG2#~Uox6W|zuKfm@zNn+Qxo>CwANDM|<+{Gj`FYyjx3t4%(L{F_7`8pQnjUN3I__tm zvMu`G@4RclpCg;}zo+f3HEQ<_A29;__n!fY5p$S+3IgUFnVsEm*>e!En0eWw5T4ep zgKs(xfli0H@E=h>g|c|rqa0-2&iK|2d>8!uE9%b!{-GgW7XMkgKk2ev;CuRJfp0#S zVro?WpBsz+i?*0N#l~0hWAw|-&Lz5R&-zO-p`T)W`My5bC$6+*eOKSyYkJ;M)F-ui z^?C0<4XVSC1^VeF;6Wo>NoF2$J%$=a&V@&q{5e9e{f;rwne2aEo>?}+BzPy-{z!}z zlwvs(r$(81FKk6s)FKr{8T2PlpSV22ODXRD7L=-i07QP=s=PCNA0^Y%eOI9A{v%x3N4|!>3x?Cg-mi53nT`*?FONQP39e)3(q>wQs+d{eRF#{r{8EH=}2a zU+aLq7~rqpNh3PmE;w$4UveH*IAJAv@W?qVeey4?s}6Nt6k)=)9kFxNf)=(2kO{@A zoMY$f(3j};3nEN<^#~KXm&IZ6KRFj+qU}5%VM1@f8E&27GUKmf&Y=GV(27Gi`*Rph z?ySeY3wDCV3Y@BWC(g}$m>eL#z+Ti}kz;yH$;a5|7sk0g0^+u9h$?Z>!JxS;1e)^Y zG!yHB12}{i(@YkR98W#DIMfmw6KvQLifwm@IOY|bKahnmX$e8aUVqRlXGziB3-MIp zy?F+&kfoTh=K^~H(|Ma>^9p>>ieu0M*k#1R@&s&9HFF7E7S2Sd;1JK@%|pYYRFaAF z=LS%37DBf`dVbw^VobVS43j335_Vd;6+Jem>2N zt*Y@?r7Jxv;wv^TUyv76tRHfzyb@>(O-T(mXLz(9jqoMKJQ_Qm(y8W`DoXQNtug{ax?2GheG;paBdsv_>r_5>P{QyGUpV`hFW<9#u+gC8jIyU+dEXbW@$J(&seH-pS}>mXW&3)z^Yqm3 zD%G~0j+?i3?;9XZ{_%kfn*5~MJ9YB+c2B>LZ%;_Jn0S+&PaE!XSjE_2R&1;@JXirC1*O8`<(1T53hxXB?O<-C~8%Tdu?{H5`DEm9%jcg*h;Pv(TaGCuq zLS?Zq4vEA{=w)I_7+!Gsrmxq3z21H{dS8F2zjd3Cx$h-T?KK;6dOt86A~{F{g?ot` zpS8kD{WArhEV+e~B%eD?CJWuYJH)vpRx=^lksdT+FC-g0mD$F9o*^OoB1a&H=tdTx$gjiCB96aa&v0+pMw$Sl z$oh-4hm}KmR$PoSOHeoP^*>2Qb8k0GtW6!a7#lV|-;^*;snL{!PnNQyiN_}|nR;Jm ziNUSIjxlB9`W+I7JRGBiZ%vF|SegNRBk5y|??y98WQoxVOL`tg4@f%BNN*>@A6}#T zC1|EN16n_moNmD9uR%%hvT?hSj$)7JQlwL;aSqarNIOuo9SO6zfbYUvpiBc2&VCV5 zUPN6|BGOc(dyziI8ZMZ|2);7jg7glwUod3METnBnC?5-ZBDNH15fbW%Jw%v^L*iPH zP{xGvCY4%n$jAOaPoE9 zXM{Lnk!q2)AU#ir(}gq&3HhD)o{o0YOOVh`2JU+wLpnxCHu{7Jbdr4#>0?52#v!do zLKz?W@ADx6CqCfQcbJfYsA%A3q^}4Wvu=!skq*z4i zL_(heBapg~UMHjkFqR-+$!`e>W+I`D;2A zNJtrQQieQb=*v)C58ZKQLDC2rH5KU>gj|7VS8N684MKW`kTD!m z71AywIL!|cT(>P2|T33&)- zl<86&9?|E|$?hT1d+bRJ_S{BfJ%@;l5z%X&m~j$&6afbY&^K%Wj@~T9j8IF7zOnrG%k zcPp`Fa-M!~Hfm}`xWgjkUy1;5_H7ADjmGy`$kTw&xi}PmfquUcHO@hvl{nPDFK=JY zzVGMD7NOokQgWG`eYNDC>(}{SVMIZh?1l4siy~JSz0bgRwoha@YKFU^1w)(mo*v`Hx|Dsa3uszEaKiL z0kQ0N1?uq&1PNGow1O5|L4PV}TLSG316{^LD4GDW8CFdxteXIS-=GYGGzf6|@mmGc z@rwqT=&%>-+diD!p9=)!W7mVA|N4OkCt76zAq7}7bh8Mo%0y=pO`2woub)PzO&b_L Qlx#Z4m)-0fIFOM44{);2Jpcdz literal 0 HcmV?d00001 diff --git a/gulpfile.js b/gulpfile.js new file mode 100644 index 00000000..8c07d1fc --- /dev/null +++ b/gulpfile.js @@ -0,0 +1,50 @@ +const gulp = require('gulp'); +const prefix = require('gulp-autoprefixer'); +const sourcemaps = require('gulp-sourcemaps'); +const sass = require('gulp-sass'); + +/* ----------------------------------------- */ +/* Compile Sass +/* ----------------------------------------- */ + +// Small error handler helper function. +function handleError(err) { + console.log(err.toString()); + this.emit('end'); +} + +const SYSTEM_SCSS = ["scss/**/*.scss"]; +function compileScss() { + // Configure options for sass output. For example, 'expanded' or 'nested' + let options = { + outputStyle: 'expanded' + }; + return gulp.src(SYSTEM_SCSS) + .pipe( + sass(options) + .on('error', handleError) + ) + .pipe(prefix({ + cascade: false + })) + .pipe(gulp.dest("./styles")) +} +const css = gulp.series(compileScss); + +/* ----------------------------------------- */ +/* Watch Updates +/* ----------------------------------------- */ + +function watchUpdates() { + gulp.watch(SYSTEM_SCSS, css); +} + +/* ----------------------------------------- */ +/* Export Tasks +/* ----------------------------------------- */ + +exports.default = gulp.series( + compileScss, + watchUpdates +); +exports.css = css; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..fc4d9b13 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3953 @@ +{ + "name": "starwarsffg", + "version": "0.053", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@gulp-sourcemaps/identity-map": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/identity-map/-/identity-map-1.0.2.tgz", + "integrity": "sha512-ciiioYMLdo16ShmfHBXJBOFm3xPC4AuwO4xeRpFeHz7WK9PYsWCmigagG2XyzZpubK4a3qNKoUBDhbzHfa50LQ==", + "requires": { + "acorn": "^5.0.3", + "css": "^2.2.1", + "normalize-path": "^2.1.1", + "source-map": "^0.6.0", + "through2": "^2.0.3" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "@gulp-sourcemaps/map-sources": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz", + "integrity": "sha1-iQrnxdjId/bThIYCFazp1+yUW9o=", + "requires": { + "normalize-path": "^2.0.1", + "through2": "^2.0.3" + } + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "acorn": { + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==" + }, + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + }, + "ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "requires": { + "ansi-wrap": "^0.1.0" + } + }, + "ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=" + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "append-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", + "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", + "requires": { + "buffer-equal": "^1.0.0" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=" + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "arr-filter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", + "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", + "requires": { + "make-iterator": "^1.0.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "arr-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", + "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", + "requires": { + "make-iterator": "^1.0.0" + } + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=" + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" + }, + "array-initial": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", + "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", + "requires": { + "array-slice": "^1.0.0", + "is-number": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" + } + } + }, + "array-last": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", + "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", + "requires": { + "is-number": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" + } + } + }, + "array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==" + }, + "array-sort": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", + "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", + "requires": { + "default-compare": "^1.0.0", + "get-value": "^2.0.6", + "kind-of": "^5.0.2" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + }, + "async-done": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", + "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.2", + "process-nextick-args": "^2.0.0", + "stream-exhaust": "^1.0.1" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" + }, + "async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=" + }, + "async-settle": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", + "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", + "requires": { + "async-done": "^1.2.2" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + }, + "autoprefixer": { + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.0.tgz", + "integrity": "sha512-D96ZiIHXbDmU02dBaemyAg53ez+6F5yZmapmgKcjm35yEe1uVDYI8hGW3VYoGRaG290ZFf91YxHrR518vC0u/A==", + "requires": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001061", + "chalk": "^2.4.2", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.30", + "postcss-value-parser": "^4.1.0" + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", + "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==" + }, + "bach": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", + "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", + "requires": { + "arr-filter": "^1.1.1", + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "array-each": "^1.0.0", + "array-initial": "^1.0.0", + "array-last": "^1.1.1", + "async-done": "^1.2.2", + "async-settle": "^1.0.0", + "now-and-later": "^2.0.0" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "requires": { + "inherits": "~2.0.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "browserslist": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.12.0.tgz", + "integrity": "sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg==", + "requires": { + "caniuse-lite": "^1.0.30001043", + "electron-to-chromium": "^1.3.413", + "node-releases": "^1.1.53", + "pkg-up": "^2.0.0" + } + }, + "buffer-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", + "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=" + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" + } + } + }, + "caniuse-lite": { + "version": "1.0.30001066", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001066.tgz", + "integrity": "sha512-Gfj/WAastBtfxLws0RCh2sDbTK/8rJuSeZMecrSkNGYxPcv7EzblmDGfWQCFEQcSqYE2BRgQiJh8HOD07N5hIw==" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + } + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=" + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=" + }, + "cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", + "requires": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "collection-map": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", + "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", + "requires": { + "arr-map": "^2.0.2", + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, + "copy-props": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz", + "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==", + "requires": { + "each-props": "^1.3.0", + "is-plain-object": "^2.0.1" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cross-spawn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", + "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "requires": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "requires": { + "array-find-index": "^1.0.1" + } + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "debug-fabulous": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/debug-fabulous/-/debug-fabulous-1.1.0.tgz", + "integrity": "sha512-GZqvGIgKNlUnHUPQhepnUZFIMoi3dgZKQBzKDeL2g7oJF9SNAji/AAu36dusFUas0O+pae74lNeoIPHqXWDkLg==", + "requires": { + "debug": "3.X", + "memoizee": "0.4.X", + "object-assign": "4.X" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "default-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", + "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", + "requires": { + "kind-of": "^5.0.2" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "default-resolution": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", + "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=" + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=" + }, + "detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=" + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "each-props": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", + "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", + "requires": { + "is-plain-object": "^2.0.1", + "object.defaults": "^1.1.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "electron-to-chromium": { + "version": "1.3.455", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.455.tgz", + "integrity": "sha512-4lwnxp+ArqOX9hiLwLpwhfqvwzUHFuDgLz4NTiU3lhygUzWtocIJ/5Vix+mWVNE2HQ9aI1k2ncGe5H/0OktMvA==" + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "requires": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", + "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==" + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "requires": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + } + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "optional": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "requires": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + } + }, + "flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==" + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "requires": { + "for-in": "^1.0.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "requires": { + "map-cache": "^0.2.2" + } + }, + "fs-mkdirp-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", + "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", + "requires": { + "graceful-fs": "^4.1.11", + "through2": "^2.0.3" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "requires": { + "globule": "^1.0.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "glob-stream": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", + "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", + "requires": { + "extend": "^3.0.0", + "glob": "^7.1.1", + "glob-parent": "^3.1.0", + "is-negated-glob": "^1.0.0", + "ordered-read-streams": "^1.0.0", + "pumpify": "^1.3.5", + "readable-stream": "^2.1.5", + "remove-trailing-separator": "^1.0.1", + "to-absolute-glob": "^2.0.0", + "unique-stream": "^2.0.2" + } + }, + "glob-watcher": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.3.tgz", + "integrity": "sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg==", + "requires": { + "anymatch": "^2.0.0", + "async-done": "^1.2.0", + "chokidar": "^2.0.0", + "is-negated-glob": "^1.0.0", + "just-debounce": "^1.0.0", + "object.defaults": "^1.1.0" + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "globule": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.1.tgz", + "integrity": "sha512-OVyWOHgw29yosRHCHo7NncwR1hW5ew0W/UrvtwvjefVJeQ26q4/8r8FmPsSF1hJ93IgWkyv16pCTz6WblMzm/g==", + "requires": { + "glob": "~7.1.1", + "lodash": "~4.17.12", + "minimatch": "~3.0.2" + } + }, + "glogg": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", + "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", + "requires": { + "sparkles": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + }, + "gulp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", + "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", + "requires": { + "glob-watcher": "^5.0.3", + "gulp-cli": "^2.2.0", + "undertaker": "^1.2.1", + "vinyl-fs": "^3.0.0" + }, + "dependencies": { + "gulp-cli": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.2.1.tgz", + "integrity": "sha512-yEMxrXqY8mJFlaauFQxNrCpzWJThu0sH1sqlToaTOT063Hub9s/Nt2C+GSLe6feQ/IMWrHvGOOsyES7CQc9O+A==", + "requires": { + "ansi-colors": "^1.0.1", + "archy": "^1.0.0", + "array-sort": "^1.0.0", + "color-support": "^1.1.3", + "concat-stream": "^1.6.0", + "copy-props": "^2.0.1", + "fancy-log": "^1.3.2", + "gulplog": "^1.0.0", + "interpret": "^1.1.0", + "isobject": "^3.0.1", + "liftoff": "^3.1.0", + "matchdep": "^2.0.0", + "mute-stdout": "^1.0.0", + "pretty-hrtime": "^1.0.0", + "replace-homedir": "^1.0.0", + "semver-greatest-satisfied-range": "^1.1.0", + "v8flags": "^3.0.1", + "yargs": "^7.1.0" + } + } + } + }, + "gulp-autoprefixer": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/gulp-autoprefixer/-/gulp-autoprefixer-7.0.1.tgz", + "integrity": "sha512-QJGEmHw+bEt7FSqvmbAUTxbCuNLJYx4sz3ox9WouYqT/7j5FH5CQ8ZnpL1M7H5npX1bUJa7lUVY1w20jXxhOxg==", + "requires": { + "autoprefixer": "^9.6.1", + "fancy-log": "^1.3.2", + "plugin-error": "^1.0.1", + "postcss": "^7.0.17", + "through2": "^3.0.1", + "vinyl-sourcemaps-apply": "^0.2.1" + }, + "dependencies": { + "through2": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", + "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", + "requires": { + "readable-stream": "2 || 3" + } + } + } + }, + "gulp-sass": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/gulp-sass/-/gulp-sass-4.1.0.tgz", + "integrity": "sha512-xIiwp9nkBLcJDpmYHbEHdoWZv+j+WtYaKD6Zil/67F3nrAaZtWYN5mDwerdo7EvcdBenSAj7Xb2hx2DqURLGdA==", + "requires": { + "chalk": "^2.3.0", + "lodash": "^4.17.11", + "node-sass": "^4.8.3", + "plugin-error": "^1.0.1", + "replace-ext": "^1.0.0", + "strip-ansi": "^4.0.0", + "through2": "^2.0.0", + "vinyl-sourcemaps-apply": "^0.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "gulp-sourcemaps": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-2.6.5.tgz", + "integrity": "sha512-SYLBRzPTew8T5Suh2U8jCSDKY+4NARua4aqjj8HOysBh2tSgT9u4jc1FYirAdPx1akUxxDeK++fqw6Jg0LkQRg==", + "requires": { + "@gulp-sourcemaps/identity-map": "1.X", + "@gulp-sourcemaps/map-sources": "1.X", + "acorn": "5.X", + "convert-source-map": "1.X", + "css": "2.X", + "debug-fabulous": "1.X", + "detect-newline": "2.X", + "graceful-fs": "4.X", + "source-map": "~0.6.0", + "strip-bom-string": "1.X", + "through2": "2.X" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "requires": { + "glogg": "^1.0.0" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "in-publish": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz", + "integrity": "sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==" + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "requires": { + "repeating": "^2.0.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==" + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=" + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "requires": { + "is-unc-path": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "requires": { + "unc-path-regex": "^0.1.2" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, + "is-valid-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=" + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "js-base64": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.2.tgz", + "integrity": "sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ==" + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "just-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", + "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=" + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "last-run": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", + "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", + "requires": { + "default-resolution": "^2.0.0", + "es6-weak-map": "^2.0.1" + } + }, + "lazystream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "requires": { + "readable-stream": "^2.0.5" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "^1.0.0" + } + }, + "lead": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", + "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", + "requires": { + "flush-write-stream": "^1.0.2" + } + }, + "liftoff": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", + "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", + "requires": { + "extend": "^3.0.0", + "findup-sync": "^3.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + } + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", + "requires": { + "es5-ext": "~0.10.2" + } + }, + "make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "requires": { + "kind-of": "^6.0.2" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "^1.0.0" + } + }, + "matchdep": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", + "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", + "requires": { + "findup-sync": "^2.0.0", + "micromatch": "^3.0.4", + "resolve": "^1.4.0", + "stack-trace": "0.0.10" + }, + "dependencies": { + "findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "memoizee": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.14.tgz", + "integrity": "sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg==", + "requires": { + "d": "1", + "es5-ext": "^0.10.45", + "es6-weak-map": "^2.0.2", + "event-emitter": "^0.3.5", + "is-promise": "^2.1", + "lru-queue": "0.1", + "next-tick": "1", + "timers-ext": "^0.1.5" + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "requires": { + "mime-db": "1.44.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "mute-stdout": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", + "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==" + }, + "nan": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", + "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==" + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, + "node-gyp": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", + "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", + "requires": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "^2.87.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" + } + } + }, + "node-releases": { + "version": "1.1.57", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.57.tgz", + "integrity": "sha512-ZQmnWS7adi61A9JsllJ2gdj2PauElcjnOwTp2O011iGzoakTxUsDGSe+6vD7wXbKdqhSFymC0OSx35aAMhrSdw==" + }, + "node-sass": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.14.1.tgz", + "integrity": "sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g==", + "requires": { + "async-foreach": "^0.1.3", + "chalk": "^1.1.1", + "cross-spawn": "^3.0.0", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "in-publish": "^2.0.0", + "lodash": "^4.17.15", + "meow": "^3.7.0", + "mkdirp": "^0.5.1", + "nan": "^2.13.2", + "node-gyp": "^3.8.0", + "npmlog": "^4.0.0", + "request": "^2.88.0", + "sass-graph": "2.2.5", + "stdout-stream": "^1.4.0", + "true-case-path": "^1.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" + }, + "now-and-later": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", + "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", + "requires": { + "once": "^1.3.2" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "requires": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "^3.0.1" + } + }, + "object.reduce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", + "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "ordered-read-streams": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", + "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", + "requires": { + "readable-stream": "^2.0.1" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "requires": { + "lcid": "^1.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "requires": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==" + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "requires": { + "path-root-regex": "^0.1.0" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=" + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "requires": { + "find-up": "^2.1.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "^2.0.0" + } + } + } + }, + "plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "requires": { + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + }, + "postcss": { + "version": "7.0.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.31.tgz", + "integrity": "sha512-a937VDHE1ftkjk+8/7nj/mrjtmkn69xxzJgRETXdAUU+IgOYPQNJF17haGWbeDxSyk++HA14UA98FurvPyBJOA==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==" + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "requires": { + "resolve": "^1.1.6" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "remove-bom-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", + "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", + "requires": { + "is-buffer": "^1.1.5", + "is-utf8": "^0.2.1" + } + }, + "remove-bom-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", + "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", + "requires": { + "remove-bom-buffer": "^3.0.0", + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "requires": { + "is-finite": "^1.0.0" + } + }, + "replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==" + }, + "replace-homedir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", + "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", + "requires": { + "homedir-polyfill": "^1.0.1", + "is-absolute": "^1.0.0", + "remove-trailing-separator": "^1.1.0" + } + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "resolve-options": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", + "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", + "requires": { + "value-or-function": "^3.0.0" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sass-graph": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz", + "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==", + "requires": { + "glob": "^7.0.0", + "lodash": "^4.0.0", + "scss-tokenizer": "^0.2.3", + "yargs": "^13.3.2" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "requires": { + "js-base64": "^2.1.8", + "source-map": "^0.4.2" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "semver-greatest-satisfied-range": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", + "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", + "requires": { + "sver-compat": "^1.5.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" + }, + "sparkles": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", + "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==" + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "stdout-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", + "requires": { + "readable-stream": "^2.0.1" + } + }, + "stream-exhaust": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", + "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==" + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=" + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "requires": { + "get-stdin": "^4.0.1" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "sver-compat": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", + "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", + "requires": { + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" + } + }, + "tar": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", + "requires": { + "block-stream": "*", + "fstream": "^1.0.12", + "inherits": "2" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "through2-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", + "requires": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=" + }, + "timers-ext": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", + "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", + "requires": { + "es5-ext": "~0.10.46", + "next-tick": "1" + } + }, + "to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", + "requires": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + } + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "to-through": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", + "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", + "requires": { + "through2": "^2.0.3" + } + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" + }, + "true-case-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", + "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", + "requires": { + "glob": "^7.1.2" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=" + }, + "undertaker": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.1.tgz", + "integrity": "sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==", + "requires": { + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "bach": "^1.0.0", + "collection-map": "^1.0.0", + "es6-weak-map": "^2.0.1", + "last-run": "^1.1.0", + "object.defaults": "^1.0.0", + "object.reduce": "^1.0.0", + "undertaker-registry": "^1.0.0" + } + }, + "undertaker-registry": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", + "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=" + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unique-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", + "requires": { + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "v8flags": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz", + "integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==", + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "value-or-function": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", + "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vinyl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", + "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + } + }, + "vinyl-fs": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", + "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", + "requires": { + "fs-mkdirp-stream": "^1.0.0", + "glob-stream": "^6.1.0", + "graceful-fs": "^4.0.0", + "is-valid-glob": "^1.0.0", + "lazystream": "^1.0.0", + "lead": "^1.0.0", + "object.assign": "^4.0.4", + "pumpify": "^1.3.5", + "readable-stream": "^2.3.3", + "remove-bom-buffer": "^3.0.0", + "remove-bom-stream": "^1.2.0", + "resolve-options": "^1.1.0", + "through2": "^2.0.0", + "to-through": "^2.0.0", + "value-or-function": "^3.0.0", + "vinyl": "^2.0.0", + "vinyl-sourcemap": "^1.1.0" + } + }, + "vinyl-sourcemap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", + "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", + "requires": { + "append-buffer": "^1.0.2", + "convert-source-map": "^1.5.0", + "graceful-fs": "^4.1.6", + "normalize-path": "^2.1.1", + "now-and-later": "^2.0.0", + "remove-bom-buffer": "^3.0.0", + "vinyl": "^2.0.0" + } + }, + "vinyl-sourcemaps-apply": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", + "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", + "requires": { + "source-map": "^0.5.1" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + }, + "yargs": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.1.tgz", + "integrity": "sha512-huO4Fr1f9PmiJJdll5kwoS2e4GqzGSsMT3PPMpOwoVkOK8ckqAewMTZyA6LXVQWflleb/Z8oPBEvNsMft0XE+g==", + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "5.0.0-security.0" + } + }, + "yargs-parser": { + "version": "5.0.0-security.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0-security.0.tgz", + "integrity": "sha512-T69y4Ps64LNesYxeYGYPvfoMTt/7y1XtfpIslUeK4um+9Hu7hlGoRtaDLvdXb7+/tfq4opVa2HRY5xGip022rQ==", + "requires": { + "camelcase": "^3.0.0", + "object.assign": "^4.1.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..05c5049e --- /dev/null +++ b/package.json @@ -0,0 +1,17 @@ +{ + "name": "starwarsffg", + "version": "1.0.0", + "description": "( PLEASE NOTE: This is a custom fork based on [Jaxxa's implementation](https://github.com/jaxxa/StarWarsFFG/tree/master). )", + "main": "index.js", + "scripts": { + "compile": "gulp css" + }, + "author": "", + "license": "MIT", + "dependencies": { + "gulp": "^4.0.2", + "gulp-autoprefixer": "^7.0.1", + "gulp-sass": "^4.1.0", + "gulp-sourcemaps": "^2.6.5" + } +} diff --git a/scss/components/_form.scss b/scss/components/_form.scss new file mode 100644 index 00000000..366502a6 --- /dev/null +++ b/scss/components/_form.scss @@ -0,0 +1,3 @@ +.item-form { + font-family: $font-primary; +} \ No newline at end of file diff --git a/scss/components/_resource.scss b/scss/components/_resource.scss new file mode 100644 index 00000000..b584e96c --- /dev/null +++ b/scss/components/_resource.scss @@ -0,0 +1,4 @@ +.resource-label { + font-weight: bold; + text-transform: uppercase; +} \ No newline at end of file diff --git a/scss/components/_tabs.scss b/scss/components/_tabs.scss new file mode 100644 index 00000000..7598ff99 --- /dev/null +++ b/scss/components/_tabs.scss @@ -0,0 +1,34 @@ +// .tabs { +// .item { +// background: rgba(0, 0, 0, 0.125); +// border: 1px solid; +// border-radius: 4px; +// margin: 0 10px 0; +// padding: 8px 4px; + +// &:hover, +// &:focus { +// background: rgba(0, 0, 0, 0.125); +// } + +// &.active { +// background: transparent; +// } +// } +// } + +.tabs { + height: 40px; + border-top: 1px solid #AAA; + border-bottom: 1px solid #AAA; + + .item { + line-height: 40px; + font-weight: bold; + } + + .item.active { + text-decoration: underline; + text-shadow: none; + } +} \ No newline at end of file diff --git a/scss/global/_flex.scss b/scss/global/_flex.scss new file mode 100644 index 00000000..013c98a6 --- /dev/null +++ b/scss/global/_flex.scss @@ -0,0 +1,9 @@ +.flex-center { + align-items: center; + justify-content: center; + text-align: center; +} + +.flex-between { + justify-content: space-between; +} \ No newline at end of file diff --git a/scss/global/_grid.scss b/scss/global/_grid.scss new file mode 100644 index 00000000..fb79192a --- /dev/null +++ b/scss/global/_grid.scss @@ -0,0 +1,79 @@ +.grid, +.grid-2col { + display: grid; + grid-column: span 2 / span 2; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 10px; + margin: 10px 0; + padding: 0; +} + +.grid-3col { + grid-column: span 3 / span 3; + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.grid-4col { + grid-column: span 4 / span 4; + grid-template-columns: repeat(4, minmax(0, 1fr)); +} + +.grid-5col { + grid-column: span 5 / span 5; + grid-template-columns: repeat(5, minmax(0, 1fr)); +} + +.grid-6col { + grid-column: span 6 / span 6; + grid-template-columns: repeat(6, minmax(0, 1fr)); +} + +.grid-7col { + grid-column: span 7 / span 7; + grid-template-columns: repeat(7, minmax(0, 1fr)); +} + +.grid-8col { + grid-column: span 8 / span 8; + grid-template-columns: repeat(8, minmax(0, 1fr)); +} + +.grid-9col { + grid-column: span 9 / span 9; + grid-template-columns: repeat(9, minmax(0, 1fr)); +} + +.grid-10col { + grid-column: span 10 / span 10; + grid-template-columns: repeat(10, minmax(0, 1fr)); +} + +.grid-11col { + grid-column: span 11 / span 11; + grid-template-columns: repeat(11, minmax(0, 1fr)); +} + +.grid-12col { + grid-column: span 12 / span 12; + grid-template-columns: repeat(12, minmax(0, 1fr)); +} + +.flex-group-center, +.flex-group-left, +.flex-group-right { + justify-content: center; + align-items: center; + text-align: center; + padding: 5px; + border: 1px solid #999; +} + +.flex-group-left { + justify-content: flex-start; + text-align: left; +} + +.flex-group-right { + justify-content: flex-end; + text-align: right; +} diff --git a/scss/global/_window.scss b/scss/global/_window.scss new file mode 100644 index 00000000..d16bacc9 --- /dev/null +++ b/scss/global/_window.scss @@ -0,0 +1,17 @@ +.window-app { + font-family: $font-primary; + + .window-content { + background: rgba(255, 255, 255, 0.7); + font-size: 9pt; + } +} + +.rollable { + &:hover, + &:focus { + color: #000; + text-shadow: 0 0 10px red; + cursor: pointer; + } +} \ No newline at end of file diff --git a/scss/starwarsffg.scss b/scss/starwarsffg.scss new file mode 100644 index 00000000..50031e38 --- /dev/null +++ b/scss/starwarsffg.scss @@ -0,0 +1,14 @@ +// Import utilities. +@import 'utils/typography'; +@import 'utils/colors'; +@import 'utils/mixins'; +@import 'utils/variables'; + +/* Global styles */ +@import 'global/window'; +@import 'global/grid'; +@import 'global/flex'; + +.starwarsffg { + +} \ No newline at end of file diff --git a/scss/utils/_colors.scss b/scss/utils/_colors.scss new file mode 100644 index 00000000..a119f260 --- /dev/null +++ b/scss/utils/_colors.scss @@ -0,0 +1,2 @@ +$c-white: #fff; +$c-black: #000; \ No newline at end of file diff --git a/scss/utils/_mixins.scss b/scss/utils/_mixins.scss new file mode 100644 index 00000000..69dd2ad1 --- /dev/null +++ b/scss/utils/_mixins.scss @@ -0,0 +1,16 @@ +@mixin element-invisible { + position: absolute; + + width: 1px; + height: 1px; + margin: -1px; + border: 0; + padding: 0; + + clip: rect(0 0 0 0); + overflow: hidden; +} + +@mixin hide { + display: none; +} \ No newline at end of file diff --git a/scss/utils/_typography.scss b/scss/utils/_typography.scss new file mode 100644 index 00000000..fda9b240 --- /dev/null +++ b/scss/utils/_typography.scss @@ -0,0 +1,17 @@ +@font-face { + font-family: 'Roboto'; + src: url('fonts/Roboto-Regular.ttf') format('truetype'); +} + +@font-face { + font-family: 'StarJedi'; + src: url('fonts/StarJedi-Regular.ttf') format('truetype'); +} + +@font-face { + font-family: 'Signika'; + src: url('fonts/Signika-Regular.ttf') format('truetype'); +} + +$font-primary: 'Roboto', sans-serif; +$font-secondary: 'StarJedi', sans-serif; \ No newline at end of file diff --git a/scss/utils/_variables.scss b/scss/utils/_variables.scss new file mode 100644 index 00000000..64be658c --- /dev/null +++ b/scss/utils/_variables.scss @@ -0,0 +1,3 @@ +$padding-sm: 5px; +$padding-md: 10px; +$padding-lg: 20px; \ No newline at end of file diff --git a/styles/starwarsffg.css b/styles/starwarsffg.css new file mode 100644 index 00000000..98c34bab --- /dev/null +++ b/styles/starwarsffg.css @@ -0,0 +1,120 @@ +@font-face { + font-family: 'Roboto'; + src: url("fonts/Roboto-Regular.ttf") format("truetype"); +} + +@font-face { + font-family: 'StarJedi'; + src: url("fonts/StarJedi-Regular.ttf") format("truetype"); +} + +@font-face { + font-family: 'Signika'; + src: url("fonts/Signika-Regular.ttf") format("truetype"); +} + +/* Global styles */ +.window-app { + font-family: "Roboto", sans-serif; +} + +.window-app .window-content { + background: rgba(255, 255, 255, 0.7); + font-size: 9pt; +} + +.rollable:hover, .rollable:focus { + color: #000; + text-shadow: 0 0 10px red; + cursor: pointer; +} + +.grid, +.grid-2col { + display: grid; + grid-column: span 2 / span 2; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 10px; + margin: 10px 0; + padding: 0; +} + +.grid-3col { + grid-column: span 3 / span 3; + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.grid-4col { + grid-column: span 4 / span 4; + grid-template-columns: repeat(4, minmax(0, 1fr)); +} + +.grid-5col { + grid-column: span 5 / span 5; + grid-template-columns: repeat(5, minmax(0, 1fr)); +} + +.grid-6col { + grid-column: span 6 / span 6; + grid-template-columns: repeat(6, minmax(0, 1fr)); +} + +.grid-7col { + grid-column: span 7 / span 7; + grid-template-columns: repeat(7, minmax(0, 1fr)); +} + +.grid-8col { + grid-column: span 8 / span 8; + grid-template-columns: repeat(8, minmax(0, 1fr)); +} + +.grid-9col { + grid-column: span 9 / span 9; + grid-template-columns: repeat(9, minmax(0, 1fr)); +} + +.grid-10col { + grid-column: span 10 / span 10; + grid-template-columns: repeat(10, minmax(0, 1fr)); +} + +.grid-11col { + grid-column: span 11 / span 11; + grid-template-columns: repeat(11, minmax(0, 1fr)); +} + +.grid-12col { + grid-column: span 12 / span 12; + grid-template-columns: repeat(12, minmax(0, 1fr)); +} + +.flex-group-center, +.flex-group-left, +.flex-group-right { + justify-content: center; + align-items: center; + text-align: center; + padding: 5px; + border: 1px solid #999; +} + +.flex-group-left { + justify-content: flex-start; + text-align: left; +} + +.flex-group-right { + justify-content: flex-end; + text-align: right; +} + +.flex-center { + align-items: center; + justify-content: center; + text-align: center; +} + +.flex-between { + justify-content: space-between; +} diff --git a/system.json b/system.json index 4cba18e7..725e9dd0 100644 --- a/system.json +++ b/system.json @@ -8,7 +8,7 @@ "templateVersion": 1, "author": "Esrin", "esmodules": ["modules/dice-pool-ffg.js", "modules/swffg-main.js"], - "styles": ["styles/swffg.css"], + "styles": ["styles/swffg.css", "styles/starwarsffg.css"], "packs": [ { "name": "rollabletables", diff --git a/templates/actors/ffg-character-sheet.html b/templates/actors/ffg-character-sheet.html index 99d002f2..a68205c7 100644 --- a/templates/actors/ffg-character-sheet.html +++ b/templates/actors/ffg-character-sheet.html @@ -1,4 +1,4 @@ -
                    + {{!-- Sheet Header --}}

                    From be1cc8d8f8c8cfbb609f0b5ce1eadf077daa4168 Mon Sep 17 00:00:00 2001 From: Esrin Date: Sun, 31 May 2020 12:31:16 +0100 Subject: [PATCH 19/44] Minor bugfixes to vehicle sheet. --- README.md | 4 + system.json | 4 +- template.json | 1396 +++++++++++------------ templates/actors/ffg-vehicle-sheet.html | 6 +- 4 files changed, 705 insertions(+), 705 deletions(-) diff --git a/README.md b/README.md index 0f3988e8..1b396783 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,7 @@ NEEDED FOR RELEASE V1: - Group Management sheet for GM use (currently in progress). - Create equipable item functionality and rework inventory to suit. Continue to improve inventory display in the process. - Add Forcepower item type (based on talent). +- Add Maximum Altitude and Crew Capacity to vehicle sheet. - Redo the dice selection popup to be more functional and provide upgrade ability and upgrade difficulty buttons. - Rebuild dice functionality to use Foundry Dice instead of chat content, remove requirement for Special-Dice-Roller. - Localisation hooks @@ -42,6 +43,9 @@ NICE TO HAVE: # Changelog +- 31/05/2020 - CStadther - Minor bugfix on .item click listener to prevent console errors when .item class components with no related item sheet are clicked, such as tabs. +- 31/05/2020 - CStadther - Added localization for character sheet. +- 29/05/2020 - Esrin - Minor bugfix to vehicle sheet, various fields will now accept string values to allow for from-to values as requested by Alex | HDScurox. - 28/05/2020 - Esrin - Brought the Minion sheet inventory in line with the latest Character sheet changes. Added talents to Minion sheet. Fixed a minor bug with group skill calculations (thanks Alex | HDScurox for the bug report). - 25/05/2020 - Esrin - Character sheet tweaks. Continued improvements to the inventory display in advance of equipable item support. - 22/05/2020 - Esrin - Minor bug fixes and tweaks, compatibility check with FVTT 0.6.0 stable release. diff --git a/system.json b/system.json index d296d246..021970f6 100644 --- a/system.json +++ b/system.json @@ -2,7 +2,7 @@ "name": "starwarsffg", "title": "Star Wars FFG", "description": "A system for playing Star Wars FFG games.", - "version": 0.053, + "version": 0.054, "minimumCoreVersion": "0.5.6", "compatibleCoreVersion": "0.6.0", "templateVersion": 1, @@ -27,6 +27,6 @@ "secondaryTokenAttribute": "strain", "url": "https://github.com/Esrin/StarWarsFFG/tree/esrin-dev", "manifest": "https://raw.githubusercontent.com/Esrin/StarWarsFFG/esrin-dev/system.json", - "download": "https://github.com/Esrin/StarWarsFFG/releases/download/esrin-dev_0.05/esrin-dev_0.053.zip", + "download": "https://github.com/Esrin/StarWarsFFG/releases/download/esrin-dev_0.05/esrin-dev_0.054.zip", "license": "LICENSE.txt" } diff --git a/template.json b/template.json index 2a3e2fbc..dc5def41 100644 --- a/template.json +++ b/template.json @@ -1,702 +1,698 @@ { - "Actor": { - "types": [ - "character", "minion", "vehicle" - ], - "templates": { - "biography": { - "biography": "" - }, - "species": { - "species": { - "value": "", - "type": "String" - } - }, - "career": { - "career": { - "value": "", - "type": "String" - } - }, - "specialisation": { - "specialisation": { - "value": "", - "type": "String" - } - }, - "stats": { - "stats": { - "wounds": { - "value": 0, - "min": 0, - "max": 10 - }, - "strain": { - "value": 0, - "min": 0, - "max": 10 - }, - "soak": { - "value": 2 - }, - "defence": { - "ranged": 0, - "melee": 0 - }, - "encumbrance": { - "value": 0, - "max": 0 - }, - "forcePool": { - "value": 0, - "max": 0 - }, - "credits": { - "value": 0, - "type": "Number", - "label": "Credits" - } - } - }, - "characteristics": { - "characteristics": { - "Brawn": { - "value": 2, - "label": "Brawn", - "abrev": "Br", - "max": 7 - }, - "Agility": { - "value": 2, - "label": "Agility", - "abrev": "Ag", - "max": 7 - }, - "Intellect": { - "value": 2, - "label": "Intellect", - "abrev": "Int", - "max": 7 - }, - "Cunning": { - "value": 2, - "label": "Cunning", - "abrev": "Cun", - "max": 7 - }, - "Willpower": { - "value": 2, - "label": "Willpower", - "abrev": "Will", - "max": 7 - }, - "Presence": { - "value": 2, - "label": "Presence", - "abrev": "Pr", - "max": 7 - } - } - }, - "skills": { - "skills": { - "Brawl": { - "rank": 0, - "characteristic": "Brawn", - "groupskill": false, - "careerskill": false, - "type": "Combat", - "max": 6 - }, - "Gunnery": { - "rank": 0, - "characteristic": "Agility", - "groupskill": false, - "careerskill": false, - "type": "Combat", - "max": 6 - }, - "Lightsaber": { - "rank": 0, - "characteristic": "Brawn", - "groupskill": false, - "careerskill": false, - "type": "Combat", - "max": 6 - }, - "Melee": { - "rank": 0, - "characteristic": "Brawn", - "groupskill": false, - "careerskill": false, - "type": "Combat", - "max": 6 - }, - "Ranged: Light": { - "rank": 0, - "characteristic": "Agility", - "groupskill": false, - "careerskill": false, - "type": "Combat", - "max": 6 - }, - "Ranged: Heavy": { - "rank": 0, - "characteristic": "Agility", - "groupskill": false, - "careerskill": false, - "type": "Combat", - "max": 6 - }, - "Astrogation": { - "rank": 0, - "characteristic": "Intellect", - "groupskill": false, - "careerskill": false, - "type": "General", - "max": 6 - }, - "Athletics ": { - "rank": 0, - "characteristic": "Brawn", - "groupskill": false, - "careerskill": false, - "type": "General", - "max": 6 - }, - "Charm": { - "rank": 0, - "characteristic": "Presence", - "groupskill": false, - "careerskill": false, - "type": "General", - "max": 6 - }, - "Coercion": { - "rank": 0, - "characteristic": "Willpower", - "groupskill": false, - "careerskill": false, - "type": "General", - "max": 6 - }, - "Computers": { - "rank": 0, - "characteristic": "Intellect", - "groupskill": false, - "careerskill": false, - "type": "General", - "max": 6 - }, - "Cool": { - "rank": 0, - "characteristic": "Presence", - "groupskill": false, - "careerskill": false, - "type": "General", - "max": 6 - }, - "Coordination": { - "rank": 0, - "characteristic": "Agility", - "groupskill": false, - "careerskill": false, - "type": "General", - "max": 6 - }, - "Deception": { - "rank": 0, - "characteristic": "Cunning", - "groupskill": false, - "careerskill": false, - "type": "General", - "max": 6 - }, - "Discipline": { - "rank": 0, - "characteristic": "Willpower", - "groupskill": false, - "careerskill": false, - "type": "General", - "max": 6 - }, - "Leadership": { - "rank": 0, - "characteristic": "Presence", - "groupskill": false, - "careerskill": false, - "type": "General", - "max": 6 - }, - "Mechanics": { - "rank": 0, - "characteristic": "Intellect", - "groupskill": false, - "careerskill": false, - "type": "General", - "max": 6 - }, - "Medicine": { - "rank": 0, - "characteristic": "Intellect", - "groupskill": false, - "careerskill": false, - "type": "General", - "max": 6 - }, - "Negotiation": { - "rank": 0, - "characteristic": "Presence", - "groupskill": false, - "careerskill": false, - "type": "General", - "max": 6 - }, - "Perception": { - "rank": 0, - "characteristic": "Cunning", - "groupskill": false, - "careerskill": false, - "type": "General", - "max": 6 - }, - "Piloting: Planetary": { - "rank": 0, - "characteristic": "Agility", - "groupskill": false, - "careerskill": false, - "type": "General", - "max": 6 - }, - "Piloting: Space": { - "rank": 0, - "characteristic": "Agility", - "groupskill": false, - "careerskill": false, - "type": "General", - "max": 6 - }, - "Resilience": { - "rank": 0, - "characteristic": "Brawn", - "groupskill": false, - "careerskill": false, - "type": "General", - "max": 6 - }, - "Skulduggery": { - "rank": 0, - "characteristic": "Cunning", - "groupskill": false, - "careerskill": false, - "type": "General", - "max": 6 - }, - "Stealth": { - "rank": 0, - "characteristic": "Agility", - "groupskill": false, - "careerskill": false, - "type": "General", - "max": 6 - }, - "Streetwise": { - "rank": 0, - "characteristic": "Cunning", - "groupskill": false, - "careerskill": false, - "type": "General", - "max": 6 - }, - "Survival": { - "rank": 0, - "characteristic": "Cunning", - "groupskill": false, - "careerskill": false, - "type": "General", - "max": 6 - }, - "Vigilance": { - "rank": 0, - "characteristic": "Willpower", - "groupskill": false, - "careerskill": false, - "type": "General", - "max": 6 - }, - "Knowledge: Core Worlds": { - "rank": 0, - "characteristic": "Intellect", - "groupskill": false, - "careerskill": false, - "type": "Knowledge", - "max": 6 - }, - "Knowledge: Education": { - "rank": 0, - "characteristic": "Intellect", - "groupskill": false, - "careerskill": false, - "type": "Knowledge", - "max": 6 - }, - "Knowledge: Lore": { - "rank": 0, - "characteristic": "Intellect", - "groupskill": false, - "careerskill": false, - "type": "Knowledge", - "max": 6 - }, - "Knowledge: Outer Rim": { - "rank": 0, - "characteristic": "Intellect", - "groupskill": false, - "careerskill": false, - "type": "Knowledge", - "max": 6 - }, - "Knowledge: Underworld": { - "rank": 0, - "characteristic": "Intellect", - "groupskill": false, - "careerskill": false, - "type": "Knowledge", - "max": 6 - }, - "Knowledge: Warfare": { - "rank": 0, - "characteristic": "Intellect", - "groupskill": false, - "careerskill": false, - "type": "Knowledge", - "max": 6 - }, - "Knowledge: Xenology": { - "rank": 0, - "characteristic": "Intellect", - "groupskill": false, - "careerskill": false, - "type": "Knowledge", - "max": 6 - } - } - }, - "attributes": { - "attributes": {} - }, - "modifiers": { - "modifiers": { - "Characteristic": {}, - "Skill Rank": {}, - "Stat": {} - } - } - }, - "character": { - "templates": ["biography", "species", "career", "specialisation", "stats", "characteristics", "skills", "attributes", "modifiers"], - "encumbrance": { - "value": 0, - "type": "Number", - "label": "Encumbrance", - "abrev": "Encum" - }, - "obligation": { - "value": 0, - "type": "Number", - "label": "Obligation" - }, - "duty": { - "value": 0, - "type": "Number", - "label": "Duty" - }, - "morality": { - "value": 0, - "type": "Number", - "label": "Morality" - }, - "conflict": { - "value": 0, - "type": "Number", - "label": "Conflict" - }, - "experience": { - "total": 0, - "available": 0 - } - }, - "minion": { - "templates": ["biography", "stats", "characteristics", "skills", "attributes", "modifiers"], - "quantity": { - "value": 1, - "type": "Number", - "label": "Quantity", - "abrev": "Qty" - }, - "unit_wounds": { - "value": 0, - "type": "Number", - "label": "Unit Wounds" - } - }, - "vehicle": { - "templates": ["biography", "attributes"], - "stats": { - "silhouette": { - "value": 1, - "type": "Number", - "label": "Silhouette" - }, - "speed": { - "value": 0, - "max": 0, - "type": "Number", - "label": "Speed" - }, - "handling": { - "value": 0, - "type": "Number", - "label": "Handling" - }, - "hullTrauma": { - "value": 0, - "min": 0, - "max": 10, - "label": "Hull Trauma" - }, - "systemStrain": { - "value": 0, - "min": 0, - "max": 10, - "label": "System Strain" - }, - "shields": { - "fore": 0, - "port": 0, - "starboard": 0, - "aft": 0, - "label": "Shields" - }, - "armour": { - "value": 0, - "type": "Number", - "label": "Armour" - }, - "sensorRange":{ - "value": "Short", - "type": "String" - }, - "crew":{}, - "passengerCapacity":{ - "value": 0, - "type": "Number", - "label": "Passenger Capacity" - }, - "encumbrance": { - "value": 0, - "min": 0, - "max": 10 - }, - "cost":{ - "value": 0, - "type": "Number", - "label": "Cost" - }, - "rarity":{ - "value": 0, - "type": "Number", - "label": "Rarity" - }, - "customizationHardPoints": { - "value": 0, - "type": "Number", - "label": "Hard Points" - } - } - } - }, - "Item": { - "types": [ - "gear", "weapon", "armour", "talent", "shipweapon", "shipattachment" - ], - "templates": { - "basic": { - "description": "", - "quantity": { - "value": 1, - "type": "Number", - "label": "Quantity", - "abrev": "Qty" - }, - "encumbrance": { - "value": 0, - "type": "Number", - "label": "Encumbrance", - "abrev": "Encum" - }, - "price": { - "value": 0, - "type": "Number", - "label": "Price" - }, - "rarity": { - "value": 0, - "type": "Number", - "label": "Rarity" - }, - "attributes": {} - }, - "hardpoints": { - "hardpoints": { - "value": 0, - "type": "Number", - "label": "Hard Points", - "abrev": "HP" - } - }, - "equippable": { - "equippable": { - "value": true, - "type": "Boolean", - "equipped": false - } - } - }, - "gear": { - "templates": ["basic"] - }, - "weapon": { - "templates": ["basic", "hardpoints", "equippable"], - "skill": { - "value": "Ranged: Light", - "type": "String", - "label": "Skill" - }, - "damage": { - "value": 0, - "type": "Number", - "label": "Damage", - "abrev": "Dam" - }, - "crit": { - "value": 0, - "type": "Number", - "label": "Critical Rating", - "abrev": "Crit" - }, - "range": { - "value": "Short", - "type": "String", - "label": "Range" - }, - "special": { - "value": "", - "type": "String", - "label": "Special" - } - }, - "armour": { - "templates": ["basic", "hardpoints", "equippable"], - "defence": { - "value": 0, - "type": "Number", - "label": "Defence", - "abrev": "Def" - }, - "soak": { - "value": 0, - "type": "Number", - "label": "Soak" - } - }, - "talent": { - "templates": ["basic"], - "description": "", - "activation": { - "value": "Passive", - "type": "String", - "label": "Activation" - }, - "ranks": { - "ranked": false, - "current": 1, - "min": 0 - }, - "trees": [], - "attributes": {} - }, - "shipweapon": { - "templates": ["basic", "hardpoints", "equippable"], - "label": "Ship Weapon", - "firingarc": { - "value": "Fore", - "type": "String", - "label": "Skill" - }, - "damage": { - "value": 0, - "type": "Number", - "label": "Damage", - "abrev": "Dam" - }, - "crit": { - "value": 0, - "type": "Number", - "label": "Critical Rating", - "abrev": "Crit" - }, - "range": { - "value": "Short", - "type": "String", - "label": "Range" - }, - "special": { - "value": "", - "type": "String", - "label": "Special" - } - }, - "shipattachment": { - "templates": ["basic", "hardpoints", "equippable"], - "label": "Ship Attachment" - }, - "species": { - "description": "", - "careerskills": [], - "characteristics": { - "Brawn": { - "value": 2, - "label": "Brawn", - "abrev": "Br" - }, - "Agility": { - "value": 2, - "label": "Agility", - "abrev": "Ag" - }, - "Intellect": { - "value": 2, - "label": "Intellect", - "abrev": "Int" - }, - "Cunning": { - "value": 2, - "label": "Cunning", - "abrev": "Cun" - }, - "Willpower": { - "value": 2, - "label": "Willpower", - "abrev": "Will" - }, - "Presence": { - "value": 2, - "label": "Presence", - "abrev": "Pr" - } - } - } - } + "Actor": { + "types": ["character", "minion", "vehicle"], + "templates": { + "biography": { + "biography": "" + }, + "species": { + "species": { + "value": "", + "type": "String" + } + }, + "career": { + "career": { + "value": "", + "type": "String" + } + }, + "specialisation": { + "specialisation": { + "value": "", + "type": "String" + } + }, + "stats": { + "stats": { + "wounds": { + "value": 0, + "min": 0, + "max": 10 + }, + "strain": { + "value": 0, + "min": 0, + "max": 10 + }, + "soak": { + "value": 2 + }, + "defence": { + "ranged": 0, + "melee": 0 + }, + "encumbrance": { + "value": 0, + "max": 0 + }, + "forcePool": { + "value": 0, + "max": 0 + }, + "credits": { + "value": 0, + "type": "Number", + "label": "Credits" + } + } + }, + "characteristics": { + "characteristics": { + "Brawn": { + "value": 2, + "label": "Brawn", + "abrev": "Br", + "max": 7 + }, + "Agility": { + "value": 2, + "label": "Agility", + "abrev": "Ag", + "max": 7 + }, + "Intellect": { + "value": 2, + "label": "Intellect", + "abrev": "Int", + "max": 7 + }, + "Cunning": { + "value": 2, + "label": "Cunning", + "abrev": "Cun", + "max": 7 + }, + "Willpower": { + "value": 2, + "label": "Willpower", + "abrev": "Will", + "max": 7 + }, + "Presence": { + "value": 2, + "label": "Presence", + "abrev": "Pr", + "max": 7 + } + } + }, + "skills": { + "skills": { + "Brawl": { + "rank": 0, + "characteristic": "Brawn", + "groupskill": false, + "careerskill": false, + "type": "Combat", + "max": 6 + }, + "Gunnery": { + "rank": 0, + "characteristic": "Agility", + "groupskill": false, + "careerskill": false, + "type": "Combat", + "max": 6 + }, + "Lightsaber": { + "rank": 0, + "characteristic": "Brawn", + "groupskill": false, + "careerskill": false, + "type": "Combat", + "max": 6 + }, + "Melee": { + "rank": 0, + "characteristic": "Brawn", + "groupskill": false, + "careerskill": false, + "type": "Combat", + "max": 6 + }, + "Ranged: Light": { + "rank": 0, + "characteristic": "Agility", + "groupskill": false, + "careerskill": false, + "type": "Combat", + "max": 6 + }, + "Ranged: Heavy": { + "rank": 0, + "characteristic": "Agility", + "groupskill": false, + "careerskill": false, + "type": "Combat", + "max": 6 + }, + "Astrogation": { + "rank": 0, + "characteristic": "Intellect", + "groupskill": false, + "careerskill": false, + "type": "General", + "max": 6 + }, + "Athletics ": { + "rank": 0, + "characteristic": "Brawn", + "groupskill": false, + "careerskill": false, + "type": "General", + "max": 6 + }, + "Charm": { + "rank": 0, + "characteristic": "Presence", + "groupskill": false, + "careerskill": false, + "type": "General", + "max": 6 + }, + "Coercion": { + "rank": 0, + "characteristic": "Willpower", + "groupskill": false, + "careerskill": false, + "type": "General", + "max": 6 + }, + "Computers": { + "rank": 0, + "characteristic": "Intellect", + "groupskill": false, + "careerskill": false, + "type": "General", + "max": 6 + }, + "Cool": { + "rank": 0, + "characteristic": "Presence", + "groupskill": false, + "careerskill": false, + "type": "General", + "max": 6 + }, + "Coordination": { + "rank": 0, + "characteristic": "Agility", + "groupskill": false, + "careerskill": false, + "type": "General", + "max": 6 + }, + "Deception": { + "rank": 0, + "characteristic": "Cunning", + "groupskill": false, + "careerskill": false, + "type": "General", + "max": 6 + }, + "Discipline": { + "rank": 0, + "characteristic": "Willpower", + "groupskill": false, + "careerskill": false, + "type": "General", + "max": 6 + }, + "Leadership": { + "rank": 0, + "characteristic": "Presence", + "groupskill": false, + "careerskill": false, + "type": "General", + "max": 6 + }, + "Mechanics": { + "rank": 0, + "characteristic": "Intellect", + "groupskill": false, + "careerskill": false, + "type": "General", + "max": 6 + }, + "Medicine": { + "rank": 0, + "characteristic": "Intellect", + "groupskill": false, + "careerskill": false, + "type": "General", + "max": 6 + }, + "Negotiation": { + "rank": 0, + "characteristic": "Presence", + "groupskill": false, + "careerskill": false, + "type": "General", + "max": 6 + }, + "Perception": { + "rank": 0, + "characteristic": "Cunning", + "groupskill": false, + "careerskill": false, + "type": "General", + "max": 6 + }, + "Piloting: Planetary": { + "rank": 0, + "characteristic": "Agility", + "groupskill": false, + "careerskill": false, + "type": "General", + "max": 6 + }, + "Piloting: Space": { + "rank": 0, + "characteristic": "Agility", + "groupskill": false, + "careerskill": false, + "type": "General", + "max": 6 + }, + "Resilience": { + "rank": 0, + "characteristic": "Brawn", + "groupskill": false, + "careerskill": false, + "type": "General", + "max": 6 + }, + "Skulduggery": { + "rank": 0, + "characteristic": "Cunning", + "groupskill": false, + "careerskill": false, + "type": "General", + "max": 6 + }, + "Stealth": { + "rank": 0, + "characteristic": "Agility", + "groupskill": false, + "careerskill": false, + "type": "General", + "max": 6 + }, + "Streetwise": { + "rank": 0, + "characteristic": "Cunning", + "groupskill": false, + "careerskill": false, + "type": "General", + "max": 6 + }, + "Survival": { + "rank": 0, + "characteristic": "Cunning", + "groupskill": false, + "careerskill": false, + "type": "General", + "max": 6 + }, + "Vigilance": { + "rank": 0, + "characteristic": "Willpower", + "groupskill": false, + "careerskill": false, + "type": "General", + "max": 6 + }, + "Knowledge: Core Worlds": { + "rank": 0, + "characteristic": "Intellect", + "groupskill": false, + "careerskill": false, + "type": "Knowledge", + "max": 6 + }, + "Knowledge: Education": { + "rank": 0, + "characteristic": "Intellect", + "groupskill": false, + "careerskill": false, + "type": "Knowledge", + "max": 6 + }, + "Knowledge: Lore": { + "rank": 0, + "characteristic": "Intellect", + "groupskill": false, + "careerskill": false, + "type": "Knowledge", + "max": 6 + }, + "Knowledge: Outer Rim": { + "rank": 0, + "characteristic": "Intellect", + "groupskill": false, + "careerskill": false, + "type": "Knowledge", + "max": 6 + }, + "Knowledge: Underworld": { + "rank": 0, + "characteristic": "Intellect", + "groupskill": false, + "careerskill": false, + "type": "Knowledge", + "max": 6 + }, + "Knowledge: Warfare": { + "rank": 0, + "characteristic": "Intellect", + "groupskill": false, + "careerskill": false, + "type": "Knowledge", + "max": 6 + }, + "Knowledge: Xenology": { + "rank": 0, + "characteristic": "Intellect", + "groupskill": false, + "careerskill": false, + "type": "Knowledge", + "max": 6 + } + } + }, + "attributes": { + "attributes": {} + }, + "modifiers": { + "modifiers": { + "Characteristic": {}, + "Skill Rank": {}, + "Stat": {} + } + } + }, + "character": { + "templates": ["biography", "species", "career", "specialisation", "stats", "characteristics", "skills", "attributes", "modifiers"], + "encumbrance": { + "value": 0, + "type": "Number", + "label": "Encumbrance", + "abrev": "Encum" + }, + "obligation": { + "value": 0, + "type": "Number", + "label": "Obligation" + }, + "duty": { + "value": 0, + "type": "Number", + "label": "Duty" + }, + "morality": { + "value": 0, + "type": "Number", + "label": "Morality" + }, + "conflict": { + "value": 0, + "type": "Number", + "label": "Conflict" + }, + "experience": { + "total": 0, + "available": 0 + } + }, + "minion": { + "templates": ["biography", "stats", "characteristics", "skills", "attributes", "modifiers"], + "quantity": { + "value": 1, + "type": "Number", + "label": "Quantity", + "abrev": "Qty" + }, + "unit_wounds": { + "value": 0, + "type": "Number", + "label": "Unit Wounds" + } + }, + "vehicle": { + "templates": ["biography", "attributes"], + "stats": { + "silhouette": { + "value": 1, + "type": "Number", + "label": "Silhouette" + }, + "speed": { + "value": 0, + "max": 0, + "type": "Number", + "label": "Speed" + }, + "handling": { + "value": 0, + "type": "Number", + "label": "Handling" + }, + "hullTrauma": { + "value": 0, + "min": 0, + "max": 10, + "label": "Hull Trauma" + }, + "systemStrain": { + "value": 0, + "min": 0, + "max": 10, + "label": "System Strain" + }, + "shields": { + "fore": 0, + "port": 0, + "starboard": 0, + "aft": 0, + "label": "Shields" + }, + "armour": { + "value": 0, + "type": "Number", + "label": "Armour" + }, + "sensorRange": { + "value": "Short", + "type": "String" + }, + "crew": {}, + "passengerCapacity": { + "value": 0, + "type": "Number", + "label": "Passenger Capacity" + }, + "encumbrance": { + "value": 0, + "min": 0, + "max": 10 + }, + "cost": { + "value": 0, + "type": "Number", + "label": "Cost" + }, + "rarity": { + "value": 0, + "type": "Number", + "label": "Rarity" + }, + "customizationHardPoints": { + "value": 0, + "type": "Number", + "label": "Hard Points" + } + } + } + }, + "Item": { + "types": ["gear", "weapon", "armour", "talent", "shipweapon", "shipattachment"], + "templates": { + "basic": { + "description": "", + "quantity": { + "value": 1, + "type": "Number", + "label": "Quantity", + "abrev": "Qty" + }, + "encumbrance": { + "value": 0, + "type": "Number", + "label": "Encumbrance", + "abrev": "Encum" + }, + "price": { + "value": 0, + "type": "Number", + "label": "Price" + }, + "rarity": { + "value": 0, + "type": "Number", + "label": "Rarity" + }, + "attributes": {} + }, + "hardpoints": { + "hardpoints": { + "value": 0, + "type": "Number", + "label": "Hard Points", + "abrev": "HP" + } + }, + "equippable": { + "equippable": { + "value": true, + "type": "Boolean", + "equipped": false + } + } + }, + "gear": { + "templates": ["basic"] + }, + "weapon": { + "templates": ["basic", "hardpoints", "equippable"], + "skill": { + "value": "Ranged: Light", + "type": "String", + "label": "Skill" + }, + "damage": { + "value": 0, + "type": "Number", + "label": "Damage", + "abrev": "Dam" + }, + "crit": { + "value": 0, + "type": "Number", + "label": "Critical Rating", + "abrev": "Crit" + }, + "range": { + "value": "Short", + "type": "String", + "label": "Range" + }, + "special": { + "value": "", + "type": "String", + "label": "Special" + } + }, + "armour": { + "templates": ["basic", "hardpoints", "equippable"], + "defence": { + "value": 0, + "type": "Number", + "label": "Defence", + "abrev": "Def" + }, + "soak": { + "value": 0, + "type": "Number", + "label": "Soak" + } + }, + "talent": { + "templates": ["basic"], + "description": "", + "activation": { + "value": "Passive", + "type": "String", + "label": "Activation" + }, + "ranks": { + "ranked": false, + "current": 1, + "min": 0 + }, + "trees": [], + "attributes": {} + }, + "shipweapon": { + "templates": ["basic", "hardpoints", "equippable"], + "label": "Ship Weapon", + "firingarc": { + "value": "Fore", + "type": "String", + "label": "Skill" + }, + "damage": { + "value": 0, + "type": "Number", + "label": "Damage", + "abrev": "Dam" + }, + "crit": { + "value": 0, + "type": "Number", + "label": "Critical Rating", + "abrev": "Crit" + }, + "range": { + "value": "Short", + "type": "String", + "label": "Range" + }, + "special": { + "value": "", + "type": "String", + "label": "Special" + } + }, + "shipattachment": { + "templates": ["basic", "hardpoints", "equippable"], + "label": "Ship Attachment" + }, + "species": { + "description": "", + "careerskills": [], + "characteristics": { + "Brawn": { + "value": 2, + "label": "Brawn", + "abrev": "Br" + }, + "Agility": { + "value": 2, + "label": "Agility", + "abrev": "Ag" + }, + "Intellect": { + "value": 2, + "label": "Intellect", + "abrev": "Int" + }, + "Cunning": { + "value": 2, + "label": "Cunning", + "abrev": "Cun" + }, + "Willpower": { + "value": 2, + "label": "Willpower", + "abrev": "Will" + }, + "Presence": { + "value": 2, + "label": "Presence", + "abrev": "Pr" + } + } + } + } } diff --git a/templates/actors/ffg-vehicle-sheet.html b/templates/actors/ffg-vehicle-sheet.html index 1d08b783..c95cf263 100644 --- a/templates/actors/ffg-vehicle-sheet.html +++ b/templates/actors/ffg-vehicle-sheet.html @@ -276,7 +276,7 @@

                    Encumbrance Cap
                    + data-dtype="String" />

                    @@ -289,7 +289,7 @@

                    Sensor Range

                    + data-dtype="String" />
                    @@ -302,7 +302,7 @@

                    Pass
                    + data-dtype="String" />

                    From 6b29b1f0d59c18bb6b804e2a2ab6c24f943c7079 Mon Sep 17 00:00:00 2001 From: Esrin Date: Sun, 31 May 2020 12:50:55 +0100 Subject: [PATCH 20/44] Confirmed compatibility with 0.6.1 --- system.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system.json b/system.json index add41e83..4bfa09fc 100644 --- a/system.json +++ b/system.json @@ -4,7 +4,7 @@ "description": "A system for playing Star Wars FFG games.", "version": 0.054, "minimumCoreVersion": "0.5.6", - "compatibleCoreVersion": "0.6.0", + "compatibleCoreVersion": "0.6.1", "templateVersion": 1, "author": "Esrin", "esmodules": ["modules/dice-pool-ffg.js", "modules/swffg-main.js"], From 08fdddd0eb7a6b019c185117a76a8297a0ff181b Mon Sep 17 00:00:00 2001 From: Esrin Date: Sun, 31 May 2020 20:53:50 +0100 Subject: [PATCH 21/44] Quick fix to font paths and README updated. --- README.md | 3 +-- scss/utils/_typography.scss | 16 ++++++++-------- styles/starwarsffg.css | 15 ++++++++------- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 1b396783..e17ed4a6 100644 --- a/README.md +++ b/README.md @@ -29,9 +29,7 @@ NEEDED FOR RELEASE V1: - Add Maximum Altitude and Crew Capacity to vehicle sheet. - Redo the dice selection popup to be more functional and provide upgrade ability and upgrade difficulty buttons. - Rebuild dice functionality to use Foundry Dice instead of chat content, remove requirement for Special-Dice-Roller. -- Localisation hooks - Look into drag-and-drop item behaviours for things like transferring items between characters, or into a vehicle cargo hold. -- SASS refactor NICE TO HAVE: @@ -43,6 +41,7 @@ NICE TO HAVE: # Changelog +- 31/05/2020 - CStadther - Added SASS configuration using Gulp. - 31/05/2020 - CStadther - Minor bugfix on .item click listener to prevent console errors when .item class components with no related item sheet are clicked, such as tabs. - 31/05/2020 - CStadther - Added localization for character sheet. - 29/05/2020 - Esrin - Minor bugfix to vehicle sheet, various fields will now accept string values to allow for from-to values as requested by Alex | HDScurox. diff --git a/scss/utils/_typography.scss b/scss/utils/_typography.scss index fda9b240..9737bce7 100644 --- a/scss/utils/_typography.scss +++ b/scss/utils/_typography.scss @@ -1,17 +1,17 @@ @font-face { - font-family: 'Roboto'; - src: url('fonts/Roboto-Regular.ttf') format('truetype'); + font-family: "Roboto"; + src: url("../fonts/Roboto-Regular.ttf") format("truetype"); } @font-face { - font-family: 'StarJedi'; - src: url('fonts/StarJedi-Regular.ttf') format('truetype'); + font-family: "StarJedi"; + src: url("../fonts/StarJedi-Regular.ttf") format("truetype"); } @font-face { - font-family: 'Signika'; - src: url('fonts/Signika-Regular.ttf') format('truetype'); + font-family: "Signika"; + src: url("../fonts/Signika-Regular.ttf") format("truetype"); } -$font-primary: 'Roboto', sans-serif; -$font-secondary: 'StarJedi', sans-serif; \ No newline at end of file +$font-primary: "Roboto", sans-serif; +$font-secondary: "StarJedi", sans-serif; diff --git a/styles/starwarsffg.css b/styles/starwarsffg.css index 98c34bab..cde71ede 100644 --- a/styles/starwarsffg.css +++ b/styles/starwarsffg.css @@ -1,16 +1,16 @@ @font-face { - font-family: 'Roboto'; - src: url("fonts/Roboto-Regular.ttf") format("truetype"); + font-family: "Roboto"; + src: url("../fonts/Roboto-Regular.ttf") format("truetype"); } @font-face { - font-family: 'StarJedi'; - src: url("fonts/StarJedi-Regular.ttf") format("truetype"); + font-family: "StarJedi"; + src: url("../fonts/StarJedi-Regular.ttf") format("truetype"); } @font-face { - font-family: 'Signika'; - src: url("fonts/Signika-Regular.ttf") format("truetype"); + font-family: "Signika"; + src: url("../fonts/Signika-Regular.ttf") format("truetype"); } /* Global styles */ @@ -23,7 +23,8 @@ font-size: 9pt; } -.rollable:hover, .rollable:focus { +.rollable:hover, +.rollable:focus { color: #000; text-shadow: 0 0 10px red; cursor: pointer; From c4b8fb777c0e47f717a72483115c556bcb43f2d1 Mon Sep 17 00:00:00 2001 From: cstadther Date: Sun, 31 May 2020 18:13:34 -0400 Subject: [PATCH 22/44] header redesign. --- package.json | 3 +- scss/components/_form.scss | 3 - scss/components/_forms.scss | 50 +++++ scss/components/_header.scss | 217 +++++++++++++++++++ scss/global/_window.scss | 2 +- scss/starwarsffg.scss | 5 +- scss/utils/_typography.scss | 6 +- styles/starwarsffg.css | 245 +++++++++++++++++++++- styles/swffg.css | 4 +- templates/actors/ffg-character-sheet.html | 158 +++++++++----- 10 files changed, 625 insertions(+), 68 deletions(-) delete mode 100644 scss/components/_form.scss create mode 100644 scss/components/_forms.scss create mode 100644 scss/components/_header.scss diff --git a/package.json b/package.json index 05c5049e..c878966d 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,8 @@ "description": "( PLEASE NOTE: This is a custom fork based on [Jaxxa's implementation](https://github.com/jaxxa/StarWarsFFG/tree/master). )", "main": "index.js", "scripts": { - "compile": "gulp css" + "compile": "gulp css", + "watch" : "gulp" }, "author": "", "license": "MIT", diff --git a/scss/components/_form.scss b/scss/components/_form.scss deleted file mode 100644 index 366502a6..00000000 --- a/scss/components/_form.scss +++ /dev/null @@ -1,3 +0,0 @@ -.item-form { - font-family: $font-primary; -} \ No newline at end of file diff --git a/scss/components/_forms.scss b/scss/components/_forms.scss new file mode 100644 index 00000000..f8bb3124 --- /dev/null +++ b/scss/components/_forms.scss @@ -0,0 +1,50 @@ +.item-form { + font-family: $font-primary; +} + +.block-background { + background-color: rgb(196, 219, 233); + padding: 5px; + + --notchSize: 9px; + + clip-path: + polygon( + 0% var(--notchSize), + var(--notchSize) 0%, + calc(100% - var(--notchSize)) 0%, + 100% var(--notchSize), + 100% calc(100% - var(--notchSize)), + calc(100% - var(--notchSize)) 100%, + var(--notchSize) 100%, + 0% calc(100% - var(--notchSize)) + ); +} + +.block-background-shadow { + position: absolute; + width: 100%; + top: 30px; + height: 30px; + background-color: rgb(125, 169, 194); + padding: 5px; + z-index: -1; + + --notchSize: 9px; + + clip-path: + polygon( + 0% var(--notchSize), + var(--notchSize) 0%, + calc(100% - var(--notchSize)) 0%, + 100% var(--notchSize), + 100% calc(100% - var(--notchSize)), + calc(100% - var(--notchSize)) 100%, + var(--notchSize) 100%, + 0% calc(100% - var(--notchSize)) + ); +} + +.character { + min-width: 575px; +} \ No newline at end of file diff --git a/scss/components/_header.scss b/scss/components/_header.scss new file mode 100644 index 00000000..8dd69290 --- /dev/null +++ b/scss/components/_header.scss @@ -0,0 +1,217 @@ +.header-fields { + .block-background-shadow { + top: 36px; + } + + .container.flex-group-center { + border: 0; + margin-bottom: 5px; + } + + h1 { + margin: 0; + width:100%; + } + + .header-name { + margin: 0; + position: relative; + width: 100%; + + input { + margin: 0; + width: 100%; + border: 0; + background-color: rgba(0,0,0,0); + + &:focus { + box-shadow: 0 0 5px rgb(125, 169, 194); + background-color: rgb(125, 169, 194); + } + } + + + } + + .header-description-block { + margin-bottom: 5px; + margin-top: 5px; + } + + .header-description { + background-color: rgb(196, 219, 233); + --notchSize: 10px; + padding:3px; + + clip-path: + polygon( + 0% var(--notchSize), + var(--notchSize) 0%, + calc(100% - var(--notchSize)) 0%, + 100% var(--notchSize), + 100% calc(100% - var(--notchSize)), + calc(100% - var(--notchSize)) 100%, + var(--notchSize) 100%, + 0% calc(100% - var(--notchSize)) + ); + } + + .table { + display: table; + width: 100%; + } + + .row { + display: table-row; + width:100%; + + div { + display: table-cell; + } + + .row-input { + padding: 0 5px; + } + + input { + width: 100%; + border: 0; + border-bottom: 1px solid black; + border-radius: 0; + + &:focus { + box-shadow: 0 0 5px rgb(125, 169, 194); + background-color: rgb(125, 169, 194); + } + } + } + + .profile-block { + margin-right: 5px; + margin-left: 5px; + height: 140px; + max-width: 140px; + } + + .profile-img { + flex: 0 0 100px; + height: 124px; + width: auto; + max-width: 124px; + border: 0; + margin: auto; + } + + .attribute { + position: relative; + padding: 0; + z-index: 1; + border:0; + + .block-background { + padding: 5px 5px; + } + + .block-title { + line-height: initial; + background-color: rgb(73, 12, 11); + color: white; + font-size: 13px; + text-transform: uppercase; + margin:auto; + // width: 160px; + --notchSize: 8px; + clip-path: + polygon( + 0% var(--notchSize), + var(--notchSize) 0%, + calc(100% - var(--notchSize)) 0%, + 100% var(--notchSize), + 100% calc(100% - var(--notchSize)), + calc(100% - var(--notchSize)) 100%, + var(--notchSize) 100%, + 0% calc(100% - var(--notchSize)) + ); + } + + .block-attribute { + + .block-value { + display: inline-block; + } + } + + .block-value { + + &.block-single { + input { + width: 100%; + padding: 6px; + } + } + + input { + border:0; + font-size:14px; + + &:focus { + box-shadow: 0 0 5px rgb(125, 169, 194); + background-color: rgb(125, 169, 194); + } + } + } + + .shadow-text { + position: absolute; + top: 5px; + font-size: 9px; + left: 50%; + transform: translateX(-50%); + } + + .shadow-left { + background-color: rgb(73, 12, 11); + width: 50%; + height: 100%; + float:left; + position: relative; + padding-top: 25px; + + .shadow-text { + color: white; + text-transform: uppercase; + } + } + + .shadow-right { + background-color: rgb(125, 169, 194); + width: 50%; + height: 100%; + float:right; + position: relative; + padding-top: 25px; + + .shadow-text { + color: black; + font-weight: bold; + text-transform: uppercase; + } + } + } + + .resource { + line-height: 30px; + width: 110px; + + &.split { + width: 130px; + } + &.single { + width: 65px; + } + + input { + width: 45px; + } + } +} diff --git a/scss/global/_window.scss b/scss/global/_window.scss index d16bacc9..981aa658 100644 --- a/scss/global/_window.scss +++ b/scss/global/_window.scss @@ -2,7 +2,7 @@ font-family: $font-primary; .window-content { - background: rgba(255, 255, 255, 0.7); + background-color: rgba(255, 255, 255, 0.7); font-size: 9pt; } } diff --git a/scss/starwarsffg.scss b/scss/starwarsffg.scss index 50031e38..4d3b98ee 100644 --- a/scss/starwarsffg.scss +++ b/scss/starwarsffg.scss @@ -10,5 +10,8 @@ @import 'global/flex'; .starwarsffg { - + @import 'components/forms'; + @import 'components/resource'; + @import 'components/tabs'; + @import 'components/_header'; } \ No newline at end of file diff --git a/scss/utils/_typography.scss b/scss/utils/_typography.scss index fda9b240..de2b9f3c 100644 --- a/scss/utils/_typography.scss +++ b/scss/utils/_typography.scss @@ -1,16 +1,16 @@ @font-face { font-family: 'Roboto'; - src: url('fonts/Roboto-Regular.ttf') format('truetype'); + src: url('../fonts/Roboto-Regular.ttf') format('truetype'); } @font-face { font-family: 'StarJedi'; - src: url('fonts/StarJedi-Regular.ttf') format('truetype'); + src: url('../fonts/StarJedi-Regular.ttf') format('truetype'); } @font-face { font-family: 'Signika'; - src: url('fonts/Signika-Regular.ttf') format('truetype'); + src: url('../fonts/Signika-Regular.ttf') format('truetype'); } $font-primary: 'Roboto', sans-serif; diff --git a/styles/starwarsffg.css b/styles/starwarsffg.css index 98c34bab..fab38c05 100644 --- a/styles/starwarsffg.css +++ b/styles/starwarsffg.css @@ -1,16 +1,16 @@ @font-face { font-family: 'Roboto'; - src: url("fonts/Roboto-Regular.ttf") format("truetype"); + src: url("../fonts/Roboto-Regular.ttf") format("truetype"); } @font-face { font-family: 'StarJedi'; - src: url("fonts/StarJedi-Regular.ttf") format("truetype"); + src: url("../fonts/StarJedi-Regular.ttf") format("truetype"); } @font-face { font-family: 'Signika'; - src: url("fonts/Signika-Regular.ttf") format("truetype"); + src: url("../fonts/Signika-Regular.ttf") format("truetype"); } /* Global styles */ @@ -19,7 +19,7 @@ } .window-app .window-content { - background: rgba(255, 255, 255, 0.7); + background-color: rgba(255, 255, 255, 0.7); font-size: 9pt; } @@ -118,3 +118,240 @@ .flex-between { justify-content: space-between; } + +.starwarsffg .item-form { + font-family: "Roboto", sans-serif; +} + +.starwarsffg .block-background { + background-color: #c4dbe9; + padding: 5px; + --notchSize: 9px; + -webkit-clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); + clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); +} + +.starwarsffg .block-background-shadow { + position: absolute; + width: 100%; + top: 30px; + height: 30px; + background-color: #7da9c2; + padding: 5px; + z-index: -1; + --notchSize: 9px; + -webkit-clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); + clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); +} + +.starwarsffg .character { + min-width: 575px; +} + +.starwarsffg .resource-label { + font-weight: bold; + text-transform: uppercase; +} + +.starwarsffg .tabs { + height: 40px; + border-top: 1px solid #AAA; + border-bottom: 1px solid #AAA; +} + +.starwarsffg .tabs .item { + line-height: 40px; + font-weight: bold; +} + +.starwarsffg .tabs .item.active { + text-decoration: underline; + text-shadow: none; +} + +.starwarsffg .header-fields .block-background-shadow { + top: 36px; +} + +.starwarsffg .header-fields .container.flex-group-center { + border: 0; + margin-bottom: 5px; +} + +.starwarsffg .header-fields h1 { + margin: 0; + width: 100%; +} + +.starwarsffg .header-fields .header-name { + margin: 0; + position: relative; + width: 100%; +} + +.starwarsffg .header-fields .header-name input { + margin: 0; + width: 100%; + border: 0; + background-color: rgba(0, 0, 0, 0); +} + +.starwarsffg .header-fields .header-name input:focus { + box-shadow: 0 0 5px #7da9c2; + background-color: #7da9c2; +} + +.starwarsffg .header-fields .header-description-block { + margin-bottom: 5px; + margin-top: 5px; +} + +.starwarsffg .header-fields .header-description { + background-color: #c4dbe9; + --notchSize: 10px; + padding: 3px; + -webkit-clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); + clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); +} + +.starwarsffg .header-fields .table { + display: table; + width: 100%; +} + +.starwarsffg .header-fields .row { + display: table-row; + width: 100%; +} + +.starwarsffg .header-fields .row div { + display: table-cell; +} + +.starwarsffg .header-fields .row .row-input { + padding: 0 5px; +} + +.starwarsffg .header-fields .row input { + width: 100%; + border: 0; + border-bottom: 1px solid black; + border-radius: 0; +} + +.starwarsffg .header-fields .row input:focus { + box-shadow: 0 0 5px #7da9c2; + background-color: #7da9c2; +} + +.starwarsffg .header-fields .profile-block { + margin-right: 5px; + margin-left: 5px; + height: 140px; + max-width: 140px; +} + +.starwarsffg .header-fields .profile-img { + flex: 0 0 100px; + height: 124px; + width: auto; + max-width: 124px; + border: 0; + margin: auto; +} + +.starwarsffg .header-fields .attribute { + position: relative; + padding: 0; + z-index: 1; + border: 0; +} + +.starwarsffg .header-fields .attribute .block-background { + padding: 5px 5px; +} + +.starwarsffg .header-fields .attribute .block-title { + line-height: initial; + background-color: #490c0b; + color: white; + font-size: 13px; + text-transform: uppercase; + margin: auto; + --notchSize: 8px; + -webkit-clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); + clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); +} + +.starwarsffg .header-fields .attribute .block-attribute .block-value { + display: inline-block; +} + +.starwarsffg .header-fields .attribute .block-value.block-single input { + width: 100%; + padding: 6px; +} + +.starwarsffg .header-fields .attribute .block-value input { + border: 0; + font-size: 14px; +} + +.starwarsffg .header-fields .attribute .block-value input:focus { + box-shadow: 0 0 5px #7da9c2; + background-color: #7da9c2; +} + +.starwarsffg .header-fields .attribute .shadow-text { + position: absolute; + top: 5px; + font-size: 9px; + left: 50%; + transform: translateX(-50%); +} + +.starwarsffg .header-fields .attribute .shadow-left { + background-color: #490c0b; + width: 50%; + height: 100%; + float: left; + position: relative; + padding-top: 25px; +} + +.starwarsffg .header-fields .attribute .shadow-left .shadow-text { + color: white; + text-transform: uppercase; +} + +.starwarsffg .header-fields .attribute .shadow-right { + background-color: #7da9c2; + width: 50%; + height: 100%; + float: right; + position: relative; + padding-top: 25px; +} + +.starwarsffg .header-fields .attribute .shadow-right .shadow-text { + color: black; + font-weight: bold; + text-transform: uppercase; +} + +.starwarsffg .header-fields .resource { + line-height: 30px; + width: 110px; +} + +.starwarsffg .header-fields .resource.split { + width: 130px; +} + +.starwarsffg .header-fields .resource.single { + width: 65px; +} + +.starwarsffg .header-fields .resource input { + width: 45px; +} diff --git a/styles/swffg.css b/styles/swffg.css index c59c07de..934eedaf 100644 --- a/styles/swffg.css +++ b/styles/swffg.css @@ -131,7 +131,7 @@ div .container.talents { justify-content: flex-start; flex: 0 0 100px; } - +/* .starwarsffg.sheet .profile-img { flex: 0 0 100px; height: 124px; @@ -140,7 +140,7 @@ div .container.talents { margin-right: 10px; margin-left: 10px; border-radius: 15px; -} +} */ .starwarsffg.sheet .header-fields { flex: 1; diff --git a/templates/actors/ffg-character-sheet.html b/templates/actors/ffg-character-sheet.html index a68205c7..24822285 100644 --- a/templates/actors/ffg-character-sheet.html +++ b/templates/actors/ffg-character-sheet.html @@ -1,89 +1,141 @@ - + {{!-- Sheet Header --}}
                    {{!-- Character Details Container --}} -
                    - - - - +
                    +
                    +
                    + +
                    +
                    +
                    +
                    +
                    +

                    +
                    +
                    +
                    + +
                    +
                    +
                    {{localize "SWFFG.Species"}}:
                    +
                    +
                    +
                    +
                    {{localize "SWFFG.Career"}}:
                    +
                    +
                    +
                    +
                    {{localize "SWFFG.Specializations"}}:
                    +
                    +
                    +
                    + +
                    +
                    - + {{!-- Primary Stats Container --}} +
                    - -
                    + +
                    {{!-- Wounds Box --}} -
                    -
                    -

                    {{localize "SWFFG.Wounds"}}

                    -
                    -
                    - - +
                    +
                    +
                    +
                    + {{localize "SWFFG.Wounds"}}
                    -
                    -
                    - - +
                    +
                    +
                    +
                    +
                    +
                    +
                    +
                    {{localize "SWFFG.Threshold"}}
                    +
                    +
                    +
                    {{localize "SWFFG.Current"}}
                    {{!-- Strain Box --}} -
                    -
                    -

                    {{localize "SWFFG.Strain"}}

                    -
                    -
                    - - +
                    +
                    +
                    +
                    + {{localize "SWFFG.Strain"}}
                    -
                    -
                    - - +
                    +
                    +
                    +
                    +
                    +
                    +
                    +
                    {{localize "SWFFG.Threshold"}}
                    +
                    +
                    +
                    {{localize "SWFFG.Current"}}
                    {{!-- Soak Box --}} -
                    -
                    -

                    {{localize "SWFFG.Soak"}}

                    -
                    -
                    - - +
                    +
                    +
                    +
                    + {{localize "SWFFG.Soak"}}
                    +
                    +
                    +
                    +
                    +
                    +
                    + + + +
                    {{!-- Defence Box --}} -
                    -
                    -

                    {{localize "SWFFG.Defense"}}

                    -
                    -
                    - - +
                    +
                    +
                    +
                    + {{localize "SWFFG.Defense"}}
                    -
                    -
                    - - +
                    +
                    +
                    +
                    +
                    +
                    +
                    +
                    {{localize "SWFFG.DefenseRanged"}}
                    +
                    +
                    +
                    {{localize "SWFFG.DefenseMelee"}}
                    + +
                    - {{!-- Force Box --}} + {{!-- Encumbrance Box --}} -
                    +
                    From 79c3e068dd07176f1a25cbd0a03ec7b5e8a2e5d8 Mon Sep 17 00:00:00 2001 From: Esrin Date: Sun, 31 May 2020 23:42:15 +0100 Subject: [PATCH 23/44] Work in progress on the group management GM tool. Destiny Pool now working (will reset on page refresh). Player Character list under construction. Bugfix to localisation hook (item quantity on character sheet). --- README.md | 2 ++ lang/en.json | 3 ++- modules/groupmanager-ffg.js | 42 +++++++++++++++++++++++++++++++++--- modules/swffg-main.js | 4 ++++ scss/components/_form.scss | 2 +- styles/swffg.css | 8 +++++++ system.json | 4 ++-- templates/group-manager.html | 37 ++++++++++++++++++++++++++++--- 8 files changed, 92 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index e17ed4a6..59fbac40 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,8 @@ NICE TO HAVE: # Changelog +- 31/05/2020 - Esrin - Work in progress on the group management GM tool. Destiny Pool now working (will reset on page refresh). Player Character list under construction. +- 31/05/2020 - Esrin - Bugfix to localisation hook for Gear Quantity on Character Sheet (thanks Alex | HDScurox for the bug report). - 31/05/2020 - CStadther - Added SASS configuration using Gulp. - 31/05/2020 - CStadther - Minor bugfix on .item click listener to prevent console errors when .item class components with no related item sheet are clicked, such as tabs. - 31/05/2020 - CStadther - Added localization for character sheet. diff --git a/lang/en.json b/lang/en.json index 218c3427..3547cb0d 100644 --- a/lang/en.json +++ b/lang/en.json @@ -48,7 +48,8 @@ "SWFFG.ItemsHP": "HP", "SWFFG.ItemsPrice": "Price", "SWFFG.ItemsRarity": "Rarity", - "SWFFG.ItemsQuantity": "Qty", + "SWFFG.ItemsQuantity": "Quantity", + "SWFFG.ItemsQty": "Qty", "SWFFG.Talents": "Talents", "SWFFG.TalentsName": "Name", "SWFFG.TalentsActivation": "Activation", diff --git a/modules/groupmanager-ffg.js b/modules/groupmanager-ffg.js index 8b3866a1..df7bfc43 100644 --- a/modules/groupmanager-ffg.js +++ b/modules/groupmanager-ffg.js @@ -30,7 +30,7 @@ export class GroupManagerLayer extends TokenLayer { export class GroupManager extends FormApplication { static get defaultOptions() { return mergeObject(super.defaultOptions, { - classes: ["form", "groupmanager", "sidebar-popout"], + classes: ["starwarsffg", "form", "group-manager"], closeOnSubmit: false, submitOnChange: true, submitOnClose: true, @@ -51,8 +51,41 @@ export class GroupManager extends FormApplication { * @return {Object} The data provided to the template when rendering the form */ getData() { - // Return data to the template - return {}; + return { g: game }; + } + + /* -------------------------------------------- */ + + /** @override */ + activateListeners(html) { + super.activateListeners(html); + + // Everything below here is only needed if the sheet is editable + if (!this.options.editable) return; + + // Flip destiny pool DARK to LIGHT + html.find(".destiny-flip-dtl").click((ev) => { + let LightPool = this.form.elements["g.ffg.DestinyPool.Light"].value; + let DarkPool = this.form.elements["g.ffg.DestinyPool.Dark"].value; + if (DarkPool > 0) { + LightPool++; + DarkPool--; + this.form.elements["g.ffg.DestinyPool.Light"].value = LightPool; + this.form.elements["g.ffg.DestinyPool.Dark"].value = DarkPool; + } + }); + + // Flip destiny pool LIGHT to DARK + html.find(".destiny-flip-ltd").click((ev) => { + let LightPool = this.form.elements["g.ffg.DestinyPool.Light"].value; + let DarkPool = this.form.elements["g.ffg.DestinyPool.Dark"].value; + if (LightPool > 0) { + LightPool--; + DarkPool++; + this.form.elements["g.ffg.DestinyPool.Light"].value = LightPool; + this.form.elements["g.ffg.DestinyPool.Dark"].value = DarkPool; + } + }); } /** @@ -62,6 +95,9 @@ export class GroupManager extends FormApplication { * @private */ _updateObject(event, formData) { + const formDPool = expandObject(formData).g.ffg.DestinyPool || {}; + game.ffg.DestinyPool.Light = formDPool.Light; + game.ffg.DestinyPool.Dark = formDPool.Dark; return formData; } } diff --git a/modules/swffg-main.js b/modules/swffg-main.js index 5a2b2046..185ab450 100644 --- a/modules/swffg-main.js +++ b/modules/swffg-main.js @@ -30,6 +30,10 @@ Hooks.once("init", async function () { }; game.ffg.StarWars = game.specialDiceRoller.starWars.parsers[0]; + game.ffg.DestinyPool = { + "Light": 0, + "Dark": 0, + }; // Define custom Entity classes. This will override the default Actor // to instead use our extended version. diff --git a/scss/components/_form.scss b/scss/components/_form.scss index 366502a6..f2e2f23c 100644 --- a/scss/components/_form.scss +++ b/scss/components/_form.scss @@ -1,3 +1,3 @@ .item-form { font-family: $font-primary; -} \ No newline at end of file +} diff --git a/styles/swffg.css b/styles/swffg.css index c59c07de..5f39e270 100644 --- a/styles/swffg.css +++ b/styles/swffg.css @@ -4,6 +4,14 @@ font-size: 9pt; } +.group-manager { + background: rgba(255, 255, 255, 0.7); + font-family: Roboto, sans-serif; + color: #222; + height: 100%; + width: auto; +} + .tableWithHeader { overflow-y: auto; margin: -1px; diff --git a/system.json b/system.json index 2a38a0b2..f5211271 100644 --- a/system.json +++ b/system.json @@ -2,7 +2,7 @@ "name": "starwarsffg", "title": "Star Wars FFG", "description": "A system for playing Star Wars FFG games.", - "version": 0.054, + "version": 0.055, "minimumCoreVersion": "0.5.6", "compatibleCoreVersion": "0.6.1", "templateVersion": 1, @@ -33,6 +33,6 @@ "secondaryTokenAttribute": "strain", "url": "https://github.com/Esrin/StarWarsFFG/tree/esrin-dev", "manifest": "https://raw.githubusercontent.com/Esrin/StarWarsFFG/esrin-dev/system.json", - "download": "https://github.com/Esrin/StarWarsFFG/releases/download/esrin-dev_0.05/esrin-dev_0.054.zip", + "download": "https://github.com/Esrin/StarWarsFFG/releases/download/esrin-dev_0.05/esrin-dev_0.055.zip", "license": "LICENSE.txt" } diff --git a/templates/group-manager.html b/templates/group-manager.html index b686fadb..98208f01 100644 --- a/templates/group-manager.html +++ b/templates/group-manager.html @@ -1,5 +1,36 @@ - -
                    - Coming Soon + +
                    +

                    Destiny Pool

                    +
                    + +
                    + + +
                    + +
                    +
                    +

                    Player Characters

                    +

                  NamePriceRarityQtyEncum{{localize "SWFFG.ItemsName"}}{{localize "SWFFG.ItemsPrice"}}{{localize "SWFFG.ItemsRarity"}}{{localize "SWFFG.ItemsQty"}}{{localize "SWFFG.ItemsEncum"}} Del
                  + + + + + + + + + + + + + + +
                  NameOblCmbtXP
                  UNDER CONSTRUCTION + +
                  + + +
                  From b272e8aa8b2ab36fcb265801b9e86e83bc8916d7 Mon Sep 17 00:00:00 2001 From: cstadther Date: Sun, 31 May 2020 19:44:28 -0400 Subject: [PATCH 24/44] restyled tabs. --- scss/components/_header.scss | 1 + scss/components/_tabs.scss | 37 ++++++++++++++++++++++- styles/starwarsffg.css | 26 +++++++++++++++- templates/actors/ffg-character-sheet.html | 1 + 4 files changed, 63 insertions(+), 2 deletions(-) diff --git a/scss/components/_header.scss b/scss/components/_header.scss index 8dd69290..82ed2885 100644 --- a/scss/components/_header.scss +++ b/scss/components/_header.scss @@ -6,6 +6,7 @@ .container.flex-group-center { border: 0; margin-bottom: 5px; + padding: 0 5px 5px 5px; } h1 { diff --git a/scss/components/_tabs.scss b/scss/components/_tabs.scss index 7598ff99..ab6b1df5 100644 --- a/scss/components/_tabs.scss +++ b/scss/components/_tabs.scss @@ -17,18 +17,53 @@ // } // } +.character { + .tabs { + height: 15px; + margin-bottom: 10px; + border : 0; + .item { + line-height: 15px; + } + } +} + .tabs { height: 40px; border-top: 1px solid #AAA; border-bottom: 1px solid #AAA; .item { - line-height: 40px; + line-height: 15px; font-weight: bold; + background-color: rgb(81, 98, 77); + padding:3px; + margin: 0 5px; + --notchSize: 10px; + + + clip-path: + polygon( + 0% var(--notchSize), + var(--notchSize) 0%, + calc(100% - var(--notchSize)) 0%, + 100% var(--notchSize), + 100% calc(100% - var(--notchSize)), + calc(100% - var(--notchSize)) 100%, + var(--notchSize) 100%, + 0% calc(100% - var(--notchSize)) + ); + + &:hover { + text-shadow: 0 0 8px white; + } } .item.active { text-decoration: underline; text-shadow: none; + background-color: rgb(73, 12, 11); + color: white; + font-weight: normal; } } \ No newline at end of file diff --git a/styles/starwarsffg.css b/styles/starwarsffg.css index fab38c05..88d87256 100644 --- a/styles/starwarsffg.css +++ b/styles/starwarsffg.css @@ -153,6 +153,16 @@ text-transform: uppercase; } +.starwarsffg .character .tabs { + height: 15px; + margin-bottom: 10px; + border: 0; +} + +.starwarsffg .character .tabs .item { + line-height: 15px; +} + .starwarsffg .tabs { height: 40px; border-top: 1px solid #AAA; @@ -160,13 +170,26 @@ } .starwarsffg .tabs .item { - line-height: 40px; + line-height: 15px; font-weight: bold; + background-color: #51624d; + padding: 3px; + margin: 0 5px; + --notchSize: 10px; + -webkit-clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); + clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); +} + +.starwarsffg .tabs .item:hover { + text-shadow: 0 0 8px white; } .starwarsffg .tabs .item.active { text-decoration: underline; text-shadow: none; + background-color: #490c0b; + color: white; + font-weight: normal; } .starwarsffg .header-fields .block-background-shadow { @@ -176,6 +199,7 @@ .starwarsffg .header-fields .container.flex-group-center { border: 0; margin-bottom: 5px; + padding: 0 5px 5px 5px; } .starwarsffg .header-fields h1 { diff --git a/templates/actors/ffg-character-sheet.html b/templates/actors/ffg-character-sheet.html index 24822285..7b042c14 100644 --- a/templates/actors/ffg-character-sheet.html +++ b/templates/actors/ffg-character-sheet.html @@ -177,6 +177,7 @@

                  {{localize "SWFFG.Encumbrance"}}

                  {{localize "SWFFG.TabTalents"}} {{localize "SWFFG.TabBiography"}} + {{!-- Sheet Body --}} From 013936f5fcdb7bc3fa5425d4a1b594dbb24cd199 Mon Sep 17 00:00:00 2001 From: cstadther Date: Sun, 31 May 2020 20:01:02 -0400 Subject: [PATCH 25/44] restyle characteristics --- scss/components/_characteristics.scss | 58 +++++++++++++++++++++++ scss/components/_sheet.scss | 5 ++ scss/starwarsffg.scss | 4 +- styles/starwarsffg.css | 48 +++++++++++++++++++ templates/actors/ffg-character-sheet.html | 20 +++++--- 5 files changed, 127 insertions(+), 8 deletions(-) create mode 100644 scss/components/_characteristics.scss create mode 100644 scss/components/_sheet.scss diff --git a/scss/components/_characteristics.scss b/scss/components/_characteristics.scss new file mode 100644 index 00000000..8766000d --- /dev/null +++ b/scss/components/_characteristics.scss @@ -0,0 +1,58 @@ +.sheet-body { + .characteristics { + .characteristic-item { + border:0; + } + + .grid { + margin-top: 0; + } + } + + .characteristic { + width: 75px; + height: 75px; + border-radius: 50%; + border: 5px double black; + margin: auto; + position: relative; + + .characteristic-value { + input { + height: 65px; + border: 0; + font-size: 40px; + text-align: center; + } + input:focus { + box-shadow: 0 0 5px rgb(125, 169, 194); + background-color: rgb(125, 169, 194); + border-radius: 50%; + } + } + + .characteristic-label { + position: absolute; + bottom: -20px; + width: 100%; + text-align: center; + background-color: rgb(73, 12, 11); + color:white; + text-transform: uppercase; + font-size : 10px; + --notchSize: 5px; + + clip-path: + polygon( + 0% var(--notchSize), + var(--notchSize) 0%, + calc(100% - var(--notchSize)) 0%, + 100% var(--notchSize), + 100% calc(100% - var(--notchSize)), + calc(100% - var(--notchSize)) 100%, + var(--notchSize) 100%, + 0% calc(100% - var(--notchSize)) + ); + } + } +} \ No newline at end of file diff --git a/scss/components/_sheet.scss b/scss/components/_sheet.scss new file mode 100644 index 00000000..577efbd7 --- /dev/null +++ b/scss/components/_sheet.scss @@ -0,0 +1,5 @@ +&.sheet { + .sheet-body { + border : 0; + } +} \ No newline at end of file diff --git a/scss/starwarsffg.scss b/scss/starwarsffg.scss index 4d3b98ee..1041d816 100644 --- a/scss/starwarsffg.scss +++ b/scss/starwarsffg.scss @@ -11,7 +11,9 @@ .starwarsffg { @import 'components/forms'; + @import 'components/sheet'; @import 'components/resource'; @import 'components/tabs'; - @import 'components/_header'; + @import 'components/header'; + @import 'components/characteristics'; } \ No newline at end of file diff --git a/styles/starwarsffg.css b/styles/starwarsffg.css index 88d87256..f93a1739 100644 --- a/styles/starwarsffg.css +++ b/styles/starwarsffg.css @@ -148,6 +148,10 @@ min-width: 575px; } +.starwarsffg.sheet .sheet-body { + border: 0; +} + .starwarsffg .resource-label { font-weight: bold; text-transform: uppercase; @@ -379,3 +383,47 @@ .starwarsffg .header-fields .resource input { width: 45px; } + +.starwarsffg .sheet-body .characteristics .characteristic-item { + border: 0; +} + +.starwarsffg .sheet-body .characteristics .grid { + margin-top: 0; +} + +.starwarsffg .sheet-body .characteristic { + width: 75px; + height: 75px; + border-radius: 50%; + border: 5px double black; + margin: auto; + position: relative; +} + +.starwarsffg .sheet-body .characteristic .characteristic-value input { + height: 65px; + border: 0; + font-size: 40px; + text-align: center; +} + +.starwarsffg .sheet-body .characteristic .characteristic-value input:focus { + box-shadow: 0 0 5px #7da9c2; + background-color: #7da9c2; + border-radius: 50%; +} + +.starwarsffg .sheet-body .characteristic .characteristic-label { + position: absolute; + bottom: -20px; + width: 100%; + text-align: center; + background-color: #490c0b; + color: white; + text-transform: uppercase; + font-size: 10px; + --notchSize: 5px; + -webkit-clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); + clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); +} diff --git a/templates/actors/ffg-character-sheet.html b/templates/actors/ffg-character-sheet.html index 7b042c14..01827f9d 100644 --- a/templates/actors/ffg-character-sheet.html +++ b/templates/actors/ffg-character-sheet.html @@ -186,15 +186,21 @@

                  {{localize "SWFFG.Encumbrance"}}

                  {{!-- Characteristics Scores --}} -
                    +
                    {{#each data.characteristics as |characteristic id|}} -
                  • - {{!-- If we set the type to text, we don't have to deal with hiding the number controls --}} - - -
                  • +
                    +
                    +
                    + +
                    +
                    + {{characteristic.label}} +
                    +
                    +
                    {{/each}} -
                  +
                  +
                  {{/each}} From 622229a838f9ad127e2186b8c0dd0b39c36b361b Mon Sep 17 00:00:00 2001 From: cstadther Date: Sun, 31 May 2020 20:23:17 -0400 Subject: [PATCH 27/44] restyled skills --- lang/en.json | 6 +-- scss/components/_characteristics.scss | 2 +- scss/components/_skills.scss | 25 +++++++++++ scss/starwarsffg.scss | 1 + styles/starwarsffg.css | 22 +++++++++- templates/actors/ffg-character-sheet.html | 51 ++++++++++------------- 6 files changed, 72 insertions(+), 35 deletions(-) create mode 100644 scss/components/_skills.scss diff --git a/lang/en.json b/lang/en.json index 218c3427..4a635c65 100644 --- a/lang/en.json +++ b/lang/en.json @@ -25,9 +25,9 @@ "SWFFG.CharacteristicCunning": "Cunning", "SWFFG.CharacteristicWillpower": "Willpower", "SWFFG.CharacteristicPresence": "Presence", - "SWFFG.SkillsGeneral": "General", - "SWFFG.SkillsCombat": "Combat", - "SWFFG.SkillsKnowledge": "Knowledge", + "SWFFG.SkillsGeneral": "General Skills", + "SWFFG.SkillsCombat": "Combat Skills", + "SWFFG.SkillsKnowledge": "Knowledge Skills", "SWFFG.SkillsName": "Name", "SWFFG.SkillsCS": "CS", "SWFFG.SkillsCareerSkill": "Career Skill", diff --git a/scss/components/_characteristics.scss b/scss/components/_characteristics.scss index 79bfb65b..a7e0d711 100644 --- a/scss/components/_characteristics.scss +++ b/scss/components/_characteristics.scss @@ -12,7 +12,7 @@ color:white; text-transform: uppercase; font-size : 10px; - --notchSize: 5px; + --notchSize: 7px; clip-path: polygon( diff --git a/scss/components/_skills.scss b/scss/components/_skills.scss new file mode 100644 index 00000000..3b5d1174 --- /dev/null +++ b/scss/components/_skills.scss @@ -0,0 +1,25 @@ +.tableWithHeader { + table { + th { + text-align: left; + padding: 3px; + border-bottom: 1px solid rgba(0, 0, 0, .25); + background-color: rgb(73, 12, 11); + color: white; + font-size: 12px; + font-weight: normal; + } + + td { + .dice-pool { + cursor: pointer; + + img { + width: 1em; + height: 1em; + border: 0; + } + } + } + } +} \ No newline at end of file diff --git a/scss/starwarsffg.scss b/scss/starwarsffg.scss index 1041d816..44d93e30 100644 --- a/scss/starwarsffg.scss +++ b/scss/starwarsffg.scss @@ -16,4 +16,5 @@ @import 'components/tabs'; @import 'components/header'; @import 'components/characteristics'; + @import 'components/skills'; } \ No newline at end of file diff --git a/styles/starwarsffg.css b/styles/starwarsffg.css index b151b2f2..36ac3792 100644 --- a/styles/starwarsffg.css +++ b/styles/starwarsffg.css @@ -397,7 +397,7 @@ color: white; text-transform: uppercase; font-size: 10px; - --notchSize: 5px; + --notchSize: 7px; -webkit-clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); } @@ -427,3 +427,23 @@ background-color: #7da9c2; border-radius: 50%; } + +.starwarsffg .tableWithHeader table th { + text-align: left; + padding: 3px; + border-bottom: 1px solid rgba(0, 0, 0, 0.25); + background-color: #490c0b; + color: white; + font-size: 12px; + font-weight: normal; +} + +.starwarsffg .tableWithHeader table td .dice-pool { + cursor: pointer; +} + +.starwarsffg .tableWithHeader table td .dice-pool img { + width: 1em; + height: 1em; + border: 0; +} diff --git a/templates/actors/ffg-character-sheet.html b/templates/actors/ffg-character-sheet.html index 83bbb185..093a8829 100644 --- a/templates/actors/ffg-character-sheet.html +++ b/templates/actors/ffg-character-sheet.html @@ -217,17 +217,14 @@

                  {{localize "SWFFG.Encumbrance"}}

                  -

                  {{localize "SWFFG.SkillsGeneral"}}

                  - - - - - - + + + + {{#each data.skills as |skill id|}} {{#iff skill.type '==' 'General'}} @@ -250,17 +247,14 @@

                  {{localize "SWFFG.SkillsGeneral"}}

                  {{localize "SWFFG.SkillsName"}} - {{localize "SWFFG.SkillsCS"}} -
                  {{localize "SWFFG.SkillsCareerSkill"}}
                  -
                  {{localize "SWFFG.SkillsRank"}}{{localize "SWFFG.SkillsRoll"}}
                  {{localize "SWFFG.SkillsGeneral"}} + {{localize "SWFFG.SkillsCS"}} +
                  {{localize "SWFFG.SkillsCareerSkill"}}
                  +
                  {{localize "SWFFG.SkillsRank"}}{{localize "SWFFG.SkillsRoll"}}
                  -

                  {{localize "SWFFG.SkillsCombat"}}

                  - - - - - - + + + + {{#each data.skills as |skill id|}} {{#iff skill.type '==' 'Combat'}} @@ -281,17 +275,14 @@

                  {{localize "SWFFG.SkillsCombat"}}

                  {{localize "SWFFG.SkillsName"}} - {{localize "SWFFG.SkillsCS"}} -
                  {{localize "SWFFG.SkillsCareerSkill"}}
                  -
                  {{localize "SWFFG.SkillsRank"}}{{localize "SWFFG.SkillsRoll"}}
                  {{localize "SWFFG.SkillsCombat"}} + {{localize "SWFFG.SkillsCS"}} +
                  {{localize "SWFFG.SkillsCareerSkill"}}
                  +
                  {{localize "SWFFG.SkillsRank"}}{{localize "SWFFG.SkillsRoll"}}
                  -

                  {{localize "SWFFG.SkillsKnowledge"}}

                  - - - - - - + + + + {{#each data.skills as |skill id|}} {{#iff skill.type '==' 'Knowledge'}} From 87640b0663065b61c2273f8703323b2d8c05c920 Mon Sep 17 00:00:00 2001 From: cstadther Date: Sun, 31 May 2020 22:06:04 -0400 Subject: [PATCH 28/44] added encumbrance and credits to items tab. --- lang/en.json | 3 +- scss/components/_items.scss | 138 ++++++++++++++++++++++ scss/components/_skills.scss | 23 ++-- scss/starwarsffg.scss | 1 + styles/starwarsffg.css | 129 +++++++++++++++++++- templates/actors/ffg-character-sheet.html | 130 ++++++++++++-------- 6 files changed, 362 insertions(+), 62 deletions(-) create mode 100644 scss/components/_items.scss diff --git a/lang/en.json b/lang/en.json index 4a635c65..cca861d9 100644 --- a/lang/en.json +++ b/lang/en.json @@ -14,7 +14,8 @@ "SWFFG.ForcePool": "Force Pool", "SWFFG.ForcePoolCommitted": "Committed", "SWFFG.ForcePoolAvailable": "Available", - "SWFFG.Encumbrance": "Encum", + "SWFFG.Encumbrance": "Encumbrance", + "SWFFG.Credits": "Credits", "SWFFG.TabCharacteristics": "Characteristics", "SWFFG.TabGear": "Gear & Equipment", "SWFFG.TabTalents": "Talents", diff --git a/scss/components/_items.scss b/scss/components/_items.scss new file mode 100644 index 00000000..d6feb916 --- /dev/null +++ b/scss/components/_items.scss @@ -0,0 +1,138 @@ +.items { + table { + th { + text-align: left; + padding: 3px; + border-bottom: 1px solid rgba(0, 0, 0, .25); + background-color: rgb(73, 12, 11); + color: white; + font-size: 12px; + font-weight: normal; + } + } + + .attribute { + position: relative; + padding: 0; + z-index: 1; + border:0; + + .block-background-shadow { + top: 36px; + } + + .block-background { + padding: 5px 5px; + } + + .block-title { + line-height: initial; + background-color: rgb(73, 12, 11); + color: white; + font-size: 13px; + text-transform: uppercase; + margin:auto; + // width: 160px; + --notchSize: 8px; + clip-path: + polygon( + 0% var(--notchSize), + var(--notchSize) 0%, + calc(100% - var(--notchSize)) 0%, + 100% var(--notchSize), + 100% calc(100% - var(--notchSize)), + calc(100% - var(--notchSize)) 100%, + var(--notchSize) 100%, + 0% calc(100% - var(--notchSize)) + ); + } + + .block-attribute { + + .block-value { + display: inline-block; + } + } + + .block-value { + + &.block-single { + input { + width: 100%; + padding: 6px; + } + } + + input { + border:0; + font-size:14px; + + &:focus { + box-shadow: 0 0 5px rgb(125, 169, 194); + background-color: rgb(125, 169, 194); + } + } + } + + .shadow-text { + position: absolute; + top: 5px; + font-size: 9px; + left: 50%; + transform: translateX(-50%); + } + + .shadow-left { + background-color: rgb(73, 12, 11); + width: 50%; + height: 100%; + float:left; + position: relative; + padding-top: 25px; + + .shadow-text { + color: white; + text-transform: uppercase; + } + } + + .shadow-right { + background-color: rgb(125, 169, 194); + width: 50%; + height: 100%; + float:right; + position: relative; + padding-top: 25px; + + .shadow-text { + color: black; + font-weight: bold; + text-transform: uppercase; + } + } + } + + .resource { + line-height: 30px; + width: 110px; + + &.split { + width: 130px; + } + &.single { + width: 65px; + } + &.double { + width: 130px; + } + + input { + width: 45px; + } + } + + .item-values { + margin-bottom: 5px; + border: 0; + } +} diff --git a/scss/components/_skills.scss b/scss/components/_skills.scss index 3b5d1174..3e8463f4 100644 --- a/scss/components/_skills.scss +++ b/scss/components/_skills.scss @@ -11,15 +11,24 @@ } td { - .dice-pool { - cursor: pointer; + padding: 0 0 0 3px; + } + } +} - img { - width: 1em; - height: 1em; - border: 0; +table { + &.items { + + .items-list { + td { + &.item-controls { + text-align: right; + width: auto; + z-index: auto; } } } + } -} \ No newline at end of file +} + diff --git a/scss/starwarsffg.scss b/scss/starwarsffg.scss index 44d93e30..1246a3d6 100644 --- a/scss/starwarsffg.scss +++ b/scss/starwarsffg.scss @@ -17,4 +17,5 @@ @import 'components/header'; @import 'components/characteristics'; @import 'components/skills'; + @import 'components/items'; } \ No newline at end of file diff --git a/styles/starwarsffg.css b/styles/starwarsffg.css index 36ac3792..6c7d2a96 100644 --- a/styles/starwarsffg.css +++ b/styles/starwarsffg.css @@ -438,12 +438,131 @@ font-weight: normal; } -.starwarsffg .tableWithHeader table td .dice-pool { - cursor: pointer; +.starwarsffg .tableWithHeader table td { + padding: 0 0 0 3px; +} + +.starwarsffg table.items .items-list td.item-controls { + text-align: right; + width: auto; + z-index: auto; +} + +.starwarsffg .items table th { + text-align: left; + padding: 3px; + border-bottom: 1px solid rgba(0, 0, 0, 0.25); + background-color: #490c0b; + color: white; + font-size: 12px; + font-weight: normal; +} + +.starwarsffg .items .attribute { + position: relative; + padding: 0; + z-index: 1; + border: 0; +} + +.starwarsffg .items .attribute .block-background-shadow { + top: 36px; +} + +.starwarsffg .items .attribute .block-background { + padding: 5px 5px; } -.starwarsffg .tableWithHeader table td .dice-pool img { - width: 1em; - height: 1em; +.starwarsffg .items .attribute .block-title { + line-height: initial; + background-color: #490c0b; + color: white; + font-size: 13px; + text-transform: uppercase; + margin: auto; + --notchSize: 8px; + -webkit-clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); + clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); +} + +.starwarsffg .items .attribute .block-attribute .block-value { + display: inline-block; +} + +.starwarsffg .items .attribute .block-value.block-single input { + width: 100%; + padding: 6px; +} + +.starwarsffg .items .attribute .block-value input { + border: 0; + font-size: 14px; +} + +.starwarsffg .items .attribute .block-value input:focus { + box-shadow: 0 0 5px #7da9c2; + background-color: #7da9c2; +} + +.starwarsffg .items .attribute .shadow-text { + position: absolute; + top: 5px; + font-size: 9px; + left: 50%; + transform: translateX(-50%); +} + +.starwarsffg .items .attribute .shadow-left { + background-color: #490c0b; + width: 50%; + height: 100%; + float: left; + position: relative; + padding-top: 25px; +} + +.starwarsffg .items .attribute .shadow-left .shadow-text { + color: white; + text-transform: uppercase; +} + +.starwarsffg .items .attribute .shadow-right { + background-color: #7da9c2; + width: 50%; + height: 100%; + float: right; + position: relative; + padding-top: 25px; +} + +.starwarsffg .items .attribute .shadow-right .shadow-text { + color: black; + font-weight: bold; + text-transform: uppercase; +} + +.starwarsffg .items .resource { + line-height: 30px; + width: 110px; +} + +.starwarsffg .items .resource.split { + width: 130px; +} + +.starwarsffg .items .resource.single { + width: 65px; +} + +.starwarsffg .items .resource.double { + width: 130px; +} + +.starwarsffg .items .resource input { + width: 45px; +} + +.starwarsffg .items .item-values { + margin-bottom: 5px; border: 0; } diff --git a/templates/actors/ffg-character-sheet.html b/templates/actors/ffg-character-sheet.html index 093a8829..cadc13a0 100644 --- a/templates/actors/ffg-character-sheet.html +++ b/templates/actors/ffg-character-sheet.html @@ -97,17 +97,12 @@

                  -
                  +
                  -
                  - - - - {{!-- Defence Box --}} @@ -308,34 +303,73 @@

                  {{localize "SWFFG.Encumbrance"}}

                  {{!-- Owned Items Tab --}}
                  +
                  + + {{!-- Encumbrance Box --}} +
                  +
                  +
                  +
                  + {{localize "SWFFG.Encumbrance"}} +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  {{localize "SWFFG.Current"}}
                  +
                  +
                  +
                  {{localize "SWFFG.Threshold"}}
                  +
                  +
                  +
                  +
                  + + {{!-- Credits Box --}} +
                  +
                  +
                  +
                  + {{localize "SWFFG.Credits"}} +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  + {{!-- Weapons List --}}
                  {{localize "SWFFG.SkillsName"}} - {{localize "SWFFG.SkillsCS"}} -
                  {{localize "SWFFG.SkillsCareerSkill"}}
                  -
                  {{localize "SWFFG.SkillsRank"}}{{localize "SWFFG.SkillsRoll"}}
                  {{localize "SWFFG.SkillsKnowledge"}} + {{localize "SWFFG.SkillsCS"}} +
                  {{localize "SWFFG.SkillsCareerSkill"}}
                  +
                  {{localize "SWFFG.SkillsRank"}}{{localize "SWFFG.SkillsRoll"}}
                  -

                  - - - - - - - - - - + + + + + + + + {{#each actor.items as |item id|}} {{#iff item.type '==' 'weapon'}} - - - - + + + + + - {{/iff}} {{/each}} @@ -344,28 +378,27 @@

                  {{!-- Armour List --}}
                  {{localize "SWFFG.ItemsName"}}{{localize "SWFFG.ItemsSkill"}}{{localize "SWFFG.ItemsDamage"}}{{localize "SWFFG.ItemsRange"}}{{localize "SWFFG.ItemsCrit"}}{{localize "SWFFG.ItemsSpecial"}}{{localize "SWFFG.ItemsEncum"}}Del
                  {{localize "SWFFG.ItemsWeapons"}}{{localize "SWFFG.ItemsSkill"}}{{localize "SWFFG.ItemsDamage"}}{{localize "SWFFG.ItemsRange"}}{{localize "SWFFG.ItemsCrit"}}{{localize "SWFFG.ItemsEncum"}}{{localize "SWFFG.ItemsSpecial"}}
                  {{item.name}}{{lookup ../this.FFG.combat_skills.abrev item.data.skill.value}}{{item.data.damage.value}}{{item.data.range.value}}{{item.data.crit.value}}{{lookup ../this.FFG.combat_skills.abrev item.data.skill.value}}{{item.data.damage.value}}{{item.data.range.value}}{{item.data.crit.value}}{{item.data.encumbrance.value}} {{item.data.special.value}}{{item.data.encumbrance.value}} - +
                  -

                  - - - - - - + + + + + + {{#each actor.items as |item id|}} {{#iff item.type '==' 'armour'}} - - - - - + + + + + {{/iff}} {{/each}} @@ -374,28 +407,27 @@

                  {{!-- Gear List --}}
                  {{localize "SWFFG.ItemsName"}}{{localize "SWFFG.ItemsDefense"}}{{localize "SWFFG.ItemsSoak"}}{{localize "SWFFG.ItemsHP"}}{{localize "SWFFG.ItemsEncum"}}Del{{localize "SWFFG.ItemsArmor"}}{{localize "SWFFG.ItemsDefense"}}{{localize "SWFFG.ItemsSoak"}}{{localize "SWFFG.ItemsHP"}}{{localize "SWFFG.ItemsEncum"}}
                  {{item.name}}{{item.data.defence.value}}{{item.data.soak.value}}{{item.data.hardpoints.value}}{{item.data.encumbrance.value}}{{item.name}}{{item.data.defence.value}}{{item.data.soak.value}}{{item.data.hardpoints.value}}{{item.data.encumbrance.value}} - +
                  -

                  - - - - - - + + + + + + {{#each actor.items as |item id|}} {{#iff item.type '==' 'gear'}} - - - - - + + + + + {{/iff}} {{/each}} From 9a2d624731562075d9f9f349a255c85bfaa0196f Mon Sep 17 00:00:00 2001 From: cstadther Date: Sun, 31 May 2020 22:32:12 -0400 Subject: [PATCH 29/44] restyled talents. --- scss/components/_items.scss | 3 ++ scss/starwarsffg.scss | 1 + styles/starwarsffg.css | 30 +++++++++++++ templates/actors/ffg-character-sheet.html | 55 ++++++++++++----------- 4 files changed, 64 insertions(+), 25 deletions(-) diff --git a/scss/components/_items.scss b/scss/components/_items.scss index d6feb916..494954ec 100644 --- a/scss/components/_items.scss +++ b/scss/components/_items.scss @@ -9,6 +9,9 @@ font-size: 12px; font-weight: normal; } + td { + padding:3px; + } } .attribute { diff --git a/scss/starwarsffg.scss b/scss/starwarsffg.scss index 1246a3d6..56b3d14b 100644 --- a/scss/starwarsffg.scss +++ b/scss/starwarsffg.scss @@ -18,4 +18,5 @@ @import 'components/characteristics'; @import 'components/skills'; @import 'components/items'; + @import 'components/talents'; } \ No newline at end of file diff --git a/styles/starwarsffg.css b/styles/starwarsffg.css index 6c7d2a96..a4ef828f 100644 --- a/styles/starwarsffg.css +++ b/styles/starwarsffg.css @@ -458,6 +458,10 @@ font-weight: normal; } +.starwarsffg .items table td { + padding: 3px; +} + .starwarsffg .items .attribute { position: relative; padding: 0; @@ -566,3 +570,29 @@ margin-bottom: 5px; border: 0; } + +.starwarsffg table.talent-list { + border: 0; +} + +.starwarsffg table.talent-list th { + text-align: left; + padding: 3px; + border-bottom: 1px solid rgba(0, 0, 0, 0.25); + background-color: #490c0b; + color: white; + font-size: 12px; + font-weight: normal; +} + +.starwarsffg table.talent-list td { + height: 30px; + line-height: 24px; + padding: 3px; +} + +.starwarsffg table.talent-list td .item-controls { + text-align: right; + width: auto; + z-index: auto; +} diff --git a/templates/actors/ffg-character-sheet.html b/templates/actors/ffg-character-sheet.html index cadc13a0..0e540b80 100644 --- a/templates/actors/ffg-character-sheet.html +++ b/templates/actors/ffg-character-sheet.html @@ -438,35 +438,40 @@

                  {{localize "SWFFG.Encumbrance"}}

                  {{!-- Talents Tab --}}
                  {{!-- Talents List --}} -
                  -

                  -
                  - {{localize "SWFFG.TalentsName"}} - {{localize "SWFFG.TalentsActivation"}} - {{localize "SWFFG.TalentsRank"}} - Del -
                  -
                    +
                  {{localize "SWFFG.ItemsName"}}{{localize "SWFFG.ItemsPrice"}}{{localize "SWFFG.ItemsRarity"}}{{localize "SWFFG.ItemsQty"}}{{localize "SWFFG.ItemsEncum"}}Del{{localize "SWFFG.ItemsGear"}}{{localize "SWFFG.ItemsPrice"}}{{localize "SWFFG.ItemsRarity"}}{{localize "SWFFG.ItemsQuantity"}}{{localize "SWFFG.ItemsEncum"}}
                  {{item.name}}{{item.data.price.value}}{{item.data.rarity.value}}{{item.data.quantity.value}}{{item.data.encumbrance.value}}{{item.name}}{{item.data.price.value}}{{item.data.rarity.value}}{{item.data.quantity.value}}{{item.data.encumbrance.value}} - +
                  + + + + + + + + + {{#each actor.items as |item id|}} {{#iff item.type '==' 'talent'}} -
                7. -

                  +

                8. + + + + + {{/iff}} {{/each}} - - + +
                  {{localize "SWFFG.Talents"}}{{localize "SWFFG.TalentsActivation"}}{{localize "SWFFG.TalentsRank"}}
                  {{item.name}}
                  {{item.safe_desc}}
                  - - - {{#if item.data.ranks.ranked}} - - {{else}} - - {{/if}} -
                  - - -
                  - +
                  {{item.data.activation.value}} + {{#if item.data.ranks.ranked}} + {{item.data.ranks.current}} + {{else}} + N/A + {{/if}} + +
                  + + +
                  +
                  {{!-- Biography Tab --}} From 890fed8e94d9ba75d5c5404f55f73b8fca9481d5 Mon Sep 17 00:00:00 2001 From: cstadther Date: Sun, 31 May 2020 22:32:39 -0400 Subject: [PATCH 30/44] Added new stylesheet --- scss/components/_talents.scss | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 scss/components/_talents.scss diff --git a/scss/components/_talents.scss b/scss/components/_talents.scss new file mode 100644 index 00000000..058bdfef --- /dev/null +++ b/scss/components/_talents.scss @@ -0,0 +1,28 @@ +table { + &.talent-list { + border:0; + + th { + text-align: left; + padding: 3px; + border-bottom: 1px solid rgba(0, 0, 0, .25); + background-color: rgb(73, 12, 11); + color: white; + font-size: 12px; + font-weight: normal; + } + + td { + height: 30px; + line-height: 24px; + padding: 3px; + + .item-controls { + text-align: right; + width: auto; + z-index: auto; + } + + } + } +} \ No newline at end of file From 1c1a1ef4ed9880317bb3ab032adcef044ff5c3c9 Mon Sep 17 00:00:00 2001 From: cstadther Date: Sun, 31 May 2020 22:40:37 -0400 Subject: [PATCH 31/44] minor fixes. --- scss/components/_skills.scss | 8 ++++++++ styles/starwarsffg.css | 6 ++++++ 2 files changed, 14 insertions(+) diff --git a/scss/components/_skills.scss b/scss/components/_skills.scss index 3e8463f4..80348dc9 100644 --- a/scss/components/_skills.scss +++ b/scss/components/_skills.scss @@ -12,6 +12,14 @@ td { padding: 0 0 0 3px; + + .dice-pool { + img { + width: 1em; + height: 1em; + border: 0; + } + } } } } diff --git a/styles/starwarsffg.css b/styles/starwarsffg.css index a4ef828f..04990960 100644 --- a/styles/starwarsffg.css +++ b/styles/starwarsffg.css @@ -442,6 +442,12 @@ padding: 0 0 0 3px; } +.starwarsffg .tableWithHeader table td .dice-pool img { + width: 1em; + height: 1em; + border: 0; +} + .starwarsffg table.items .items-list td.item-controls { text-align: right; width: auto; From 1205b33a1114b857721aac08a1c2c354c4ed53cd Mon Sep 17 00:00:00 2001 From: cstadther Date: Mon, 1 Jun 2020 09:43:48 -0400 Subject: [PATCH 32/44] removed duplicate items on biography page. --- lang/en.json | 1 - templates/actors/ffg-character-sheet.html | 53 +---------------------- 2 files changed, 2 insertions(+), 52 deletions(-) diff --git a/lang/en.json b/lang/en.json index cca861d9..5b8ad053 100644 --- a/lang/en.json +++ b/lang/en.json @@ -15,7 +15,6 @@ "SWFFG.ForcePoolCommitted": "Committed", "SWFFG.ForcePoolAvailable": "Available", "SWFFG.Encumbrance": "Encumbrance", - "SWFFG.Credits": "Credits", "SWFFG.TabCharacteristics": "Characteristics", "SWFFG.TabGear": "Gear & Equipment", "SWFFG.TabTalents": "Talents", diff --git a/templates/actors/ffg-character-sheet.html b/templates/actors/ffg-character-sheet.html index 0e540b80..902684e4 100644 --- a/templates/actors/ffg-character-sheet.html +++ b/templates/actors/ffg-character-sheet.html @@ -333,7 +333,7 @@

                  {{localize "SWFFG.Encumbrance"}}

                  - {{localize "SWFFG.Credits"}} + {{localize "SWFFG.DescriptionCredits"}}
                  @@ -493,56 +493,7 @@

                  {{localize "SWFFG.DescriptionXP"}}

                  - - {{!-- Credits Box --}} -
                  -
                  -
                  -

                  {{localize "SWFFG.DescriptionCredits"}}

                  - -
                  -
                  -
                  - - {{!-- Obligation Box --}} -
                  -

                  {{localize "SWFFG.DescriptionObligation"}}

                  -
                  -
                  - -
                  -
                  -
                  - - {{!-- Duty Box --}} -
                  -

                  {{localize "SWFFG.DescriptionDuty"}}

                  -
                  -
                  - -
                  -
                  -
                  - - {{!-- Morality Box --}} -
                  -

                  {{localize "SWFFG.DescriptionMorality"}}

                  -
                  -
                  - -
                  -
                  -
                  - - {{!-- Conflict Box --}} -
                  -

                  {{localize "SWFFG.DescriptionConflict"}}

                  -
                  -
                  - -
                  -
                  -
                  +
                  From 26a91167a68fe8572260ce56535842076a9decc9 Mon Sep 17 00:00:00 2001 From: cstadther Date: Mon, 1 Jun 2020 14:43:18 -0400 Subject: [PATCH 33/44] restyled the biography tab. --- scss/components/_biography.scss | 135 +++++++++++++++++++ scss/components/_characteristics.scss | 9 ++ scss/components/_forms.scss | 4 + scss/components/_skills.scss | 17 +++ scss/starwarsffg.scss | 1 + styles/starwarsffg.css | 145 ++++++++++++++++++++ templates/actors/ffg-character-sheet.html | 155 ++++++++++++++++------ 7 files changed, 426 insertions(+), 40 deletions(-) create mode 100644 scss/components/_biography.scss diff --git a/scss/components/_biography.scss b/scss/components/_biography.scss new file mode 100644 index 00000000..207bc4eb --- /dev/null +++ b/scss/components/_biography.scss @@ -0,0 +1,135 @@ +.biography { + .attribute { + position: relative; + padding: 0; + z-index: 1; + border:0; + + .block-background-shadow { + top: 36px; + } + + .block-background { + padding: 5px 5px; + } + + .block-title { + line-height: initial; + background-color: rgb(73, 12, 11); + color: white; + font-size: 13px; + text-transform: uppercase; + margin:auto; + // width: 160px; + --notchSize: 8px; + clip-path: + polygon( + 0% var(--notchSize), + var(--notchSize) 0%, + calc(100% - var(--notchSize)) 0%, + 100% var(--notchSize), + 100% calc(100% - var(--notchSize)), + calc(100% - var(--notchSize)) 100%, + var(--notchSize) 100%, + 0% calc(100% - var(--notchSize)) + ); + } + + .block-attribute { + + .block-value { + display: inline-block; + } + } + + .block-value { + + &.block-single { + input { + width: 100%; + padding: 6px; + } + } + + input { + border:0; + font-size:14px; + + &:focus { + box-shadow: 0 0 5px rgb(125, 169, 194); + background-color: rgb(125, 169, 194); + } + } + } + + .shadow-text { + position: absolute; + top: 5px; + font-size: 9px; + left: 50%; + transform: translateX(-50%); + } + + .shadow-left { + background-color: rgb(73, 12, 11); + width: 50%; + height: 100%; + float:left; + position: relative; + padding-top: 25px; + + .shadow-text { + color: white; + text-transform: uppercase; + } + } + + .shadow-right { + background-color: rgb(125, 169, 194); + width: 50%; + height: 100%; + float:right; + position: relative; + padding-top: 25px; + + .shadow-text { + color: black; + font-weight: bold; + text-transform: uppercase; + } + } + } + + .resource { + line-height: 30px; + width: 110px; + + &.split { + width: 130px; + } + &.single { + width: 110px; + } + &.double { + width: 130px; + } + + input { + width: 45px; + } + } + + .biography-values { + margin-bottom: 5px; + border: 0; + position: absolute; + bottom: 10px; + left: 0; + padding: 0; + + } + + .biography-editor { + height:475px; + } +} \ No newline at end of file diff --git a/scss/components/_characteristics.scss b/scss/components/_characteristics.scss index a7e0d711..d306181c 100644 --- a/scss/components/_characteristics.scss +++ b/scss/components/_characteristics.scss @@ -1,5 +1,14 @@ .sheet-body { + + div.tab.characteristics { + overflow: hidden; + } + .characteristics { + fieldset.skillfilter { + display: none; + } + .characteristic-item { border:0; position: relative; diff --git a/scss/components/_forms.scss b/scss/components/_forms.scss index f8bb3124..1f822f3f 100644 --- a/scss/components/_forms.scss +++ b/scss/components/_forms.scss @@ -47,4 +47,8 @@ .character { min-width: 575px; +} + +.position-relative { + position: relative; } \ No newline at end of file diff --git a/scss/components/_skills.scss b/scss/components/_skills.scss index 80348dc9..78b421e4 100644 --- a/scss/components/_skills.scss +++ b/scss/components/_skills.scss @@ -1,4 +1,11 @@ .tableWithHeader { + + .tableWithHeader-container { + flex: 1; + margin: 2px; + position: relative; + } + table { th { text-align: left; @@ -21,6 +28,16 @@ } } } + + .careerskill-toggle { + margin: 0; + padding: 0; + } + + .careerskill-rank { + width: 30px; + text-align: center; + } } } diff --git a/scss/starwarsffg.scss b/scss/starwarsffg.scss index 56b3d14b..e676da4b 100644 --- a/scss/starwarsffg.scss +++ b/scss/starwarsffg.scss @@ -19,4 +19,5 @@ @import 'components/skills'; @import 'components/items'; @import 'components/talents'; + @import 'components/biography'; } \ No newline at end of file diff --git a/styles/starwarsffg.css b/styles/starwarsffg.css index 04990960..26b7a148 100644 --- a/styles/starwarsffg.css +++ b/styles/starwarsffg.css @@ -148,6 +148,10 @@ min-width: 575px; } +.starwarsffg .position-relative { + position: relative; +} + .starwarsffg.sheet .sheet-body { border: 0; } @@ -384,6 +388,14 @@ width: 45px; } +.starwarsffg .sheet-body div.tab.characteristics { + overflow: hidden; +} + +.starwarsffg .sheet-body .characteristics fieldset.skillfilter { + display: none; +} + .starwarsffg .sheet-body .characteristics .characteristic-item { border: 0; position: relative; @@ -428,6 +440,12 @@ border-radius: 50%; } +.starwarsffg .tableWithHeader .tableWithHeader-container { + flex: 1; + margin: 2px; + position: relative; +} + .starwarsffg .tableWithHeader table th { text-align: left; padding: 3px; @@ -448,6 +466,16 @@ border: 0; } +.starwarsffg .tableWithHeader table .careerskill-toggle { + margin: 0; + padding: 0; +} + +.starwarsffg .tableWithHeader table .careerskill-rank { + width: 30px; + text-align: center; +} + .starwarsffg table.items .items-list td.item-controls { text-align: right; width: auto; @@ -602,3 +630,120 @@ width: auto; z-index: auto; } + +.starwarsffg .biography .attribute { + position: relative; + padding: 0; + z-index: 1; + border: 0; +} + +.starwarsffg .biography .attribute .block-background-shadow { + top: 36px; +} + +.starwarsffg .biography .attribute .block-background { + padding: 5px 5px; +} + +.starwarsffg .biography .attribute .block-title { + line-height: initial; + background-color: #490c0b; + color: white; + font-size: 13px; + text-transform: uppercase; + margin: auto; + --notchSize: 8px; + -webkit-clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); + clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); +} + +.starwarsffg .biography .attribute .block-attribute .block-value { + display: inline-block; +} + +.starwarsffg .biography .attribute .block-value.block-single input { + width: 100%; + padding: 6px; +} + +.starwarsffg .biography .attribute .block-value input { + border: 0; + font-size: 14px; +} + +.starwarsffg .biography .attribute .block-value input:focus { + box-shadow: 0 0 5px #7da9c2; + background-color: #7da9c2; +} + +.starwarsffg .biography .attribute .shadow-text { + position: absolute; + top: 5px; + font-size: 9px; + left: 50%; + transform: translateX(-50%); +} + +.starwarsffg .biography .attribute .shadow-left { + background-color: #490c0b; + width: 50%; + height: 100%; + float: left; + position: relative; + padding-top: 25px; +} + +.starwarsffg .biography .attribute .shadow-left .shadow-text { + color: white; + text-transform: uppercase; +} + +.starwarsffg .biography .attribute .shadow-right { + background-color: #7da9c2; + width: 50%; + height: 100%; + float: right; + position: relative; + padding-top: 25px; +} + +.starwarsffg .biography .attribute .shadow-right .shadow-text { + color: black; + font-weight: bold; + text-transform: uppercase; +} + +.starwarsffg .biography .resource { + line-height: 30px; + width: 110px; +} + +.starwarsffg .biography .resource.split { + width: 130px; +} + +.starwarsffg .biography .resource.single { + width: 110px; +} + +.starwarsffg .biography .resource.double { + width: 130px; +} + +.starwarsffg .biography .resource input { + width: 45px; +} + +.starwarsffg .biography .biography-values { + margin-bottom: 5px; + border: 0; + position: absolute; + bottom: 10px; + left: 0; + padding: 0; +} + +.starwarsffg .biography .biography-editor { + height: 475px; +} diff --git a/templates/actors/ffg-character-sheet.html b/templates/actors/ffg-character-sheet.html index 902684e4..0d730566 100644 --- a/templates/actors/ffg-character-sheet.html +++ b/templates/actors/ffg-character-sheet.html @@ -14,7 +14,7 @@
                  -

                  +

                  @@ -22,15 +22,15 @@

                  {{localize "SWFFG.Species"}}:
                  -
                  +
                  {{localize "SWFFG.Career"}}:
                  -
                  +
                  {{localize "SWFFG.Specializations"}}:
                  -
                  +

                  @@ -178,7 +178,7 @@

                  {{localize "SWFFG.Encumbrance"}}

                  {{!-- Sheet Body --}}
                  {{!-- Characteristics Tab --}} -
                  +
                  {{!-- Characteristics Scores --}}
                  @@ -196,25 +196,25 @@

                  {{localize "SWFFG.Encumbrance"}}

                  {{/each}}
                  -
                  +
                  -
                  +
                  - @@ -226,10 +226,10 @@

                  {{localize "SWFFG.Encumbrance"}}

                  {{localize "SWFFG.SkillsGeneral"}} + {{localize "SWFFG.SkillsCS"}}
                  {{localize "SWFFG.SkillsCareerSkill"}}
                  {{id}} {{#with (lookup ../this.data.characteristics [characteristic])~}} ({{abrev}}) {{/with}} - + - + @@ -240,11 +240,11 @@

                  {{localize "SWFFG.Encumbrance"}}

                  -
                  +
                  - @@ -256,10 +256,10 @@

                  {{localize "SWFFG.Encumbrance"}}

                  {{localize "SWFFG.SkillsCombat"}} + {{localize "SWFFG.SkillsCS"}}
                  {{localize "SWFFG.SkillsCareerSkill"}}
                  {{id}} {{#with (lookup ../this.data.characteristics [characteristic])~}} ({{abrev}}) {{/with}} - + - + @@ -272,7 +272,7 @@

                  {{localize "SWFFG.Encumbrance"}}

                  - @@ -284,10 +284,10 @@

                  {{localize "SWFFG.Encumbrance"}}

                  {{localize "SWFFG.SkillsKnowledge"}} + {{localize "SWFFG.SkillsCS"}}
                  {{localize "SWFFG.SkillsCareerSkill"}}
                  {{lookup ../this.FFG.skills.knowledgestripped [id]~}} {{#with (lookup ../this.data.characteristics [characteristic])~}} ({{abrev}}) {{/with}} - + - + @@ -475,26 +475,101 @@

                  {{localize "SWFFG.Encumbrance"}}

                  {{!-- Biography Tab --}} -
                  - {{editor content=data.biography target="data.biography" button=true owner=owner editable=editable}} {{!-- Footer info --}} -
                  - {{!-- XP Box --}} -
                  -

                  {{localize "SWFFG.DescriptionXP"}}

                  -
                  -
                  - - +
                  +
                  + {{editor content=data.biography target="data.biography" button=true owner=owner editable=editable}} {{!-- Footer info --}} +
                  + +
                  + + {{!-- Experience Box --}} +
                  +
                  +
                  +
                  + {{localize "SWFFG.DescriptionXP"}} +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  {{localize "SWFFG.DescriptionXPAvailable"}}
                  +
                  +
                  +
                  {{localize "SWFFG.DescriptionXPTotal"}}
                  +
                  +
                  +
                  +
                  + + {{!-- Obligation Box --}} +
                  +
                  +
                  +
                  + {{localize "SWFFG.DescriptionObligation"}} +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  + + {{!-- Duty Box --}} +
                  +
                  +
                  +
                  + {{localize "SWFFG.DescriptionDuty"}} +
                  +
                  +
                  +
                  -
                  -
                  - - +
                  +
                  +
                  +
                  + + {{!-- Morality Box --}} +
                  +
                  +
                  +
                  + {{localize "SWFFG.DescriptionMorality"}} +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  + + {{!-- Duty Box --}} +
                  +
                  +
                  +
                  + {{localize "SWFFG.DescriptionConflict"}} +
                  +
                  +
                  +
                  +
                  +
                  -
                  +
                  {{!-- Modifiers Tab --}} @@ -510,7 +585,7 @@

                  {{localize "SWFFG.DescriptionXP"}}

                    {{#each data.attributes as |attr key|}}
                  1. - + -
                  -
                  -
                  - - +
                  +
                  + +
                  +
                  +
                  +

                  +
                  +
                  +
                  +
                  +
                  +
                  + +
                  +
                  +
                  + {{localize "SWFFG.ItemWeaponDamage"}} +
                  -
                  - - +
                  +
                  +
                  + +
                  +
                  +
                  + {{localize "SWFFG.ItemWeaponCritical"}} +
                  -
                  - - +
                  +
                  +
                  + +
                  +
                  +
                  + {{localize "SWFFG.ItemWeaponEncumbrance"}} +
                  -
                  - - +
                  +
                  +
                  + +
                  +
                  +
                  + {{localize "SWFFG.ItemWeaponHardPoints"}} +
                  -
                  - - +
                  +
                  +
                  + +
                  +
                  +
                  + {{localize "SWFFG.ItemWeaponRarity"}} +
                  -
                  - - +
                  + +
                  +
                  +
                  +
                  +
                  + {{localize "SWFFG.ItemWeaponSkill"}} +
                  +
                  + +
                  +
                  +
                  -
                  - - +
                  +
                  +
                  +
                  + {{localize "SWFFG.ItemWeaponRange"}} +
                  +
                  + +
                  +
                  +
                  -
                  - - +
                  +
                  +
                  +
                  + {{localize "SWFFG.ItemWeaponPrice"}} +
                  +
                  +
                  +
                  +
                  +
                  -
                  - - +
                  + +
                  +
                  +
                  +
                  +
                  + {{localize "SWFFG.ItemWeaponQuantity"}} +
                  +
                  +
                  +
                  +
                  +
                  -
                  - - +
                  +
                  +
                  +
                  + {{localize "SWFFG.ItemWeaponSpecial"}} +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  {{!-- Sheet Tab Navigation --}} From 0b30ba949c8db2002f05338870b55b6b04cdf03a Mon Sep 17 00:00:00 2001 From: Chris Stadther Date: Mon, 1 Jun 2020 21:24:53 -0400 Subject: [PATCH 35/44] restyled armor sheet. (#5) --- lang/en.json | 3 +- modules/items/item-sheet-ffg.js | 7 + scss/components/_itemarmorsheet.scss | 238 ++++++++++++++++++++++++++ scss/components/_itemweaponsheet.scss | 3 +- scss/starwarsffg.scss | 1 + styles/starwarsffg.css | 203 ++++++++++++++++++++++ templates/items/ffg-armour-sheet.html | 117 +++++++++---- 7 files changed, 539 insertions(+), 33 deletions(-) create mode 100644 scss/components/_itemarmorsheet.scss diff --git a/lang/en.json b/lang/en.json index 74a797fd..b9f46198 100644 --- a/lang/en.json +++ b/lang/en.json @@ -71,5 +71,6 @@ "SWFFG.ItemWeaponRange": "Range", "SWFFG.ItemWeaponPrice": "Price", "SWFFG.ItemWeaponQuantity": "Qty", - "SWFFG.ItemWeaponSpecial": "Special" + "SWFFG.ItemWeaponSpecial": "Special", + "SWFFG.ItemArmorDefense": "Def" } diff --git a/modules/items/item-sheet-ffg.js b/modules/items/item-sheet-ffg.js index d93b5e4a..ab31a422 100644 --- a/modules/items/item-sheet-ffg.js +++ b/modules/items/item-sheet-ffg.js @@ -33,7 +33,14 @@ export class ItemSheetFFG extends ItemSheet { case "weapon": this.position.width = 385; this.position.height = 650; + break; + case "armour": + this.position.width = 385; + this.position.height = 575; + break; default: + this.position.width = 385; + this.position.height = 650; } data.FFG = CONFIG.FFG; diff --git a/scss/components/_itemarmorsheet.scss b/scss/components/_itemarmorsheet.scss new file mode 100644 index 00000000..0d55dcab --- /dev/null +++ b/scss/components/_itemarmorsheet.scss @@ -0,0 +1,238 @@ +.item-sheet-armor { + + .header-fields { + height: 340px; + } + + .charname { + width: 100%; + + input { + color: rgb(85, 49, 19); + border: 0; + + &:focus { + box-shadow: 0 0 5px rgb(125, 169, 194); + background-color: rgb(125, 169, 194); + } + } + + } + + .characteristic-item { + border:0; + position: relative; + padding:0; + margin: 0 5px; + + .characteristic-label { + margin-top: 5px; + width: 100%; + text-align: center; + background-color: rgb(85, 49, 19); + color:white; + text-transform: uppercase; + font-size : 10px; + --notchSize: 7px; + + clip-path: + polygon( + 0% var(--notchSize), + var(--notchSize) 0%, + calc(100% - var(--notchSize)) 0%, + 100% var(--notchSize), + 100% calc(100% - var(--notchSize)), + calc(100% - var(--notchSize)) 100%, + var(--notchSize) 100%, + 0% calc(100% - var(--notchSize)) + ); + } + + .characteristic { + width: 50px; + height: 50px; + border-radius: 10px; + border: 5px double rgb(85, 49, 19); + margin: auto; + position: relative; + + .characteristic-value { + input { + height: 40px; + border: 0; + font-size: 30px; + text-align: center; + } + input:focus { + box-shadow: 0 0 5px rgb(125, 169, 194); + background-color: rgb(125, 169, 194); + border-radius: 5px; + } + } + + + } + } + + .item-name { + margin:0; + padding-bottom:0 !important; + } + + .grid { + margin-top: 0; + } + + .block-background { + background-color: rgb(233, 192, 158); + } + + .attribute { + position: relative; + padding: 0; + z-index: 1; + border:0; + + .block-background-shadow { + top: 36px; + } + + .block-background { + padding: 5px 5px; + } + + .block-title { + line-height: initial; + background-color: rgb(85, 49, 19); + color: white; + font-size: 13px; + text-transform: uppercase; + margin:auto; + + --notchSize: 8px; + clip-path: + polygon( + 0% var(--notchSize), + var(--notchSize) 0%, + calc(100% - var(--notchSize)) 0%, + 100% var(--notchSize), + 100% calc(100% - var(--notchSize)), + calc(100% - var(--notchSize)) 100%, + var(--notchSize) 100%, + 0% calc(100% - var(--notchSize)) + ); + } + + .block-attribute { + + select { + &:focus { + box-shadow: 0 0 5px rgb(125, 169, 194); + background-color: rgb(125, 169, 194); + } + } + + .block-value { + display: inline-block; + } + } + + .block-value { + + textarea { + resize:none; + font-family: 'Roboto'; + border : 0; + + &:focus { + box-shadow: 0 0 5px rgb(125, 169, 194); + background-color: rgb(125, 169, 194); + outline: none; + } + } + + &.block-single { + input { + width: 100%; + padding: 6px; + } + } + + input { + border:0; + font-size:14px; + + &:focus { + box-shadow: 0 0 5px rgb(125, 169, 194); + background-color: rgb(125, 169, 194); + } + } + } + + .shadow-text { + position: absolute; + top: 5px; + font-size: 9px; + left: 50%; + transform: translateX(-50%); + } + + .shadow-left { + background-color: rgb(73, 12, 11); + width: 50%; + height: 100%; + float:left; + position: relative; + padding-top: 25px; + + .shadow-text { + color: white; + text-transform: uppercase; + } + } + + .shadow-right { + background-color: rgb(125, 169, 194); + width: 50%; + height: 100%; + float:right; + position: relative; + padding-top: 25px; + + .shadow-text { + color: black; + font-weight: bold; + text-transform: uppercase; + } + } + } + + .resource { + line-height: 30px; + width: 110px; + + &.split { + width: 130px; + } + &.single { + width: 100px; + } + &.double { + width: 235px; + } + + input { + width: 45px; + } + } + + .tabs { + height : 20px; + border: 0; + + .item { + line-height: 10px; + } + } + +} \ No newline at end of file diff --git a/scss/components/_itemweaponsheet.scss b/scss/components/_itemweaponsheet.scss index 976213de..a468fb40 100644 --- a/scss/components/_itemweaponsheet.scss +++ b/scss/components/_itemweaponsheet.scss @@ -6,10 +6,11 @@ .charname { width: 100%; + input { color: rgb(19, 65, 3); border: 0; - + &:focus { box-shadow: 0 0 5px rgb(125, 169, 194); background-color: rgb(125, 169, 194); diff --git a/scss/starwarsffg.scss b/scss/starwarsffg.scss index c4ace1a6..8532b0c0 100644 --- a/scss/starwarsffg.scss +++ b/scss/starwarsffg.scss @@ -21,4 +21,5 @@ @import 'components/talents'; @import 'components/biography'; @import 'components/itemweaponsheet'; + @import 'components/itemarmorsheet'; } \ No newline at end of file diff --git a/styles/starwarsffg.css b/styles/starwarsffg.css index c6f438ee..095e796f 100644 --- a/styles/starwarsffg.css +++ b/styles/starwarsffg.css @@ -950,3 +950,206 @@ .starwarsffg .item-sheet-weapon .tabs .item { line-height: 10px; } + +.starwarsffg .item-sheet-armor .header-fields { + height: 340px; +} + +.starwarsffg .item-sheet-armor .charname { + width: 100%; +} + +.starwarsffg .item-sheet-armor .charname input { + color: #553113; + border: 0; +} + +.starwarsffg .item-sheet-armor .charname input:focus { + box-shadow: 0 0 5px #7da9c2; + background-color: #7da9c2; +} + +.starwarsffg .item-sheet-armor .characteristic-item { + border: 0; + position: relative; + padding: 0; + margin: 0 5px; +} + +.starwarsffg .item-sheet-armor .characteristic-item .characteristic-label { + margin-top: 5px; + width: 100%; + text-align: center; + background-color: #553113; + color: white; + text-transform: uppercase; + font-size: 10px; + --notchSize: 7px; + -webkit-clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); + clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); +} + +.starwarsffg .item-sheet-armor .characteristic-item .characteristic { + width: 50px; + height: 50px; + border-radius: 10px; + border: 5px double #553113; + margin: auto; + position: relative; +} + +.starwarsffg .item-sheet-armor .characteristic-item .characteristic .characteristic-value input { + height: 40px; + border: 0; + font-size: 30px; + text-align: center; +} + +.starwarsffg .item-sheet-armor .characteristic-item .characteristic .characteristic-value input:focus { + box-shadow: 0 0 5px #7da9c2; + background-color: #7da9c2; + border-radius: 5px; +} + +.starwarsffg .item-sheet-armor .item-name { + margin: 0; + padding-bottom: 0 !important; +} + +.starwarsffg .item-sheet-armor .grid { + margin-top: 0; +} + +.starwarsffg .item-sheet-armor .block-background { + background-color: #e9c09e; +} + +.starwarsffg .item-sheet-armor .attribute { + position: relative; + padding: 0; + z-index: 1; + border: 0; +} + +.starwarsffg .item-sheet-armor .attribute .block-background-shadow { + top: 36px; +} + +.starwarsffg .item-sheet-armor .attribute .block-background { + padding: 5px 5px; +} + +.starwarsffg .item-sheet-armor .attribute .block-title { + line-height: initial; + background-color: #553113; + color: white; + font-size: 13px; + text-transform: uppercase; + margin: auto; + --notchSize: 8px; + -webkit-clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); + clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); +} + +.starwarsffg .item-sheet-armor .attribute .block-attribute select:focus { + box-shadow: 0 0 5px #7da9c2; + background-color: #7da9c2; +} + +.starwarsffg .item-sheet-armor .attribute .block-attribute .block-value { + display: inline-block; +} + +.starwarsffg .item-sheet-armor .attribute .block-value textarea { + resize: none; + font-family: 'Roboto'; + border: 0; +} + +.starwarsffg .item-sheet-armor .attribute .block-value textarea:focus { + box-shadow: 0 0 5px #7da9c2; + background-color: #7da9c2; + outline: none; +} + +.starwarsffg .item-sheet-armor .attribute .block-value.block-single input { + width: 100%; + padding: 6px; +} + +.starwarsffg .item-sheet-armor .attribute .block-value input { + border: 0; + font-size: 14px; +} + +.starwarsffg .item-sheet-armor .attribute .block-value input:focus { + box-shadow: 0 0 5px #7da9c2; + background-color: #7da9c2; +} + +.starwarsffg .item-sheet-armor .attribute .shadow-text { + position: absolute; + top: 5px; + font-size: 9px; + left: 50%; + transform: translateX(-50%); +} + +.starwarsffg .item-sheet-armor .attribute .shadow-left { + background-color: #490c0b; + width: 50%; + height: 100%; + float: left; + position: relative; + padding-top: 25px; +} + +.starwarsffg .item-sheet-armor .attribute .shadow-left .shadow-text { + color: white; + text-transform: uppercase; +} + +.starwarsffg .item-sheet-armor .attribute .shadow-right { + background-color: #7da9c2; + width: 50%; + height: 100%; + float: right; + position: relative; + padding-top: 25px; +} + +.starwarsffg .item-sheet-armor .attribute .shadow-right .shadow-text { + color: black; + font-weight: bold; + text-transform: uppercase; +} + +.starwarsffg .item-sheet-armor .resource { + line-height: 30px; + width: 110px; +} + +.starwarsffg .item-sheet-armor .resource.split { + width: 130px; +} + +.starwarsffg .item-sheet-armor .resource.single { + width: 100px; +} + +.starwarsffg .item-sheet-armor .resource.double { + width: 235px; +} + +.starwarsffg .item-sheet-armor .resource input { + width: 45px; +} + +.starwarsffg .item-sheet-armor .tabs { + height: 20px; + border: 0; +} + +.starwarsffg .item-sheet-armor .tabs .item { + line-height: 10px; +} diff --git a/templates/items/ffg-armour-sheet.html b/templates/items/ffg-armour-sheet.html index 0df91f1c..c44fcf1b 100644 --- a/templates/items/ffg-armour-sheet.html +++ b/templates/items/ffg-armour-sheet.html @@ -1,41 +1,96 @@ -
                  +
                  - -
                  -
                  +
                  +
                  + +
                  +
                  +

                  -
                  -
                  - - -
                  -
                  - - -
                  -
                  - - -
                  -
                  - - +
                  +
                  +
                  +
                  +
                  + +
                  +
                  +
                  + {{localize "SWFFG.ItemArmorDefense"}} +
                  +
                  +
                  +
                  +
                  + +
                  +
                  +
                  + {{localize "SWFFG.ItemsSoak"}} +
                  +
                  +
                  +
                  +
                  + +
                  +
                  +
                  + {{localize "SWFFG.ItemWeaponEncumbrance"}} +
                  +
                  +
                  +
                  +
                  + +
                  +
                  +
                  + {{localize "SWFFG.ItemWeaponHardPoints"}} +
                  +
                  +
                  +
                  +
                  + +
                  +
                  +
                  + {{localize "SWFFG.ItemWeaponRarity"}} +
                  +
                  -
                  - - -
                  -
                  - - -
                  -
                  - - + +
                  +
                  +
                  +
                  +
                  + {{localize "SWFFG.ItemWeaponPrice"}} +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  + {{localize "SWFFG.ItemWeaponQuantity"}} +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  {{!-- Sheet Tab Navigation --}} From 4c75221dda0deb43752acf0e0158152401e299d2 Mon Sep 17 00:00:00 2001 From: Chris Stadther Date: Mon, 1 Jun 2020 21:41:51 -0400 Subject: [PATCH 36/44] restyled gear sheet (#6) --- modules/items/item-sheet-ffg.js | 1 + scss/components/_itemgearsheet.scss | 238 ++++++++++++++++++++++++++++ scss/starwarsffg.scss | 1 + styles/starwarsffg.css | 203 ++++++++++++++++++++++++ templates/items/ffg-gear-sheet.html | 78 ++++++--- 5 files changed, 501 insertions(+), 20 deletions(-) create mode 100644 scss/components/_itemgearsheet.scss diff --git a/modules/items/item-sheet-ffg.js b/modules/items/item-sheet-ffg.js index ab31a422..5b1ccab4 100644 --- a/modules/items/item-sheet-ffg.js +++ b/modules/items/item-sheet-ffg.js @@ -35,6 +35,7 @@ export class ItemSheetFFG extends ItemSheet { this.position.height = 650; break; case "armour": + case "gear": this.position.width = 385; this.position.height = 575; break; diff --git a/scss/components/_itemgearsheet.scss b/scss/components/_itemgearsheet.scss new file mode 100644 index 00000000..cfecc6c5 --- /dev/null +++ b/scss/components/_itemgearsheet.scss @@ -0,0 +1,238 @@ +.item-sheet-gear { + + .header-fields { + height: 340px; + } + + .charname { + width: 100%; + + input { + color: rgb(44, 3, 68); + border: 0; + + &:focus { + box-shadow: 0 0 5px rgb(125, 169, 194); + background-color: rgb(125, 169, 194); + } + } + + } + + .characteristic-item { + border:0; + position: relative; + padding:0; + margin: 0 5px; + + .characteristic-label { + margin-top: 5px; + width: 100%; + text-align: center; + background-color: rgb(44, 3, 68); + color:white; + text-transform: uppercase; + font-size : 10px; + --notchSize: 7px; + + clip-path: + polygon( + 0% var(--notchSize), + var(--notchSize) 0%, + calc(100% - var(--notchSize)) 0%, + 100% var(--notchSize), + 100% calc(100% - var(--notchSize)), + calc(100% - var(--notchSize)) 100%, + var(--notchSize) 100%, + 0% calc(100% - var(--notchSize)) + ); + } + + .characteristic { + width: 50px; + height: 50px; + border-radius: 10px; + border: 5px double rgb(44, 3, 68); + margin: auto; + position: relative; + + .characteristic-value { + input { + height: 40px; + border: 0; + font-size: 30px; + text-align: center; + } + input:focus { + box-shadow: 0 0 5px rgb(125, 169, 194); + background-color: rgb(125, 169, 194); + border-radius: 5px; + } + } + + + } + } + + .item-name { + margin:0; + padding-bottom:0 !important; + } + + .grid { + margin-top: 0; + } + + .block-background { + background-color: rgb(233, 198, 253); + } + + .attribute { + position: relative; + padding: 0; + z-index: 1; + border:0; + + .block-background-shadow { + top: 36px; + } + + .block-background { + padding: 5px 5px; + } + + .block-title { + line-height: initial; + background-color: rgb(44, 3, 68); + color: white; + font-size: 13px; + text-transform: uppercase; + margin:auto; + + --notchSize: 8px; + clip-path: + polygon( + 0% var(--notchSize), + var(--notchSize) 0%, + calc(100% - var(--notchSize)) 0%, + 100% var(--notchSize), + 100% calc(100% - var(--notchSize)), + calc(100% - var(--notchSize)) 100%, + var(--notchSize) 100%, + 0% calc(100% - var(--notchSize)) + ); + } + + .block-attribute { + + select { + &:focus { + box-shadow: 0 0 5px rgb(125, 169, 194); + background-color: rgb(125, 169, 194); + } + } + + .block-value { + display: inline-block; + } + } + + .block-value { + + textarea { + resize:none; + font-family: 'Roboto'; + border : 0; + + &:focus { + box-shadow: 0 0 5px rgb(125, 169, 194); + background-color: rgb(125, 169, 194); + outline: none; + } + } + + &.block-single { + input { + width: 100%; + padding: 6px; + } + } + + input { + border:0; + font-size:14px; + + &:focus { + box-shadow: 0 0 5px rgb(125, 169, 194); + background-color: rgb(125, 169, 194); + } + } + } + + .shadow-text { + position: absolute; + top: 5px; + font-size: 9px; + left: 50%; + transform: translateX(-50%); + } + + .shadow-left { + background-color: rgb(73, 12, 11); + width: 50%; + height: 100%; + float:left; + position: relative; + padding-top: 25px; + + .shadow-text { + color: white; + text-transform: uppercase; + } + } + + .shadow-right { + background-color: rgb(125, 169, 194); + width: 50%; + height: 100%; + float:right; + position: relative; + padding-top: 25px; + + .shadow-text { + color: black; + font-weight: bold; + text-transform: uppercase; + } + } + } + + .resource { + line-height: 30px; + width: 110px; + + &.split { + width: 130px; + } + &.single { + width: 100px; + } + &.double { + width: 235px; + } + + input { + width: 45px; + } + } + + .tabs { + height : 20px; + border: 0; + + .item { + line-height: 10px; + } + } + +} \ No newline at end of file diff --git a/scss/starwarsffg.scss b/scss/starwarsffg.scss index 8532b0c0..1f922f09 100644 --- a/scss/starwarsffg.scss +++ b/scss/starwarsffg.scss @@ -22,4 +22,5 @@ @import 'components/biography'; @import 'components/itemweaponsheet'; @import 'components/itemarmorsheet'; + @import 'components/itemgearsheet'; } \ No newline at end of file diff --git a/styles/starwarsffg.css b/styles/starwarsffg.css index 095e796f..ee91cf6b 100644 --- a/styles/starwarsffg.css +++ b/styles/starwarsffg.css @@ -1153,3 +1153,206 @@ .starwarsffg .item-sheet-armor .tabs .item { line-height: 10px; } + +.starwarsffg .item-sheet-gear .header-fields { + height: 340px; +} + +.starwarsffg .item-sheet-gear .charname { + width: 100%; +} + +.starwarsffg .item-sheet-gear .charname input { + color: #2c0344; + border: 0; +} + +.starwarsffg .item-sheet-gear .charname input:focus { + box-shadow: 0 0 5px #7da9c2; + background-color: #7da9c2; +} + +.starwarsffg .item-sheet-gear .characteristic-item { + border: 0; + position: relative; + padding: 0; + margin: 0 5px; +} + +.starwarsffg .item-sheet-gear .characteristic-item .characteristic-label { + margin-top: 5px; + width: 100%; + text-align: center; + background-color: #2c0344; + color: white; + text-transform: uppercase; + font-size: 10px; + --notchSize: 7px; + -webkit-clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); + clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); +} + +.starwarsffg .item-sheet-gear .characteristic-item .characteristic { + width: 50px; + height: 50px; + border-radius: 10px; + border: 5px double #2c0344; + margin: auto; + position: relative; +} + +.starwarsffg .item-sheet-gear .characteristic-item .characteristic .characteristic-value input { + height: 40px; + border: 0; + font-size: 30px; + text-align: center; +} + +.starwarsffg .item-sheet-gear .characteristic-item .characteristic .characteristic-value input:focus { + box-shadow: 0 0 5px #7da9c2; + background-color: #7da9c2; + border-radius: 5px; +} + +.starwarsffg .item-sheet-gear .item-name { + margin: 0; + padding-bottom: 0 !important; +} + +.starwarsffg .item-sheet-gear .grid { + margin-top: 0; +} + +.starwarsffg .item-sheet-gear .block-background { + background-color: #e9c6fd; +} + +.starwarsffg .item-sheet-gear .attribute { + position: relative; + padding: 0; + z-index: 1; + border: 0; +} + +.starwarsffg .item-sheet-gear .attribute .block-background-shadow { + top: 36px; +} + +.starwarsffg .item-sheet-gear .attribute .block-background { + padding: 5px 5px; +} + +.starwarsffg .item-sheet-gear .attribute .block-title { + line-height: initial; + background-color: #2c0344; + color: white; + font-size: 13px; + text-transform: uppercase; + margin: auto; + --notchSize: 8px; + -webkit-clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); + clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); +} + +.starwarsffg .item-sheet-gear .attribute .block-attribute select:focus { + box-shadow: 0 0 5px #7da9c2; + background-color: #7da9c2; +} + +.starwarsffg .item-sheet-gear .attribute .block-attribute .block-value { + display: inline-block; +} + +.starwarsffg .item-sheet-gear .attribute .block-value textarea { + resize: none; + font-family: 'Roboto'; + border: 0; +} + +.starwarsffg .item-sheet-gear .attribute .block-value textarea:focus { + box-shadow: 0 0 5px #7da9c2; + background-color: #7da9c2; + outline: none; +} + +.starwarsffg .item-sheet-gear .attribute .block-value.block-single input { + width: 100%; + padding: 6px; +} + +.starwarsffg .item-sheet-gear .attribute .block-value input { + border: 0; + font-size: 14px; +} + +.starwarsffg .item-sheet-gear .attribute .block-value input:focus { + box-shadow: 0 0 5px #7da9c2; + background-color: #7da9c2; +} + +.starwarsffg .item-sheet-gear .attribute .shadow-text { + position: absolute; + top: 5px; + font-size: 9px; + left: 50%; + transform: translateX(-50%); +} + +.starwarsffg .item-sheet-gear .attribute .shadow-left { + background-color: #490c0b; + width: 50%; + height: 100%; + float: left; + position: relative; + padding-top: 25px; +} + +.starwarsffg .item-sheet-gear .attribute .shadow-left .shadow-text { + color: white; + text-transform: uppercase; +} + +.starwarsffg .item-sheet-gear .attribute .shadow-right { + background-color: #7da9c2; + width: 50%; + height: 100%; + float: right; + position: relative; + padding-top: 25px; +} + +.starwarsffg .item-sheet-gear .attribute .shadow-right .shadow-text { + color: black; + font-weight: bold; + text-transform: uppercase; +} + +.starwarsffg .item-sheet-gear .resource { + line-height: 30px; + width: 110px; +} + +.starwarsffg .item-sheet-gear .resource.split { + width: 130px; +} + +.starwarsffg .item-sheet-gear .resource.single { + width: 100px; +} + +.starwarsffg .item-sheet-gear .resource.double { + width: 235px; +} + +.starwarsffg .item-sheet-gear .resource input { + width: 45px; +} + +.starwarsffg .item-sheet-gear .tabs { + height: 20px; + border: 0; +} + +.starwarsffg .item-sheet-gear .tabs .item { + line-height: 10px; +} diff --git a/templates/items/ffg-gear-sheet.html b/templates/items/ffg-gear-sheet.html index bdf76fe6..667597a0 100644 --- a/templates/items/ffg-gear-sheet.html +++ b/templates/items/ffg-gear-sheet.html @@ -1,30 +1,68 @@ - +
                  -
                  -
                  -

                  +
                  +
                  -
                  -
                  - - +
                  +
                  +

                  -
                  - - -
                  -
                  - - -
                  -
                  - - +
                  +
                  +
                  +
                  +
                  + +
                  +
                  +
                  + {{localize "SWFFG.ItemWeaponEncumbrance"}} +
                  +
                  +
                  +
                  +
                  + +
                  +
                  +
                  + {{localize "SWFFG.ItemWeaponRarity"}} +
                  +
                  +
                  + +
                  +
                  +
                  +
                  +
                  + {{localize "SWFFG.ItemWeaponPrice"}} +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  + {{localize "SWFFG.ItemWeaponQuantity"}} +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  -
                  + + {{!-- Sheet Tab Navigation --}}
                  +
                  + {{!-- Sheet Tab Navigation --}} {{!-- Sheet Body --}} diff --git a/templates/items/ffg-talent-sheet.html b/templates/items/ffg-talent-sheet.html index 9251cf90..21716fa8 100644 --- a/templates/items/ffg-talent-sheet.html +++ b/templates/items/ffg-talent-sheet.html @@ -1,32 +1,60 @@ - +
                  -
                  -
                  +
                  + +
                  +

                  -
                  -
                  - - + +
                  +
                  +
                  +
                  +
                  + {{localize "SWFFG.TalentsActivation"}} +
                  +
                  + +
                  +
                  +
                  -
                  - + +
                  +
                  +
                  +
                  + {{localize "SWFFG.ItemTalentRanked"}} +
                  +
                  + +
                  +
                  +
                  -
                  - - {{#if data.ranks.ranked}} - - {{else}} - - {{/if}} +
                  +
                  +
                  +
                  + {{localize "SWFFG.TalentsRank"}} +
                  +
                  + {{#if data.ranks.ranked}} +
                  + {{else}} +
                  + {{/if}} +
                  +
                  +
                  From 390942d5b797f499de83bd382b20413fda578cff Mon Sep 17 00:00:00 2001 From: Jaxxa Date: Tue, 2 Jun 2020 20:28:06 +1000 Subject: [PATCH 38/44] Added Icons in the Dice roller, visually indicating the dice types. --- README.md | 1 + templates/roll-options.html | 9 ++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 59fbac40..89eb0cc1 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,7 @@ NICE TO HAVE: # Changelog +- 02/06/2020 - Jaxxa - Added Icons in the Dice roller, visually indicating the dice types. - 31/05/2020 - Esrin - Work in progress on the group management GM tool. Destiny Pool now working (will reset on page refresh). Player Character list under construction. - 31/05/2020 - Esrin - Bugfix to localisation hook for Gear Quantity on Character Sheet (thanks Alex | HDScurox for the bug report). - 31/05/2020 - CStadther - Added SASS configuration using Gulp. diff --git a/templates/roll-options.html b/templates/roll-options.html index fab17307..98252eac 100644 --- a/templates/roll-options.html +++ b/templates/roll-options.html @@ -2,30 +2,37 @@
                  + + + + + + - + + From 3cafffcbd8d29428cc1c09a2db8b84e02562c4ab Mon Sep 17 00:00:00 2001 From: Esrin Date: Tue, 2 Jun 2020 12:22:15 +0100 Subject: [PATCH 39/44] Minor bugfix to character sheet, soak value set to disabled for auto-calculation, encumbrance max and current values swapped to correct fields and current set to disabled for auto-calculation. --- README.md | 2 + system.json | 6 +- templates/actors/ffg-character-sheet.html | 114 +++++++++------------- 3 files changed, 53 insertions(+), 69 deletions(-) diff --git a/README.md b/README.md index 59fbac40..2e7cade4 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,8 @@ NICE TO HAVE: # Changelog +- 02/06/2020 - Esrin - Minor bugfix to character sheet, soak value set to disabled for auto-calculation, encumbrance max and current values swapped to correct fields and current set to disabled for auto-calculation. +- 02/06/2020 - CStadther - Major sheet restyling - 31/05/2020 - Esrin - Work in progress on the group management GM tool. Destiny Pool now working (will reset on page refresh). Player Character list under construction. - 31/05/2020 - Esrin - Bugfix to localisation hook for Gear Quantity on Character Sheet (thanks Alex | HDScurox for the bug report). - 31/05/2020 - CStadther - Added SASS configuration using Gulp. diff --git a/system.json b/system.json index f5211271..723e7c4b 100644 --- a/system.json +++ b/system.json @@ -2,11 +2,11 @@ "name": "starwarsffg", "title": "Star Wars FFG", "description": "A system for playing Star Wars FFG games.", - "version": 0.055, + "version": 0.06, "minimumCoreVersion": "0.5.6", "compatibleCoreVersion": "0.6.1", "templateVersion": 1, - "author": "Esrin", + "author": "Esrin and Jaxxa", "esmodules": ["modules/dice-pool-ffg.js", "modules/swffg-main.js"], "styles": ["styles/swffg.css", "styles/starwarsffg.css"], "packs": [ @@ -33,6 +33,6 @@ "secondaryTokenAttribute": "strain", "url": "https://github.com/Esrin/StarWarsFFG/tree/esrin-dev", "manifest": "https://raw.githubusercontent.com/Esrin/StarWarsFFG/esrin-dev/system.json", - "download": "https://github.com/Esrin/StarWarsFFG/releases/download/esrin-dev_0.05/esrin-dev_0.055.zip", + "download": "https://github.com/Esrin/StarWarsFFG/releases/download/esrin-dev_0.06/esrin-dev_0.060.zip", "license": "LICENSE.txt" } diff --git a/templates/actors/ffg-character-sheet.html b/templates/actors/ffg-character-sheet.html index 9e5ee2a4..09ab6b9f 100644 --- a/templates/actors/ffg-character-sheet.html +++ b/templates/actors/ffg-character-sheet.html @@ -13,35 +13,32 @@
                  -
                  -

                  -
                  +
                  +

                  +
                  - -
                  -
                  -
                  {{localize "SWFFG.Species"}}:
                  -
                  -
                  -
                  -
                  {{localize "SWFFG.Career"}}:
                  -
                  -
                  -
                  -
                  {{localize "SWFFG.Specializations"}}:
                  -
                  -
                  +
                  +
                  +
                  {{localize "SWFFG.Species"}}:
                  +
                  - +
                  +
                  {{localize "SWFFG.Career"}}:
                  +
                  +
                  +
                  +
                  {{localize "SWFFG.Specializations"}}:
                  +
                  +
                  +
                  - + {{!-- Primary Stats Container --}} - +
                  -
                  {{!-- Wounds Box --}}
                  @@ -51,8 +48,8 @@

                  -
                  -
                  +
                  +

                  @@ -74,8 +71,8 @@

                  -
                  -
                  +
                  +

                  @@ -97,11 +94,10 @@

                  -
                  +

                  -
                  -
                  +
                  @@ -113,8 +109,8 @@

                  -
                  -
                  +
                  +
                  @@ -126,8 +122,6 @@

                  - -
                  - -
                  - -
                  - - - + + +

                  + +
                  + +
                  + +
                  @@ -290,8 +284,7 @@

                  {{localize "SWFFG.ForcePool"}}

                  {{!-- Owned Items Tab --}}
                  -
                  - +
                  {{!-- Encumbrance Box --}}
                  @@ -300,8 +293,8 @@

                  {{localize "SWFFG.ForcePool"}}

                  {{localize "SWFFG.Encumbrance"}}
                  -
                  -
                  +
                  +
                  @@ -326,8 +319,7 @@

                  {{localize "SWFFG.ForcePool"}}

                  -
                  -
                  +
                  @@ -443,11 +435,7 @@

                  {{localize "SWFFG.ForcePool"}}

                  Proficiency
                  Ability
                  Challenge
                  Difficulty
                  Boost
                  Setback
                  Force
                  {{item.data.activation.value}} - {{#if item.data.ranks.ranked}} - {{item.data.ranks.current}} - {{else}} - N/A - {{/if}} + {{#if item.data.ranks.ranked}} {{item.data.ranks.current}} {{else}} N/A {{/if}}
                  @@ -467,8 +455,7 @@

                  {{localize "SWFFG.ForcePool"}}

                  {{editor content=data.biography target="data.biography" button=true owner=owner editable=editable}} {{!-- Footer info --}}
                  -
                  - +
                  {{!-- Experience Box --}}
                  @@ -477,8 +464,8 @@

                  {{localize "SWFFG.ForcePool"}}

                  {{localize "SWFFG.DescriptionXP"}}
                  -
                  -
                  +
                  +
                  @@ -503,8 +490,7 @@

                  {{localize "SWFFG.ForcePool"}}

                  -
                  -
                  +
                  @@ -519,8 +505,7 @@

                  {{localize "SWFFG.ForcePool"}}

                  -
                  -
                  +
                  @@ -535,8 +520,7 @@

                  {{localize "SWFFG.ForcePool"}}

                  -
                  -
                  +
                  @@ -551,12 +535,10 @@

                  {{localize "SWFFG.ForcePool"}}

                  -
                  -
                  +
                  - {{!-- Modifiers Tab --}} @@ -572,7 +554,7 @@

                  {{localize "SWFFG.ForcePool"}}

                    {{#each data.attributes as |attr key|}}
                  1. - + - - - - - - {{!-- Primary Stats Container --}} -
                    - -
                    - {{!-- Wounds Box --}} -
                    -
                    -

                    {{localize "SWFFG.Wounds"}}

                    -
                    -
                    - - -
                    -
                    -
                    - - -
                    -
                    -
                    -
                    - - {{!-- Strain Box --}} -
                    -
                    -

                    {{localize "SWFFG.Strain"}}

                    -
                    -
                    - - -
                    -
                    -
                    - - -
                    -
                    -
                    -
                    - - {{!-- Soak Box --}} -
                    -
                    -

                    {{localize "SWFFG.Soak"}}

                    -
                    -
                    - - -
                    -
                    -
                    -
                    - - {{!-- Defence Box --}} -
                    -
                    -

                    {{localize "SWFFG.Defense"}}

                    -
                    -
                    - - -
                    -
                    -
                    - - -
                    -
                    -
                    -
                    - - {{!-- Force Box --}} -
                    -
                    -

                    {{localize "SWFFG.ForcePool"}}

                    -
                    -
                    - - -
                    -
                    -
                    - - -
                    -
                    -
                    -
                    - - {{!-- Encumbrance Box --}} -
                    -
                    -

                    {{localize "SWFFG.Encumbrance"}}

                    -
                    -
                    - - -
                    -
                    -
                    -
                    -
                    -
                    - - - - {{!-- Sheet Tab Navigation --}} - - - {{!-- Sheet Body --}} -
                    - {{!-- Characteristics Tab --}} -
                    - {{!-- Characteristics Scores --}} - -
                      - {{#each data.characteristics as |characteristic id|}} -
                    • - {{!-- If we set the type to text, we don't have to deal with hiding the number controls --}} - - -
                    • - {{/each}} -
                    - -
                    -
                    - -

                    {{localize "SWFFG.SkillsGeneral"}}

                    - - - - - - - - - - {{#each data.skills as |skill id|}} {{#iff skill.type '==' 'General'}} - - - - - - - {{/iff}} {{/each}} - -
                    {{localize "SWFFG.SkillsName"}} - {{localize "SWFFG.SkillsCS"}} -
                    {{localize "SWFFG.SkillsCareerSkill"}}
                    -
                    {{localize "SWFFG.SkillsRank"}}{{localize "SWFFG.SkillsRoll"}}
                    {{id}} {{#with (lookup ../this.data.characteristics [characteristic])~}} ({{abrev}}) {{/with}} - - - - - -
                    -
                    -
                    -
                    - -

                    {{localize "SWFFG.SkillsCombat"}}

                    - - - - - - - - - - {{#each data.skills as |skill id|}} {{#iff skill.type '==' 'Combat'}} - - - - - - - {{/iff}} {{/each}} - -
                    {{localize "SWFFG.SkillsName"}} - {{localize "SWFFG.SkillsCS"}} -
                    {{localize "SWFFG.SkillsCareerSkill"}}
                    -
                    {{localize "SWFFG.SkillsRank"}}{{localize "SWFFG.SkillsRoll"}}
                    {{id}} {{#with (lookup ../this.data.characteristics [characteristic])~}} ({{abrev}}) {{/with}} - - - - - -
                    -
                    - -

                    {{localize "SWFFG.SkillsKnowledge"}}

                    - - - - - - - - - - {{#each data.skills as |skill id|}} {{#iff skill.type '==' 'Knowledge'}} - - - - - - - {{/iff}} {{/each}} - -
                    {{localize "SWFFG.SkillsName"}} - {{localize "SWFFG.SkillsCS"}} -
                    {{localize "SWFFG.SkillsCareerSkill"}}
                    -
                    {{localize "SWFFG.SkillsRank"}}{{localize "SWFFG.SkillsRoll"}}
                    {{lookup ../this.FFG.skills.knowledgestripped [id]~}} {{#with (lookup ../this.data.characteristics [characteristic])~}} ({{abrev}}) {{/with}} - - - - - -
                    -
                    -
                    -
                    -
                    - - {{!-- Owned Items Tab --}} -
                    - {{!-- Weapons List --}} - -

                    - - - - - - - - - - - - - - {{#each actor.items as |item id|}} {{#iff item.type '==' 'weapon'}} - - - - - - - - - - - {{/iff}} {{/each}} - -
                    {{localize "SWFFG.ItemsName"}}{{localize "SWFFG.ItemsSkill"}}{{localize "SWFFG.ItemsDamage"}}{{localize "SWFFG.ItemsRange"}}{{localize "SWFFG.ItemsCrit"}}{{localize "SWFFG.ItemsSpecial"}}{{localize "SWFFG.ItemsEncum"}}Del
                    {{item.name}}{{lookup ../this.FFG.combat_skills.abrev item.data.skill.value}}{{item.data.damage.value}}{{item.data.range.value}}{{item.data.crit.value}}{{item.data.special.value}}{{item.data.encumbrance.value}} - - -
                    - - {{!-- Armour List --}} - -

                    - - - - - - - - - - - - {{#each actor.items as |item id|}} {{#iff item.type '==' 'armour'}} - - - - - - - - - {{/iff}} {{/each}} - -
                    {{localize "SWFFG.ItemsName"}}{{localize "SWFFG.ItemsDefense"}}{{localize "SWFFG.ItemsSoak"}}{{localize "SWFFG.ItemsHP"}}{{localize "SWFFG.ItemsEncum"}}Del
                    {{item.name}}{{item.data.defence.value}}{{item.data.soak.value}}{{item.data.hardpoints.value}}{{item.data.encumbrance.value}} - - -
                    - - {{!-- Gear List --}} - -

                    - - - - - - - - - - - - {{#each actor.items as |item id|}} {{#iff item.type '==' 'gear'}} - - - - - - - - - {{/iff}} {{/each}} - -
                    {{localize "SWFFG.ItemsName"}}{{localize "SWFFG.ItemsPrice"}}{{localize "SWFFG.ItemsRarity"}}{{localize "SWFFG.ItemsQty"}}{{localize "SWFFG.ItemsEncum"}}Del
                    {{item.name}}{{item.data.price.value}}{{item.data.rarity.value}}{{item.data.quantity.value}}{{item.data.encumbrance.value}} - - -
                    -
                    - - {{!-- Talents Tab --}} -
                    - {{!-- Talents List --}} -
                    -

                    -
                    - {{localize "SWFFG.TalentsName"}} - {{localize "SWFFG.TalentsActivation"}} - {{localize "SWFFG.TalentsRank"}} - Del -
                    -
                      - {{#each actor.items as |item id|}} {{#iff item.type '==' 'talent'}} -
                    1. -

                      - {{item.name}} -
                      {{item.safe_desc}}
                      -

                      - - {{#if item.data.ranks.ranked}} - - {{else}} - - {{/if}} -
                      - - -
                      -
                    2. - {{/iff}} {{/each}} -
                    -
                    -
                    - - {{!-- Biography Tab --}} -
                    - {{editor content=data.biography target="data.biography" button=true owner=owner editable=editable}} {{!-- Footer info --}} -
                    - {{!-- XP Box --}} -
                    -

                    {{localize "SWFFG.DescriptionXP"}}

                    -
                    -
                    - - -
                    -
                    -
                    - - -
                    -
                    -
                    - - {{!-- Credits Box --}} -
                    -
                    -
                    -

                    {{localize "SWFFG.DescriptionCredits"}}

                    - -
                    -
                    -
                    - - {{!-- Obligation Box --}} -
                    -

                    {{localize "SWFFG.DescriptionObligation"}}

                    -
                    -
                    - -
                    -
                    -
                    - - {{!-- Duty Box --}} -
                    -

                    {{localize "SWFFG.DescriptionDuty"}}

                    -
                    -
                    - -
                    -
                    -
                    - - {{!-- Morality Box --}} -
                    -

                    {{localize "SWFFG.DescriptionMorality"}}

                    -
                    -
                    - -
                    -
                    -
                    - - {{!-- Conflict Box --}} -
                    -

                    {{localize "SWFFG.DescriptionConflict"}}

                    -
                    -
                    - -
                    -
                    -
                    -
                    -
                    - - {{!-- Modifiers Tab --}} -
                    -
                    - - Mod Type - Modifier - Value - -
                    - -
                      - {{#each data.attributes as |attr key|}} -
                    1. - - - - - - -
                    2. - {{/each}} -
                    -
                    -
                    - +
                    + {{!-- Sheet Header --}} +
                    + + +
                    + {{!-- Character Details Container --}} +
                    +
                    +
                    + +
                    +
                    +
                    +
                    +
                    +

                    +
                    +
                    +
                    +
                    +
                    +
                    {{localize "SWFFG.Species"}}:
                    +
                    +
                    +
                    +
                    {{localize "SWFFG.Career"}}:
                    +
                    +
                    +
                    +
                    {{localize "SWFFG.Specializations"}}:
                    +
                    +
                    +
                    +
                    +
                    +
                    + + {{!-- Primary Stats Container --}} + +
                    +
                    + {{!-- Wounds Box --}} +
                    +
                    +
                    +
                    + {{localize "SWFFG.Wounds"}} +
                    +
                    +
                    +
                    +
                    +
                    +
                    +
                    +
                    {{localize "SWFFG.Threshold"}}
                    +
                    +
                    +
                    {{localize "SWFFG.Current"}}
                    +
                    +
                    +
                    +
                    + + {{!-- Strain Box --}} +
                    +
                    +
                    +
                    + {{localize "SWFFG.Strain"}} +
                    +
                    +
                    +
                    +
                    +
                    +
                    +
                    +
                    {{localize "SWFFG.Threshold"}}
                    +
                    +
                    +
                    {{localize "SWFFG.Current"}}
                    +
                    +
                    +
                    +
                    + + {{!-- Soak Box --}} +
                    +
                    +
                    +
                    + {{localize "SWFFG.Soak"}} +
                    +
                    +
                    +
                    +
                    +
                    +
                    +
                    + + {{!-- Defence Box --}} +
                    +
                    +
                    +
                    + {{localize "SWFFG.Defense"}} +
                    +
                    +
                    +
                    +
                    +
                    +
                    +
                    +
                    {{localize "SWFFG.DefenseRanged"}}
                    +
                    +
                    +
                    {{localize "SWFFG.DefenseMelee"}}
                    +
                    +
                    +
                    +
                    + + +
                    +
                    +
                    +
                    + + {{!-- Sheet Tab Navigation --}} + + + {{!-- Sheet Body --}} +
                    + {{!-- Characteristics Tab --}} +
                    + {{!-- Characteristics Scores --}} + +
                    + {{#each data.characteristics as |characteristic id|}} +
                    +
                    +
                    + +
                    +
                    +
                    + {{characteristic.label}} +
                    +
                    + {{/each}} +
                    + +
                    +
                    + + + +
                    + +
                    + +
                    + + +
                    +
                    +
                    + + + + + + + + + {{#each data.skills as |skill id|}} {{#iff skill.type '==' 'General'}} + + + + + + + {{/iff}} {{/each}} + +
                    {{localize "SWFFG.SkillsGeneral"}} + {{localize "SWFFG.SkillsCS"}} +
                    {{localize "SWFFG.SkillsCareerSkill"}}
                    +
                    {{localize "SWFFG.SkillsRank"}}{{localize "SWFFG.SkillsRoll"}}
                    {{id}} {{#with (lookup ../this.data.characteristics [characteristic])~}} ({{abrev}}) {{/with}} + + + + + +
                    +
                    +
                    +
                    + + + + + + + + + {{#each data.skills as |skill id|}} {{#iff skill.type '==' 'Combat'}} + + + + + + + {{/iff}} {{/each}} + +
                    {{localize "SWFFG.SkillsCombat"}} + {{localize "SWFFG.SkillsCS"}} +
                    {{localize "SWFFG.SkillsCareerSkill"}}
                    +
                    {{localize "SWFFG.SkillsRank"}}{{localize "SWFFG.SkillsRoll"}}
                    {{id}} {{#with (lookup ../this.data.characteristics [characteristic])~}} ({{abrev}}) {{/with}} + + + + + +
                    +
                    + + + + + + + + + {{#each data.skills as |skill id|}} {{#iff skill.type '==' 'Knowledge'}} + + + + + + + {{/iff}} {{/each}} + +
                    {{localize "SWFFG.SkillsKnowledge"}} + {{localize "SWFFG.SkillsCS"}} +
                    {{localize "SWFFG.SkillsCareerSkill"}}
                    +
                    {{localize "SWFFG.SkillsRank"}}{{localize "SWFFG.SkillsRoll"}}
                    {{lookup ../this.FFG.skills.knowledgestripped [id]~}} {{#with (lookup ../this.data.characteristics [characteristic])~}} ({{abrev}}) {{/with}} + + + + + +
                    +
                    +
                    +
                    +
                    + + {{!-- Owned Items Tab --}} +
                    +
                    + {{!-- Encumbrance Box --}} +
                    +
                    +
                    +
                    + {{localize "SWFFG.Encumbrance"}} +
                    +
                    +
                    +
                    +
                    +
                    +
                    +
                    +
                    {{localize "SWFFG.Current"}}
                    +
                    +
                    +
                    {{localize "SWFFG.Threshold"}}
                    +
                    +
                    +
                    +
                    + + {{!-- Credits Box --}} +
                    +
                    +
                    +
                    + {{localize "SWFFG.DescriptionCredits"}} +
                    +
                    +
                    +
                    +
                    +
                    +
                    +
                    +
                    + + {{!-- Weapons List --}} + + + + + + + + + + + + + {{#each actor.items as |item id|}} {{#iff item.type '==' 'weapon'}} + + + + + + + + + + + {{/iff}} {{/each}} + +
                    {{localize "SWFFG.ItemsWeapons"}}{{localize "SWFFG.ItemsSkill"}}{{localize "SWFFG.ItemsDamage"}}{{localize "SWFFG.ItemsRange"}}{{localize "SWFFG.ItemsCrit"}}{{localize "SWFFG.ItemsEncum"}}{{localize "SWFFG.ItemsSpecial"}}
                    {{item.name}}{{lookup ../this.FFG.combat_skills.abrev item.data.skill.value}}{{item.data.damage.value}}{{item.data.range.value}}{{item.data.crit.value}}{{item.data.encumbrance.value}}{{item.data.special.value}} + + +
                    + + {{!-- Armour List --}} + + + + + + + + + + + + + {{#each actor.items as |item id|}} {{#iff item.type '==' 'armour'}} + + + + + + + + + {{/iff}} {{/each}} + +
                    {{localize "SWFFG.ItemsArmor"}}{{localize "SWFFG.ItemsDefense"}}{{localize "SWFFG.ItemsSoak"}}{{localize "SWFFG.ItemsHP"}}{{localize "SWFFG.ItemsEncum"}}
                    {{item.name}}{{item.data.defence.value}}{{item.data.soak.value}}{{item.data.hardpoints.value}}{{item.data.encumbrance.value}} + + +
                    + + {{!-- Gear List --}} + + + + + + + + + + + + + {{#each actor.items as |item id|}} {{#iff item.type '==' 'gear'}} + + + + + + + + + {{/iff}} {{/each}} + +
                    {{localize "SWFFG.ItemsGear"}}{{localize "SWFFG.ItemsPrice"}}{{localize "SWFFG.ItemsRarity"}}{{localize "SWFFG.ItemsQuantity"}}{{localize "SWFFG.ItemsEncum"}}
                    {{item.name}}{{item.data.price.value}}{{item.data.rarity.value}}{{item.data.quantity.value}}{{item.data.encumbrance.value}} + + +
                    +
                    + + {{!-- Talents Tab --}} +
                    + {{!-- Talents List --}} + + + + + + + + + + + {{#each actor.items as |item id|}} {{#iff item.type '==' 'talent'}} + + + + + + + {{/iff}} {{/each}} + +
                    {{localize "SWFFG.Talents"}}{{localize "SWFFG.TalentsActivation"}}{{localize "SWFFG.TalentsRank"}}
                    + {{item.name}} +
                    {{item.safe_desc}}
                    +
                    {{item.data.activation.value}} + {{#if item.data.ranks.ranked}} {{item.data.ranks.current}} {{else}} N/A {{/if}} + +
                    + + +
                    +
                    +
                    + + {{!-- Biography Tab --}} +
                    +
                    + {{editor content=data.biography target="data.biography" button=true owner=owner editable=editable}} {{!-- Footer info --}} +
                    + +
                    + {{!-- Experience Box --}} +
                    +
                    +
                    +
                    + {{localize "SWFFG.DescriptionXP"}} +
                    +
                    +
                    +
                    +
                    +
                    +
                    +
                    +
                    {{localize "SWFFG.DescriptionXPAvailable"}}
                    +
                    +
                    +
                    {{localize "SWFFG.DescriptionXPTotal"}}
                    +
                    +
                    +
                    +
                    + + {{!-- Obligation Box --}} +
                    +
                    +
                    +
                    + {{localize "SWFFG.DescriptionObligation"}} +
                    +
                    +
                    +
                    +
                    +
                    +
                    +
                    + + {{!-- Duty Box --}} +
                    +
                    +
                    +
                    + {{localize "SWFFG.DescriptionDuty"}} +
                    +
                    +
                    +
                    +
                    +
                    +
                    +
                    + + {{!-- Morality Box --}} +
                    +
                    +
                    +
                    + {{localize "SWFFG.DescriptionMorality"}} +
                    +
                    +
                    +
                    +
                    +
                    +
                    +
                    + + {{!-- Duty Box --}} +
                    +
                    +
                    +
                    + {{localize "SWFFG.DescriptionConflict"}} +
                    +
                    +
                    +
                    +
                    +
                    +
                    +
                    +
                    +
                    + + {{!-- Modifiers Tab --}} +
                    +
                    + + Mod Type + Modifier + Value + +
                    + +
                      + {{#each data.attributes as |attr key|}} +
                    1. + + + + + + +
                    2. + {{/each}} +
                    +
                    +
                    +
                    diff --git a/templates/actors/ffg-minion-sheet.html b/templates/actors/ffg-minion-sheet.html index 86380388..32b00c67 100644 --- a/templates/actors/ffg-minion-sheet.html +++ b/templates/actors/ffg-minion-sheet.html @@ -1,430 +1,430 @@ -
                    - - {{!-- Sheet Header --}} -
                    - - - -
                    - {{!-- Character Name and Player --}} -
                    -
                    - -
                    - -
                    - {{!-- Soak, Wounds and Defence container --}} -
                    - {{!-- Soak Box --}} -
                    -
                    -

                    Soak

                    -
                    -
                    - - -
                    -
                    -
                    -
                    - - {{!-- Wounds Box --}} -
                    -
                    -

                    Wounds

                    -
                    -
                    - - -
                    -
                    -
                    - - -
                    -
                    -
                    -
                    - - {{!-- Defence Box --}} -
                    -
                    -

                    Defence

                    -
                    -
                    - - -
                    -
                    -
                    - - -
                    -
                    -
                    -
                    - - {{!-- Individual Wounds Box --}} -
                    -
                    -

                    Unit Wounds

                    -
                    -
                    - - -
                    -
                    -
                    -
                    - -
                    -
                    - - - - - {{!-- Sheet Tab Navigation --}} - - - {{!-- Sheet Body --}} -
                    - {{!-- Characteristics Tab --}} -
                    - - {{!-- Characteristics Scores --}} - -
                      - {{#each data.characteristics as |characteristic id|}} -
                    • - {{!-- If we set the type to text, we don't have to deal with hiding the number controls --}} - - -
                    • - {{/each}} -
                    - -
                    -
                    - -

                    General

                    - - - - - - - - - - {{#each data.skills as |skill id|}} - {{#iff skill.type '==' 'General'}} - - - - - - - {{/iff}} - {{/each}} - -
                    NameGroup SkillRankRoll
                    {{id}} {{#with (lookup ../this.data.characteristics [characteristic])~}} - ({{abrev}}) - {{/with}} - - - - - - -
                    -
                    -
                    -
                    - -

                    Combat

                    - - - - - - - - - - {{#each data.skills as |skill id|}} - {{#iff skill.type '==' 'Combat'}} - - - - - - - {{/iff}} - {{/each}} - -
                    NameGroup SkillRankRoll
                    {{id}} {{#with (lookup ../this.data.characteristics [characteristic])~}} - ({{abrev}}) - {{/with}} - - - - - -
                    -
                    - -

                    Knowledge

                    - - - - - - - - - - {{#each data.skills as |skill id|}} - {{#iff skill.type '==' 'Knowledge'}} - - - - - - - {{/iff}} - {{/each}} - -
                    NameGroup SkillRankRoll
                    {{lookup ../this.FFG.skills.knowledgestripped [id]~}} {{#with (lookup ../this.data.characteristics [characteristic])~}} - ({{abrev}}) - {{/with}} - - - - - - -
                    -
                    -
                    -
                    -
                    - - {{!-- Owned Items Tab --}} -
                    - {{!-- Weapons List --}} - -

                    - - - - - - - - - - - - - - {{#each actor.items as |item id|}} {{#iff item.type '==' 'weapon'}} - - - - - - - - - - - {{/iff}} {{/each}} - -
                    NameSkillDamageRangeCritSpecialEncumDel
                    {{item.name}}{{lookup ../this.FFG.combat_skills.abrev item.data.skill.value}}{{item.data.damage.value}}{{item.data.range.value}}{{item.data.crit.value}}{{item.data.special.value}}{{item.data.encumbrance.value}} - - -
                    - - {{!-- Armour List --}} - -

                    - - - - - - - - - - - - {{#each actor.items as |item id|}} {{#iff item.type '==' 'armour'}} - - - - - - - - - {{/iff}} {{/each}} - -
                    NameDefenceSoakHPEncumDel
                    {{item.name}}{{item.data.defence.value}}{{item.data.soak.value}}{{item.data.hardpoints.value}}{{item.data.encumbrance.value}} - - -
                    - - {{!-- Gear List --}} - -

                    - - - - - - - - - - - - {{#each actor.items as |item id|}} {{#iff item.type '==' 'gear'}} - - - - - - - - - {{/iff}} {{/each}} - -
                    NamePriceRarityQtyEncumDel
                    {{item.name}}{{item.data.price.value}}{{item.data.rarity.value}}{{item.data.quantity.value}}{{item.data.encumbrance.value}} - - -
                    -
                    - - {{!-- Talents Tab --}} -
                    - {{!-- Talents List --}} -
                    -

                    -
                    - Name - Activation - Rank - Del -
                    -
                      - {{#each actor.items as |item id|}} {{#iff item.type '==' 'talent'}} -
                    1. -

                      - {{item.name}} -
                      {{item.safe_desc}}
                      -

                      - - {{#if item.data.ranks.ranked}} - - {{else}} - - {{/if}} -
                      - - -
                      -
                    2. - {{/iff}} {{/each}} -
                    -
                    -
                    - - {{!-- Biography Tab --}} -
                    - {{editor content=data.biography target="data.biography" button=true owner=owner editable=editable}} -
                    - - {{!-- Modifiers Tab --}} -
                    -
                    - - Mod Type - Modifier - Value - -
                    - -
                      - {{#each data.attributes as |attr key|}} -
                    1. - - - - - - -
                    2. - {{/each}} -
                    -
                    - -
                    -
                    +
                    + + {{!-- Sheet Header --}} +
                    + + + +
                    + {{!-- Character Name and Player --}} +
                    +
                    + +
                    + +
                    + {{!-- Soak, Wounds and Defence container --}} +
                    + {{!-- Soak Box --}} +
                    +
                    +

                    Soak

                    +
                    +
                    + + +
                    +
                    +
                    +
                    + + {{!-- Wounds Box --}} +
                    +
                    +

                    Wounds

                    +
                    +
                    + + +
                    +
                    +
                    + + +
                    +
                    +
                    +
                    + + {{!-- Defence Box --}} +
                    +
                    +

                    Defence

                    +
                    +
                    + + +
                    +
                    +
                    + + +
                    +
                    +
                    +
                    + + {{!-- Individual Wounds Box --}} +
                    +
                    +

                    Unit Wounds

                    +
                    +
                    + + +
                    +
                    +
                    +
                    + +
                    +
                    + + + + + {{!-- Sheet Tab Navigation --}} + + + {{!-- Sheet Body --}} +
                    + {{!-- Characteristics Tab --}} +
                    + + {{!-- Characteristics Scores --}} + +
                      + {{#each data.characteristics as |characteristic id|}} +
                    • + {{!-- If we set the type to text, we don't have to deal with hiding the number controls --}} + + +
                    • + {{/each}} +
                    + +
                    +
                    + +

                    General

                    + + + + + + + + + + {{#each data.skills as |skill id|}} + {{#iff skill.type '==' 'General'}} + + + + + + + {{/iff}} + {{/each}} + +
                    NameGroup SkillRankRoll
                    {{id}} {{#with (lookup ../this.data.characteristics [characteristic])~}} + ({{abrev}}) + {{/with}} + + + + + + +
                    +
                    +
                    +
                    + +

                    Combat

                    + + + + + + + + + + {{#each data.skills as |skill id|}} + {{#iff skill.type '==' 'Combat'}} + + + + + + + {{/iff}} + {{/each}} + +
                    NameGroup SkillRankRoll
                    {{id}} {{#with (lookup ../this.data.characteristics [characteristic])~}} + ({{abrev}}) + {{/with}} + + + + + +
                    +
                    + +

                    Knowledge

                    + + + + + + + + + + {{#each data.skills as |skill id|}} + {{#iff skill.type '==' 'Knowledge'}} + + + + + + + {{/iff}} + {{/each}} + +
                    NameGroup SkillRankRoll
                    {{lookup ../this.FFG.skills.knowledgestripped [id]~}} {{#with (lookup ../this.data.characteristics [characteristic])~}} + ({{abrev}}) + {{/with}} + + + + + + +
                    +
                    +
                    +
                    +
                    + + {{!-- Owned Items Tab --}} +
                    + {{!-- Weapons List --}} + +

                    + + + + + + + + + + + + + + {{#each actor.items as |item id|}} {{#iff item.type '==' 'weapon'}} + + + + + + + + + + + {{/iff}} {{/each}} + +
                    NameSkillDamageRangeCritSpecialEncumDel
                    {{item.name}}{{lookup ../this.FFG.combat_skills.abrev item.data.skill.value}}{{item.data.damage.value}}{{item.data.range.value}}{{item.data.crit.value}}{{item.data.special.value}}{{item.data.encumbrance.value}} + + +
                    + + {{!-- Armour List --}} + +

                    + + + + + + + + + + + + {{#each actor.items as |item id|}} {{#iff item.type '==' 'armour'}} + + + + + + + + + {{/iff}} {{/each}} + +
                    NameDefenceSoakHPEncumDel
                    {{item.name}}{{item.data.defence.value}}{{item.data.soak.value}}{{item.data.hardpoints.value}}{{item.data.encumbrance.value}} + + +
                    + + {{!-- Gear List --}} + +

                    + + + + + + + + + + + + {{#each actor.items as |item id|}} {{#iff item.type '==' 'gear'}} + + + + + + + + + {{/iff}} {{/each}} + +
                    NamePriceRarityQtyEncumDel
                    {{item.name}}{{item.data.price.value}}{{item.data.rarity.value}}{{item.data.quantity.value}}{{item.data.encumbrance.value}} + + +
                    +
                    + + {{!-- Talents Tab --}} +
                    + {{!-- Talents List --}} +
                    +

                    +
                    + Name + Activation + Rank + Del +
                    +
                      + {{#each actor.items as |item id|}} {{#iff item.type '==' 'talent'}} +
                    1. +

                      + {{item.name}} +
                      {{item.safe_desc}}
                      +

                      + + {{#if item.data.ranks.ranked}} + + {{else}} + + {{/if}} +
                      + + +
                      +
                    2. + {{/iff}} {{/each}} +
                    +
                    +
                    + + {{!-- Biography Tab --}} +
                    + {{editor content=data.biography target="data.biography" button=true owner=owner editable=editable}} +
                    + + {{!-- Modifiers Tab --}} +
                    +
                    + + Mod Type + Modifier + Value + +
                    + +
                      + {{#each data.attributes as |attr key|}} +
                    1. + + + + + + +
                    2. + {{/each}} +
                    +
                    + +
                    +
                    diff --git a/templates/actors/ffg-vehicle-sheet.html b/templates/actors/ffg-vehicle-sheet.html index c95cf263..58994ffe 100644 --- a/templates/actors/ffg-vehicle-sheet.html +++ b/templates/actors/ffg-vehicle-sheet.html @@ -1,367 +1,367 @@ -
                    - - {{!-- Sheet Header --}} -
                    - - - -
                    - {{!-- Ship Name --}} -
                    -
                    -
                    - - {{!-- Defence Grid --}} -
                    - {{!-- Fore and Aft Box --}} -
                    -
                    -

                    Defence

                    -
                    -
                    - - -
                    -
                    - - -
                    -
                    - - -
                    -
                    - - -
                    -
                    -
                    -
                    -
                    - - {{!-- Silhouette, Speed and Handling Container --}} -
                    - - {{!-- Silhouette Box --}} -
                    -
                    -

                    Silhouette

                    -
                    -
                    - - -
                    -
                    -
                    -
                    - - {{!-- Speed Box --}} -
                    -
                    -

                    Speed

                    -
                    -
                    - - -
                    -
                    -
                    - - -
                    -
                    -
                    -
                    - - {{!-- Handling Box --}} -
                    -
                    -

                    Handling

                    -
                    -
                    - - - {{log data.stats.handling.value}} -
                    -
                    -
                    -
                    -
                    - - {{!-- Armour, Hull Trauma and System Strain container --}} -
                    - {{!-- Armour Box --}} -
                    -
                    -

                    Armour

                    -
                    -
                    - - -
                    -
                    -
                    -
                    - - {{!-- Hull Trauma Box --}} -
                    -
                    -

                    Hull Trauma

                    -
                    -
                    - - -
                    -
                    -
                    - - -
                    -
                    -
                    -
                    - - {{!-- System Strain Box --}} -
                    -
                    -

                    System Strain

                    -
                    -
                    - - -
                    -
                    -
                    - - -
                    -
                    -
                    -
                    -
                    - - - {{!-- Sheet Tab Navigation --}} - - - {{!-- Sheet Body --}} -
                    - - {{!-- Owned Items Tab --}} -
                    - - {{!-- Ship Weapons List --}} -
                    -

                    -
                    - Name - Firing Arc - Damage - Range - Crit - Special - Del -
                    -
                      - {{#each actor.items as |item id|}} - {{#iff item.type '==' 'shipweapon'}} -
                    1. -

                      {{item.name}}
                      {{item.safe_desc}}

                      - - - - - -
                      - - -
                      -
                    2. - {{/iff}} - {{/each}} -
                    -
                    - - {{!-- Ship Attachments List --}} -
                    -

                    -
                    - Name - Hardpoints Required - Del -
                    -
                      - {{#each actor.items as |item id|}} - {{#iff item.type '==' 'shipattachment'}} -
                    1. -

                      {{item.name}}
                      {{item.safe_desc}}

                      - -
                      - - -
                      -
                    2. - {{/iff}} - {{/each}} -
                    -
                    - - {{!-- Cargo Hold --}} -
                    -

                    -
                    - Name - Price - Rarity - Quantity - Encum - Del -
                    -
                      - {{#each actor.items as |item id|}} - {{#iff item.type '!=' 'shipweapon'}} - {{#iff item.type '!=' 'shipattachment'}} - {{#iff item.type '!=' 'talent'}} -
                    1. -

                      {{item.name}}
                      {{item.safe_desc}}

                      - - - - -
                      - - -
                      -
                    2. - {{/iff}} - {{/iff}} - {{/iff}} - {{/each}} -
                    -
                    - -
                    - - {{!-- Biography Tab --}} -
                    - {{editor content=data.biography target="data.biography" button=true owner=owner editable=editable}} - {{!-- Obligations Section --}} -
                    - - {{!-- Hard Points Box --}} -
                    -
                    -

                    Hard Points

                    -
                    -
                    - -
                    -
                    -
                    -
                    - - {{!-- Encumbrance Capacity Box --}} -
                    -
                    -

                    Encumbrance Capacity

                    -
                    -
                    - -
                    -
                    -
                    -
                    - - {{!-- Sensor Range Box --}} -
                    -
                    -

                    Sensor Range

                    -
                    -
                    - -
                    -
                    -
                    -
                    - - {{!-- Passenger Capacity Box --}} -
                    -
                    -

                    Passenger Capacity

                    -
                    -
                    - -
                    -
                    -
                    -
                    -
                    -
                    - - {{!-- Modifiers Tab --}} -
                    -
                    - - Mod Type - Modifier - Value - -
                    - -
                      - {{#each data.attributes as |attr key|}} -
                    1. - - - - - - -
                    2. - {{/each}} -
                    -
                    - -
                    -
                    +
                    + + {{!-- Sheet Header --}} +
                    + + + +
                    + {{!-- Ship Name --}} +
                    +
                    +
                    + + {{!-- Defence Grid --}} +
                    + {{!-- Fore and Aft Box --}} +
                    +
                    +

                    Defence

                    +
                    +
                    + + +
                    +
                    + + +
                    +
                    + + +
                    +
                    + + +
                    +
                    +
                    +
                    +
                    + + {{!-- Silhouette, Speed and Handling Container --}} +
                    + + {{!-- Silhouette Box --}} +
                    +
                    +

                    Silhouette

                    +
                    +
                    + + +
                    +
                    +
                    +
                    + + {{!-- Speed Box --}} +
                    +
                    +

                    Speed

                    +
                    +
                    + + +
                    +
                    +
                    + + +
                    +
                    +
                    +
                    + + {{!-- Handling Box --}} +
                    +
                    +

                    Handling

                    +
                    +
                    + + + {{log data.stats.handling.value}} +
                    +
                    +
                    +
                    +
                    + + {{!-- Armour, Hull Trauma and System Strain container --}} +
                    + {{!-- Armour Box --}} +
                    +
                    +

                    Armour

                    +
                    +
                    + + +
                    +
                    +
                    +
                    + + {{!-- Hull Trauma Box --}} +
                    +
                    +

                    Hull Trauma

                    +
                    +
                    + + +
                    +
                    +
                    + + +
                    +
                    +
                    +
                    + + {{!-- System Strain Box --}} +
                    +
                    +

                    System Strain

                    +
                    +
                    + + +
                    +
                    +
                    + + +
                    +
                    +
                    +
                    +
                    + + + {{!-- Sheet Tab Navigation --}} + + + {{!-- Sheet Body --}} +
                    + + {{!-- Owned Items Tab --}} +
                    + + {{!-- Ship Weapons List --}} +
                    +

                    +
                    + Name + Firing Arc + Damage + Range + Crit + Special + Del +
                    +
                      + {{#each actor.items as |item id|}} + {{#iff item.type '==' 'shipweapon'}} +
                    1. +

                      {{item.name}}
                      {{item.safe_desc}}

                      + + + + + +
                      + + +
                      +
                    2. + {{/iff}} + {{/each}} +
                    +
                    + + {{!-- Ship Attachments List --}} +
                    +

                    +
                    + Name + Hardpoints Required + Del +
                    +
                      + {{#each actor.items as |item id|}} + {{#iff item.type '==' 'shipattachment'}} +
                    1. +

                      {{item.name}}
                      {{item.safe_desc}}

                      + +
                      + + +
                      +
                    2. + {{/iff}} + {{/each}} +
                    +
                    + + {{!-- Cargo Hold --}} +
                    +

                    +
                    + Name + Price + Rarity + Quantity + Encum + Del +
                    +
                      + {{#each actor.items as |item id|}} + {{#iff item.type '!=' 'shipweapon'}} + {{#iff item.type '!=' 'shipattachment'}} + {{#iff item.type '!=' 'talent'}} +
                    1. +

                      {{item.name}}
                      {{item.safe_desc}}

                      + + + + +
                      + + +
                      +
                    2. + {{/iff}} + {{/iff}} + {{/iff}} + {{/each}} +
                    +
                    + +
                    + + {{!-- Biography Tab --}} +
                    + {{editor content=data.biography target="data.biography" button=true owner=owner editable=editable}} + {{!-- Obligations Section --}} +
                    + + {{!-- Hard Points Box --}} +
                    +
                    +

                    Hard Points

                    +
                    +
                    + +
                    +
                    +
                    +
                    + + {{!-- Encumbrance Capacity Box --}} +
                    +
                    +

                    Encumbrance Capacity

                    +
                    +
                    + +
                    +
                    +
                    +
                    + + {{!-- Sensor Range Box --}} +
                    +
                    +

                    Sensor Range

                    +
                    +
                    + +
                    +
                    +
                    +
                    + + {{!-- Passenger Capacity Box --}} +
                    +
                    +

                    Passenger Capacity

                    +
                    +
                    + +
                    +
                    +
                    +
                    +
                    +
                    + + {{!-- Modifiers Tab --}} +
                    +
                    + + Mod Type + Modifier + Value + +
                    + +
                      + {{#each data.attributes as |attr key|}} +
                    1. + + + + + + +
                    2. + {{/each}} +
                    +
                    + +
                    +
                    From 4722474207b6898a75f55c219fd7b2c9b005f95e Mon Sep 17 00:00:00 2001 From: Esrin Date: Tue, 2 Jun 2020 12:58:03 +0100 Subject: [PATCH 41/44] Bringing branch in line with old repo. --- LICENSE.txt | 42 +- README.md | 181 +- lang/en.json | 22 +- modules/actors/actor-ffg.js | 220 +- modules/actors/actor-sheet-ffg.js | 660 +- modules/combat-ffg.js | 138 +- modules/dice-pool-ffg.js | 256 +- modules/groupmanager-ffg.js | 206 +- modules/items/item-ffg.js | 40 +- modules/items/item-sheet-ffg.js | 260 +- modules/swffg-config.js | 252 +- modules/swffg-main.js | 450 +- package-lock.json | 7906 +++++++++++------------ package.json | 35 +- scss/components/_tabs.scss | 49 +- styles/starwarsffg.css | 3152 ++++----- system.json | 76 +- template.json | 1396 ++-- templates/actors/ffg-minion-sheet.html | 2 +- templates/actors/ffg-vehicle-sheet.html | 2 +- 20 files changed, 7705 insertions(+), 7640 deletions(-) diff --git a/LICENSE.txt b/LICENSE.txt index 740121c9..515e8f90 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,21 +1,21 @@ -MIT License - -Copyright (c) 2020 Foundry Network - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +MIT License + +Copyright (c) 2020 Foundry Network + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index 59fbac40..b25fc4b0 100644 --- a/README.md +++ b/README.md @@ -1,89 +1,92 @@ -( PLEASE NOTE: This is a custom fork based on [Jaxxa's implementation](https://github.com/jaxxa/StarWarsFFG/tree/master). ) - -# StarWarsFFG - -This is an implementation of the [Fantasy Flight Games Star Wars](https://www.fantasyflightgames.com/en/starwarsrpg/) roleplaying system by in [Foundry Virtual Tabletop](https://foundryvtt.com/). - -# Requirements - -This Requires the "Special Dice Roller" Module to Roll the dice and calculate the results. -This is most easily available from the in-game Module browser. After installing it you will need to activate it on your world. -[foundry-vtt-community](https://foundry-vtt-community.github.io/wiki/Community-Modules/#special-dice-roller) or [GitHub](https://github.com/BernhardPosselt/foundryvtt-special-dice-roller) - -# Installing - -1. Open Foundry VTT -2. Go to the "Game Systems" Tab -3. Click the "Install System" button -4. Copy the Following link into the "Manifest URL" section: - https://raw.githubusercontent.com/Esrin/StarWarsFFG/esrin-dev/system.json -5. Click Install, after a few seconds the system should be installed. - -# To-do - -NEEDED FOR RELEASE V1: - -- Group Management sheet for GM use (currently in progress). -- Create equipable item functionality and rework inventory to suit. Continue to improve inventory display in the process. -- Add Forcepower item type (based on talent). -- Add Maximum Altitude and Crew Capacity to vehicle sheet. -- Redo the dice selection popup to be more functional and provide upgrade ability and upgrade difficulty buttons. -- Rebuild dice functionality to use Foundry Dice instead of chat content, remove requirement for Special-Dice-Roller. -- Look into drag-and-drop item behaviours for things like transferring items between characters, or into a vehicle cargo hold. - -NICE TO HAVE: - -- Create JS data models for species, careers and specialisations and use those in prepareData to define career skills and starting characteristics. -- Attempt to fix display of wound and strain bars so that they suit FFG system. -- Genesys cross-compatibility (dice, sheets) -- Rework Special Qualities and Critical Injuries to be item type, add view to item sheets and character sheets. -- Character creator - -# Changelog - -- 31/05/2020 - Esrin - Work in progress on the group management GM tool. Destiny Pool now working (will reset on page refresh). Player Character list under construction. -- 31/05/2020 - Esrin - Bugfix to localisation hook for Gear Quantity on Character Sheet (thanks Alex | HDScurox for the bug report). -- 31/05/2020 - CStadther - Added SASS configuration using Gulp. -- 31/05/2020 - CStadther - Minor bugfix on .item click listener to prevent console errors when .item class components with no related item sheet are clicked, such as tabs. -- 31/05/2020 - CStadther - Added localization for character sheet. -- 29/05/2020 - Esrin - Minor bugfix to vehicle sheet, various fields will now accept string values to allow for from-to values as requested by Alex | HDScurox. -- 28/05/2020 - Esrin - Brought the Minion sheet inventory in line with the latest Character sheet changes. Added talents to Minion sheet. Fixed a minor bug with group skill calculations (thanks Alex | HDScurox for the bug report). -- 25/05/2020 - Esrin - Character sheet tweaks. Continued improvements to the inventory display in advance of equipable item support. -- 22/05/2020 - Esrin - Minor bug fixes and tweaks, compatibility check with FVTT 0.6.0 stable release. -- 18/05/2020 - alfarobl - Tweak to dice display orders to match the chat order, kindly provided by alfarobl. -- 18/05/2020 - Esrin - A very hacky method has been introduced to allow the built in FoundryVTT combat tracker to roll initiative using FFG dice results. The resulting number is made up of successes and advantages. For example 1 success and 2 advantage would result in 1.02 for the initiative tracker. Warning, there might be bugs with this solution! Initiative can be switched between Vigilance and Cool via the System Settings section of the world configuration. -- 13/05/2020 - Esrin - Continued sheet design tweaks. -- 12/05/2020 - Esrin - Reworked actorsheet entities back down to a single entity with dynamic options based on actor.type. Now much easier to maintain in single place. -- 12/05/2020 - Esrin - First pass at improvements to inventory display to show more info on hover of certain areas (hover name for description, hover special for full text, etc). Still much more styling and layout work needed for sheets in general. -- 11/05/2020 - Esrin - First pass on some quality of life improvements to the inventory display (work in progress). Minor bugfixes. -- 11/05/2020 - Esrin - Fixed bug on vehicle sheet that was preventing data entry to some fields. -- 11/05/2020 - Esrin - Reworked the modifier tabs to be more foolproof and user friendly. Only Soak modifiers are calculated automatically at present. Automatic calculation of other stat / characteristic / skill modifiers is not a priority right now so putting on the backburner. -- 11/05/2020 - Esrin - Improved vehicle sheet design to have Defence in fore, aft, port, starboard cross pattern. -- 11/05/2020 - Esrin - Added Range, Skill, Firing Arc and Activation dropdowns to item and talent sheets where appropriate. -- 11/05/2020 - Esrin - Added skills filter to character and minion sheets, allowing filtering by General, Combat and Knowledge. -- 11/05/2020 - Esrin - Added career skills checkbox to character sheet. -- 11/05/2020 - Esrin - Fixed Handling on vehicle sheet. Now displays a + for positive values. -- 09/05/2020 - Esrin - Rollable table for Critical Injuries -- 09/05/2020 - Esrin - Cleaned up items to just use one JS class and get dynamic template by type. -- 09/05/2020 - Esrin - Built item sheet for ship weapons and ship attachments -- 09/05/2020 - Esrin - Built character sheet for vehicles -- 09/05/2020 - Esrin - Added data structure for ship weapons and ship attachments -- 09/05/2020 - Esrin - Added data structure for vehicles (using Jaxxa's work as a template) -- 09/05/2020 - Esrin - Added currency to characters -- 09/05/2020 - Esrin - Derived encumbrance from item values. -- 09/05/2020 - Esrin - Derived soak value from brawn, equipped armour, and modifiers on weapons, gear and talents as a test case for automation. -- 08/05/2020 - Esrin - Extended Actor class to allow for calculated Minion stat values (wounds from unit wounds _ quantity, and skills from group skills _ quantity-1) -- 08/05/2020 - Esrin - Added data structure for minions -- 08/05/2020 - Esrin - Built character sheet for minions -- 08/05/2020 - Esrin - Updated main character sheet to correctly display all three main item types, and talents. -- 08/05/2020 - Esrin - Added data structure for talents -- 08/05/2020 - Esrin - Updated main character sheet to show XP on all pages, and obligation types on Biography page. -- 08/05/2020 - Esrin - Built very basic item sheets for the three main item types. -- 08/05/2020 - Esrin - Added data structures for the three main item types, gear, weapons, armour. -- 07/05/2020 - Esrin - Minor tweaks to the character sheet styling. Begun restructuring the underlying data structure in template.json to introduce best practices, avoid unnecessary duplication and prepare for the addition of new actor and item types. -- 07/05/2020 - Esrin - First pass at character sheet styling. Next step, talents, items and derived modifiers. -- 06/05/2020 - Esrin - Added "Rolling " into the chat message for FFG dice rolls to show which skill the person was rolling on. -- 06/05/2020 - Esrin - Added abbreviations (abrev) to characteristics, refactored skill display on ffg-actor-sheet.html to allow for linked characteristic abbreviations in display. -- 06/05/2020 - Esrin - Updated to TabsV2 class in actor-sheet-ffg.js to avoid deprecation of Tabs class in future FoundryVTT versions. -- 06/05/2020 - Esrin - Renamed remaining core files from Simple World Building to swffg naming scheme for consistency. -- 06/05/2020 - Esrin - Removed old SimpleWorldBuilding dependencies and fixed breakages where necessary. +( PLEASE NOTE: This is a custom fork based on [Jaxxa's implementation](https://github.com/jaxxa/StarWarsFFG/tree/master). ) + +# StarWarsFFG + +This is an implementation of the [Fantasy Flight Games Star Wars](https://www.fantasyflightgames.com/en/starwarsrpg/) roleplaying system by in [Foundry Virtual Tabletop](https://foundryvtt.com/). + +# Requirements + +This Requires the "Special Dice Roller" Module to Roll the dice and calculate the results. +This is most easily available from the in-game Module browser. After installing it you will need to activate it on your world. +[foundry-vtt-community](https://foundry-vtt-community.github.io/wiki/Community-Modules/#special-dice-roller) or [GitHub](https://github.com/BernhardPosselt/foundryvtt-special-dice-roller) + +# Installing + +1. Open Foundry VTT +2. Go to the "Game Systems" Tab +3. Click the "Install System" button +4. Copy the Following link into the "Manifest URL" section: + https://raw.githubusercontent.com/Esrin/StarWarsFFG/esrin-dev/system.json +5. Click Install, after a few seconds the system should be installed. + +# To-do + +NEEDED FOR RELEASE V1: + +- Group Management sheet for GM use (currently in progress). +- Create equipable item functionality and rework inventory to suit. Continue to improve inventory display in the process. +- Add Forcepower item type (based on talent). +- Add Maximum Altitude and Crew Capacity to vehicle sheet. +- Redo the dice selection popup to be more functional and provide upgrade ability and upgrade difficulty buttons. +- Rebuild dice functionality to use Foundry Dice instead of chat content, remove requirement for Special-Dice-Roller. +- Look into drag-and-drop item behaviours for things like transferring items between characters, or into a vehicle cargo hold. + +NICE TO HAVE: + +- Create JS data models for species, careers and specialisations and use those in prepareData to define career skills and starting characteristics. +- Attempt to fix display of wound and strain bars so that they suit FFG system. +- Genesys cross-compatibility (dice, sheets) +- Rework Special Qualities and Critical Injuries to be item type, add view to item sheets and character sheets. +- Character creator + +# Changelog + +- 02/06/2020 - Esrin - Minor bugfix to character sheet, soak value set to disabled for auto-calculation, encumbrance max and current values swapped to correct fields and current set to disabled for auto-calculation. +- 02/06/2020 - CStadther - Major sheet restyling +- 02/06/2020 - Jaxxa - Added Icons in the Dice roller, visually indicating the dice types. +- 31/05/2020 - Esrin - Work in progress on the group management GM tool. Destiny Pool now working (will reset on page refresh). Player Character list under construction. +- 31/05/2020 - Esrin - Bugfix to localisation hook for Gear Quantity on Character Sheet (thanks Alex | HDScurox for the bug report). +- 31/05/2020 - CStadther - Added SASS configuration using Gulp. +- 31/05/2020 - CStadther - Minor bugfix on .item click listener to prevent console errors when .item class components with no related item sheet are clicked, such as tabs. +- 31/05/2020 - CStadther - Added localization for character sheet. +- 29/05/2020 - Esrin - Minor bugfix to vehicle sheet, various fields will now accept string values to allow for from-to values as requested by Alex | HDScurox. +- 28/05/2020 - Esrin - Brought the Minion sheet inventory in line with the latest Character sheet changes. Added talents to Minion sheet. Fixed a minor bug with group skill calculations (thanks Alex | HDScurox for the bug report). +- 25/05/2020 - Esrin - Character sheet tweaks. Continued improvements to the inventory display in advance of equipable item support. +- 22/05/2020 - Esrin - Minor bug fixes and tweaks, compatibility check with FVTT 0.6.0 stable release. +- 18/05/2020 - alfarobl - Tweak to dice display orders to match the chat order, kindly provided by alfarobl. +- 18/05/2020 - Esrin - A very hacky method has been introduced to allow the built in FoundryVTT combat tracker to roll initiative using FFG dice results. The resulting number is made up of successes and advantages. For example 1 success and 2 advantage would result in 1.02 for the initiative tracker. Warning, there might be bugs with this solution! Initiative can be switched between Vigilance and Cool via the System Settings section of the world configuration. +- 13/05/2020 - Esrin - Continued sheet design tweaks. +- 12/05/2020 - Esrin - Reworked actorsheet entities back down to a single entity with dynamic options based on actor.type. Now much easier to maintain in single place. +- 12/05/2020 - Esrin - First pass at improvements to inventory display to show more info on hover of certain areas (hover name for description, hover special for full text, etc). Still much more styling and layout work needed for sheets in general. +- 11/05/2020 - Esrin - First pass on some quality of life improvements to the inventory display (work in progress). Minor bugfixes. +- 11/05/2020 - Esrin - Fixed bug on vehicle sheet that was preventing data entry to some fields. +- 11/05/2020 - Esrin - Reworked the modifier tabs to be more foolproof and user friendly. Only Soak modifiers are calculated automatically at present. Automatic calculation of other stat / characteristic / skill modifiers is not a priority right now so putting on the backburner. +- 11/05/2020 - Esrin - Improved vehicle sheet design to have Defence in fore, aft, port, starboard cross pattern. +- 11/05/2020 - Esrin - Added Range, Skill, Firing Arc and Activation dropdowns to item and talent sheets where appropriate. +- 11/05/2020 - Esrin - Added skills filter to character and minion sheets, allowing filtering by General, Combat and Knowledge. +- 11/05/2020 - Esrin - Added career skills checkbox to character sheet. +- 11/05/2020 - Esrin - Fixed Handling on vehicle sheet. Now displays a + for positive values. +- 09/05/2020 - Esrin - Rollable table for Critical Injuries +- 09/05/2020 - Esrin - Cleaned up items to just use one JS class and get dynamic template by type. +- 09/05/2020 - Esrin - Built item sheet for ship weapons and ship attachments +- 09/05/2020 - Esrin - Built character sheet for vehicles +- 09/05/2020 - Esrin - Added data structure for ship weapons and ship attachments +- 09/05/2020 - Esrin - Added data structure for vehicles (using Jaxxa's work as a template) +- 09/05/2020 - Esrin - Added currency to characters +- 09/05/2020 - Esrin - Derived encumbrance from item values. +- 09/05/2020 - Esrin - Derived soak value from brawn, equipped armour, and modifiers on weapons, gear and talents as a test case for automation. +- 08/05/2020 - Esrin - Extended Actor class to allow for calculated Minion stat values (wounds from unit wounds _ quantity, and skills from group skills _ quantity-1) +- 08/05/2020 - Esrin - Added data structure for minions +- 08/05/2020 - Esrin - Built character sheet for minions +- 08/05/2020 - Esrin - Updated main character sheet to correctly display all three main item types, and talents. +- 08/05/2020 - Esrin - Added data structure for talents +- 08/05/2020 - Esrin - Updated main character sheet to show XP on all pages, and obligation types on Biography page. +- 08/05/2020 - Esrin - Built very basic item sheets for the three main item types. +- 08/05/2020 - Esrin - Added data structures for the three main item types, gear, weapons, armour. +- 07/05/2020 - Esrin - Minor tweaks to the character sheet styling. Begun restructuring the underlying data structure in template.json to introduce best practices, avoid unnecessary duplication and prepare for the addition of new actor and item types. +- 07/05/2020 - Esrin - First pass at character sheet styling. Next step, talents, items and derived modifiers. +- 06/05/2020 - Esrin - Added "Rolling " into the chat message for FFG dice rolls to show which skill the person was rolling on. +- 06/05/2020 - Esrin - Added abbreviations (abrev) to characteristics, refactored skill display on ffg-actor-sheet.html to allow for linked characteristic abbreviations in display. +- 06/05/2020 - Esrin - Updated to TabsV2 class in actor-sheet-ffg.js to avoid deprecation of Tabs class in future FoundryVTT versions. +- 06/05/2020 - Esrin - Renamed remaining core files from Simple World Building to swffg naming scheme for consistency. +- 06/05/2020 - Esrin - Removed old SimpleWorldBuilding dependencies and fixed breakages where necessary. diff --git a/lang/en.json b/lang/en.json index 3547cb0d..771070f3 100644 --- a/lang/en.json +++ b/lang/en.json @@ -14,7 +14,7 @@ "SWFFG.ForcePool": "Force Pool", "SWFFG.ForcePoolCommitted": "Committed", "SWFFG.ForcePoolAvailable": "Available", - "SWFFG.Encumbrance": "Encum", + "SWFFG.Encumbrance": "Encumbrance", "SWFFG.TabCharacteristics": "Characteristics", "SWFFG.TabGear": "Gear & Equipment", "SWFFG.TabTalents": "Talents", @@ -25,9 +25,9 @@ "SWFFG.CharacteristicCunning": "Cunning", "SWFFG.CharacteristicWillpower": "Willpower", "SWFFG.CharacteristicPresence": "Presence", - "SWFFG.SkillsGeneral": "General", - "SWFFG.SkillsCombat": "Combat", - "SWFFG.SkillsKnowledge": "Knowledge", + "SWFFG.SkillsGeneral": "General Skills", + "SWFFG.SkillsCombat": "Combat Skills", + "SWFFG.SkillsKnowledge": "Knowledge Skills", "SWFFG.SkillsName": "Name", "SWFFG.SkillsCS": "CS", "SWFFG.SkillsCareerSkill": "Career Skill", @@ -61,5 +61,17 @@ "SWFFG.DescriptionObligation": "Obligation", "SWFFG.DescriptionDuty": "Duty", "SWFFG.DescriptionMorality": "Morality", - "SWFFG.DescriptionConflict": "Conflict" + "SWFFG.DescriptionConflict": "Conflict", + "SWFFG.ItemWeaponDamage": "Dmg", + "SWFFG.ItemWeaponCritical": "Crit", + "SWFFG.ItemWeaponEncumbrance": "Encum", + "SWFFG.ItemWeaponHardPoints": "HP", + "SWFFG.ItemWeaponRarity": "Rarity", + "SWFFG.ItemWeaponSkill": "Skill", + "SWFFG.ItemWeaponRange": "Range", + "SWFFG.ItemWeaponPrice": "Price", + "SWFFG.ItemWeaponQuantity": "Qty", + "SWFFG.ItemWeaponSpecial": "Special", + "SWFFG.ItemArmorDefense": "Def", + "SWFFG.ItemTalentRanked": "Ranked?" } diff --git a/modules/actors/actor-ffg.js b/modules/actors/actor-ffg.js index db26ab73..ae8d0b95 100644 --- a/modules/actors/actor-ffg.js +++ b/modules/actors/actor-ffg.js @@ -1,110 +1,110 @@ -/** - * Extend the base Actor entity. - * @extends {Actor} - */ -export class ActorFFG extends Actor { - /** - * Augment the basic actor data with additional dynamic data. - */ - prepareData() { - super.prepareData(); - - const actorData = this.data; - const data = actorData.data; - const flags = actorData.flags; - - // Make separate methods for each Actor type (character, minion, etc.) to keep - // things organized. - if (actorData.type === "minion") this._prepareMinionData(actorData); - if (actorData.type === "character") this._prepareCharacterData(actorData); - } - - /** - * Prepare Minion type specific data - */ - _prepareMinionData(actorData) { - const data = actorData.data; - - // Set Wounds threshold to unit_wounds * quantity to account for minion group health. - data.stats.wounds.max = Math.floor(data.unit_wounds.value * data.quantity.value); - // Check we don't go below 0. - if (data.stats.wounds.max < 0) { - data.stats.wounds.max = 0; - } - - // Loop through Skills, and where groupskill = true, set the rank to 1*(quantity-1). - for (let [key, skill] of Object.entries(data.skills)) { - // Check to see if this is a group skill, otherwise do nothing. - if (skill.groupskill) { - skill.rank = Math.floor(1 * (data.quantity.value - 1)); - // Check we don't go below 0. - if (skill.rank < 0) { - skill.rank = 0; - } - } else if (!skill.groupskill) { - skill.rank = 0; - } - } - } - - /** - * Prepare Character type specific data - */ - _prepareCharacterData(actorData) { - const data = actorData.data; - const items = actorData.items; - var soak = 0; - var armoursoak = 0; - var othersoak = 0; - var encum = 0; - - // Calculate soak based on Brawn value, and any Soak modifiers in weapons, armour, gear and talents. - // Start with Brawn. Also calculate total encumbrance from items. - soak = +data.characteristics.Brawn.value; - - for (let characteristic of Object.keys(data.characteristics)) { - const strId = `SWFFG.Characteristic${this._capitalize(characteristic)}`; - const localizedField = game.i18n.localize(strId); - - data.characteristics[characteristic].label = localizedField; - } - - // Loop through all items - for (let [key, item] of Object.entries(items)) { - // For armour type, get all Soak values and add to armoursoak. - if (item.type == "armour") { - armoursoak += +item.data.soak.value; - } - // Loop through all item attributes and add any modifiers to our collection. - for (let [k, mod] of Object.entries(item.data.attributes)) { - if (mod.mod == "Soak") { - othersoak += +mod.value; - } - } - - // Calculate encumbrance. - if (item.type != "talent") { - encum += +item.data.encumbrance.value; - } - } - - // Set Encumbrance value on character. - data.stats.encumbrance.value = encum; - - // Add together all of our soak results. - soak += +armoursoak; - soak += +othersoak; - - // Finally set Soak value on character. - data.stats.soak.value = soak; - } - - /** - * Capitalize string - * @param {String} s String value to capitalize - */ - _capitalize(s) { - if (typeof s !== 'string') return '' - return s.charAt(0).toUpperCase() + s.slice(1) - } -} +/** + * Extend the base Actor entity. + * @extends {Actor} + */ +export class ActorFFG extends Actor { + /** + * Augment the basic actor data with additional dynamic data. + */ + prepareData() { + super.prepareData(); + + const actorData = this.data; + const data = actorData.data; + const flags = actorData.flags; + + // Make separate methods for each Actor type (character, minion, etc.) to keep + // things organized. + if (actorData.type === "minion") this._prepareMinionData(actorData); + if (actorData.type === "character") this._prepareCharacterData(actorData); + } + + /** + * Prepare Minion type specific data + */ + _prepareMinionData(actorData) { + const data = actorData.data; + + // Set Wounds threshold to unit_wounds * quantity to account for minion group health. + data.stats.wounds.max = Math.floor(data.unit_wounds.value * data.quantity.value); + // Check we don't go below 0. + if (data.stats.wounds.max < 0) { + data.stats.wounds.max = 0; + } + + // Loop through Skills, and where groupskill = true, set the rank to 1*(quantity-1). + for (let [key, skill] of Object.entries(data.skills)) { + // Check to see if this is a group skill, otherwise do nothing. + if (skill.groupskill) { + skill.rank = Math.floor(1 * (data.quantity.value - 1)); + // Check we don't go below 0. + if (skill.rank < 0) { + skill.rank = 0; + } + } else if (!skill.groupskill) { + skill.rank = 0; + } + } + } + + /** + * Prepare Character type specific data + */ + _prepareCharacterData(actorData) { + const data = actorData.data; + const items = actorData.items; + var soak = 0; + var armoursoak = 0; + var othersoak = 0; + var encum = 0; + + // Calculate soak based on Brawn value, and any Soak modifiers in weapons, armour, gear and talents. + // Start with Brawn. Also calculate total encumbrance from items. + soak = +data.characteristics.Brawn.value; + + for (let characteristic of Object.keys(data.characteristics)) { + const strId = `SWFFG.Characteristic${this._capitalize(characteristic)}`; + const localizedField = game.i18n.localize(strId); + + data.characteristics[characteristic].label = localizedField; + } + + // Loop through all items + for (let [key, item] of Object.entries(items)) { + // For armour type, get all Soak values and add to armoursoak. + if (item.type == "armour") { + armoursoak += +item.data.soak.value; + } + // Loop through all item attributes and add any modifiers to our collection. + for (let [k, mod] of Object.entries(item.data.attributes)) { + if (mod.mod == "Soak") { + othersoak += +mod.value; + } + } + + // Calculate encumbrance. + if (item.type != "talent") { + encum += +item.data.encumbrance.value; + } + } + + // Set Encumbrance value on character. + data.stats.encumbrance.value = encum; + + // Add together all of our soak results. + soak += +armoursoak; + soak += +othersoak; + + // Finally set Soak value on character. + data.stats.soak.value = soak; + } + + /** + * Capitalize string + * @param {String} s String value to capitalize + */ + _capitalize(s) { + if (typeof s !== 'string') return '' + return s.charAt(0).toUpperCase() + s.slice(1) + } +} diff --git a/modules/actors/actor-sheet-ffg.js b/modules/actors/actor-sheet-ffg.js index 53768a96..a40f32c5 100644 --- a/modules/actors/actor-sheet-ffg.js +++ b/modules/actors/actor-sheet-ffg.js @@ -1,330 +1,330 @@ -/** - * Extend the basic ActorSheet with some very simple modifications - * @extends {ActorSheet} - */ -export class ActorSheetFFG extends ActorSheet { - constructor(...args) { - super(...args); - /** - * Track the set of filters which are applied - * @type {Set} - */ - this._filters = { - skills: new Set(), - }; - } - - pools = new Map(); - - /** @override */ - static get defaultOptions() { - return mergeObject(super.defaultOptions, { - classes: ["starwarsffg", "sheet", "actor"], - template: "systems/starwarsffg/templates/actors/ffg-character-sheet.html", - width: 710, - height: 650, - tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "characteristics" }], - }); - } - - /** @override */ - get template() { - const path = "systems/starwarsffg/templates/actors"; - return `${path}/ffg-${this.actor.data.type}-sheet.html`; - } - - /* -------------------------------------------- */ - - /** @override */ - getData() { - const data = super.getData(); - data.dtypes = ["String", "Number", "Boolean"]; - for (let attr of Object.values(data.data.attributes)) { - attr.isCheckbox = attr.dtype === "Boolean"; - } - data.FFG = CONFIG.FFG; - - switch (this.actor.data.type) { - case "character": - this.position.width = 610; - this.position.height = 840; - break; - case "minion": - this.position.width = 700; - this.position.height = 620; - break; - case "vehicle": - this.position.width = 710; - this.position.height = 650; - default: - } - return data; - } - - /* -------------------------------------------- */ - - /** @override */ - activateListeners(html) { - super.activateListeners(html); - - // TODO: This is not needed in Foundry 0.6.0 - // Activate tabs - let tabs = html.find(".tabs"); - let initial = this._sheetTab; - new TabsV2(tabs, { - initial: initial, - callback: (clicked) => (this._sheetTab = clicked.data("tab")), - }); - - // Everything below here is only needed if the sheet is editable - if (!this.options.editable) return; - - // Update Inventory Item - By clicking entire line - html.find(".item").click((ev) => { - if (!$(ev.target).hasClass("fa-trash")) { - const li = $(ev.currentTarget); - const item = this.actor.getOwnedItem(li.data("itemId")); - if(item?.sheet) { - item.sheet.render(true); - } - } - }); - // Update Talent - By clicking entire line - html.find(".talents.item").click((ev) => { - if (!$(ev.target).hasClass("fa-trash")) { - const li = $(ev.currentTarget); - const item = this.actor.getOwnedItem(li.data("itemId")); - item.sheet.render(true); - } - }); - - // Delete Inventory Item - html.find(".item-delete").click((ev) => { - const li = $(ev.currentTarget).parents(".item"); - this.actor.deleteOwnedItem(li.data("itemId")); - li.slideUp(200, () => this.render(false)); - }); - - // Set skill filter element. - html.find(".skillfilter").each((_, elem) => { - const filters = this._filters.skills; - if (!filters.filter) { - filters.filter = "all"; - } - }); - - // Update radio button checked status for skill filter controls. - html.find(".filter-control").each((_, elem) => { - if (elem.id == this._filters.skills.filter) { - elem.checked = true; - } else { - elem.checked = false; - } - }); - - // Setup dice pool image and hide filtered skills - html.find(".skill").each((_, elem) => { - this._addSkillDicePool(elem); - const filters = this._filters.skills; - if (filters.filter != "all") { - if (elem.dataset["skilltype"] != filters.filter) { - elem.style.display = "none"; - } else { - elem.style.display = ""; - } - } - }); - - // Roll Skill - html - .find(".roll-button") - .children() - .on("click", async (event) => { - let upgradeType = null; - if (event.ctrlKey && !event.shiftKey) { - upgradeType = "ability"; - } else if (!event.ctrlKey && event.shiftKey) { - upgradeType = "difficulty"; - } - await this._rollSkill(event, upgradeType); - }); - - // Add or Remove Attribute - html.find(".attributes").on("click", ".attribute-control", this._onClickAttributeControl.bind(this)); - - // Update Filter value. - html.find(".skillfilter").on("click", ".filter-control", this._onClickFilterControl.bind(this)); - } - - /* -------------------------------------------- */ - - /** - * Listen for click events on an attribute control to modify the composition of attributes in the sheet - * @param {MouseEvent} event The originating left click event - * @private - */ - async _onClickAttributeControl(event) { - event.preventDefault(); - const a = event.currentTarget; - const action = a.dataset.action; - const attrs = this.object.data.data.attributes; - const form = this.form; - - // Add new attribute - if (action === "create") { - const nk = Object.keys(attrs).length + 1; - let newKey = document.createElement("div"); - newKey.innerHTML = ``; - form.appendChild(newKey); - await this._onSubmit(event); - } - - // Remove existing attribute - else if (action === "delete") { - const li = a.closest(".attribute"); - li.parentElement.removeChild(li); - await this._onSubmit(event); - } - } - - /** - * Listen for click events on a filter control to modify the selected filter option. - * @param {MouseEvent} event The originating left click event - * @private - */ - async _onClickFilterControl(event) { - event.preventDefault(); - const a = event.currentTarget; - const filters = this._filters.skills; - var filter = a.id; - $(a).prop("checked", true); - filters.filter = filter; - await this._onSubmit(event); - } - - /* -------------------------------------------- */ - - /** @override */ - _updateObject(event, formData) { - // Handle the free-form attributes list - const formAttrs = expandObject(formData).data.attributes || {}; - const attributes = Object.values(formAttrs).reduce((obj, v) => { - let k = v["key"].trim(); - if (/[\s\.]/.test(k)) return ui.notifications.error("Attribute keys may not contain spaces or periods"); - delete v["key"]; - obj[k] = v; - return obj; - }, {}); - - // Remove attributes which are no longer used - for (let k of Object.keys(this.object.data.data.attributes)) { - if (!attributes.hasOwnProperty(k)) attributes[`-=${k}`] = null; - } - - // Re-combine formData - formData = Object.entries(formData) - .filter((e) => !e[0].startsWith("data.attributes")) - .reduce( - (obj, e) => { - obj[e[0]] = e[1]; - return obj; - }, - { _id: this.object._id, "data.attributes": attributes } - ); - - // Update the Actor - return this.object.update(formData); - } - - async _rollSkillManual(skill, ability, difficulty) { - const dicePool = new DicePoolFFG({ - ability: ability, - difficulty: difficulty, - }); - dicePool.upgrade(skill); - await this._completeRollManual(dicePool, skillName); - } - - async _rollSkill(event, upgradeType) { - const data = this.getData(); - const row = event.target.parentElement.parentElement; - const skillName = row.parentElement.dataset["ability"]; - const skill = data.data.skills[skillName]; - const characteristic = data.data.characteristics[skill.characteristic]; - - const dicePool = new DicePoolFFG({ - ability: characteristic.value, - difficulty: 2, // Default to average difficulty - }); - dicePool.upgrade(skill.rank); - - if (upgradeType === "ability") { - dicePool.upgrade(); - } else if (upgradeType === "difficulty") { - dicePool.upgradeDifficulty(); - } - - await this._completeRoll(dicePool, `Rolling ${skillName}`, skillName); - } - - async _completeRoll(dicePool, description, skillName) { - const id = randomID(); - - const content = await renderTemplate("systems/starwarsffg/templates/roll-options.html", { - dicePool, - id, - }); - - new Dialog({ - title: description || "Finalize your roll", - content, - buttons: { - one: { - icon: '', - label: "Roll", - callback: () => { - const container = document.getElementById(id); - const finalPool = DicePoolFFG.fromContainer(container); - - ChatMessage.create({ - user: game.user._id, - speaker: this.getData(), - flavor: `Rolling ${skillName}...`, - sound: CONFIG.sounds.dice, - content: `/sw ${finalPool.renderDiceExpression()}`, - }); - }, - }, - two: { - icon: '', - label: "Cancel", - }, - }, - }).render(true); - } - - async _completeRollManual(dicePool, skillName) { - ChatMessage.create({ - user: game.user._id, - speaker: this.getData(), - flavor: `Rolling ${skillName}...`, - sound: CONFIG.sounds.dice, - content: `/sw ${dicePool.renderDiceExpression()}`, - }); - } - - _addSkillDicePool(elem) { - const data = this.getData(); - const skillName = elem.dataset["ability"]; - const skill = data.data.skills[skillName]; - const characteristic = data.data.characteristics[skill.characteristic]; - - const dicePool = new DicePoolFFG({ - ability: Math.max(characteristic.value, skill.rank), - }); - dicePool.upgrade(Math.min(characteristic.value, skill.rank)); - - const rollButton = elem.querySelector(".roll-button"); - dicePool.renderPreview(rollButton); - } -} +/** + * Extend the basic ActorSheet with some very simple modifications + * @extends {ActorSheet} + */ +export class ActorSheetFFG extends ActorSheet { + constructor(...args) { + super(...args); + /** + * Track the set of filters which are applied + * @type {Set} + */ + this._filters = { + skills: new Set(), + }; + } + + pools = new Map(); + + /** @override */ + static get defaultOptions() { + return mergeObject(super.defaultOptions, { + classes: ["starwarsffg", "sheet", "actor"], + template: "systems/starwarsffg/templates/actors/ffg-character-sheet.html", + width: 710, + height: 650, + tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "characteristics" }], + }); + } + + /** @override */ + get template() { + const path = "systems/starwarsffg/templates/actors"; + return `${path}/ffg-${this.actor.data.type}-sheet.html`; + } + + /* -------------------------------------------- */ + + /** @override */ + getData() { + const data = super.getData(); + data.dtypes = ["String", "Number", "Boolean"]; + for (let attr of Object.values(data.data.attributes)) { + attr.isCheckbox = attr.dtype === "Boolean"; + } + data.FFG = CONFIG.FFG; + + switch (this.actor.data.type) { + case "character": + this.position.width = 610; + this.position.height = 840; + break; + case "minion": + this.position.width = 700; + this.position.height = 620; + break; + case "vehicle": + this.position.width = 710; + this.position.height = 650; + default: + } + return data; + } + + /* -------------------------------------------- */ + + /** @override */ + activateListeners(html) { + super.activateListeners(html); + + // TODO: This is not needed in Foundry 0.6.0 + // Activate tabs + let tabs = html.find(".tabs"); + let initial = this._sheetTab; + new TabsV2(tabs, { + initial: initial, + callback: (clicked) => (this._sheetTab = clicked.data("tab")), + }); + + // Everything below here is only needed if the sheet is editable + if (!this.options.editable) return; + + // Update Inventory Item - By clicking entire line + html.find(".item").click((ev) => { + if (!$(ev.target).hasClass("fa-trash")) { + const li = $(ev.currentTarget); + const item = this.actor.getOwnedItem(li.data("itemId")); + if(item?.sheet) { + item.sheet.render(true); + } + } + }); + // Update Talent - By clicking entire line + html.find(".talents.item").click((ev) => { + if (!$(ev.target).hasClass("fa-trash")) { + const li = $(ev.currentTarget); + const item = this.actor.getOwnedItem(li.data("itemId")); + item.sheet.render(true); + } + }); + + // Delete Inventory Item + html.find(".item-delete").click((ev) => { + const li = $(ev.currentTarget).parents(".item"); + this.actor.deleteOwnedItem(li.data("itemId")); + li.slideUp(200, () => this.render(false)); + }); + + // Set skill filter element. + html.find(".skillfilter").each((_, elem) => { + const filters = this._filters.skills; + if (!filters.filter) { + filters.filter = "all"; + } + }); + + // Update radio button checked status for skill filter controls. + html.find(".filter-control").each((_, elem) => { + if (elem.id == this._filters.skills.filter) { + elem.checked = true; + } else { + elem.checked = false; + } + }); + + // Setup dice pool image and hide filtered skills + html.find(".skill").each((_, elem) => { + this._addSkillDicePool(elem); + const filters = this._filters.skills; + if (filters.filter != "all") { + if (elem.dataset["skilltype"] != filters.filter) { + elem.style.display = "none"; + } else { + elem.style.display = ""; + } + } + }); + + // Roll Skill + html + .find(".roll-button") + .children() + .on("click", async (event) => { + let upgradeType = null; + if (event.ctrlKey && !event.shiftKey) { + upgradeType = "ability"; + } else if (!event.ctrlKey && event.shiftKey) { + upgradeType = "difficulty"; + } + await this._rollSkill(event, upgradeType); + }); + + // Add or Remove Attribute + html.find(".attributes").on("click", ".attribute-control", this._onClickAttributeControl.bind(this)); + + // Update Filter value. + html.find(".skillfilter").on("click", ".filter-control", this._onClickFilterControl.bind(this)); + } + + /* -------------------------------------------- */ + + /** + * Listen for click events on an attribute control to modify the composition of attributes in the sheet + * @param {MouseEvent} event The originating left click event + * @private + */ + async _onClickAttributeControl(event) { + event.preventDefault(); + const a = event.currentTarget; + const action = a.dataset.action; + const attrs = this.object.data.data.attributes; + const form = this.form; + + // Add new attribute + if (action === "create") { + const nk = Object.keys(attrs).length + 1; + let newKey = document.createElement("div"); + newKey.innerHTML = ``; + form.appendChild(newKey); + await this._onSubmit(event); + } + + // Remove existing attribute + else if (action === "delete") { + const li = a.closest(".attribute"); + li.parentElement.removeChild(li); + await this._onSubmit(event); + } + } + + /** + * Listen for click events on a filter control to modify the selected filter option. + * @param {MouseEvent} event The originating left click event + * @private + */ + async _onClickFilterControl(event) { + event.preventDefault(); + const a = event.currentTarget; + const filters = this._filters.skills; + var filter = a.id; + $(a).prop("checked", true); + filters.filter = filter; + await this._onSubmit(event); + } + + /* -------------------------------------------- */ + + /** @override */ + _updateObject(event, formData) { + // Handle the free-form attributes list + const formAttrs = expandObject(formData).data.attributes || {}; + const attributes = Object.values(formAttrs).reduce((obj, v) => { + let k = v["key"].trim(); + if (/[\s\.]/.test(k)) return ui.notifications.error("Attribute keys may not contain spaces or periods"); + delete v["key"]; + obj[k] = v; + return obj; + }, {}); + + // Remove attributes which are no longer used + for (let k of Object.keys(this.object.data.data.attributes)) { + if (!attributes.hasOwnProperty(k)) attributes[`-=${k}`] = null; + } + + // Re-combine formData + formData = Object.entries(formData) + .filter((e) => !e[0].startsWith("data.attributes")) + .reduce( + (obj, e) => { + obj[e[0]] = e[1]; + return obj; + }, + { _id: this.object._id, "data.attributes": attributes } + ); + + // Update the Actor + return this.object.update(formData); + } + + async _rollSkillManual(skill, ability, difficulty) { + const dicePool = new DicePoolFFG({ + ability: ability, + difficulty: difficulty, + }); + dicePool.upgrade(skill); + await this._completeRollManual(dicePool, skillName); + } + + async _rollSkill(event, upgradeType) { + const data = this.getData(); + const row = event.target.parentElement.parentElement; + const skillName = row.parentElement.dataset["ability"]; + const skill = data.data.skills[skillName]; + const characteristic = data.data.characteristics[skill.characteristic]; + + const dicePool = new DicePoolFFG({ + ability: characteristic.value, + difficulty: 2, // Default to average difficulty + }); + dicePool.upgrade(skill.rank); + + if (upgradeType === "ability") { + dicePool.upgrade(); + } else if (upgradeType === "difficulty") { + dicePool.upgradeDifficulty(); + } + + await this._completeRoll(dicePool, `Rolling ${skillName}`, skillName); + } + + async _completeRoll(dicePool, description, skillName) { + const id = randomID(); + + const content = await renderTemplate("systems/starwarsffg/templates/roll-options.html", { + dicePool, + id, + }); + + new Dialog({ + title: description || "Finalize your roll", + content, + buttons: { + one: { + icon: '', + label: "Roll", + callback: () => { + const container = document.getElementById(id); + const finalPool = DicePoolFFG.fromContainer(container); + + ChatMessage.create({ + user: game.user._id, + speaker: this.getData(), + flavor: `Rolling ${skillName}...`, + sound: CONFIG.sounds.dice, + content: `/sw ${finalPool.renderDiceExpression()}`, + }); + }, + }, + two: { + icon: '', + label: "Cancel", + }, + }, + }).render(true); + } + + async _completeRollManual(dicePool, skillName) { + ChatMessage.create({ + user: game.user._id, + speaker: this.getData(), + flavor: `Rolling ${skillName}...`, + sound: CONFIG.sounds.dice, + content: `/sw ${dicePool.renderDiceExpression()}`, + }); + } + + _addSkillDicePool(elem) { + const data = this.getData(); + const skillName = elem.dataset["ability"]; + const skill = data.data.skills[skillName]; + const characteristic = data.data.characteristics[skill.characteristic]; + + const dicePool = new DicePoolFFG({ + ability: Math.max(characteristic.value, skill.rank), + }); + dicePool.upgrade(Math.min(characteristic.value, skill.rank)); + + const rollButton = elem.querySelector(".roll-button"); + dicePool.renderPreview(rollButton); + } +} diff --git a/modules/combat-ffg.js b/modules/combat-ffg.js index e17e35af..385d83db 100644 --- a/modules/combat-ffg.js +++ b/modules/combat-ffg.js @@ -1,69 +1,69 @@ -/** - * Extend the base Combat entity. - * @extends {Combat} - */ -export class CombatFFG extends Combat { - - /** @override */ - _getInitiativeRoll(combatant, formula) { - const cData = combatant.actor.data.data; - const origFormula = formula; - - if (combatant.actor.data.type === "vehicle") { return new Roll("0"); } - - if (formula === "Vigilance") { - formula = _getInitiativeFormula(cData.skills.Vigilance.rank, cData.characteristics.Willpower.value, 0); - } - else if (formula === "Cool") { - formula = _getInitiativeFormula(cData.skills.Cool.rank, cData.characteristics.Presence.value, 0); - } - - const rollData = combatant.actor ? combatant.actor.getRollData() : {}; - const letters = formula.split(''); - const rolls = []; - const getSuc = new RegExp('Successes: ([0-9]+)', 'g'); - const getAdv = new RegExp('Advantages: ([0-9]+)', 'g'); - - for (const letter of letters) { - rolls.push(game.ffg.StarWars.letterToRolls(letter, 1)); - } - - let newformula = combineAll(rolls, game.ffg.StarWars.rollValuesMonoid); - - let rolling = game.specialDiceRoller.starWars.roll(newformula); - - let results = game.specialDiceRoller.starWars.formatRolls(rolling); - - let success = 0; - let advantage = 0; - - success = getSuc.exec(results); - if (success) { success = success[1]; } - advantage = getAdv.exec(results); - if (advantage) { advantage = advantage[1]; } - - let total = +success+(advantage*0.01); - - console.log(`Total is: ${total}`); - - let roll = new Roll(origFormula, rollData).roll(); - roll._result = total; - roll._total = total; - - return roll; - } -} - -function combineAll(values, monoid) { - return values - .reduce((prev, curr) => monoid.combine(prev, curr), monoid.identity); -} - -function _getInitiativeFormula(skill, ability, difficulty) { - const dicePool = new DicePoolFFG({ - ability: ability, - difficulty: difficulty - }); - dicePool.upgrade(skill); - return dicePool.renderDiceExpression(); -} +/** + * Extend the base Combat entity. + * @extends {Combat} + */ +export class CombatFFG extends Combat { + + /** @override */ + _getInitiativeRoll(combatant, formula) { + const cData = combatant.actor.data.data; + const origFormula = formula; + + if (combatant.actor.data.type === "vehicle") { return new Roll("0"); } + + if (formula === "Vigilance") { + formula = _getInitiativeFormula(cData.skills.Vigilance.rank, cData.characteristics.Willpower.value, 0); + } + else if (formula === "Cool") { + formula = _getInitiativeFormula(cData.skills.Cool.rank, cData.characteristics.Presence.value, 0); + } + + const rollData = combatant.actor ? combatant.actor.getRollData() : {}; + const letters = formula.split(''); + const rolls = []; + const getSuc = new RegExp('Successes: ([0-9]+)', 'g'); + const getAdv = new RegExp('Advantages: ([0-9]+)', 'g'); + + for (const letter of letters) { + rolls.push(game.ffg.StarWars.letterToRolls(letter, 1)); + } + + let newformula = combineAll(rolls, game.ffg.StarWars.rollValuesMonoid); + + let rolling = game.specialDiceRoller.starWars.roll(newformula); + + let results = game.specialDiceRoller.starWars.formatRolls(rolling); + + let success = 0; + let advantage = 0; + + success = getSuc.exec(results); + if (success) { success = success[1]; } + advantage = getAdv.exec(results); + if (advantage) { advantage = advantage[1]; } + + let total = +success+(advantage*0.01); + + console.log(`Total is: ${total}`); + + let roll = new Roll(origFormula, rollData).roll(); + roll._result = total; + roll._total = total; + + return roll; + } +} + +function combineAll(values, monoid) { + return values + .reduce((prev, curr) => monoid.combine(prev, curr), monoid.identity); +} + +function _getInitiativeFormula(skill, ability, difficulty) { + const dicePool = new DicePoolFFG({ + ability: ability, + difficulty: difficulty + }); + dicePool.upgrade(skill); + return dicePool.renderDiceExpression(); +} diff --git a/modules/dice-pool-ffg.js b/modules/dice-pool-ffg.js index 72590920..dad21f35 100644 --- a/modules/dice-pool-ffg.js +++ b/modules/dice-pool-ffg.js @@ -1,128 +1,128 @@ -const PROFICIENCY_ICON = "modules/special-dice-roller/public/images/sw/yellow.png"; -const ABILITY_ICON = "modules/special-dice-roller/public/images/sw/green.png"; -const CHALLENGE_ICON = "modules/special-dice-roller/public/images/sw/red.png"; -const DIFFICULTY_ICON = "modules/special-dice-roller/public/images/sw/purple.png"; -const BOOST_ICON = "modules/special-dice-roller/public/images/sw/blue.png"; -const SETBACK_ICON = "modules/special-dice-roller/public/images/sw/black.png"; -const FORCE_ICON = "modules/special-dice-roller/public/images/sw/whiteHex.png"; - -/** - * Dice pool utility specializing in the FFG special dice - */ -export class DicePoolFFG { - constructor(obj) { - if (obj === undefined) { - obj = {}; - } - if (typeof(obj) === "string") { - obj = JSON.parse(obj); - } - this.proficiency = obj.proficiency || 0; - this.ability = obj.ability || 0; - this.challenge = obj.challenge || 0; - this.difficulty = obj.difficulty || 0; - this.boost = obj.boost || 0; - this.setback = obj.setback || 0; - this.force = obj.force || 0; - } - - /** - * Upgrade the dice pool, converting any remaining ability dice into proficiency - * dice or adding an ability die if none remain. - * @param times the number of times to perform this operation, defaults to 1 - */ - upgrade(times) { - if (times === undefined) { - times = 1; - } - for (let i = 0; i < times; i++) { - if (this.ability > 0) { - this.ability--; - this.proficiency++; - } else { - this.ability++; - } - } - } - /** - * Upgrade the dice pool's difficulty, converting any remaining difficulty dice - * into challenge dice or adding an difficulty die if none remain. - * @param times the number of times to perform this operation, defaults to 1 - */ - upgradeDifficulty(times) { - if (times === undefined) { - times = 1; - } - for (let i = 0; i < times; i++) { - if (this.difficulty > 0) { - this.difficulty--; - this.challenge++; - } else { - this.difficulty++; - } - } - } - - /** - * Transform the dice pool into a rollable expression - * @returns {string} a dice expression that can be used to roll the dice pool - */ - renderDiceExpression() { - return [ - "p".repeat(this.proficiency), - "a".repeat(this.ability), - "c".repeat(this.challenge), - "d".repeat(this.difficulty), - "b".repeat(this.boost), - "s".repeat(this.setback), - "f".repeat(this.force) - ].join(""); - } - - /** - * Create a preview of the dice pool using images - * @param container {HTMLElement} where to place the preview. A container will be generated if this is undefined - * @returns {HTMLElement} - */ - renderPreview(container) { - if (container === undefined) { - container = document.createElement("div"); - container.classList.add("dice-pool"); - } - this._addIcons(container, PROFICIENCY_ICON, this.proficiency); - this._addIcons(container, ABILITY_ICON, this.ability); - this._addIcons(container, CHALLENGE_ICON, this.challenge); - this._addIcons(container, DIFFICULTY_ICON, this.difficulty); - this._addIcons(container, BOOST_ICON, this.boost); - this._addIcons(container, SETBACK_ICON, this.setback); - this._addIcons(container, FORCE_ICON, this.force); - return container; - } - - _addIcons(container, icon, times) { - for (let i = 0; i < times; i++) { - const img = document.createElement("img"); - img.src = icon; - img.width = 48; - img.height = 48; - container.appendChild(img); - } - } - - /** - * Search the passed container for inputs that contain dice pool information - * @param container the container where the inputs are located - * @returns {DicePoolFFG} - */ - static fromContainer(container) { - return new DicePoolFFG({ - proficiency: container.querySelector('[name="proficiency"]').value, - ability: container.querySelector('[name="ability"]').value, - challenge: container.querySelector('[name="challenge"]').value, - difficulty: container.querySelector('[name="difficulty"]').value, - boost: container.querySelector('[name="boost"]').value, - setback: container.querySelector('[name="setback"]').value, - force: container.querySelector('[name="force"]').value, - }) - } -} +const PROFICIENCY_ICON = "modules/special-dice-roller/public/images/sw/yellow.png"; +const ABILITY_ICON = "modules/special-dice-roller/public/images/sw/green.png"; +const CHALLENGE_ICON = "modules/special-dice-roller/public/images/sw/red.png"; +const DIFFICULTY_ICON = "modules/special-dice-roller/public/images/sw/purple.png"; +const BOOST_ICON = "modules/special-dice-roller/public/images/sw/blue.png"; +const SETBACK_ICON = "modules/special-dice-roller/public/images/sw/black.png"; +const FORCE_ICON = "modules/special-dice-roller/public/images/sw/whiteHex.png"; + +/** + * Dice pool utility specializing in the FFG special dice + */ +export class DicePoolFFG { + constructor(obj) { + if (obj === undefined) { + obj = {}; + } + if (typeof(obj) === "string") { + obj = JSON.parse(obj); + } + this.proficiency = obj.proficiency || 0; + this.ability = obj.ability || 0; + this.challenge = obj.challenge || 0; + this.difficulty = obj.difficulty || 0; + this.boost = obj.boost || 0; + this.setback = obj.setback || 0; + this.force = obj.force || 0; + } + + /** + * Upgrade the dice pool, converting any remaining ability dice into proficiency + * dice or adding an ability die if none remain. + * @param times the number of times to perform this operation, defaults to 1 + */ + upgrade(times) { + if (times === undefined) { + times = 1; + } + for (let i = 0; i < times; i++) { + if (this.ability > 0) { + this.ability--; + this.proficiency++; + } else { + this.ability++; + } + } + } + /** + * Upgrade the dice pool's difficulty, converting any remaining difficulty dice + * into challenge dice or adding an difficulty die if none remain. + * @param times the number of times to perform this operation, defaults to 1 + */ + upgradeDifficulty(times) { + if (times === undefined) { + times = 1; + } + for (let i = 0; i < times; i++) { + if (this.difficulty > 0) { + this.difficulty--; + this.challenge++; + } else { + this.difficulty++; + } + } + } + + /** + * Transform the dice pool into a rollable expression + * @returns {string} a dice expression that can be used to roll the dice pool + */ + renderDiceExpression() { + return [ + "p".repeat(this.proficiency), + "a".repeat(this.ability), + "c".repeat(this.challenge), + "d".repeat(this.difficulty), + "b".repeat(this.boost), + "s".repeat(this.setback), + "f".repeat(this.force) + ].join(""); + } + + /** + * Create a preview of the dice pool using images + * @param container {HTMLElement} where to place the preview. A container will be generated if this is undefined + * @returns {HTMLElement} + */ + renderPreview(container) { + if (container === undefined) { + container = document.createElement("div"); + container.classList.add("dice-pool"); + } + this._addIcons(container, PROFICIENCY_ICON, this.proficiency); + this._addIcons(container, ABILITY_ICON, this.ability); + this._addIcons(container, CHALLENGE_ICON, this.challenge); + this._addIcons(container, DIFFICULTY_ICON, this.difficulty); + this._addIcons(container, BOOST_ICON, this.boost); + this._addIcons(container, SETBACK_ICON, this.setback); + this._addIcons(container, FORCE_ICON, this.force); + return container; + } + + _addIcons(container, icon, times) { + for (let i = 0; i < times; i++) { + const img = document.createElement("img"); + img.src = icon; + img.width = 48; + img.height = 48; + container.appendChild(img); + } + } + + /** + * Search the passed container for inputs that contain dice pool information + * @param container the container where the inputs are located + * @returns {DicePoolFFG} + */ + static fromContainer(container) { + return new DicePoolFFG({ + proficiency: container.querySelector('[name="proficiency"]').value, + ability: container.querySelector('[name="ability"]').value, + challenge: container.querySelector('[name="challenge"]').value, + difficulty: container.querySelector('[name="difficulty"]').value, + boost: container.querySelector('[name="boost"]').value, + setback: container.querySelector('[name="setback"]').value, + force: container.querySelector('[name="force"]').value, + }) + } +} diff --git a/modules/groupmanager-ffg.js b/modules/groupmanager-ffg.js index df7bfc43..3e63e858 100644 --- a/modules/groupmanager-ffg.js +++ b/modules/groupmanager-ffg.js @@ -1,103 +1,103 @@ -export class GroupManagerLayer extends TokenLayer { - constructor() { - super(); - } - - static get layerOptions() { - return mergeObject(super.layerOptions, { - canDragCreate: false, - }); - } - /* -------------------------------------------- */ - /* Methods - /* -------------------------------------------- */ - - activate() { - super.activate(); - } - - deactivate() { - super.deactivate(); - } - - async draw() { - super.draw(); - } - - /* -------------------------------------------- */ -} - -export class GroupManager extends FormApplication { - static get defaultOptions() { - return mergeObject(super.defaultOptions, { - classes: ["starwarsffg", "form", "group-manager"], - closeOnSubmit: false, - submitOnChange: true, - submitOnClose: true, - popOut: true, - editable: game.user.isGM, - width: 300, - height: 450, - template: "systems/starwarsffg/templates/group-manager.html", - id: "group-manager", - title: "Group Manager", - }); - } - - /* -------------------------------------------- */ - - /** - * Obtain module metadata and merge it with game settings which track current module visibility - * @return {Object} The data provided to the template when rendering the form - */ - getData() { - return { g: game }; - } - - /* -------------------------------------------- */ - - /** @override */ - activateListeners(html) { - super.activateListeners(html); - - // Everything below here is only needed if the sheet is editable - if (!this.options.editable) return; - - // Flip destiny pool DARK to LIGHT - html.find(".destiny-flip-dtl").click((ev) => { - let LightPool = this.form.elements["g.ffg.DestinyPool.Light"].value; - let DarkPool = this.form.elements["g.ffg.DestinyPool.Dark"].value; - if (DarkPool > 0) { - LightPool++; - DarkPool--; - this.form.elements["g.ffg.DestinyPool.Light"].value = LightPool; - this.form.elements["g.ffg.DestinyPool.Dark"].value = DarkPool; - } - }); - - // Flip destiny pool LIGHT to DARK - html.find(".destiny-flip-ltd").click((ev) => { - let LightPool = this.form.elements["g.ffg.DestinyPool.Light"].value; - let DarkPool = this.form.elements["g.ffg.DestinyPool.Dark"].value; - if (LightPool > 0) { - LightPool--; - DarkPool++; - this.form.elements["g.ffg.DestinyPool.Light"].value = LightPool; - this.form.elements["g.ffg.DestinyPool.Dark"].value = DarkPool; - } - }); - } - - /** - * This method is called upon form submission after form data is validated - * @param event {Event} The initial triggering submission event - * @param formData {Object} The object of validated form data with which to update the object - * @private - */ - _updateObject(event, formData) { - const formDPool = expandObject(formData).g.ffg.DestinyPool || {}; - game.ffg.DestinyPool.Light = formDPool.Light; - game.ffg.DestinyPool.Dark = formDPool.Dark; - return formData; - } -} +export class GroupManagerLayer extends TokenLayer { + constructor() { + super(); + } + + static get layerOptions() { + return mergeObject(super.layerOptions, { + canDragCreate: false, + }); + } + /* -------------------------------------------- */ + /* Methods + /* -------------------------------------------- */ + + activate() { + super.activate(); + } + + deactivate() { + super.deactivate(); + } + + async draw() { + super.draw(); + } + + /* -------------------------------------------- */ +} + +export class GroupManager extends FormApplication { + static get defaultOptions() { + return mergeObject(super.defaultOptions, { + classes: ["starwarsffg", "form", "group-manager"], + closeOnSubmit: false, + submitOnChange: true, + submitOnClose: true, + popOut: true, + editable: game.user.isGM, + width: 300, + height: 450, + template: "systems/starwarsffg/templates/group-manager.html", + id: "group-manager", + title: "Group Manager", + }); + } + + /* -------------------------------------------- */ + + /** + * Obtain module metadata and merge it with game settings which track current module visibility + * @return {Object} The data provided to the template when rendering the form + */ + getData() { + return { g: game }; + } + + /* -------------------------------------------- */ + + /** @override */ + activateListeners(html) { + super.activateListeners(html); + + // Everything below here is only needed if the sheet is editable + if (!this.options.editable) return; + + // Flip destiny pool DARK to LIGHT + html.find(".destiny-flip-dtl").click((ev) => { + let LightPool = this.form.elements["g.ffg.DestinyPool.Light"].value; + let DarkPool = this.form.elements["g.ffg.DestinyPool.Dark"].value; + if (DarkPool > 0) { + LightPool++; + DarkPool--; + this.form.elements["g.ffg.DestinyPool.Light"].value = LightPool; + this.form.elements["g.ffg.DestinyPool.Dark"].value = DarkPool; + } + }); + + // Flip destiny pool LIGHT to DARK + html.find(".destiny-flip-ltd").click((ev) => { + let LightPool = this.form.elements["g.ffg.DestinyPool.Light"].value; + let DarkPool = this.form.elements["g.ffg.DestinyPool.Dark"].value; + if (LightPool > 0) { + LightPool--; + DarkPool++; + this.form.elements["g.ffg.DestinyPool.Light"].value = LightPool; + this.form.elements["g.ffg.DestinyPool.Dark"].value = DarkPool; + } + }); + } + + /** + * This method is called upon form submission after form data is validated + * @param event {Event} The initial triggering submission event + * @param formData {Object} The object of validated form data with which to update the object + * @private + */ + _updateObject(event, formData) { + const formDPool = expandObject(formData).g.ffg.DestinyPool || {}; + game.ffg.DestinyPool.Light = formDPool.Light; + game.ffg.DestinyPool.Dark = formDPool.Dark; + return formData; + } +} diff --git a/modules/items/item-ffg.js b/modules/items/item-ffg.js index 12c50414..48f4d6f6 100644 --- a/modules/items/item-ffg.js +++ b/modules/items/item-ffg.js @@ -1,20 +1,20 @@ -/** - * Extend the basic Item with some very simple modifications. - * @extends {Item} - */ -export class ItemFFG extends Item { - /** - * Augment the basic Item data model with additional dynamic data. - */ - prepareData() { - super.prepareData(); - - // Get the Item's data - const itemData = this.data; - const actorData = this.actor ? this.actor.data : {}; - const data = itemData.data; - - itemData.safe_desc = data.description.replace(/(<([^>]+)>)/ig,""); - - } -} +/** + * Extend the basic Item with some very simple modifications. + * @extends {Item} + */ +export class ItemFFG extends Item { + /** + * Augment the basic Item data model with additional dynamic data. + */ + prepareData() { + super.prepareData(); + + // Get the Item's data + const itemData = this.data; + const actorData = this.actor ? this.actor.data : {}; + const data = itemData.data; + + itemData.safe_desc = data.description.replace(/(<([^>]+)>)/ig,""); + + } +} diff --git a/modules/items/item-sheet-ffg.js b/modules/items/item-sheet-ffg.js index 0cdda9b2..91b0791c 100644 --- a/modules/items/item-sheet-ffg.js +++ b/modules/items/item-sheet-ffg.js @@ -1,121 +1,139 @@ -/** - * Extend the basic ItemSheet with some very simple modifications - * @extends {ItemSheet} - */ -export class ItemSheetFFG extends ItemSheet { - /** @override */ - static get defaultOptions() { - return mergeObject(super.defaultOptions, { - classes: ["starwarsffg", "sheet", "item"], - width: 784, - height: 484, - tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "description" }], - }); - } - - /** @override */ - get template() { - const path = "systems/starwarsffg/templates/items"; - return `${path}/ffg-${this.item.data.type}-sheet.html`; - } - - /* -------------------------------------------- */ - - /** @override */ - getData() { - const data = super.getData(); - data.dtypes = ["String", "Number", "Boolean"]; - for (let attr of Object.values(data.data.attributes)) { - attr.isCheckbox = attr.dtype === "Boolean"; - } - data.FFG = CONFIG.FFG; - return data; - } - - /* -------------------------------------------- */ - - /** @override */ - activateListeners(html) { - super.activateListeners(html); - - // TODO: This is not needed in Foundry 0.6.0 - // Activate tabs - let tabs = html.find(".tabs"); - let initial = this._sheetTab; - new TabsV2(tabs, { - initial: initial, - callback: (clicked) => (this._sheetTab = clicked.data("tab")), - }); - - // Everything below here is only needed if the sheet is editable - if (!this.options.editable) return; - - // Add or Remove Attribute - html.find(".attributes").on("click", ".attribute-control", this._onClickAttributeControl.bind(this)); - } - - /* -------------------------------------------- */ - - /** - * Listen for click events on an attribute control to modify the composition of attributes in the sheet - * @param {MouseEvent} event The originating left click event - * @private - */ - async _onClickAttributeControl(event) { - event.preventDefault(); - const a = event.currentTarget; - const action = a.dataset.action; - const attrs = this.object.data.data.attributes; - const form = this.form; - - // Add new attribute - if (action === "create") { - const nk = Object.keys(attrs).length + 1; - let newKey = document.createElement("div"); - newKey.innerHTML = ``; - form.appendChild(newKey); - await this._onSubmit(event); - } - - // Remove existing attribute - else if (action === "delete") { - const li = a.closest(".attribute"); - li.parentElement.removeChild(li); - await this._onSubmit(event); - } - } - - /* -------------------------------------------- */ - - /** @override */ - _updateObject(event, formData) { - // Handle the free-form attributes list - const formAttrs = expandObject(formData).data.attributes || {}; - const attributes = Object.values(formAttrs).reduce((obj, v) => { - let k = v["key"].trim(); - if (/[\s\.]/.test(k)) return ui.notifications.error("Attribute keys may not contain spaces or periods"); - delete v["key"]; - obj[k] = v; - return obj; - }, {}); - - // Remove attributes which are no longer used - for (let k of Object.keys(this.object.data.data.attributes)) { - if (!attributes.hasOwnProperty(k)) attributes[`-=${k}`] = null; - } - - // Re-combine formData - formData = Object.entries(formData) - .filter((e) => !e[0].startsWith("data.attributes")) - .reduce( - (obj, e) => { - obj[e[0]] = e[1]; - return obj; - }, - { _id: this.object._id, "data.attributes": attributes } - ); - - // Update the Actor - return this.object.update(formData); - } -} +/** + * Extend the basic ItemSheet with some very simple modifications + * @extends {ItemSheet} + */ +export class ItemSheetFFG extends ItemSheet { + /** @override */ + static get defaultOptions() { + return mergeObject(super.defaultOptions, { + classes: ["starwarsffg", "sheet", "item"], + width: 784, + height: 484, + tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "description" }], + }); + } + + /** @override */ + get template() { + const path = "systems/starwarsffg/templates/items"; + return `${path}/ffg-${this.item.data.type}-sheet.html`; + } + + /* -------------------------------------------- */ + + /** @override */ + getData() { + const data = super.getData(); + data.dtypes = ["String", "Number", "Boolean"]; + for (let attr of Object.values(data.data.attributes)) { + attr.isCheckbox = attr.dtype === "Boolean"; + } + + switch (this.object.data.type) { + case "weapon": + this.position.width = 385; + this.position.height = 650; + break; + case "armour": + case "gear": + this.position.width = 385; + this.position.height = 575; + break; + case "talent": + this.position.width = 405; + this.position.height = 475; + break; + default: + } + + data.FFG = CONFIG.FFG; + return data; + } + + /* -------------------------------------------- */ + + /** @override */ + activateListeners(html) { + super.activateListeners(html); + + // TODO: This is not needed in Foundry 0.6.0 + // Activate tabs + let tabs = html.find(".tabs"); + let initial = this._sheetTab; + new TabsV2(tabs, { + initial: initial, + callback: (clicked) => (this._sheetTab = clicked.data("tab")), + }); + + // Everything below here is only needed if the sheet is editable + if (!this.options.editable) return; + + // Add or Remove Attribute + html.find(".attributes").on("click", ".attribute-control", this._onClickAttributeControl.bind(this)); + } + + /* -------------------------------------------- */ + + /** + * Listen for click events on an attribute control to modify the composition of attributes in the sheet + * @param {MouseEvent} event The originating left click event + * @private + */ + async _onClickAttributeControl(event) { + event.preventDefault(); + const a = event.currentTarget; + const action = a.dataset.action; + const attrs = this.object.data.data.attributes; + const form = this.form; + + // Add new attribute + if (action === "create") { + const nk = Object.keys(attrs).length + 1; + let newKey = document.createElement("div"); + newKey.innerHTML = ``; + form.appendChild(newKey); + await this._onSubmit(event); + } + + // Remove existing attribute + else if (action === "delete") { + const li = a.closest(".attribute"); + li.parentElement.removeChild(li); + await this._onSubmit(event); + } + } + + /* -------------------------------------------- */ + + /** @override */ + _updateObject(event, formData) { + // Handle the free-form attributes list + const formAttrs = expandObject(formData).data.attributes || {}; + const attributes = Object.values(formAttrs).reduce((obj, v) => { + let k = v["key"].trim(); + if (/[\s\.]/.test(k)) return ui.notifications.error("Attribute keys may not contain spaces or periods"); + delete v["key"]; + obj[k] = v; + return obj; + }, {}); + + // Remove attributes which are no longer used + for (let k of Object.keys(this.object.data.data.attributes)) { + if (!attributes.hasOwnProperty(k)) attributes[`-=${k}`] = null; + } + + // Re-combine formData + formData = Object.entries(formData) + .filter((e) => !e[0].startsWith("data.attributes")) + .reduce( + (obj, e) => { + obj[e[0]] = e[1]; + return obj; + }, + { _id: this.object._id, "data.attributes": attributes } + ); + + // Update the Actor + return this.object.update(formData); + } +} diff --git a/modules/swffg-config.js b/modules/swffg-config.js index 4c749112..1818285f 100644 --- a/modules/swffg-config.js +++ b/modules/swffg-config.js @@ -1,126 +1,126 @@ -export const FFG = {}; - -FFG.characteristics = { - "Brawn": "Brawn", - "Agility": "Agility", - "Intellect": "Intellect", - "Cunning": "Cunning", - "Willpower": "Willpower", - "Presence": "Presence", -}; - -FFG.character_stats = { - "wounds": "Wounds", - "strain": "Strain", - "soak": "Soak", - "defence": "Defence", - "encumbrance": "Encumbrance", - "forcePool": "Force Pool", - "credits": "Credits", -}; - -FFG.skills = { - "Brawl": "Brawl", - "Gunnery": "Gunnery", - "Lightsaber": "Lightsaber", - "Melee": "Melee", - "Ranged: Light": "Ranged: Light", - "Ranged: Heavy": "Ranged: Heavy", - "Astrogation": "Astrogation", - "Athletics ": "Athletics", - "Charm": "Charm", - "Coercion": "Coercion", - "Computers": "Computers", - "Cool": "Cool", - "Coordination": "Coordination", - "Deception": "Deception", - "Discipline": "Discipline", - "Leadership": "Leadership", - "Mechanics": "Mechanics", - "Medicine": "Medicine", - "Negotiation": "Negotiation", - "Perception": "Perception", - "Piloting: Planetary": "Piloting: Planetary", - "Piloting: Space": "Piloting: Space", - "Resilience": "Resilience", - "Skulduggery": "Skulduggery", - "Stealth": "Stealth", - "Streetwise": "Streetwise", - "Survival": "Survival", - "Vigilance": "Vigilance", - "Knowledge: Core Worlds": "Knowledge: Core Worlds", - "Knowledge: Education": "Knowledge: Education", - "Knowledge: Lore": "Knowledge: Lore", - "Knowledge: Outer Rim": "Knowledge: Outer Rim", - "Knowledge: Underworld": "Knowledge: Underworld", - "Knowledge: Warfare": "Knowledge: Warfare", - "Knowledge: Xenology": "Knowledge: Xenology", -}; - -FFG.skills.knowledgestripped = { - "Knowledge: Core Worlds": "Core Worlds", - "Knowledge: Education": "Education", - "Knowledge: Lore": "Lore", - "Knowledge: Outer Rim": "Outer Rim", - "Knowledge: Underworld": "Underworld", - "Knowledge: Warfare": "Warfare", - "Knowledge: Xenology": "Xenology", -}; - -FFG.ranges = { - "Engaged": "Engaged", - "Short": "Short", - "Medium": "Medium", - "Long": "Long", - "Extreme": "Extreme", -}; - -FFG.vehicle_ranges = { - "Close": "Close", - "Short": "Short", - "Medium": "Medium", - "Long": "Long", - "Extreme": "Extreme", -}; - -FFG.fire_arcs = { - "Forward": "Forward", - "Aft": "Aft", - "Port": "Port", - "Starboard": "Starboard", - "All": "All", -}; - -FFG.combat_skills = { - "Brawl": "Brawl", - "Gunnery": "Gunnery", - "Lightsaber": "Lightsaber", - "Melee": "Melee", - "Ranged: Light": "Ranged: Light", - "Ranged: Heavy": "Ranged: Heavy", -}; - -FFG.combat_skills.abrev = { - "Brawl": "B", - "Gunnery": "G", - "Lightsaber": "LS", - "Melee": "M", - "Ranged: Light": "RL", - "Ranged: Heavy": "RH", -}; - -FFG.activations = { - "Passive": "Passive", - "Active (Incidental)": "Active (Incidental)", - "Active (Incidental, Out of Turn)": "Active (Incidental, Out of Turn)", - "Active (Action)": "Active (Action)", - "Active (Maneuver)": "Active (Maneuver)", -}; - -FFG.mod_types = ["Characteristic", "Skill Rank", "Skill Boost", "Stat"]; - -FFG.species = {}; - -FFG.careers = {}; - -FFG.specialisations = {}; +export const FFG = {}; + +FFG.characteristics = { + "Brawn": "Brawn", + "Agility": "Agility", + "Intellect": "Intellect", + "Cunning": "Cunning", + "Willpower": "Willpower", + "Presence": "Presence", +}; + +FFG.character_stats = { + "wounds": "Wounds", + "strain": "Strain", + "soak": "Soak", + "defence": "Defence", + "encumbrance": "Encumbrance", + "forcePool": "Force Pool", + "credits": "Credits", +}; + +FFG.skills = { + "Brawl": "Brawl", + "Gunnery": "Gunnery", + "Lightsaber": "Lightsaber", + "Melee": "Melee", + "Ranged: Light": "Ranged: Light", + "Ranged: Heavy": "Ranged: Heavy", + "Astrogation": "Astrogation", + "Athletics ": "Athletics", + "Charm": "Charm", + "Coercion": "Coercion", + "Computers": "Computers", + "Cool": "Cool", + "Coordination": "Coordination", + "Deception": "Deception", + "Discipline": "Discipline", + "Leadership": "Leadership", + "Mechanics": "Mechanics", + "Medicine": "Medicine", + "Negotiation": "Negotiation", + "Perception": "Perception", + "Piloting: Planetary": "Piloting: Planetary", + "Piloting: Space": "Piloting: Space", + "Resilience": "Resilience", + "Skulduggery": "Skulduggery", + "Stealth": "Stealth", + "Streetwise": "Streetwise", + "Survival": "Survival", + "Vigilance": "Vigilance", + "Knowledge: Core Worlds": "Knowledge: Core Worlds", + "Knowledge: Education": "Knowledge: Education", + "Knowledge: Lore": "Knowledge: Lore", + "Knowledge: Outer Rim": "Knowledge: Outer Rim", + "Knowledge: Underworld": "Knowledge: Underworld", + "Knowledge: Warfare": "Knowledge: Warfare", + "Knowledge: Xenology": "Knowledge: Xenology", +}; + +FFG.skills.knowledgestripped = { + "Knowledge: Core Worlds": "Core Worlds", + "Knowledge: Education": "Education", + "Knowledge: Lore": "Lore", + "Knowledge: Outer Rim": "Outer Rim", + "Knowledge: Underworld": "Underworld", + "Knowledge: Warfare": "Warfare", + "Knowledge: Xenology": "Xenology", +}; + +FFG.ranges = { + "Engaged": "Engaged", + "Short": "Short", + "Medium": "Medium", + "Long": "Long", + "Extreme": "Extreme", +}; + +FFG.vehicle_ranges = { + "Close": "Close", + "Short": "Short", + "Medium": "Medium", + "Long": "Long", + "Extreme": "Extreme", +}; + +FFG.fire_arcs = { + "Forward": "Forward", + "Aft": "Aft", + "Port": "Port", + "Starboard": "Starboard", + "All": "All", +}; + +FFG.combat_skills = { + "Brawl": "Brawl", + "Gunnery": "Gunnery", + "Lightsaber": "Lightsaber", + "Melee": "Melee", + "Ranged: Light": "Ranged: Light", + "Ranged: Heavy": "Ranged: Heavy", +}; + +FFG.combat_skills.abrev = { + "Brawl": "B", + "Gunnery": "G", + "Lightsaber": "LS", + "Melee": "M", + "Ranged: Light": "RL", + "Ranged: Heavy": "RH", +}; + +FFG.activations = { + "Passive": "Passive", + "Active (Incidental)": "Active (Incidental)", + "Active (Incidental, Out of Turn)": "Active (Incidental, Out of Turn)", + "Active (Action)": "Active (Action)", + "Active (Maneuver)": "Active (Maneuver)", +}; + +FFG.mod_types = ["Characteristic", "Skill Rank", "Skill Boost", "Stat"]; + +FFG.species = {}; + +FFG.careers = {}; + +FFG.specialisations = {}; diff --git a/modules/swffg-main.js b/modules/swffg-main.js index 185ab450..dc0875b2 100644 --- a/modules/swffg-main.js +++ b/modules/swffg-main.js @@ -1,225 +1,225 @@ -/** - * A systems implementation of the Star Wars RPG by Fantasy Flight Games. - * Author: Esrin - * Software License: GNU GPLv3 - */ - -// Import Modules -import { FFG } from "./swffg-config.js"; -import { ActorFFG } from "./actors/actor-ffg.js"; -import { CombatFFG } from "./combat-ffg.js"; -import { ItemFFG } from "./items/item-ffg.js"; -import { ItemSheetFFG } from "./items/item-sheet-ffg.js"; -import { ActorSheetFFG } from "./actors/actor-sheet-ffg.js"; -import { DicePoolFFG } from "./dice-pool-ffg.js"; -import { GroupManagerLayer } from "./groupmanager-ffg.js"; -import { GroupManager } from "./groupmanager-ffg.js"; - -/* -------------------------------------------- */ -/* Foundry VTT Initialization */ -/* -------------------------------------------- */ - -Hooks.once("init", async function () { - console.log(`Initializing SWFFG System`); - - // Place our classes in their own namespace for later reference. - game.ffg = { - ActorFFG, - ItemFFG, - CombatFFG, - }; - - game.ffg.StarWars = game.specialDiceRoller.starWars.parsers[0]; - game.ffg.DestinyPool = { - "Light": 0, - "Dark": 0, - }; - - // Define custom Entity classes. This will override the default Actor - // to instead use our extended version. - CONFIG.Actor.entityClass = ActorFFG; - CONFIG.Item.entityClass = ItemFFG; - CONFIG.Combat.entityClass = CombatFFG; - - // A very hacky temporary workaround to override how initiative functions and provide the results of a FFG roll to the initiative tracker. - // Currently overriding the prototype due to a bug with overriding the core Combat entity which resets to default after page refresh. - /** @override */ - Combat.prototype._getInitiativeRoll = function (combatant, formula) { - const cData = combatant.actor.data.data; - const origFormula = formula; - - if (combatant.actor.data.type === "vehicle") { - return new Roll("0"); - } - - if (formula === "Vigilance") { - formula = _getInitiativeFormula(cData.skills.Vigilance.rank, cData.characteristics.Willpower.value, 0); - } else if (formula === "Cool") { - formula = _getInitiativeFormula(cData.skills.Cool.rank, cData.characteristics.Presence.value, 0); - } - - const rollData = combatant.actor ? combatant.actor.getRollData() : {}; - const letters = formula.split(""); - const rolls = []; - const getSuc = new RegExp("Successes: ([0-9]+)", "g"); - const getAdv = new RegExp("Advantages: ([0-9]+)", "g"); - - for (const letter of letters) { - rolls.push(game.ffg.StarWars.letterToRolls(letter, 1)); - } - - let newformula = combineAll(rolls, game.ffg.StarWars.rollValuesMonoid); - - let rolling = game.specialDiceRoller.starWars.roll(newformula); - - let results = game.specialDiceRoller.starWars.formatRolls(rolling); - - let success = 0; - let advantage = 0; - - success = getSuc.exec(results); - if (success) { - success = success[1]; - } - advantage = getAdv.exec(results); - if (advantage) { - advantage = advantage[1]; - } - - let total = +success + advantage * 0.01; - - console.log(`Total is: ${total}`); - - let roll = new Roll(origFormula, rollData).roll(); - roll._result = total; - roll._total = total; - - return roll; - }; - - // TURN ON OR OFF HOOK DEBUGGING - CONFIG.debug.hooks = false; - - // Give global access to FFG config. - CONFIG.FFG = FFG; - - /** - * Set an initiative formula for the system - * @type {String} - */ - // Register initiative rule - game.settings.register("starwarsffg", "initiativeRule", { - name: "Initiative Type", - hint: "Choose between Vigilance or Cool for Initiative rolls.", - scope: "world", - config: true, - default: "v", - type: String, - choices: { - v: "Use Vigilance", - c: "Use Cool", - }, - onChange: (rule) => _setffgInitiative(rule), - }); - _setffgInitiative(game.settings.get("starwarsffg", "initiativeRule")); - - function _setffgInitiative(initMethod) { - let formula; - switch (initMethod) { - case "v": - formula = "Vigilance"; - break; - - case "c": - formula = "Cool"; - break; - } - - CONFIG.Combat.initiative = { - formula: formula, - decimals: 2, - }; - } - - function combineAll(values, monoid) { - return values.reduce((prev, curr) => monoid.combine(prev, curr), monoid.identity); - } - - function _getInitiativeFormula(skill, ability, difficulty) { - const dicePool = new DicePoolFFG({ - ability: ability, - difficulty: difficulty, - }); - dicePool.upgrade(skill); - return dicePool.renderDiceExpression(); - } - - // Register sheet application classes - Actors.unregisterSheet("core", ActorSheet); - Actors.registerSheet("ffg", ActorSheetFFG, { makeDefault: true }); - Items.unregisterSheet("core", ItemSheet); - Items.registerSheet("ffg", ItemSheetFFG, { makeDefault: true }); - - // Add utilities to the global scope, this can be useful for macro makers - window.DicePoolFFG = DicePoolFFG; - - // Register Handlebars utilities - Handlebars.registerHelper("json", JSON.stringify); - - // Allows {if X = Y} type syntax in html using handlebars - Handlebars.registerHelper("iff", function (a, operator, b, opts) { - var bool = false; - switch (operator) { - case "==": - bool = a == b; - break; - case ">": - bool = a > b; - break; - case "<": - bool = a < b; - break; - case "!=": - bool = a != b; - break; - default: - throw "Unknown operator " + operator; - } - - if (bool) { - return opts.fn(this); - } else { - return opts.inverse(this); - } - }); -}); - -/* -------------------------------------------- */ -/* Set up control buttons */ -/* -------------------------------------------- */ - -Hooks.on("getSceneControlButtons", (controls) => { - if (game.user.isGM) { - controls.push({ - name: "groupmanager", - title: "Group Manager", - icon: "fas fa-users", - layer: "GroupManagerLayer", - tools: [ - { - name: "groupsheet", - title: "Open Group Sheet", - icon: "fas fa-users", - onClick: () => { - new GroupManager().render(true); - }, - button: true, - }, - ], - }); - } -}); - -Hooks.once("canvasInit", (canvas) => { - canvas.groupmanager = canvas.stage.addChildAt(new GroupManagerLayer(canvas), 8); -}); +/** + * A systems implementation of the Star Wars RPG by Fantasy Flight Games. + * Author: Esrin + * Software License: GNU GPLv3 + */ + +// Import Modules +import { FFG } from "./swffg-config.js"; +import { ActorFFG } from "./actors/actor-ffg.js"; +import { CombatFFG } from "./combat-ffg.js"; +import { ItemFFG } from "./items/item-ffg.js"; +import { ItemSheetFFG } from "./items/item-sheet-ffg.js"; +import { ActorSheetFFG } from "./actors/actor-sheet-ffg.js"; +import { DicePoolFFG } from "./dice-pool-ffg.js"; +import { GroupManagerLayer } from "./groupmanager-ffg.js"; +import { GroupManager } from "./groupmanager-ffg.js"; + +/* -------------------------------------------- */ +/* Foundry VTT Initialization */ +/* -------------------------------------------- */ + +Hooks.once("init", async function () { + console.log(`Initializing SWFFG System`); + + // Place our classes in their own namespace for later reference. + game.ffg = { + ActorFFG, + ItemFFG, + CombatFFG, + }; + + game.ffg.StarWars = game.specialDiceRoller.starWars.parsers[0]; + game.ffg.DestinyPool = { + "Light": 0, + "Dark": 0, + }; + + // Define custom Entity classes. This will override the default Actor + // to instead use our extended version. + CONFIG.Actor.entityClass = ActorFFG; + CONFIG.Item.entityClass = ItemFFG; + CONFIG.Combat.entityClass = CombatFFG; + + // A very hacky temporary workaround to override how initiative functions and provide the results of a FFG roll to the initiative tracker. + // Currently overriding the prototype due to a bug with overriding the core Combat entity which resets to default after page refresh. + /** @override */ + Combat.prototype._getInitiativeRoll = function (combatant, formula) { + const cData = combatant.actor.data.data; + const origFormula = formula; + + if (combatant.actor.data.type === "vehicle") { + return new Roll("0"); + } + + if (formula === "Vigilance") { + formula = _getInitiativeFormula(cData.skills.Vigilance.rank, cData.characteristics.Willpower.value, 0); + } else if (formula === "Cool") { + formula = _getInitiativeFormula(cData.skills.Cool.rank, cData.characteristics.Presence.value, 0); + } + + const rollData = combatant.actor ? combatant.actor.getRollData() : {}; + const letters = formula.split(""); + const rolls = []; + const getSuc = new RegExp("Successes: ([0-9]+)", "g"); + const getAdv = new RegExp("Advantages: ([0-9]+)", "g"); + + for (const letter of letters) { + rolls.push(game.ffg.StarWars.letterToRolls(letter, 1)); + } + + let newformula = combineAll(rolls, game.ffg.StarWars.rollValuesMonoid); + + let rolling = game.specialDiceRoller.starWars.roll(newformula); + + let results = game.specialDiceRoller.starWars.formatRolls(rolling); + + let success = 0; + let advantage = 0; + + success = getSuc.exec(results); + if (success) { + success = success[1]; + } + advantage = getAdv.exec(results); + if (advantage) { + advantage = advantage[1]; + } + + let total = +success + advantage * 0.01; + + console.log(`Total is: ${total}`); + + let roll = new Roll(origFormula, rollData).roll(); + roll._result = total; + roll._total = total; + + return roll; + }; + + // TURN ON OR OFF HOOK DEBUGGING + CONFIG.debug.hooks = false; + + // Give global access to FFG config. + CONFIG.FFG = FFG; + + /** + * Set an initiative formula for the system + * @type {String} + */ + // Register initiative rule + game.settings.register("starwarsffg", "initiativeRule", { + name: "Initiative Type", + hint: "Choose between Vigilance or Cool for Initiative rolls.", + scope: "world", + config: true, + default: "v", + type: String, + choices: { + v: "Use Vigilance", + c: "Use Cool", + }, + onChange: (rule) => _setffgInitiative(rule), + }); + _setffgInitiative(game.settings.get("starwarsffg", "initiativeRule")); + + function _setffgInitiative(initMethod) { + let formula; + switch (initMethod) { + case "v": + formula = "Vigilance"; + break; + + case "c": + formula = "Cool"; + break; + } + + CONFIG.Combat.initiative = { + formula: formula, + decimals: 2, + }; + } + + function combineAll(values, monoid) { + return values.reduce((prev, curr) => monoid.combine(prev, curr), monoid.identity); + } + + function _getInitiativeFormula(skill, ability, difficulty) { + const dicePool = new DicePoolFFG({ + ability: ability, + difficulty: difficulty, + }); + dicePool.upgrade(skill); + return dicePool.renderDiceExpression(); + } + + // Register sheet application classes + Actors.unregisterSheet("core", ActorSheet); + Actors.registerSheet("ffg", ActorSheetFFG, { makeDefault: true }); + Items.unregisterSheet("core", ItemSheet); + Items.registerSheet("ffg", ItemSheetFFG, { makeDefault: true }); + + // Add utilities to the global scope, this can be useful for macro makers + window.DicePoolFFG = DicePoolFFG; + + // Register Handlebars utilities + Handlebars.registerHelper("json", JSON.stringify); + + // Allows {if X = Y} type syntax in html using handlebars + Handlebars.registerHelper("iff", function (a, operator, b, opts) { + var bool = false; + switch (operator) { + case "==": + bool = a == b; + break; + case ">": + bool = a > b; + break; + case "<": + bool = a < b; + break; + case "!=": + bool = a != b; + break; + default: + throw "Unknown operator " + operator; + } + + if (bool) { + return opts.fn(this); + } else { + return opts.inverse(this); + } + }); +}); + +/* -------------------------------------------- */ +/* Set up control buttons */ +/* -------------------------------------------- */ + +Hooks.on("getSceneControlButtons", (controls) => { + if (game.user.isGM) { + controls.push({ + name: "groupmanager", + title: "Group Manager", + icon: "fas fa-users", + layer: "GroupManagerLayer", + tools: [ + { + name: "groupsheet", + title: "Open Group Sheet", + icon: "fas fa-users", + onClick: () => { + new GroupManager().render(true); + }, + button: true, + }, + ], + }); + } +}); + +Hooks.once("canvasInit", (canvas) => { + canvas.groupmanager = canvas.stage.addChildAt(new GroupManagerLayer(canvas), 8); +}); diff --git a/package-lock.json b/package-lock.json index fc4d9b13..8aa74e13 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,3953 +1,3953 @@ -{ - "name": "starwarsffg", - "version": "0.053", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@gulp-sourcemaps/identity-map": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/identity-map/-/identity-map-1.0.2.tgz", - "integrity": "sha512-ciiioYMLdo16ShmfHBXJBOFm3xPC4AuwO4xeRpFeHz7WK9PYsWCmigagG2XyzZpubK4a3qNKoUBDhbzHfa50LQ==", - "requires": { - "acorn": "^5.0.3", - "css": "^2.2.1", - "normalize-path": "^2.1.1", - "source-map": "^0.6.0", - "through2": "^2.0.3" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "@gulp-sourcemaps/map-sources": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz", - "integrity": "sha1-iQrnxdjId/bThIYCFazp1+yUW9o=", - "requires": { - "normalize-path": "^2.0.1", - "through2": "^2.0.3" - } - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, - "acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==" - }, - "ajv": { - "version": "6.12.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", - "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" - }, - "ansi-colors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", - "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", - "requires": { - "ansi-wrap": "^0.1.0" - } - }, - "ansi-gray": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", - "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=" - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "append-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", - "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", - "requires": { - "buffer-equal": "^1.0.0" - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=" - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" - }, - "arr-filter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", - "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", - "requires": { - "make-iterator": "^1.0.0" - } - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" - }, - "arr-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", - "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", - "requires": { - "make-iterator": "^1.0.0" - } - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" - }, - "array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=" - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" - }, - "array-initial": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", - "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", - "requires": { - "array-slice": "^1.0.0", - "is-number": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" - } - } - }, - "array-last": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", - "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", - "requires": { - "is-number": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" - } - } - }, - "array-slice": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==" - }, - "array-sort": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", - "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", - "requires": { - "default-compare": "^1.0.0", - "get-value": "^2.0.6", - "kind-of": "^5.0.2" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" - }, - "async-done": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", - "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.2", - "process-nextick-args": "^2.0.0", - "stream-exhaust": "^1.0.1" - } - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" - }, - "async-foreach": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", - "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=" - }, - "async-settle": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", - "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", - "requires": { - "async-done": "^1.2.2" - } - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" - }, - "autoprefixer": { - "version": "9.8.0", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.0.tgz", - "integrity": "sha512-D96ZiIHXbDmU02dBaemyAg53ez+6F5yZmapmgKcjm35yEe1uVDYI8hGW3VYoGRaG290ZFf91YxHrR518vC0u/A==", - "requires": { - "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001061", - "chalk": "^2.4.2", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^7.0.30", - "postcss-value-parser": "^4.1.0" - } - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "aws4": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", - "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==" - }, - "bach": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", - "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", - "requires": { - "arr-filter": "^1.1.1", - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "array-each": "^1.0.0", - "array-initial": "^1.0.0", - "array-last": "^1.1.1", - "async-done": "^1.2.2", - "async-settle": "^1.0.0", - "now-and-later": "^2.0.0" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "requires": { - "inherits": "~2.0.0" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "browserslist": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.12.0.tgz", - "integrity": "sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg==", - "requires": { - "caniuse-lite": "^1.0.30001043", - "electron-to-chromium": "^1.3.413", - "node-releases": "^1.1.53", - "pkg-up": "^2.0.0" - } - }, - "buffer-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", - "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=" - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" - } - } - }, - "caniuse-lite": { - "version": "1.0.30001066", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001066.tgz", - "integrity": "sha512-Gfj/WAastBtfxLws0RCh2sDbTK/8rJuSeZMecrSkNGYxPcv7EzblmDGfWQCFEQcSqYE2BRgQiJh8HOD07N5hIw==" - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - } - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" - }, - "clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=" - }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=" - }, - "cloneable-readable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", - "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", - "requires": { - "inherits": "^2.0.1", - "process-nextick-args": "^2.0.0", - "readable-stream": "^2.3.5" - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" - }, - "collection-map": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", - "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", - "requires": { - "arr-map": "^2.0.2", - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - } - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" - }, - "copy-props": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz", - "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==", - "requires": { - "each-props": "^1.3.0", - "is-plain-object": "^2.0.1" - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cross-spawn": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", - "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - }, - "css": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", - "requires": { - "inherits": "^2.0.3", - "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "requires": { - "array-find-index": "^1.0.1" - } - }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "debug-fabulous": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/debug-fabulous/-/debug-fabulous-1.1.0.tgz", - "integrity": "sha512-GZqvGIgKNlUnHUPQhepnUZFIMoi3dgZKQBzKDeL2g7oJF9SNAji/AAu36dusFUas0O+pae74lNeoIPHqXWDkLg==", - "requires": { - "debug": "3.X", - "memoizee": "0.4.X", - "object-assign": "4.X" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" - }, - "default-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", - "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", - "requires": { - "kind-of": "^5.0.2" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - }, - "default-resolution": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", - "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=" - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=" - }, - "detect-newline": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", - "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=" - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "each-props": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", - "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", - "requires": { - "is-plain-object": "^2.0.1", - "object.defaults": "^1.1.0" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "electron-to-chromium": { - "version": "1.3.455", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.455.tgz", - "integrity": "sha512-4lwnxp+ArqOX9hiLwLpwhfqvwzUHFuDgLz4NTiU3lhygUzWtocIJ/5Vix+mWVNE2HQ9aI1k2ncGe5H/0OktMvA==" - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { - "once": "^1.4.0" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "requires": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", - "requires": { - "type": "^2.0.0" - }, - "dependencies": { - "type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", - "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==" - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "fancy-log": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", - "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", - "requires": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "parse-node-version": "^1.0.0", - "time-stamp": "^1.0.0" - } - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "optional": true - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - } - }, - "fined": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", - "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", - "requires": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", - "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" - } - }, - "flagged-respawn": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", - "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==" - }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" - }, - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "requires": { - "for-in": "^1.0.1" - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "requires": { - "map-cache": "^0.2.2" - } - }, - "fs-mkdirp-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", - "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", - "requires": { - "graceful-fs": "^4.1.11", - "through2": "^2.0.3" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } - }, - "fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "gaze": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", - "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", - "requires": { - "globule": "^1.0.0" - } - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "glob-stream": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", - "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", - "requires": { - "extend": "^3.0.0", - "glob": "^7.1.1", - "glob-parent": "^3.1.0", - "is-negated-glob": "^1.0.0", - "ordered-read-streams": "^1.0.0", - "pumpify": "^1.3.5", - "readable-stream": "^2.1.5", - "remove-trailing-separator": "^1.0.1", - "to-absolute-glob": "^2.0.0", - "unique-stream": "^2.0.2" - } - }, - "glob-watcher": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.3.tgz", - "integrity": "sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg==", - "requires": { - "anymatch": "^2.0.0", - "async-done": "^1.2.0", - "chokidar": "^2.0.0", - "is-negated-glob": "^1.0.0", - "just-debounce": "^1.0.0", - "object.defaults": "^1.1.0" - } - }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } - }, - "globule": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.1.tgz", - "integrity": "sha512-OVyWOHgw29yosRHCHo7NncwR1hW5ew0W/UrvtwvjefVJeQ26q4/8r8FmPsSF1hJ93IgWkyv16pCTz6WblMzm/g==", - "requires": { - "glob": "~7.1.1", - "lodash": "~4.17.12", - "minimatch": "~3.0.2" - } - }, - "glogg": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", - "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", - "requires": { - "sparkles": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" - }, - "gulp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", - "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", - "requires": { - "glob-watcher": "^5.0.3", - "gulp-cli": "^2.2.0", - "undertaker": "^1.2.1", - "vinyl-fs": "^3.0.0" - }, - "dependencies": { - "gulp-cli": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.2.1.tgz", - "integrity": "sha512-yEMxrXqY8mJFlaauFQxNrCpzWJThu0sH1sqlToaTOT063Hub9s/Nt2C+GSLe6feQ/IMWrHvGOOsyES7CQc9O+A==", - "requires": { - "ansi-colors": "^1.0.1", - "archy": "^1.0.0", - "array-sort": "^1.0.0", - "color-support": "^1.1.3", - "concat-stream": "^1.6.0", - "copy-props": "^2.0.1", - "fancy-log": "^1.3.2", - "gulplog": "^1.0.0", - "interpret": "^1.1.0", - "isobject": "^3.0.1", - "liftoff": "^3.1.0", - "matchdep": "^2.0.0", - "mute-stdout": "^1.0.0", - "pretty-hrtime": "^1.0.0", - "replace-homedir": "^1.0.0", - "semver-greatest-satisfied-range": "^1.1.0", - "v8flags": "^3.0.1", - "yargs": "^7.1.0" - } - } - } - }, - "gulp-autoprefixer": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/gulp-autoprefixer/-/gulp-autoprefixer-7.0.1.tgz", - "integrity": "sha512-QJGEmHw+bEt7FSqvmbAUTxbCuNLJYx4sz3ox9WouYqT/7j5FH5CQ8ZnpL1M7H5npX1bUJa7lUVY1w20jXxhOxg==", - "requires": { - "autoprefixer": "^9.6.1", - "fancy-log": "^1.3.2", - "plugin-error": "^1.0.1", - "postcss": "^7.0.17", - "through2": "^3.0.1", - "vinyl-sourcemaps-apply": "^0.2.1" - }, - "dependencies": { - "through2": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", - "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", - "requires": { - "readable-stream": "2 || 3" - } - } - } - }, - "gulp-sass": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/gulp-sass/-/gulp-sass-4.1.0.tgz", - "integrity": "sha512-xIiwp9nkBLcJDpmYHbEHdoWZv+j+WtYaKD6Zil/67F3nrAaZtWYN5mDwerdo7EvcdBenSAj7Xb2hx2DqURLGdA==", - "requires": { - "chalk": "^2.3.0", - "lodash": "^4.17.11", - "node-sass": "^4.8.3", - "plugin-error": "^1.0.1", - "replace-ext": "^1.0.0", - "strip-ansi": "^4.0.0", - "through2": "^2.0.0", - "vinyl-sourcemaps-apply": "^0.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "gulp-sourcemaps": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-2.6.5.tgz", - "integrity": "sha512-SYLBRzPTew8T5Suh2U8jCSDKY+4NARua4aqjj8HOysBh2tSgT9u4jc1FYirAdPx1akUxxDeK++fqw6Jg0LkQRg==", - "requires": { - "@gulp-sourcemaps/identity-map": "1.X", - "@gulp-sourcemaps/map-sources": "1.X", - "acorn": "5.X", - "convert-source-map": "1.X", - "css": "2.X", - "debug-fabulous": "1.X", - "detect-newline": "2.X", - "graceful-fs": "4.X", - "source-map": "~0.6.0", - "strip-bom-string": "1.X", - "through2": "2.X" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", - "requires": { - "glogg": "^1.0.0" - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "in-publish": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz", - "integrity": "sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==" - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "requires": { - "repeating": "^2.0.0" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" - }, - "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==" - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" - }, - "is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "requires": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" - }, - "is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", - "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==" - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-negated-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", - "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=" - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "requires": { - "isobject": "^3.0.1" - } - }, - "is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" - }, - "is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "requires": { - "is-unc-path": "^1.0.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "requires": { - "unc-path-regex": "^0.1.2" - } - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" - }, - "is-valid-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", - "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=" - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "js-base64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.2.tgz", - "integrity": "sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ==" - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "just-debounce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", - "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=" - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - }, - "last-run": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", - "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", - "requires": { - "default-resolution": "^2.0.0", - "es6-weak-map": "^2.0.1" - } - }, - "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "requires": { - "readable-stream": "^2.0.5" - } - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "requires": { - "invert-kv": "^1.0.0" - } - }, - "lead": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", - "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", - "requires": { - "flush-write-stream": "^1.0.2" - } - }, - "liftoff": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", - "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", - "requires": { - "extend": "^3.0.0", - "findup-sync": "^3.0.0", - "fined": "^1.0.1", - "flagged-respawn": "^1.0.0", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.0", - "rechoir": "^0.6.2", - "resolve": "^1.1.7" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "dependencies": { - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - } - } - }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - } - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "lru-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", - "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", - "requires": { - "es5-ext": "~0.10.2" - } - }, - "make-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", - "requires": { - "kind-of": "^6.0.2" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "requires": { - "object-visit": "^1.0.0" - } - }, - "matchdep": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", - "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", - "requires": { - "findup-sync": "^2.0.0", - "micromatch": "^3.0.4", - "resolve": "^1.4.0", - "stack-trace": "0.0.10" - }, - "dependencies": { - "findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^3.1.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - } - }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "memoizee": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.14.tgz", - "integrity": "sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg==", - "requires": { - "d": "1", - "es5-ext": "^0.10.45", - "es6-weak-map": "^2.0.2", - "event-emitter": "^0.3.5", - "is-promise": "^2.1", - "lru-queue": "0.1", - "next-tick": "1", - "timers-ext": "^0.1.5" - } - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" - }, - "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", - "requires": { - "mime-db": "1.44.0" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "mute-stdout": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", - "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==" - }, - "nan": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", - "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==" - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" - }, - "node-gyp": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", - "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", - "requires": { - "fstream": "^1.0.0", - "glob": "^7.0.3", - "graceful-fs": "^4.1.2", - "mkdirp": "^0.5.0", - "nopt": "2 || 3", - "npmlog": "0 || 1 || 2 || 3 || 4", - "osenv": "0", - "request": "^2.87.0", - "rimraf": "2", - "semver": "~5.3.0", - "tar": "^2.0.0", - "which": "1" - }, - "dependencies": { - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" - } - } - }, - "node-releases": { - "version": "1.1.57", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.57.tgz", - "integrity": "sha512-ZQmnWS7adi61A9JsllJ2gdj2PauElcjnOwTp2O011iGzoakTxUsDGSe+6vD7wXbKdqhSFymC0OSx35aAMhrSdw==" - }, - "node-sass": { - "version": "4.14.1", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.14.1.tgz", - "integrity": "sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g==", - "requires": { - "async-foreach": "^0.1.3", - "chalk": "^1.1.1", - "cross-spawn": "^3.0.0", - "gaze": "^1.0.0", - "get-stdin": "^4.0.1", - "glob": "^7.0.3", - "in-publish": "^2.0.0", - "lodash": "^4.17.15", - "meow": "^3.7.0", - "mkdirp": "^0.5.1", - "nan": "^2.13.2", - "node-gyp": "^3.8.0", - "npmlog": "^4.0.0", - "request": "^2.88.0", - "sass-graph": "2.2.5", - "stdout-stream": "^1.4.0", - "true-case-path": "^1.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "requires": { - "abbrev": "1" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" - }, - "now-and-later": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", - "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", - "requires": { - "once": "^1.3.2" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "requires": { - "isobject": "^3.0.0" - } - }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", - "requires": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "object.map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "requires": { - "isobject": "^3.0.1" - } - }, - "object.reduce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", - "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "ordered-read-streams": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", - "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", - "requires": { - "readable-stream": "^2.0.1" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "requires": { - "lcid": "^1.0.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" - }, - "parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", - "requires": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "requires": { - "error-ex": "^1.2.0" - } - }, - "parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==" - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" - }, - "path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", - "requires": { - "path-root-regex": "^0.1.0" - } - }, - "path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=" - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "requires": { - "pinkie": "^2.0.0" - } - }, - "pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", - "requires": { - "find-up": "^2.1.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "requires": { - "locate-path": "^2.0.0" - } - } - } - }, - "plugin-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", - "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", - "requires": { - "ansi-colors": "^1.0.1", - "arr-diff": "^4.0.0", - "arr-union": "^3.1.0", - "extend-shallow": "^3.0.2" - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" - }, - "postcss": { - "version": "7.0.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.31.tgz", - "integrity": "sha512-a937VDHE1ftkjk+8/7nj/mrjtmkn69xxzJgRETXdAUU+IgOYPQNJF17haGWbeDxSyk++HA14UA98FurvPyBJOA==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==" - }, - "pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=" - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" - }, - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "requires": { - "resolve": "^1.1.6" - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "remove-bom-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", - "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", - "requires": { - "is-buffer": "^1.1.5", - "is-utf8": "^0.2.1" - } - }, - "remove-bom-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", - "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", - "requires": { - "remove-bom-buffer": "^3.0.0", - "safe-buffer": "^5.1.0", - "through2": "^2.0.3" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "requires": { - "is-finite": "^1.0.0" - } - }, - "replace-ext": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", - "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==" - }, - "replace-homedir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", - "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", - "requires": { - "homedir-polyfill": "^1.0.1", - "is-absolute": "^1.0.0", - "remove-trailing-separator": "^1.1.0" - } - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" - }, - "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - } - }, - "resolve-options": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", - "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", - "requires": { - "value-or-function": "^3.0.0" - } - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sass-graph": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz", - "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==", - "requires": { - "glob": "^7.0.0", - "lodash": "^4.0.0", - "scss-tokenizer": "^0.2.3", - "yargs": "^13.3.2" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "scss-tokenizer": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", - "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", - "requires": { - "js-base64": "^2.1.8", - "source-map": "^0.4.2" - }, - "dependencies": { - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "semver-greatest-satisfied-range": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", - "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", - "requires": { - "sver-compat": "^1.5.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" - }, - "sparkles": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", - "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==" - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "stdout-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", - "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", - "requires": { - "readable-stream": "^2.0.1" - } - }, - "stream-exhaust": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", - "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==" - }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "requires": { - "is-utf8": "^0.2.0" - } - }, - "strip-bom-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=" - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "requires": { - "get-stdin": "^4.0.1" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "sver-compat": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", - "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", - "requires": { - "es6-iterator": "^2.0.1", - "es6-symbol": "^3.1.1" - } - }, - "tar": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", - "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", - "requires": { - "block-stream": "*", - "fstream": "^1.0.12", - "inherits": "2" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "through2-filter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", - "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", - "requires": { - "through2": "~2.0.0", - "xtend": "~4.0.0" - } - }, - "time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=" - }, - "timers-ext": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", - "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", - "requires": { - "es5-ext": "~0.10.46", - "next-tick": "1" - } - }, - "to-absolute-glob": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", - "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", - "requires": { - "is-absolute": "^1.0.0", - "is-negated-glob": "^1.0.0" - } - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "to-through": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", - "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", - "requires": { - "through2": "^2.0.3" - } - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" - }, - "true-case-path": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", - "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", - "requires": { - "glob": "^7.1.2" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=" - }, - "undertaker": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.1.tgz", - "integrity": "sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==", - "requires": { - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "bach": "^1.0.0", - "collection-map": "^1.0.0", - "es6-weak-map": "^2.0.1", - "last-run": "^1.1.0", - "object.defaults": "^1.0.0", - "object.reduce": "^1.0.0", - "undertaker-registry": "^1.0.0" - } - }, - "undertaker-registry": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", - "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=" - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "unique-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", - "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", - "requires": { - "json-stable-stringify-without-jsonify": "^1.0.1", - "through2-filter": "^3.0.0" - } - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" - } - } - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - }, - "v8flags": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz", - "integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==", - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "value-or-function": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", - "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=" - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "vinyl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", - "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", - "requires": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - } - }, - "vinyl-fs": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", - "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", - "requires": { - "fs-mkdirp-stream": "^1.0.0", - "glob-stream": "^6.1.0", - "graceful-fs": "^4.0.0", - "is-valid-glob": "^1.0.0", - "lazystream": "^1.0.0", - "lead": "^1.0.0", - "object.assign": "^4.0.4", - "pumpify": "^1.3.5", - "readable-stream": "^2.3.3", - "remove-bom-buffer": "^3.0.0", - "remove-bom-stream": "^1.2.0", - "resolve-options": "^1.1.0", - "through2": "^2.0.0", - "to-through": "^2.0.0", - "value-or-function": "^3.0.0", - "vinyl": "^2.0.0", - "vinyl-sourcemap": "^1.1.0" - } - }, - "vinyl-sourcemap": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", - "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", - "requires": { - "append-buffer": "^1.0.2", - "convert-source-map": "^1.5.0", - "graceful-fs": "^4.1.6", - "normalize-path": "^2.1.1", - "now-and-later": "^2.0.0", - "remove-bom-buffer": "^3.0.0", - "vinyl": "^2.0.0" - } - }, - "vinyl-sourcemaps-apply": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", - "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", - "requires": { - "source-map": "^0.5.1" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" - }, - "yargs": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.1.tgz", - "integrity": "sha512-huO4Fr1f9PmiJJdll5kwoS2e4GqzGSsMT3PPMpOwoVkOK8ckqAewMTZyA6LXVQWflleb/Z8oPBEvNsMft0XE+g==", - "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "5.0.0-security.0" - } - }, - "yargs-parser": { - "version": "5.0.0-security.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0-security.0.tgz", - "integrity": "sha512-T69y4Ps64LNesYxeYGYPvfoMTt/7y1XtfpIslUeK4um+9Hu7hlGoRtaDLvdXb7+/tfq4opVa2HRY5xGip022rQ==", - "requires": { - "camelcase": "^3.0.0", - "object.assign": "^4.1.0" - } - } - } -} +{ + "name": "starwarsffg", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@gulp-sourcemaps/identity-map": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/identity-map/-/identity-map-1.0.2.tgz", + "integrity": "sha512-ciiioYMLdo16ShmfHBXJBOFm3xPC4AuwO4xeRpFeHz7WK9PYsWCmigagG2XyzZpubK4a3qNKoUBDhbzHfa50LQ==", + "requires": { + "acorn": "^5.0.3", + "css": "^2.2.1", + "normalize-path": "^2.1.1", + "source-map": "^0.6.0", + "through2": "^2.0.3" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "@gulp-sourcemaps/map-sources": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz", + "integrity": "sha1-iQrnxdjId/bThIYCFazp1+yUW9o=", + "requires": { + "normalize-path": "^2.0.1", + "through2": "^2.0.3" + } + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "acorn": { + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==" + }, + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + }, + "ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "requires": { + "ansi-wrap": "^0.1.0" + } + }, + "ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=" + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "append-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", + "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", + "requires": { + "buffer-equal": "^1.0.0" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=" + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "arr-filter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", + "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", + "requires": { + "make-iterator": "^1.0.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "arr-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", + "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", + "requires": { + "make-iterator": "^1.0.0" + } + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=" + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" + }, + "array-initial": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", + "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", + "requires": { + "array-slice": "^1.0.0", + "is-number": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" + } + } + }, + "array-last": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", + "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", + "requires": { + "is-number": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" + } + } + }, + "array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==" + }, + "array-sort": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", + "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", + "requires": { + "default-compare": "^1.0.0", + "get-value": "^2.0.6", + "kind-of": "^5.0.2" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + }, + "async-done": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", + "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.2", + "process-nextick-args": "^2.0.0", + "stream-exhaust": "^1.0.1" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" + }, + "async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=" + }, + "async-settle": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", + "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", + "requires": { + "async-done": "^1.2.2" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + }, + "autoprefixer": { + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.0.tgz", + "integrity": "sha512-D96ZiIHXbDmU02dBaemyAg53ez+6F5yZmapmgKcjm35yEe1uVDYI8hGW3VYoGRaG290ZFf91YxHrR518vC0u/A==", + "requires": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001061", + "chalk": "^2.4.2", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.30", + "postcss-value-parser": "^4.1.0" + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", + "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==" + }, + "bach": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", + "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", + "requires": { + "arr-filter": "^1.1.1", + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "array-each": "^1.0.0", + "array-initial": "^1.0.0", + "array-last": "^1.1.1", + "async-done": "^1.2.2", + "async-settle": "^1.0.0", + "now-and-later": "^2.0.0" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "requires": { + "inherits": "~2.0.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "browserslist": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.12.0.tgz", + "integrity": "sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg==", + "requires": { + "caniuse-lite": "^1.0.30001043", + "electron-to-chromium": "^1.3.413", + "node-releases": "^1.1.53", + "pkg-up": "^2.0.0" + } + }, + "buffer-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", + "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=" + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" + } + } + }, + "caniuse-lite": { + "version": "1.0.30001066", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001066.tgz", + "integrity": "sha512-Gfj/WAastBtfxLws0RCh2sDbTK/8rJuSeZMecrSkNGYxPcv7EzblmDGfWQCFEQcSqYE2BRgQiJh8HOD07N5hIw==" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + } + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=" + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=" + }, + "cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", + "requires": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "collection-map": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", + "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", + "requires": { + "arr-map": "^2.0.2", + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, + "copy-props": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz", + "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==", + "requires": { + "each-props": "^1.3.0", + "is-plain-object": "^2.0.1" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cross-spawn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", + "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "requires": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "requires": { + "array-find-index": "^1.0.1" + } + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "debug-fabulous": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/debug-fabulous/-/debug-fabulous-1.1.0.tgz", + "integrity": "sha512-GZqvGIgKNlUnHUPQhepnUZFIMoi3dgZKQBzKDeL2g7oJF9SNAji/AAu36dusFUas0O+pae74lNeoIPHqXWDkLg==", + "requires": { + "debug": "3.X", + "memoizee": "0.4.X", + "object-assign": "4.X" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "default-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", + "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", + "requires": { + "kind-of": "^5.0.2" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "default-resolution": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", + "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=" + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=" + }, + "detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=" + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "each-props": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", + "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", + "requires": { + "is-plain-object": "^2.0.1", + "object.defaults": "^1.1.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "electron-to-chromium": { + "version": "1.3.455", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.455.tgz", + "integrity": "sha512-4lwnxp+ArqOX9hiLwLpwhfqvwzUHFuDgLz4NTiU3lhygUzWtocIJ/5Vix+mWVNE2HQ9aI1k2ncGe5H/0OktMvA==" + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "requires": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", + "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==" + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "requires": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + } + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "optional": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "requires": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + } + }, + "flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==" + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "requires": { + "for-in": "^1.0.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "requires": { + "map-cache": "^0.2.2" + } + }, + "fs-mkdirp-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", + "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", + "requires": { + "graceful-fs": "^4.1.11", + "through2": "^2.0.3" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "requires": { + "globule": "^1.0.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "glob-stream": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", + "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", + "requires": { + "extend": "^3.0.0", + "glob": "^7.1.1", + "glob-parent": "^3.1.0", + "is-negated-glob": "^1.0.0", + "ordered-read-streams": "^1.0.0", + "pumpify": "^1.3.5", + "readable-stream": "^2.1.5", + "remove-trailing-separator": "^1.0.1", + "to-absolute-glob": "^2.0.0", + "unique-stream": "^2.0.2" + } + }, + "glob-watcher": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.3.tgz", + "integrity": "sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg==", + "requires": { + "anymatch": "^2.0.0", + "async-done": "^1.2.0", + "chokidar": "^2.0.0", + "is-negated-glob": "^1.0.0", + "just-debounce": "^1.0.0", + "object.defaults": "^1.1.0" + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "globule": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.1.tgz", + "integrity": "sha512-OVyWOHgw29yosRHCHo7NncwR1hW5ew0W/UrvtwvjefVJeQ26q4/8r8FmPsSF1hJ93IgWkyv16pCTz6WblMzm/g==", + "requires": { + "glob": "~7.1.1", + "lodash": "~4.17.12", + "minimatch": "~3.0.2" + } + }, + "glogg": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", + "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", + "requires": { + "sparkles": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + }, + "gulp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", + "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", + "requires": { + "glob-watcher": "^5.0.3", + "gulp-cli": "^2.2.0", + "undertaker": "^1.2.1", + "vinyl-fs": "^3.0.0" + }, + "dependencies": { + "gulp-cli": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.2.1.tgz", + "integrity": "sha512-yEMxrXqY8mJFlaauFQxNrCpzWJThu0sH1sqlToaTOT063Hub9s/Nt2C+GSLe6feQ/IMWrHvGOOsyES7CQc9O+A==", + "requires": { + "ansi-colors": "^1.0.1", + "archy": "^1.0.0", + "array-sort": "^1.0.0", + "color-support": "^1.1.3", + "concat-stream": "^1.6.0", + "copy-props": "^2.0.1", + "fancy-log": "^1.3.2", + "gulplog": "^1.0.0", + "interpret": "^1.1.0", + "isobject": "^3.0.1", + "liftoff": "^3.1.0", + "matchdep": "^2.0.0", + "mute-stdout": "^1.0.0", + "pretty-hrtime": "^1.0.0", + "replace-homedir": "^1.0.0", + "semver-greatest-satisfied-range": "^1.1.0", + "v8flags": "^3.0.1", + "yargs": "^7.1.0" + } + } + } + }, + "gulp-autoprefixer": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/gulp-autoprefixer/-/gulp-autoprefixer-7.0.1.tgz", + "integrity": "sha512-QJGEmHw+bEt7FSqvmbAUTxbCuNLJYx4sz3ox9WouYqT/7j5FH5CQ8ZnpL1M7H5npX1bUJa7lUVY1w20jXxhOxg==", + "requires": { + "autoprefixer": "^9.6.1", + "fancy-log": "^1.3.2", + "plugin-error": "^1.0.1", + "postcss": "^7.0.17", + "through2": "^3.0.1", + "vinyl-sourcemaps-apply": "^0.2.1" + }, + "dependencies": { + "through2": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", + "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", + "requires": { + "readable-stream": "2 || 3" + } + } + } + }, + "gulp-sass": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/gulp-sass/-/gulp-sass-4.1.0.tgz", + "integrity": "sha512-xIiwp9nkBLcJDpmYHbEHdoWZv+j+WtYaKD6Zil/67F3nrAaZtWYN5mDwerdo7EvcdBenSAj7Xb2hx2DqURLGdA==", + "requires": { + "chalk": "^2.3.0", + "lodash": "^4.17.11", + "node-sass": "^4.8.3", + "plugin-error": "^1.0.1", + "replace-ext": "^1.0.0", + "strip-ansi": "^4.0.0", + "through2": "^2.0.0", + "vinyl-sourcemaps-apply": "^0.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "gulp-sourcemaps": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-2.6.5.tgz", + "integrity": "sha512-SYLBRzPTew8T5Suh2U8jCSDKY+4NARua4aqjj8HOysBh2tSgT9u4jc1FYirAdPx1akUxxDeK++fqw6Jg0LkQRg==", + "requires": { + "@gulp-sourcemaps/identity-map": "1.X", + "@gulp-sourcemaps/map-sources": "1.X", + "acorn": "5.X", + "convert-source-map": "1.X", + "css": "2.X", + "debug-fabulous": "1.X", + "detect-newline": "2.X", + "graceful-fs": "4.X", + "source-map": "~0.6.0", + "strip-bom-string": "1.X", + "through2": "2.X" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "requires": { + "glogg": "^1.0.0" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "in-publish": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz", + "integrity": "sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==" + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "requires": { + "repeating": "^2.0.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, + "interpret": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.3.0.tgz", + "integrity": "sha512-RDVhhDkycLoSQtE9o0vpK/vOccVDsCbWVzRxArGYnlQLcihPl2loFbPyiH7CM0m2/ijOJU3+PZbnBPaB6NJ1MA==" + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=" + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "requires": { + "is-unc-path": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "requires": { + "unc-path-regex": "^0.1.2" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, + "is-valid-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=" + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "js-base64": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.2.tgz", + "integrity": "sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ==" + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "just-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", + "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=" + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "last-run": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", + "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", + "requires": { + "default-resolution": "^2.0.0", + "es6-weak-map": "^2.0.1" + } + }, + "lazystream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "requires": { + "readable-stream": "^2.0.5" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "^1.0.0" + } + }, + "lead": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", + "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", + "requires": { + "flush-write-stream": "^1.0.2" + } + }, + "liftoff": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", + "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", + "requires": { + "extend": "^3.0.0", + "findup-sync": "^3.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + } + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", + "requires": { + "es5-ext": "~0.10.2" + } + }, + "make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "requires": { + "kind-of": "^6.0.2" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "^1.0.0" + } + }, + "matchdep": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", + "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", + "requires": { + "findup-sync": "^2.0.0", + "micromatch": "^3.0.4", + "resolve": "^1.4.0", + "stack-trace": "0.0.10" + }, + "dependencies": { + "findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "memoizee": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.14.tgz", + "integrity": "sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg==", + "requires": { + "d": "1", + "es5-ext": "^0.10.45", + "es6-weak-map": "^2.0.2", + "event-emitter": "^0.3.5", + "is-promise": "^2.1", + "lru-queue": "0.1", + "next-tick": "1", + "timers-ext": "^0.1.5" + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "requires": { + "mime-db": "1.44.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "mute-stdout": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", + "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==" + }, + "nan": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", + "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==" + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, + "node-gyp": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", + "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", + "requires": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "^2.87.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" + } + } + }, + "node-releases": { + "version": "1.1.57", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.57.tgz", + "integrity": "sha512-ZQmnWS7adi61A9JsllJ2gdj2PauElcjnOwTp2O011iGzoakTxUsDGSe+6vD7wXbKdqhSFymC0OSx35aAMhrSdw==" + }, + "node-sass": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.14.1.tgz", + "integrity": "sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g==", + "requires": { + "async-foreach": "^0.1.3", + "chalk": "^1.1.1", + "cross-spawn": "^3.0.0", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "in-publish": "^2.0.0", + "lodash": "^4.17.15", + "meow": "^3.7.0", + "mkdirp": "^0.5.1", + "nan": "^2.13.2", + "node-gyp": "^3.8.0", + "npmlog": "^4.0.0", + "request": "^2.88.0", + "sass-graph": "2.2.5", + "stdout-stream": "^1.4.0", + "true-case-path": "^1.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" + }, + "now-and-later": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", + "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", + "requires": { + "once": "^1.3.2" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "requires": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "^3.0.1" + } + }, + "object.reduce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", + "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "ordered-read-streams": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", + "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", + "requires": { + "readable-stream": "^2.0.1" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "requires": { + "lcid": "^1.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "requires": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==" + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "requires": { + "path-root-regex": "^0.1.0" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=" + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "requires": { + "find-up": "^2.1.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "^2.0.0" + } + } + } + }, + "plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "requires": { + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + }, + "postcss": { + "version": "7.0.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.31.tgz", + "integrity": "sha512-a937VDHE1ftkjk+8/7nj/mrjtmkn69xxzJgRETXdAUU+IgOYPQNJF17haGWbeDxSyk++HA14UA98FurvPyBJOA==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==" + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "requires": { + "resolve": "^1.1.6" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "remove-bom-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", + "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", + "requires": { + "is-buffer": "^1.1.5", + "is-utf8": "^0.2.1" + } + }, + "remove-bom-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", + "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", + "requires": { + "remove-bom-buffer": "^3.0.0", + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "requires": { + "is-finite": "^1.0.0" + } + }, + "replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==" + }, + "replace-homedir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", + "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", + "requires": { + "homedir-polyfill": "^1.0.1", + "is-absolute": "^1.0.0", + "remove-trailing-separator": "^1.1.0" + } + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "resolve-options": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", + "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", + "requires": { + "value-or-function": "^3.0.0" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sass-graph": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz", + "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==", + "requires": { + "glob": "^7.0.0", + "lodash": "^4.0.0", + "scss-tokenizer": "^0.2.3", + "yargs": "^13.3.2" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "requires": { + "js-base64": "^2.1.8", + "source-map": "^0.4.2" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "semver-greatest-satisfied-range": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", + "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", + "requires": { + "sver-compat": "^1.5.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" + }, + "sparkles": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", + "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==" + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "stdout-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", + "requires": { + "readable-stream": "^2.0.1" + } + }, + "stream-exhaust": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", + "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==" + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=" + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "requires": { + "get-stdin": "^4.0.1" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "sver-compat": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", + "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", + "requires": { + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" + } + }, + "tar": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", + "requires": { + "block-stream": "*", + "fstream": "^1.0.12", + "inherits": "2" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "through2-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", + "requires": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=" + }, + "timers-ext": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", + "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", + "requires": { + "es5-ext": "~0.10.46", + "next-tick": "1" + } + }, + "to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", + "requires": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + } + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "to-through": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", + "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", + "requires": { + "through2": "^2.0.3" + } + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" + }, + "true-case-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", + "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", + "requires": { + "glob": "^7.1.2" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=" + }, + "undertaker": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.1.tgz", + "integrity": "sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==", + "requires": { + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "bach": "^1.0.0", + "collection-map": "^1.0.0", + "es6-weak-map": "^2.0.1", + "last-run": "^1.1.0", + "object.defaults": "^1.0.0", + "object.reduce": "^1.0.0", + "undertaker-registry": "^1.0.0" + } + }, + "undertaker-registry": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", + "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=" + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unique-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", + "requires": { + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "v8flags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "value-or-function": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", + "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vinyl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", + "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + } + }, + "vinyl-fs": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", + "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", + "requires": { + "fs-mkdirp-stream": "^1.0.0", + "glob-stream": "^6.1.0", + "graceful-fs": "^4.0.0", + "is-valid-glob": "^1.0.0", + "lazystream": "^1.0.0", + "lead": "^1.0.0", + "object.assign": "^4.0.4", + "pumpify": "^1.3.5", + "readable-stream": "^2.3.3", + "remove-bom-buffer": "^3.0.0", + "remove-bom-stream": "^1.2.0", + "resolve-options": "^1.1.0", + "through2": "^2.0.0", + "to-through": "^2.0.0", + "value-or-function": "^3.0.0", + "vinyl": "^2.0.0", + "vinyl-sourcemap": "^1.1.0" + } + }, + "vinyl-sourcemap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", + "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", + "requires": { + "append-buffer": "^1.0.2", + "convert-source-map": "^1.5.0", + "graceful-fs": "^4.1.6", + "normalize-path": "^2.1.1", + "now-and-later": "^2.0.0", + "remove-bom-buffer": "^3.0.0", + "vinyl": "^2.0.0" + } + }, + "vinyl-sourcemaps-apply": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", + "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", + "requires": { + "source-map": "^0.5.1" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + }, + "yargs": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.1.tgz", + "integrity": "sha512-huO4Fr1f9PmiJJdll5kwoS2e4GqzGSsMT3PPMpOwoVkOK8ckqAewMTZyA6LXVQWflleb/Z8oPBEvNsMft0XE+g==", + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "5.0.0-security.0" + } + }, + "yargs-parser": { + "version": "5.0.0-security.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0-security.0.tgz", + "integrity": "sha512-T69y4Ps64LNesYxeYGYPvfoMTt/7y1XtfpIslUeK4um+9Hu7hlGoRtaDLvdXb7+/tfq4opVa2HRY5xGip022rQ==", + "requires": { + "camelcase": "^3.0.0", + "object.assign": "^4.1.0" + } + } + } +} diff --git a/package.json b/package.json index 05c5049e..995a9344 100644 --- a/package.json +++ b/package.json @@ -1,17 +1,18 @@ -{ - "name": "starwarsffg", - "version": "1.0.0", - "description": "( PLEASE NOTE: This is a custom fork based on [Jaxxa's implementation](https://github.com/jaxxa/StarWarsFFG/tree/master). )", - "main": "index.js", - "scripts": { - "compile": "gulp css" - }, - "author": "", - "license": "MIT", - "dependencies": { - "gulp": "^4.0.2", - "gulp-autoprefixer": "^7.0.1", - "gulp-sass": "^4.1.0", - "gulp-sourcemaps": "^2.6.5" - } -} +{ + "name": "starwarsffg", + "version": "1.0.0", + "description": "( PLEASE NOTE: This is a custom fork based on [Jaxxa's implementation](https://github.com/jaxxa/StarWarsFFG/tree/master). )", + "main": "index.js", + "scripts": { + "compile": "gulp css", + "watch": "gulp" + }, + "author": "", + "license": "MIT", + "dependencies": { + "gulp": "^4.0.2", + "gulp-autoprefixer": "^7.0.1", + "gulp-sass": "^4.1.0", + "gulp-sourcemaps": "^2.6.5" + } +} diff --git a/scss/components/_tabs.scss b/scss/components/_tabs.scss index ab6b1df5..d222fc5d 100644 --- a/scss/components/_tabs.scss +++ b/scss/components/_tabs.scss @@ -21,7 +21,29 @@ .tabs { height: 15px; margin-bottom: 10px; - border : 0; + border: 0; + .item { + line-height: 15px; + } + } +} + +.minion { + .tabs { + height: 15px; + margin-bottom: 10px; + border: 0; + .item { + line-height: 15px; + } + } +} + +.vehicle { + .tabs { + height: 15px; + margin-bottom: 10px; + border: 0; .item { line-height: 15px; } @@ -30,29 +52,18 @@ .tabs { height: 40px; - border-top: 1px solid #AAA; - border-bottom: 1px solid #AAA; + border-top: 1px solid #aaa; + border-bottom: 1px solid #aaa; .item { line-height: 15px; font-weight: bold; background-color: rgb(81, 98, 77); - padding:3px; + padding: 3px; margin: 0 5px; --notchSize: 10px; - - - clip-path: - polygon( - 0% var(--notchSize), - var(--notchSize) 0%, - calc(100% - var(--notchSize)) 0%, - 100% var(--notchSize), - 100% calc(100% - var(--notchSize)), - calc(100% - var(--notchSize)) 100%, - var(--notchSize) 100%, - 0% calc(100% - var(--notchSize)) - ); + + clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); &:hover { text-shadow: 0 0 8px white; @@ -62,8 +73,8 @@ .item.active { text-decoration: underline; text-shadow: none; - background-color: rgb(73, 12, 11); + background-color: rgb(73, 12, 11); color: white; font-weight: normal; } -} \ No newline at end of file +} diff --git a/styles/starwarsffg.css b/styles/starwarsffg.css index 93977b1c..9832d528 100644 --- a/styles/starwarsffg.css +++ b/styles/starwarsffg.css @@ -1,1566 +1,1586 @@ -@font-face { - font-family: "Roboto"; - src: url("../fonts/Roboto-Regular.ttf") format("truetype"); -} - -@font-face { - font-family: "StarJedi"; - src: url("../fonts/StarJedi-Regular.ttf") format("truetype"); -} - -@font-face { - font-family: "Signika"; - src: url("../fonts/Signika-Regular.ttf") format("truetype"); -} - -/* Global styles */ -.window-app { - font-family: "Roboto", sans-serif; -} - -.window-app .window-content { - background-color: rgba(255, 255, 255, 0.7); - font-size: 9pt; -} - -.rollable:hover, .rollable:focus { - color: #000; - text-shadow: 0 0 10px red; - cursor: pointer; -} - -.grid, -.grid-2col { - display: grid; - grid-column: span 2 / span 2; - grid-template-columns: repeat(2, minmax(0, 1fr)); - gap: 10px; - margin: 10px 0; - padding: 0; -} - -.grid-3col { - grid-column: span 3 / span 3; - grid-template-columns: repeat(3, minmax(0, 1fr)); -} - -.grid-4col { - grid-column: span 4 / span 4; - grid-template-columns: repeat(4, minmax(0, 1fr)); -} - -.grid-5col { - grid-column: span 5 / span 5; - grid-template-columns: repeat(5, minmax(0, 1fr)); -} - -.grid-6col { - grid-column: span 6 / span 6; - grid-template-columns: repeat(6, minmax(0, 1fr)); -} - -.grid-7col { - grid-column: span 7 / span 7; - grid-template-columns: repeat(7, minmax(0, 1fr)); -} - -.grid-8col { - grid-column: span 8 / span 8; - grid-template-columns: repeat(8, minmax(0, 1fr)); -} - -.grid-9col { - grid-column: span 9 / span 9; - grid-template-columns: repeat(9, minmax(0, 1fr)); -} - -.grid-10col { - grid-column: span 10 / span 10; - grid-template-columns: repeat(10, minmax(0, 1fr)); -} - -.grid-11col { - grid-column: span 11 / span 11; - grid-template-columns: repeat(11, minmax(0, 1fr)); -} - -.grid-12col { - grid-column: span 12 / span 12; - grid-template-columns: repeat(12, minmax(0, 1fr)); -} - -.flex-group-center, -.flex-group-left, -.flex-group-right { - justify-content: center; - align-items: center; - text-align: center; - padding: 5px; - border: 1px solid #999; -} - -.flex-group-left { - justify-content: flex-start; - text-align: left; -} - -.flex-group-right { - justify-content: flex-end; - text-align: right; -} - -.flex-center { - align-items: center; - justify-content: center; - text-align: center; -} - -.flex-between { - justify-content: space-between; -} - -.starwarsffg .item-form { - font-family: "Roboto", sans-serif; -} - -.starwarsffg .block-background { - background-color: #c4dbe9; - padding: 5px; - --notchSize: 9px; - -webkit-clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); - clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); -} - -.starwarsffg .block-background-shadow { - position: absolute; - width: 100%; - top: 30px; - height: 30px; - background-color: #7da9c2; - padding: 5px; - z-index: -1; - --notchSize: 9px; - -webkit-clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); - clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); -} - -.starwarsffg .character { - min-width: 575px; -} - -.starwarsffg .position-relative { - position: relative; -} - -.starwarsffg.sheet .sheet-body { - border: 0; -} - -.starwarsffg .resource-label { - font-weight: bold; - text-transform: uppercase; -} - -.starwarsffg .character .tabs { - height: 15px; - margin-bottom: 10px; - border: 0; -} - -.starwarsffg .character .tabs .item { - line-height: 15px; -} - -.starwarsffg .tabs { - height: 40px; - border-top: 1px solid #AAA; - border-bottom: 1px solid #AAA; -} - -.starwarsffg .tabs .item { - line-height: 15px; - font-weight: bold; - background-color: #51624d; - padding: 3px; - margin: 0 5px; - --notchSize: 10px; - -webkit-clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); - clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); -} - -.starwarsffg .tabs .item:hover { - text-shadow: 0 0 8px white; -} - -.starwarsffg .tabs .item.active { - text-decoration: underline; - text-shadow: none; - background-color: #490c0b; - color: white; - font-weight: normal; -} - -.starwarsffg .header-fields .block-background-shadow { - top: 36px; -} - -.starwarsffg .header-fields .container.flex-group-center { - border: 0; - margin-bottom: 5px; - padding: 0 5px 5px 5px; -} - -.starwarsffg .header-fields h1 { - margin: 0; - width: 100%; -} - -.starwarsffg .header-fields .header-name { - margin: 0; - position: relative; - width: 100%; -} - -.starwarsffg .header-fields .header-name input { - margin: 0; - width: 100%; - border: 0; - background-color: rgba(0, 0, 0, 0); -} - -.starwarsffg .header-fields .header-name input:focus { - box-shadow: 0 0 5px #7da9c2; - background-color: #7da9c2; -} - -.starwarsffg .header-fields .header-description-block { - margin-bottom: 5px; - margin-top: 5px; -} - -.starwarsffg .header-fields .header-description { - background-color: #c4dbe9; - --notchSize: 10px; - padding: 3px; - -webkit-clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); - clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); -} - -.starwarsffg .header-fields .table { - display: table; - width: 100%; -} - -.starwarsffg .header-fields .row { - display: table-row; - width: 100%; -} - -.starwarsffg .header-fields .row div { - display: table-cell; -} - -.starwarsffg .header-fields .row .row-input { - padding: 0 5px; -} - -.starwarsffg .header-fields .row input { - width: 100%; - border: 0; - border-bottom: 1px solid black; - border-radius: 0; -} - -.starwarsffg .header-fields .row input:focus { - box-shadow: 0 0 5px #7da9c2; - background-color: #7da9c2; -} - -.starwarsffg .header-fields .profile-block { - margin-right: 5px; - margin-left: 5px; - height: 140px; - max-width: 140px; -} - -.starwarsffg .header-fields .profile-img { - flex: 0 0 100px; - height: 124px; - width: auto; - max-width: 124px; - border: 0; - margin: auto; -} - -.starwarsffg .header-fields .attribute { - position: relative; - padding: 0; - z-index: 1; - border: 0; -} - -.starwarsffg .header-fields .attribute .block-background { - padding: 5px 5px; -} - -.starwarsffg .header-fields .attribute .block-title { - line-height: initial; - background-color: #490c0b; - color: white; - font-size: 13px; - text-transform: uppercase; - margin: auto; - --notchSize: 8px; - -webkit-clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); - clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); -} - -.starwarsffg .header-fields .attribute .block-attribute .block-value { - display: inline-block; -} - -.starwarsffg .header-fields .attribute .block-value.block-single input { - width: 100%; - padding: 6px; -} - -.starwarsffg .header-fields .attribute .block-value input { - border: 0; - font-size: 14px; -} - -.starwarsffg .header-fields .attribute .block-value input:focus { - box-shadow: 0 0 5px #7da9c2; - background-color: #7da9c2; -} - -.starwarsffg .header-fields .attribute .shadow-text { - position: absolute; - top: 5px; - font-size: 9px; - left: 50%; - transform: translateX(-50%); -} - -.starwarsffg .header-fields .attribute .shadow-left { - background-color: #490c0b; - width: 50%; - height: 100%; - float: left; - position: relative; - padding-top: 25px; -} - -.starwarsffg .header-fields .attribute .shadow-left .shadow-text { - color: white; - text-transform: uppercase; -} - -.starwarsffg .header-fields .attribute .shadow-right { - background-color: #7da9c2; - width: 50%; - height: 100%; - float: right; - position: relative; - padding-top: 25px; -} - -.starwarsffg .header-fields .attribute .shadow-right .shadow-text { - color: black; - font-weight: bold; - text-transform: uppercase; -} - -.starwarsffg .header-fields .resource { - line-height: 30px; - width: 110px; -} - -.starwarsffg .header-fields .resource.split { - width: 130px; -} - -.starwarsffg .header-fields .resource.single { - width: 65px; -} - -.starwarsffg .header-fields .resource input { - width: 45px; -} - -.starwarsffg .sheet-body div.tab.characteristics { - overflow: hidden; -} - -.starwarsffg .sheet-body .characteristics fieldset.skillfilter { - display: none; -} - -.starwarsffg .sheet-body .characteristics .characteristic-item { - border: 0; - position: relative; -} - -.starwarsffg .sheet-body .characteristics .characteristic-item .characteristic-label { - margin-top: 5px; - width: 100%; - text-align: center; - background-color: #490c0b; - color: white; - text-transform: uppercase; - font-size: 10px; - --notchSize: 7px; - -webkit-clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); - clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); -} - -.starwarsffg .sheet-body .characteristics .grid { - margin-top: 0; -} - -.starwarsffg .sheet-body .characteristic { - width: 50px; - height: 50px; - border-radius: 50%; - border: 5px double black; - margin: auto; - position: relative; -} - -.starwarsffg .sheet-body .characteristic .characteristic-value input { - height: 40px; - border: 0; - font-size: 30px; - text-align: center; -} - -.starwarsffg .sheet-body .characteristic .characteristic-value input:focus { - box-shadow: 0 0 5px #7da9c2; - background-color: #7da9c2; - border-radius: 50%; -} - -.starwarsffg .tableWithHeader .tableWithHeader-container { - flex: 1; - margin: 2px; - position: relative; -} - -.starwarsffg .tableWithHeader table th { - text-align: left; - padding: 3px; - border-bottom: 1px solid rgba(0, 0, 0, 0.25); - background-color: #490c0b; - color: white; - font-size: 12px; - font-weight: normal; -} - -.starwarsffg .tableWithHeader table td { - padding: 0 0 0 3px; -} - -.starwarsffg .tableWithHeader table td .dice-pool img { - width: 1em; - height: 1em; - border: 0; -} - -.starwarsffg .tableWithHeader table .careerskill-toggle { - margin: 0; - padding: 0; -} - -.starwarsffg .tableWithHeader table .careerskill-rank { - width: 30px; - text-align: center; -} - -.starwarsffg table.items .items-list td.item-controls { - text-align: right; - width: auto; - z-index: auto; -} - -.starwarsffg .items table th { - text-align: left; - padding: 3px; - border-bottom: 1px solid rgba(0, 0, 0, 0.25); - background-color: #490c0b; - color: white; - font-size: 12px; - font-weight: normal; -} - -.starwarsffg .items table td { - padding: 3px; -} - -.starwarsffg .items .attribute { - position: relative; - padding: 0; - z-index: 1; - border: 0; -} - -.starwarsffg .items .attribute .block-background-shadow { - top: 36px; -} - -.starwarsffg .items .attribute .block-background { - padding: 5px 5px; -} - -.starwarsffg .items .attribute .block-title { - line-height: initial; - background-color: #490c0b; - color: white; - font-size: 13px; - text-transform: uppercase; - margin: auto; - --notchSize: 8px; - -webkit-clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); - clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); -} - -.starwarsffg .items .attribute .block-attribute .block-value { - display: inline-block; -} - -.starwarsffg .items .attribute .block-value.block-single input { - width: 100%; - padding: 6px; -} - -.starwarsffg .items .attribute .block-value input { - border: 0; - font-size: 14px; -} - -.starwarsffg .items .attribute .block-value input:focus { - box-shadow: 0 0 5px #7da9c2; - background-color: #7da9c2; -} - -.starwarsffg .items .attribute .shadow-text { - position: absolute; - top: 5px; - font-size: 9px; - left: 50%; - transform: translateX(-50%); -} - -.starwarsffg .items .attribute .shadow-left { - background-color: #490c0b; - width: 50%; - height: 100%; - float: left; - position: relative; - padding-top: 25px; -} - -.starwarsffg .items .attribute .shadow-left .shadow-text { - color: white; - text-transform: uppercase; -} - -.starwarsffg .items .attribute .shadow-right { - background-color: #7da9c2; - width: 50%; - height: 100%; - float: right; - position: relative; - padding-top: 25px; -} - -.starwarsffg .items .attribute .shadow-right .shadow-text { - color: black; - font-weight: bold; - text-transform: uppercase; -} - -.starwarsffg .items .resource { - line-height: 30px; - width: 110px; -} - -.starwarsffg .items .resource.split { - width: 130px; -} - -.starwarsffg .items .resource.single { - width: 65px; -} - -.starwarsffg .items .resource.double { - width: 130px; -} - -.starwarsffg .items .resource input { - width: 45px; -} - -.starwarsffg .items .item-values { - margin-bottom: 5px; - border: 0; -} - -.starwarsffg table.talent-list { - border: 0; -} - -.starwarsffg table.talent-list th { - text-align: left; - padding: 3px; - border-bottom: 1px solid rgba(0, 0, 0, 0.25); - background-color: #490c0b; - color: white; - font-size: 12px; - font-weight: normal; -} - -.starwarsffg table.talent-list td { - height: 30px; - line-height: 24px; - padding: 3px; -} - -.starwarsffg table.talent-list td .item-controls { - text-align: right; - width: auto; - z-index: auto; -} - -.starwarsffg .biography .attribute { - position: relative; - padding: 0; - z-index: 1; - border: 0; -} - -.starwarsffg .biography .attribute .block-background-shadow { - top: 36px; -} - -.starwarsffg .biography .attribute .block-background { - padding: 5px 5px; -} - -.starwarsffg .biography .attribute .block-title { - line-height: initial; - background-color: #490c0b; - color: white; - font-size: 13px; - text-transform: uppercase; - margin: auto; - --notchSize: 8px; - -webkit-clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); - clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); -} - -.starwarsffg .biography .attribute .block-attribute .block-value { - display: inline-block; -} - -.starwarsffg .biography .attribute .block-value.block-single input { - width: 100%; - padding: 6px; -} - -.starwarsffg .biography .attribute .block-value input { - border: 0; - font-size: 14px; -} - -.starwarsffg .biography .attribute .block-value input:focus { - box-shadow: 0 0 5px #7da9c2; - background-color: #7da9c2; -} - -.starwarsffg .biography .attribute .shadow-text { - position: absolute; - top: 5px; - font-size: 9px; - left: 50%; - transform: translateX(-50%); -} - -.starwarsffg .biography .attribute .shadow-left { - background-color: #490c0b; - width: 50%; - height: 100%; - float: left; - position: relative; - padding-top: 25px; -} - -.starwarsffg .biography .attribute .shadow-left .shadow-text { - color: white; - text-transform: uppercase; -} - -.starwarsffg .biography .attribute .shadow-right { - background-color: #7da9c2; - width: 50%; - height: 100%; - float: right; - position: relative; - padding-top: 25px; -} - -.starwarsffg .biography .attribute .shadow-right .shadow-text { - color: black; - font-weight: bold; - text-transform: uppercase; -} - -.starwarsffg .biography .resource { - line-height: 30px; - width: 110px; -} - -.starwarsffg .biography .resource.split { - width: 130px; -} - -.starwarsffg .biography .resource.single { - width: 110px; -} - -.starwarsffg .biography .resource.double { - width: 130px; -} - -.starwarsffg .biography .resource input { - width: 45px; -} - -.starwarsffg .biography .biography-values { - margin-bottom: 5px; - border: 0; - position: absolute; - bottom: 10px; - left: 0; - padding: 0; -} - -.starwarsffg .biography .biography-editor { - height: 475px; -} - -.starwarsffg .item-sheet-weapon .header-fields { - height: 435px; -} - -.starwarsffg .item-sheet-weapon .charname { - width: 100%; -} - -.starwarsffg .item-sheet-weapon .charname input { - color: #134103; - border: 0; -} - -.starwarsffg .item-sheet-weapon .charname input:focus { - box-shadow: 0 0 5px #7da9c2; - background-color: #7da9c2; -} - -.starwarsffg .item-sheet-weapon .characteristic-item { - border: 0; - position: relative; - padding: 0; - margin: 0 5px; -} - -.starwarsffg .item-sheet-weapon .characteristic-item .characteristic-label { - margin-top: 5px; - width: 100%; - text-align: center; - background-color: #134103; - color: white; - text-transform: uppercase; - font-size: 10px; - --notchSize: 7px; - -webkit-clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); - clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); -} - -.starwarsffg .item-sheet-weapon .characteristic-item .characteristic { - width: 50px; - height: 50px; - border-radius: 10px; - border: 5px double #124701; - margin: auto; - position: relative; -} - -.starwarsffg .item-sheet-weapon .characteristic-item .characteristic .characteristic-value input { - height: 40px; - border: 0; - font-size: 30px; - text-align: center; -} - -.starwarsffg .item-sheet-weapon .characteristic-item .characteristic .characteristic-value input:focus { - box-shadow: 0 0 5px #7da9c2; - background-color: #7da9c2; - border-radius: 5px; -} - -.starwarsffg .item-sheet-weapon .item-name { - margin: 0; - padding-bottom: 0 !important; -} - -.starwarsffg .item-sheet-weapon .grid { - margin-top: 0; -} - -.starwarsffg .item-sheet-weapon .block-background { - background-color: #bffebf; -} - -.starwarsffg .item-sheet-weapon .attribute { - position: relative; - padding: 0; - z-index: 1; - border: 0; -} - -.starwarsffg .item-sheet-weapon .attribute .block-background-shadow { - top: 36px; -} - -.starwarsffg .item-sheet-weapon .attribute .block-background { - padding: 5px 5px; -} - -.starwarsffg .item-sheet-weapon .attribute .block-title { - line-height: initial; - background-color: #134103; - color: white; - font-size: 13px; - text-transform: uppercase; - margin: auto; - --notchSize: 8px; - -webkit-clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); - clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); -} - -.starwarsffg .item-sheet-weapon .attribute .block-attribute select:focus { - box-shadow: 0 0 5px #7da9c2; - background-color: #7da9c2; -} - -.starwarsffg .item-sheet-weapon .attribute .block-attribute .block-value { - display: inline-block; -} - -.starwarsffg .item-sheet-weapon .attribute .block-value textarea { - resize: none; - font-family: 'Roboto'; - border: 0; -} - -.starwarsffg .item-sheet-weapon .attribute .block-value textarea:focus { - box-shadow: 0 0 5px #7da9c2; - background-color: #7da9c2; - outline: none; -} - -.starwarsffg .item-sheet-weapon .attribute .block-value.block-single input { - width: 100%; - padding: 6px; -} - -.starwarsffg .item-sheet-weapon .attribute .block-value input { - border: 0; - font-size: 14px; -} - -.starwarsffg .item-sheet-weapon .attribute .block-value input:focus { - box-shadow: 0 0 5px #7da9c2; - background-color: #7da9c2; -} - -.starwarsffg .item-sheet-weapon .attribute .shadow-text { - position: absolute; - top: 5px; - font-size: 9px; - left: 50%; - transform: translateX(-50%); -} - -.starwarsffg .item-sheet-weapon .attribute .shadow-left { - background-color: #490c0b; - width: 50%; - height: 100%; - float: left; - position: relative; - padding-top: 25px; -} - -.starwarsffg .item-sheet-weapon .attribute .shadow-left .shadow-text { - color: white; - text-transform: uppercase; -} - -.starwarsffg .item-sheet-weapon .attribute .shadow-right { - background-color: #7da9c2; - width: 50%; - height: 100%; - float: right; - position: relative; - padding-top: 25px; -} - -.starwarsffg .item-sheet-weapon .attribute .shadow-right .shadow-text { - color: black; - font-weight: bold; - text-transform: uppercase; -} - -.starwarsffg .item-sheet-weapon .resource { - line-height: 30px; - width: 110px; -} - -.starwarsffg .item-sheet-weapon .resource.split { - width: 130px; -} - -.starwarsffg .item-sheet-weapon .resource.single { - width: 100px; -} - -.starwarsffg .item-sheet-weapon .resource.double { - width: 235px; -} - -.starwarsffg .item-sheet-weapon .resource input { - width: 45px; -} - -.starwarsffg .item-sheet-weapon .tabs { - height: 20px; - border: 0; -} - -.starwarsffg .item-sheet-weapon .tabs .item { - line-height: 15px; -} - -.starwarsffg .item-sheet-armor .header-fields { - height: 340px; -} - -.starwarsffg .item-sheet-armor .charname { - width: 100%; -} - -.starwarsffg .item-sheet-armor .charname input { - color: #553113; - border: 0; -} - -.starwarsffg .item-sheet-armor .charname input:focus { - box-shadow: 0 0 5px #7da9c2; - background-color: #7da9c2; -} - -.starwarsffg .item-sheet-armor .characteristic-item { - border: 0; - position: relative; - padding: 0; - margin: 0 5px; -} - -.starwarsffg .item-sheet-armor .characteristic-item .characteristic-label { - margin-top: 5px; - width: 100%; - text-align: center; - background-color: #553113; - color: white; - text-transform: uppercase; - font-size: 10px; - --notchSize: 7px; - -webkit-clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); - clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); -} - -.starwarsffg .item-sheet-armor .characteristic-item .characteristic { - width: 50px; - height: 50px; - border-radius: 10px; - border: 5px double #553113; - margin: auto; - position: relative; -} - -.starwarsffg .item-sheet-armor .characteristic-item .characteristic .characteristic-value input { - height: 40px; - border: 0; - font-size: 30px; - text-align: center; -} - -.starwarsffg .item-sheet-armor .characteristic-item .characteristic .characteristic-value input:focus { - box-shadow: 0 0 5px #7da9c2; - background-color: #7da9c2; - border-radius: 5px; -} - -.starwarsffg .item-sheet-armor .item-name { - margin: 0; - padding-bottom: 0 !important; -} - -.starwarsffg .item-sheet-armor .grid { - margin-top: 0; -} - -.starwarsffg .item-sheet-armor .block-background { - background-color: #e9c09e; -} - -.starwarsffg .item-sheet-armor .attribute { - position: relative; - padding: 0; - z-index: 1; - border: 0; -} - -.starwarsffg .item-sheet-armor .attribute .block-background-shadow { - top: 36px; -} - -.starwarsffg .item-sheet-armor .attribute .block-background { - padding: 5px 5px; -} - -.starwarsffg .item-sheet-armor .attribute .block-title { - line-height: initial; - background-color: #553113; - color: white; - font-size: 13px; - text-transform: uppercase; - margin: auto; - --notchSize: 8px; - -webkit-clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); - clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); -} - -.starwarsffg .item-sheet-armor .attribute .block-attribute select:focus { - box-shadow: 0 0 5px #7da9c2; - background-color: #7da9c2; -} - -.starwarsffg .item-sheet-armor .attribute .block-attribute .block-value { - display: inline-block; -} - -.starwarsffg .item-sheet-armor .attribute .block-value textarea { - resize: none; - font-family: 'Roboto'; - border: 0; -} - -.starwarsffg .item-sheet-armor .attribute .block-value textarea:focus { - box-shadow: 0 0 5px #7da9c2; - background-color: #7da9c2; - outline: none; -} - -.starwarsffg .item-sheet-armor .attribute .block-value.block-single input { - width: 100%; - padding: 6px; -} - -.starwarsffg .item-sheet-armor .attribute .block-value input { - border: 0; - font-size: 14px; -} - -.starwarsffg .item-sheet-armor .attribute .block-value input:focus { - box-shadow: 0 0 5px #7da9c2; - background-color: #7da9c2; -} - -.starwarsffg .item-sheet-armor .attribute .shadow-text { - position: absolute; - top: 5px; - font-size: 9px; - left: 50%; - transform: translateX(-50%); -} - -.starwarsffg .item-sheet-armor .attribute .shadow-left { - background-color: #490c0b; - width: 50%; - height: 100%; - float: left; - position: relative; - padding-top: 25px; -} - -.starwarsffg .item-sheet-armor .attribute .shadow-left .shadow-text { - color: white; - text-transform: uppercase; -} - -.starwarsffg .item-sheet-armor .attribute .shadow-right { - background-color: #7da9c2; - width: 50%; - height: 100%; - float: right; - position: relative; - padding-top: 25px; -} - -.starwarsffg .item-sheet-armor .attribute .shadow-right .shadow-text { - color: black; - font-weight: bold; - text-transform: uppercase; -} - -.starwarsffg .item-sheet-armor .resource { - line-height: 30px; - width: 110px; -} - -.starwarsffg .item-sheet-armor .resource.split { - width: 130px; -} - -.starwarsffg .item-sheet-armor .resource.single { - width: 100px; -} - -.starwarsffg .item-sheet-armor .resource.double { - width: 235px; -} - -.starwarsffg .item-sheet-armor .resource input { - width: 45px; -} - -.starwarsffg .item-sheet-armor .tabs { - height: 20px; - border: 0; -} - -.starwarsffg .item-sheet-armor .tabs .item { - line-height: 15px; -} - -.starwarsffg .item-sheet-gear .header-fields { - height: 340px; -} - -.starwarsffg .item-sheet-gear .charname { - width: 100%; -} - -.starwarsffg .item-sheet-gear .charname input { - color: #2c0344; - border: 0; -} - -.starwarsffg .item-sheet-gear .charname input:focus { - box-shadow: 0 0 5px #7da9c2; - background-color: #7da9c2; -} - -.starwarsffg .item-sheet-gear .characteristic-item { - border: 0; - position: relative; - padding: 0; - margin: 0 5px; -} - -.starwarsffg .item-sheet-gear .characteristic-item .characteristic-label { - margin-top: 5px; - width: 100%; - text-align: center; - background-color: #2c0344; - color: white; - text-transform: uppercase; - font-size: 10px; - --notchSize: 7px; - -webkit-clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); - clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); -} - -.starwarsffg .item-sheet-gear .characteristic-item .characteristic { - width: 50px; - height: 50px; - border-radius: 10px; - border: 5px double #2c0344; - margin: auto; - position: relative; -} - -.starwarsffg .item-sheet-gear .characteristic-item .characteristic .characteristic-value input { - height: 40px; - border: 0; - font-size: 30px; - text-align: center; -} - -.starwarsffg .item-sheet-gear .characteristic-item .characteristic .characteristic-value input:focus { - box-shadow: 0 0 5px #7da9c2; - background-color: #7da9c2; - border-radius: 5px; -} - -.starwarsffg .item-sheet-gear .item-name { - margin: 0; - padding-bottom: 0 !important; -} - -.starwarsffg .item-sheet-gear .grid { - margin-top: 0; -} - -.starwarsffg .item-sheet-gear .block-background { - background-color: #e9c6fd; -} - -.starwarsffg .item-sheet-gear .attribute { - position: relative; - padding: 0; - z-index: 1; - border: 0; -} - -.starwarsffg .item-sheet-gear .attribute .block-background-shadow { - top: 36px; -} - -.starwarsffg .item-sheet-gear .attribute .block-background { - padding: 5px 5px; -} - -.starwarsffg .item-sheet-gear .attribute .block-title { - line-height: initial; - background-color: #2c0344; - color: white; - font-size: 13px; - text-transform: uppercase; - margin: auto; - --notchSize: 8px; - -webkit-clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); - clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); -} - -.starwarsffg .item-sheet-gear .attribute .block-attribute select:focus { - box-shadow: 0 0 5px #7da9c2; - background-color: #7da9c2; -} - -.starwarsffg .item-sheet-gear .attribute .block-attribute .block-value { - display: inline-block; -} - -.starwarsffg .item-sheet-gear .attribute .block-value textarea { - resize: none; - font-family: 'Roboto'; - border: 0; -} - -.starwarsffg .item-sheet-gear .attribute .block-value textarea:focus { - box-shadow: 0 0 5px #7da9c2; - background-color: #7da9c2; - outline: none; -} - -.starwarsffg .item-sheet-gear .attribute .block-value.block-single input { - width: 100%; - padding: 6px; -} - -.starwarsffg .item-sheet-gear .attribute .block-value input { - border: 0; - font-size: 14px; -} - -.starwarsffg .item-sheet-gear .attribute .block-value input:focus { - box-shadow: 0 0 5px #7da9c2; - background-color: #7da9c2; -} - -.starwarsffg .item-sheet-gear .attribute .shadow-text { - position: absolute; - top: 5px; - font-size: 9px; - left: 50%; - transform: translateX(-50%); -} - -.starwarsffg .item-sheet-gear .attribute .shadow-left { - background-color: #490c0b; - width: 50%; - height: 100%; - float: left; - position: relative; - padding-top: 25px; -} - -.starwarsffg .item-sheet-gear .attribute .shadow-left .shadow-text { - color: white; - text-transform: uppercase; -} - -.starwarsffg .item-sheet-gear .attribute .shadow-right { - background-color: #7da9c2; - width: 50%; - height: 100%; - float: right; - position: relative; - padding-top: 25px; -} - -.starwarsffg .item-sheet-gear .attribute .shadow-right .shadow-text { - color: black; - font-weight: bold; - text-transform: uppercase; -} - -.starwarsffg .item-sheet-gear .resource { - line-height: 30px; - width: 110px; -} - -.starwarsffg .item-sheet-gear .resource.split { - width: 130px; -} - -.starwarsffg .item-sheet-gear .resource.single { - width: 100px; -} - -.starwarsffg .item-sheet-gear .resource.double { - width: 235px; -} - -.starwarsffg .item-sheet-gear .resource input { - width: 45px; -} - -.starwarsffg .item-sheet-gear .tabs { - height: 20px; - border: 0; -} - -.starwarsffg .item-sheet-gear .tabs .item { - line-height: 15px; -} - -.starwarsffg .item-sheet-talent .header-fields { - height: 260px; -} - -.starwarsffg .item-sheet-talent .charname { - width: 100%; -} - -.starwarsffg .item-sheet-talent .charname input { - color: #821517; - border: 0; -} - -.starwarsffg .item-sheet-talent .charname input:focus { - box-shadow: 0 0 5px #7da9c2; - background-color: #7da9c2; -} - -.starwarsffg .item-sheet-talent .characteristic-item { - border: 0; - position: relative; - padding: 0; - margin: 0 5px; -} - -.starwarsffg .item-sheet-talent .characteristic-item .characteristic-label { - margin-top: 5px; - width: 100%; - text-align: center; - background-color: #821517; - color: white; - text-transform: uppercase; - font-size: 10px; - --notchSize: 7px; - -webkit-clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); - clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); -} - -.starwarsffg .item-sheet-talent .characteristic-item .characteristic { - width: 50px; - height: 50px; - border-radius: 10px; - border: 5px double #821517; - margin: auto; - position: relative; -} - -.starwarsffg .item-sheet-talent .characteristic-item .characteristic .characteristic-value input { - height: 40px; - border: 0; - font-size: 30px; - text-align: center; -} - -.starwarsffg .item-sheet-talent .characteristic-item .characteristic .characteristic-value input:focus { - box-shadow: 0 0 5px #7da9c2; - background-color: #7da9c2; - border-radius: 5px; -} - -.starwarsffg .item-sheet-talent .item-name { - margin: 0; - padding-bottom: 0 !important; -} - -.starwarsffg .item-sheet-talent .item-name .charname input { - width: 100%; -} - -.starwarsffg .item-sheet-talent .grid { - margin-top: 0; -} - -.starwarsffg .item-sheet-talent .block-background { - background-color: #f2ebde; -} - -.starwarsffg .item-sheet-talent .attribute { - position: relative; - padding: 0; - z-index: 1; - border: 0; -} - -.starwarsffg .item-sheet-talent .attribute .block-background-shadow { - top: 36px; -} - -.starwarsffg .item-sheet-talent .attribute .block-background { - padding: 5px 5px; -} - -.starwarsffg .item-sheet-talent .attribute .block-title { - line-height: initial; - background-color: #821517; - color: white; - font-size: 13px; - text-transform: uppercase; - margin: auto; - --notchSize: 8px; - -webkit-clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); - clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); -} - -.starwarsffg .item-sheet-talent .attribute .block-attribute select:focus { - box-shadow: 0 0 5px #7da9c2; - background-color: #7da9c2; -} - -.starwarsffg .item-sheet-talent .attribute .block-attribute .block-value { - display: inline-block; -} - -.starwarsffg .item-sheet-talent .attribute .block-value textarea { - resize: none; - font-family: 'Roboto'; - border: 0; -} - -.starwarsffg .item-sheet-talent .attribute .block-value textarea:focus { - box-shadow: 0 0 5px #7da9c2; - background-color: #7da9c2; - outline: none; -} - -.starwarsffg .item-sheet-talent .attribute .block-value.block-single input { - width: 100%; - padding: 6px; -} - -.starwarsffg .item-sheet-talent .attribute .block-value input { - border: 0; - font-size: 14px; -} - -.starwarsffg .item-sheet-talent .attribute .block-value input:focus { - box-shadow: 0 0 5px #7da9c2; - background-color: #7da9c2; -} - -.starwarsffg .item-sheet-talent .attribute .shadow-text { - position: absolute; - top: 5px; - font-size: 9px; - left: 50%; - transform: translateX(-50%); -} - -.starwarsffg .item-sheet-talent .attribute .shadow-left { - background-color: #490c0b; - width: 50%; - height: 100%; - float: left; - position: relative; - padding-top: 25px; -} - -.starwarsffg .item-sheet-talent .attribute .shadow-left .shadow-text { - color: white; - text-transform: uppercase; -} - -.starwarsffg .item-sheet-talent .attribute .shadow-right { - background-color: #7da9c2; - width: 50%; - height: 100%; - float: right; - position: relative; - padding-top: 25px; -} - -.starwarsffg .item-sheet-talent .attribute .shadow-right .shadow-text { - color: black; - font-weight: bold; - text-transform: uppercase; -} - -.starwarsffg .item-sheet-talent .resource { - line-height: 30px; - width: 110px; -} - -.starwarsffg .item-sheet-talent .resource.split { - width: 130px; -} - -.starwarsffg .item-sheet-talent .resource.single { - width: 65px; -} - -.starwarsffg .item-sheet-talent .resource.double { - width: 235px; -} - -.starwarsffg .item-sheet-talent .resource input { - width: 65px; - height: 17px; -} - -.starwarsffg .item-sheet-talent .tabs { - height: 20px; - border: 0; -} - -.starwarsffg .item-sheet-talent .tabs .item { - line-height: 15px; -} +@font-face { + font-family: "Roboto"; + src: url("../fonts/Roboto-Regular.ttf") format("truetype"); +} + +@font-face { + font-family: "StarJedi"; + src: url("../fonts/StarJedi-Regular.ttf") format("truetype"); +} + +@font-face { + font-family: "Signika"; + src: url("../fonts/Signika-Regular.ttf") format("truetype"); +} + +/* Global styles */ +.window-app { + font-family: "Roboto", sans-serif; +} + +.window-app .window-content { + background-color: rgba(255, 255, 255, 0.7); + font-size: 9pt; +} + +.rollable:hover, .rollable:focus { + color: #000; + text-shadow: 0 0 10px red; + cursor: pointer; +} + +.grid, +.grid-2col { + display: grid; + grid-column: span 2 / span 2; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 10px; + margin: 10px 0; + padding: 0; +} + +.grid-3col { + grid-column: span 3 / span 3; + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.grid-4col { + grid-column: span 4 / span 4; + grid-template-columns: repeat(4, minmax(0, 1fr)); +} + +.grid-5col { + grid-column: span 5 / span 5; + grid-template-columns: repeat(5, minmax(0, 1fr)); +} + +.grid-6col { + grid-column: span 6 / span 6; + grid-template-columns: repeat(6, minmax(0, 1fr)); +} + +.grid-7col { + grid-column: span 7 / span 7; + grid-template-columns: repeat(7, minmax(0, 1fr)); +} + +.grid-8col { + grid-column: span 8 / span 8; + grid-template-columns: repeat(8, minmax(0, 1fr)); +} + +.grid-9col { + grid-column: span 9 / span 9; + grid-template-columns: repeat(9, minmax(0, 1fr)); +} + +.grid-10col { + grid-column: span 10 / span 10; + grid-template-columns: repeat(10, minmax(0, 1fr)); +} + +.grid-11col { + grid-column: span 11 / span 11; + grid-template-columns: repeat(11, minmax(0, 1fr)); +} + +.grid-12col { + grid-column: span 12 / span 12; + grid-template-columns: repeat(12, minmax(0, 1fr)); +} + +.flex-group-center, +.flex-group-left, +.flex-group-right { + justify-content: center; + align-items: center; + text-align: center; + padding: 5px; + border: 1px solid #999; +} + +.flex-group-left { + justify-content: flex-start; + text-align: left; +} + +.flex-group-right { + justify-content: flex-end; + text-align: right; +} + +.flex-center { + align-items: center; + justify-content: center; + text-align: center; +} + +.flex-between { + justify-content: space-between; +} + +.starwarsffg .item-form { + font-family: "Roboto", sans-serif; +} + +.starwarsffg .block-background { + background-color: #c4dbe9; + padding: 5px; + --notchSize: 9px; + -webkit-clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); + clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); +} + +.starwarsffg .block-background-shadow { + position: absolute; + width: 100%; + top: 30px; + height: 30px; + background-color: #7da9c2; + padding: 5px; + z-index: -1; + --notchSize: 9px; + -webkit-clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); + clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); +} + +.starwarsffg .character { + min-width: 575px; +} + +.starwarsffg .position-relative { + position: relative; +} + +.starwarsffg.sheet .sheet-body { + border: 0; +} + +.starwarsffg .resource-label { + font-weight: bold; + text-transform: uppercase; +} + +.starwarsffg .character .tabs { + height: 15px; + margin-bottom: 10px; + border: 0; +} + +.starwarsffg .character .tabs .item { + line-height: 15px; +} + +.starwarsffg .minion .tabs { + height: 15px; + margin-bottom: 10px; + border: 0; +} + +.starwarsffg .minion .tabs .item { + line-height: 15px; +} + +.starwarsffg .vehicle .tabs { + height: 15px; + margin-bottom: 10px; + border: 0; +} + +.starwarsffg .vehicle .tabs .item { + line-height: 15px; +} + +.starwarsffg .tabs { + height: 40px; + border-top: 1px solid #aaa; + border-bottom: 1px solid #aaa; +} + +.starwarsffg .tabs .item { + line-height: 15px; + font-weight: bold; + background-color: #51624d; + padding: 3px; + margin: 0 5px; + --notchSize: 10px; + -webkit-clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); + clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); +} + +.starwarsffg .tabs .item:hover { + text-shadow: 0 0 8px white; +} + +.starwarsffg .tabs .item.active { + text-decoration: underline; + text-shadow: none; + background-color: #490c0b; + color: white; + font-weight: normal; +} + +.starwarsffg .header-fields .block-background-shadow { + top: 36px; +} + +.starwarsffg .header-fields .container.flex-group-center { + border: 0; + margin-bottom: 5px; + padding: 0 5px 5px 5px; +} + +.starwarsffg .header-fields h1 { + margin: 0; + width: 100%; +} + +.starwarsffg .header-fields .header-name { + margin: 0; + position: relative; + width: 100%; +} + +.starwarsffg .header-fields .header-name input { + margin: 0; + width: 100%; + border: 0; + background-color: rgba(0, 0, 0, 0); +} + +.starwarsffg .header-fields .header-name input:focus { + box-shadow: 0 0 5px #7da9c2; + background-color: #7da9c2; +} + +.starwarsffg .header-fields .header-description-block { + margin-bottom: 5px; + margin-top: 5px; +} + +.starwarsffg .header-fields .header-description { + background-color: #c4dbe9; + --notchSize: 10px; + padding: 3px; + -webkit-clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); + clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); +} + +.starwarsffg .header-fields .table { + display: table; + width: 100%; +} + +.starwarsffg .header-fields .row { + display: table-row; + width: 100%; +} + +.starwarsffg .header-fields .row div { + display: table-cell; +} + +.starwarsffg .header-fields .row .row-input { + padding: 0 5px; +} + +.starwarsffg .header-fields .row input { + width: 100%; + border: 0; + border-bottom: 1px solid black; + border-radius: 0; +} + +.starwarsffg .header-fields .row input:focus { + box-shadow: 0 0 5px #7da9c2; + background-color: #7da9c2; +} + +.starwarsffg .header-fields .profile-block { + margin-right: 5px; + margin-left: 5px; + height: 140px; + max-width: 140px; +} + +.starwarsffg .header-fields .profile-img { + flex: 0 0 100px; + height: 124px; + width: auto; + max-width: 124px; + border: 0; + margin: auto; +} + +.starwarsffg .header-fields .attribute { + position: relative; + padding: 0; + z-index: 1; + border: 0; +} + +.starwarsffg .header-fields .attribute .block-background { + padding: 5px 5px; +} + +.starwarsffg .header-fields .attribute .block-title { + line-height: initial; + background-color: #490c0b; + color: white; + font-size: 13px; + text-transform: uppercase; + margin: auto; + --notchSize: 8px; + -webkit-clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); + clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); +} + +.starwarsffg .header-fields .attribute .block-attribute .block-value { + display: inline-block; +} + +.starwarsffg .header-fields .attribute .block-value.block-single input { + width: 100%; + padding: 6px; +} + +.starwarsffg .header-fields .attribute .block-value input { + border: 0; + font-size: 14px; +} + +.starwarsffg .header-fields .attribute .block-value input:focus { + box-shadow: 0 0 5px #7da9c2; + background-color: #7da9c2; +} + +.starwarsffg .header-fields .attribute .shadow-text { + position: absolute; + top: 5px; + font-size: 9px; + left: 50%; + transform: translateX(-50%); +} + +.starwarsffg .header-fields .attribute .shadow-left { + background-color: #490c0b; + width: 50%; + height: 100%; + float: left; + position: relative; + padding-top: 25px; +} + +.starwarsffg .header-fields .attribute .shadow-left .shadow-text { + color: white; + text-transform: uppercase; +} + +.starwarsffg .header-fields .attribute .shadow-right { + background-color: #7da9c2; + width: 50%; + height: 100%; + float: right; + position: relative; + padding-top: 25px; +} + +.starwarsffg .header-fields .attribute .shadow-right .shadow-text { + color: black; + font-weight: bold; + text-transform: uppercase; +} + +.starwarsffg .header-fields .resource { + line-height: 30px; + width: 110px; +} + +.starwarsffg .header-fields .resource.split { + width: 130px; +} + +.starwarsffg .header-fields .resource.single { + width: 65px; +} + +.starwarsffg .header-fields .resource input { + width: 45px; +} + +.starwarsffg .sheet-body div.tab.characteristics { + overflow: hidden; +} + +.starwarsffg .sheet-body .characteristics fieldset.skillfilter { + display: none; +} + +.starwarsffg .sheet-body .characteristics .characteristic-item { + border: 0; + position: relative; +} + +.starwarsffg .sheet-body .characteristics .characteristic-item .characteristic-label { + margin-top: 5px; + width: 100%; + text-align: center; + background-color: #490c0b; + color: white; + text-transform: uppercase; + font-size: 10px; + --notchSize: 7px; + -webkit-clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); + clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); +} + +.starwarsffg .sheet-body .characteristics .grid { + margin-top: 0; +} + +.starwarsffg .sheet-body .characteristic { + width: 50px; + height: 50px; + border-radius: 50%; + border: 5px double black; + margin: auto; + position: relative; +} + +.starwarsffg .sheet-body .characteristic .characteristic-value input { + height: 40px; + border: 0; + font-size: 30px; + text-align: center; +} + +.starwarsffg .sheet-body .characteristic .characteristic-value input:focus { + box-shadow: 0 0 5px #7da9c2; + background-color: #7da9c2; + border-radius: 50%; +} + +.starwarsffg .tableWithHeader .tableWithHeader-container { + flex: 1; + margin: 2px; + position: relative; +} + +.starwarsffg .tableWithHeader table th { + text-align: left; + padding: 3px; + border-bottom: 1px solid rgba(0, 0, 0, 0.25); + background-color: #490c0b; + color: white; + font-size: 12px; + font-weight: normal; +} + +.starwarsffg .tableWithHeader table td { + padding: 0 0 0 3px; +} + +.starwarsffg .tableWithHeader table td .dice-pool img { + width: 1em; + height: 1em; + border: 0; +} + +.starwarsffg .tableWithHeader table .careerskill-toggle { + margin: 0; + padding: 0; +} + +.starwarsffg .tableWithHeader table .careerskill-rank { + width: 30px; + text-align: center; +} + +.starwarsffg table.items .items-list td.item-controls { + text-align: right; + width: auto; + z-index: auto; +} + +.starwarsffg .items table th { + text-align: left; + padding: 3px; + border-bottom: 1px solid rgba(0, 0, 0, 0.25); + background-color: #490c0b; + color: white; + font-size: 12px; + font-weight: normal; +} + +.starwarsffg .items table td { + padding: 3px; +} + +.starwarsffg .items .attribute { + position: relative; + padding: 0; + z-index: 1; + border: 0; +} + +.starwarsffg .items .attribute .block-background-shadow { + top: 36px; +} + +.starwarsffg .items .attribute .block-background { + padding: 5px 5px; +} + +.starwarsffg .items .attribute .block-title { + line-height: initial; + background-color: #490c0b; + color: white; + font-size: 13px; + text-transform: uppercase; + margin: auto; + --notchSize: 8px; + -webkit-clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); + clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); +} + +.starwarsffg .items .attribute .block-attribute .block-value { + display: inline-block; +} + +.starwarsffg .items .attribute .block-value.block-single input { + width: 100%; + padding: 6px; +} + +.starwarsffg .items .attribute .block-value input { + border: 0; + font-size: 14px; +} + +.starwarsffg .items .attribute .block-value input:focus { + box-shadow: 0 0 5px #7da9c2; + background-color: #7da9c2; +} + +.starwarsffg .items .attribute .shadow-text { + position: absolute; + top: 5px; + font-size: 9px; + left: 50%; + transform: translateX(-50%); +} + +.starwarsffg .items .attribute .shadow-left { + background-color: #490c0b; + width: 50%; + height: 100%; + float: left; + position: relative; + padding-top: 25px; +} + +.starwarsffg .items .attribute .shadow-left .shadow-text { + color: white; + text-transform: uppercase; +} + +.starwarsffg .items .attribute .shadow-right { + background-color: #7da9c2; + width: 50%; + height: 100%; + float: right; + position: relative; + padding-top: 25px; +} + +.starwarsffg .items .attribute .shadow-right .shadow-text { + color: black; + font-weight: bold; + text-transform: uppercase; +} + +.starwarsffg .items .resource { + line-height: 30px; + width: 110px; +} + +.starwarsffg .items .resource.split { + width: 130px; +} + +.starwarsffg .items .resource.single { + width: 65px; +} + +.starwarsffg .items .resource.double { + width: 130px; +} + +.starwarsffg .items .resource input { + width: 45px; +} + +.starwarsffg .items .item-values { + margin-bottom: 5px; + border: 0; +} + +.starwarsffg table.talent-list { + border: 0; +} + +.starwarsffg table.talent-list th { + text-align: left; + padding: 3px; + border-bottom: 1px solid rgba(0, 0, 0, 0.25); + background-color: #490c0b; + color: white; + font-size: 12px; + font-weight: normal; +} + +.starwarsffg table.talent-list td { + height: 30px; + line-height: 24px; + padding: 3px; +} + +.starwarsffg table.talent-list td .item-controls { + text-align: right; + width: auto; + z-index: auto; +} + +.starwarsffg .biography .attribute { + position: relative; + padding: 0; + z-index: 1; + border: 0; +} + +.starwarsffg .biography .attribute .block-background-shadow { + top: 36px; +} + +.starwarsffg .biography .attribute .block-background { + padding: 5px 5px; +} + +.starwarsffg .biography .attribute .block-title { + line-height: initial; + background-color: #490c0b; + color: white; + font-size: 13px; + text-transform: uppercase; + margin: auto; + --notchSize: 8px; + -webkit-clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); + clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); +} + +.starwarsffg .biography .attribute .block-attribute .block-value { + display: inline-block; +} + +.starwarsffg .biography .attribute .block-value.block-single input { + width: 100%; + padding: 6px; +} + +.starwarsffg .biography .attribute .block-value input { + border: 0; + font-size: 14px; +} + +.starwarsffg .biography .attribute .block-value input:focus { + box-shadow: 0 0 5px #7da9c2; + background-color: #7da9c2; +} + +.starwarsffg .biography .attribute .shadow-text { + position: absolute; + top: 5px; + font-size: 9px; + left: 50%; + transform: translateX(-50%); +} + +.starwarsffg .biography .attribute .shadow-left { + background-color: #490c0b; + width: 50%; + height: 100%; + float: left; + position: relative; + padding-top: 25px; +} + +.starwarsffg .biography .attribute .shadow-left .shadow-text { + color: white; + text-transform: uppercase; +} + +.starwarsffg .biography .attribute .shadow-right { + background-color: #7da9c2; + width: 50%; + height: 100%; + float: right; + position: relative; + padding-top: 25px; +} + +.starwarsffg .biography .attribute .shadow-right .shadow-text { + color: black; + font-weight: bold; + text-transform: uppercase; +} + +.starwarsffg .biography .resource { + line-height: 30px; + width: 110px; +} + +.starwarsffg .biography .resource.split { + width: 130px; +} + +.starwarsffg .biography .resource.single { + width: 110px; +} + +.starwarsffg .biography .resource.double { + width: 130px; +} + +.starwarsffg .biography .resource input { + width: 45px; +} + +.starwarsffg .biography .biography-values { + margin-bottom: 5px; + border: 0; + position: absolute; + bottom: 10px; + left: 0; + padding: 0; +} + +.starwarsffg .biography .biography-editor { + height: 475px; +} + +.starwarsffg .item-sheet-weapon .header-fields { + height: 435px; +} + +.starwarsffg .item-sheet-weapon .charname { + width: 100%; +} + +.starwarsffg .item-sheet-weapon .charname input { + color: #134103; + border: 0; +} + +.starwarsffg .item-sheet-weapon .charname input:focus { + box-shadow: 0 0 5px #7da9c2; + background-color: #7da9c2; +} + +.starwarsffg .item-sheet-weapon .characteristic-item { + border: 0; + position: relative; + padding: 0; + margin: 0 5px; +} + +.starwarsffg .item-sheet-weapon .characteristic-item .characteristic-label { + margin-top: 5px; + width: 100%; + text-align: center; + background-color: #134103; + color: white; + text-transform: uppercase; + font-size: 10px; + --notchSize: 7px; + -webkit-clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); + clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); +} + +.starwarsffg .item-sheet-weapon .characteristic-item .characteristic { + width: 50px; + height: 50px; + border-radius: 10px; + border: 5px double #124701; + margin: auto; + position: relative; +} + +.starwarsffg .item-sheet-weapon .characteristic-item .characteristic .characteristic-value input { + height: 40px; + border: 0; + font-size: 30px; + text-align: center; +} + +.starwarsffg .item-sheet-weapon .characteristic-item .characteristic .characteristic-value input:focus { + box-shadow: 0 0 5px #7da9c2; + background-color: #7da9c2; + border-radius: 5px; +} + +.starwarsffg .item-sheet-weapon .item-name { + margin: 0; + padding-bottom: 0 !important; +} + +.starwarsffg .item-sheet-weapon .grid { + margin-top: 0; +} + +.starwarsffg .item-sheet-weapon .block-background { + background-color: #bffebf; +} + +.starwarsffg .item-sheet-weapon .attribute { + position: relative; + padding: 0; + z-index: 1; + border: 0; +} + +.starwarsffg .item-sheet-weapon .attribute .block-background-shadow { + top: 36px; +} + +.starwarsffg .item-sheet-weapon .attribute .block-background { + padding: 5px 5px; +} + +.starwarsffg .item-sheet-weapon .attribute .block-title { + line-height: initial; + background-color: #134103; + color: white; + font-size: 13px; + text-transform: uppercase; + margin: auto; + --notchSize: 8px; + -webkit-clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); + clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); +} + +.starwarsffg .item-sheet-weapon .attribute .block-attribute select:focus { + box-shadow: 0 0 5px #7da9c2; + background-color: #7da9c2; +} + +.starwarsffg .item-sheet-weapon .attribute .block-attribute .block-value { + display: inline-block; +} + +.starwarsffg .item-sheet-weapon .attribute .block-value textarea { + resize: none; + font-family: 'Roboto'; + border: 0; +} + +.starwarsffg .item-sheet-weapon .attribute .block-value textarea:focus { + box-shadow: 0 0 5px #7da9c2; + background-color: #7da9c2; + outline: none; +} + +.starwarsffg .item-sheet-weapon .attribute .block-value.block-single input { + width: 100%; + padding: 6px; +} + +.starwarsffg .item-sheet-weapon .attribute .block-value input { + border: 0; + font-size: 14px; +} + +.starwarsffg .item-sheet-weapon .attribute .block-value input:focus { + box-shadow: 0 0 5px #7da9c2; + background-color: #7da9c2; +} + +.starwarsffg .item-sheet-weapon .attribute .shadow-text { + position: absolute; + top: 5px; + font-size: 9px; + left: 50%; + transform: translateX(-50%); +} + +.starwarsffg .item-sheet-weapon .attribute .shadow-left { + background-color: #490c0b; + width: 50%; + height: 100%; + float: left; + position: relative; + padding-top: 25px; +} + +.starwarsffg .item-sheet-weapon .attribute .shadow-left .shadow-text { + color: white; + text-transform: uppercase; +} + +.starwarsffg .item-sheet-weapon .attribute .shadow-right { + background-color: #7da9c2; + width: 50%; + height: 100%; + float: right; + position: relative; + padding-top: 25px; +} + +.starwarsffg .item-sheet-weapon .attribute .shadow-right .shadow-text { + color: black; + font-weight: bold; + text-transform: uppercase; +} + +.starwarsffg .item-sheet-weapon .resource { + line-height: 30px; + width: 110px; +} + +.starwarsffg .item-sheet-weapon .resource.split { + width: 130px; +} + +.starwarsffg .item-sheet-weapon .resource.single { + width: 100px; +} + +.starwarsffg .item-sheet-weapon .resource.double { + width: 235px; +} + +.starwarsffg .item-sheet-weapon .resource input { + width: 45px; +} + +.starwarsffg .item-sheet-weapon .tabs { + height: 20px; + border: 0; +} + +.starwarsffg .item-sheet-weapon .tabs .item { + line-height: 15px; +} + +.starwarsffg .item-sheet-armor .header-fields { + height: 340px; +} + +.starwarsffg .item-sheet-armor .charname { + width: 100%; +} + +.starwarsffg .item-sheet-armor .charname input { + color: #553113; + border: 0; +} + +.starwarsffg .item-sheet-armor .charname input:focus { + box-shadow: 0 0 5px #7da9c2; + background-color: #7da9c2; +} + +.starwarsffg .item-sheet-armor .characteristic-item { + border: 0; + position: relative; + padding: 0; + margin: 0 5px; +} + +.starwarsffg .item-sheet-armor .characteristic-item .characteristic-label { + margin-top: 5px; + width: 100%; + text-align: center; + background-color: #553113; + color: white; + text-transform: uppercase; + font-size: 10px; + --notchSize: 7px; + -webkit-clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); + clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); +} + +.starwarsffg .item-sheet-armor .characteristic-item .characteristic { + width: 50px; + height: 50px; + border-radius: 10px; + border: 5px double #553113; + margin: auto; + position: relative; +} + +.starwarsffg .item-sheet-armor .characteristic-item .characteristic .characteristic-value input { + height: 40px; + border: 0; + font-size: 30px; + text-align: center; +} + +.starwarsffg .item-sheet-armor .characteristic-item .characteristic .characteristic-value input:focus { + box-shadow: 0 0 5px #7da9c2; + background-color: #7da9c2; + border-radius: 5px; +} + +.starwarsffg .item-sheet-armor .item-name { + margin: 0; + padding-bottom: 0 !important; +} + +.starwarsffg .item-sheet-armor .grid { + margin-top: 0; +} + +.starwarsffg .item-sheet-armor .block-background { + background-color: #e9c09e; +} + +.starwarsffg .item-sheet-armor .attribute { + position: relative; + padding: 0; + z-index: 1; + border: 0; +} + +.starwarsffg .item-sheet-armor .attribute .block-background-shadow { + top: 36px; +} + +.starwarsffg .item-sheet-armor .attribute .block-background { + padding: 5px 5px; +} + +.starwarsffg .item-sheet-armor .attribute .block-title { + line-height: initial; + background-color: #553113; + color: white; + font-size: 13px; + text-transform: uppercase; + margin: auto; + --notchSize: 8px; + -webkit-clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); + clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); +} + +.starwarsffg .item-sheet-armor .attribute .block-attribute select:focus { + box-shadow: 0 0 5px #7da9c2; + background-color: #7da9c2; +} + +.starwarsffg .item-sheet-armor .attribute .block-attribute .block-value { + display: inline-block; +} + +.starwarsffg .item-sheet-armor .attribute .block-value textarea { + resize: none; + font-family: 'Roboto'; + border: 0; +} + +.starwarsffg .item-sheet-armor .attribute .block-value textarea:focus { + box-shadow: 0 0 5px #7da9c2; + background-color: #7da9c2; + outline: none; +} + +.starwarsffg .item-sheet-armor .attribute .block-value.block-single input { + width: 100%; + padding: 6px; +} + +.starwarsffg .item-sheet-armor .attribute .block-value input { + border: 0; + font-size: 14px; +} + +.starwarsffg .item-sheet-armor .attribute .block-value input:focus { + box-shadow: 0 0 5px #7da9c2; + background-color: #7da9c2; +} + +.starwarsffg .item-sheet-armor .attribute .shadow-text { + position: absolute; + top: 5px; + font-size: 9px; + left: 50%; + transform: translateX(-50%); +} + +.starwarsffg .item-sheet-armor .attribute .shadow-left { + background-color: #490c0b; + width: 50%; + height: 100%; + float: left; + position: relative; + padding-top: 25px; +} + +.starwarsffg .item-sheet-armor .attribute .shadow-left .shadow-text { + color: white; + text-transform: uppercase; +} + +.starwarsffg .item-sheet-armor .attribute .shadow-right { + background-color: #7da9c2; + width: 50%; + height: 100%; + float: right; + position: relative; + padding-top: 25px; +} + +.starwarsffg .item-sheet-armor .attribute .shadow-right .shadow-text { + color: black; + font-weight: bold; + text-transform: uppercase; +} + +.starwarsffg .item-sheet-armor .resource { + line-height: 30px; + width: 110px; +} + +.starwarsffg .item-sheet-armor .resource.split { + width: 130px; +} + +.starwarsffg .item-sheet-armor .resource.single { + width: 100px; +} + +.starwarsffg .item-sheet-armor .resource.double { + width: 235px; +} + +.starwarsffg .item-sheet-armor .resource input { + width: 45px; +} + +.starwarsffg .item-sheet-armor .tabs { + height: 20px; + border: 0; +} + +.starwarsffg .item-sheet-armor .tabs .item { + line-height: 15px; +} + +.starwarsffg .item-sheet-gear .header-fields { + height: 340px; +} + +.starwarsffg .item-sheet-gear .charname { + width: 100%; +} + +.starwarsffg .item-sheet-gear .charname input { + color: #2c0344; + border: 0; +} + +.starwarsffg .item-sheet-gear .charname input:focus { + box-shadow: 0 0 5px #7da9c2; + background-color: #7da9c2; +} + +.starwarsffg .item-sheet-gear .characteristic-item { + border: 0; + position: relative; + padding: 0; + margin: 0 5px; +} + +.starwarsffg .item-sheet-gear .characteristic-item .characteristic-label { + margin-top: 5px; + width: 100%; + text-align: center; + background-color: #2c0344; + color: white; + text-transform: uppercase; + font-size: 10px; + --notchSize: 7px; + -webkit-clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); + clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); +} + +.starwarsffg .item-sheet-gear .characteristic-item .characteristic { + width: 50px; + height: 50px; + border-radius: 10px; + border: 5px double #2c0344; + margin: auto; + position: relative; +} + +.starwarsffg .item-sheet-gear .characteristic-item .characteristic .characteristic-value input { + height: 40px; + border: 0; + font-size: 30px; + text-align: center; +} + +.starwarsffg .item-sheet-gear .characteristic-item .characteristic .characteristic-value input:focus { + box-shadow: 0 0 5px #7da9c2; + background-color: #7da9c2; + border-radius: 5px; +} + +.starwarsffg .item-sheet-gear .item-name { + margin: 0; + padding-bottom: 0 !important; +} + +.starwarsffg .item-sheet-gear .grid { + margin-top: 0; +} + +.starwarsffg .item-sheet-gear .block-background { + background-color: #e9c6fd; +} + +.starwarsffg .item-sheet-gear .attribute { + position: relative; + padding: 0; + z-index: 1; + border: 0; +} + +.starwarsffg .item-sheet-gear .attribute .block-background-shadow { + top: 36px; +} + +.starwarsffg .item-sheet-gear .attribute .block-background { + padding: 5px 5px; +} + +.starwarsffg .item-sheet-gear .attribute .block-title { + line-height: initial; + background-color: #2c0344; + color: white; + font-size: 13px; + text-transform: uppercase; + margin: auto; + --notchSize: 8px; + -webkit-clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); + clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); +} + +.starwarsffg .item-sheet-gear .attribute .block-attribute select:focus { + box-shadow: 0 0 5px #7da9c2; + background-color: #7da9c2; +} + +.starwarsffg .item-sheet-gear .attribute .block-attribute .block-value { + display: inline-block; +} + +.starwarsffg .item-sheet-gear .attribute .block-value textarea { + resize: none; + font-family: 'Roboto'; + border: 0; +} + +.starwarsffg .item-sheet-gear .attribute .block-value textarea:focus { + box-shadow: 0 0 5px #7da9c2; + background-color: #7da9c2; + outline: none; +} + +.starwarsffg .item-sheet-gear .attribute .block-value.block-single input { + width: 100%; + padding: 6px; +} + +.starwarsffg .item-sheet-gear .attribute .block-value input { + border: 0; + font-size: 14px; +} + +.starwarsffg .item-sheet-gear .attribute .block-value input:focus { + box-shadow: 0 0 5px #7da9c2; + background-color: #7da9c2; +} + +.starwarsffg .item-sheet-gear .attribute .shadow-text { + position: absolute; + top: 5px; + font-size: 9px; + left: 50%; + transform: translateX(-50%); +} + +.starwarsffg .item-sheet-gear .attribute .shadow-left { + background-color: #490c0b; + width: 50%; + height: 100%; + float: left; + position: relative; + padding-top: 25px; +} + +.starwarsffg .item-sheet-gear .attribute .shadow-left .shadow-text { + color: white; + text-transform: uppercase; +} + +.starwarsffg .item-sheet-gear .attribute .shadow-right { + background-color: #7da9c2; + width: 50%; + height: 100%; + float: right; + position: relative; + padding-top: 25px; +} + +.starwarsffg .item-sheet-gear .attribute .shadow-right .shadow-text { + color: black; + font-weight: bold; + text-transform: uppercase; +} + +.starwarsffg .item-sheet-gear .resource { + line-height: 30px; + width: 110px; +} + +.starwarsffg .item-sheet-gear .resource.split { + width: 130px; +} + +.starwarsffg .item-sheet-gear .resource.single { + width: 100px; +} + +.starwarsffg .item-sheet-gear .resource.double { + width: 235px; +} + +.starwarsffg .item-sheet-gear .resource input { + width: 45px; +} + +.starwarsffg .item-sheet-gear .tabs { + height: 20px; + border: 0; +} + +.starwarsffg .item-sheet-gear .tabs .item { + line-height: 15px; +} + +.starwarsffg .item-sheet-talent .header-fields { + height: 260px; +} + +.starwarsffg .item-sheet-talent .charname { + width: 100%; +} + +.starwarsffg .item-sheet-talent .charname input { + color: #821517; + border: 0; +} + +.starwarsffg .item-sheet-talent .charname input:focus { + box-shadow: 0 0 5px #7da9c2; + background-color: #7da9c2; +} + +.starwarsffg .item-sheet-talent .characteristic-item { + border: 0; + position: relative; + padding: 0; + margin: 0 5px; +} + +.starwarsffg .item-sheet-talent .characteristic-item .characteristic-label { + margin-top: 5px; + width: 100%; + text-align: center; + background-color: #821517; + color: white; + text-transform: uppercase; + font-size: 10px; + --notchSize: 7px; + -webkit-clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); + clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); +} + +.starwarsffg .item-sheet-talent .characteristic-item .characteristic { + width: 50px; + height: 50px; + border-radius: 10px; + border: 5px double #821517; + margin: auto; + position: relative; +} + +.starwarsffg .item-sheet-talent .characteristic-item .characteristic .characteristic-value input { + height: 40px; + border: 0; + font-size: 30px; + text-align: center; +} + +.starwarsffg .item-sheet-talent .characteristic-item .characteristic .characteristic-value input:focus { + box-shadow: 0 0 5px #7da9c2; + background-color: #7da9c2; + border-radius: 5px; +} + +.starwarsffg .item-sheet-talent .item-name { + margin: 0; + padding-bottom: 0 !important; +} + +.starwarsffg .item-sheet-talent .item-name .charname input { + width: 100%; +} + +.starwarsffg .item-sheet-talent .grid { + margin-top: 0; +} + +.starwarsffg .item-sheet-talent .block-background { + background-color: #f2ebde; +} + +.starwarsffg .item-sheet-talent .attribute { + position: relative; + padding: 0; + z-index: 1; + border: 0; +} + +.starwarsffg .item-sheet-talent .attribute .block-background-shadow { + top: 36px; +} + +.starwarsffg .item-sheet-talent .attribute .block-background { + padding: 5px 5px; +} + +.starwarsffg .item-sheet-talent .attribute .block-title { + line-height: initial; + background-color: #821517; + color: white; + font-size: 13px; + text-transform: uppercase; + margin: auto; + --notchSize: 8px; + -webkit-clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); + clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); +} + +.starwarsffg .item-sheet-talent .attribute .block-attribute select:focus { + box-shadow: 0 0 5px #7da9c2; + background-color: #7da9c2; +} + +.starwarsffg .item-sheet-talent .attribute .block-attribute .block-value { + display: inline-block; +} + +.starwarsffg .item-sheet-talent .attribute .block-value textarea { + resize: none; + font-family: 'Roboto'; + border: 0; +} + +.starwarsffg .item-sheet-talent .attribute .block-value textarea:focus { + box-shadow: 0 0 5px #7da9c2; + background-color: #7da9c2; + outline: none; +} + +.starwarsffg .item-sheet-talent .attribute .block-value.block-single input { + width: 100%; + padding: 6px; +} + +.starwarsffg .item-sheet-talent .attribute .block-value input { + border: 0; + font-size: 14px; +} + +.starwarsffg .item-sheet-talent .attribute .block-value input:focus { + box-shadow: 0 0 5px #7da9c2; + background-color: #7da9c2; +} + +.starwarsffg .item-sheet-talent .attribute .shadow-text { + position: absolute; + top: 5px; + font-size: 9px; + left: 50%; + transform: translateX(-50%); +} + +.starwarsffg .item-sheet-talent .attribute .shadow-left { + background-color: #490c0b; + width: 50%; + height: 100%; + float: left; + position: relative; + padding-top: 25px; +} + +.starwarsffg .item-sheet-talent .attribute .shadow-left .shadow-text { + color: white; + text-transform: uppercase; +} + +.starwarsffg .item-sheet-talent .attribute .shadow-right { + background-color: #7da9c2; + width: 50%; + height: 100%; + float: right; + position: relative; + padding-top: 25px; +} + +.starwarsffg .item-sheet-talent .attribute .shadow-right .shadow-text { + color: black; + font-weight: bold; + text-transform: uppercase; +} + +.starwarsffg .item-sheet-talent .resource { + line-height: 30px; + width: 110px; +} + +.starwarsffg .item-sheet-talent .resource.split { + width: 130px; +} + +.starwarsffg .item-sheet-talent .resource.single { + width: 65px; +} + +.starwarsffg .item-sheet-talent .resource.double { + width: 235px; +} + +.starwarsffg .item-sheet-talent .resource input { + width: 65px; + height: 17px; +} + +.starwarsffg .item-sheet-talent .tabs { + height: 20px; + border: 0; +} + +.starwarsffg .item-sheet-talent .tabs .item { + line-height: 15px; +} diff --git a/system.json b/system.json index f5211271..ed42bcb3 100644 --- a/system.json +++ b/system.json @@ -1,38 +1,38 @@ -{ - "name": "starwarsffg", - "title": "Star Wars FFG", - "description": "A system for playing Star Wars FFG games.", - "version": 0.055, - "minimumCoreVersion": "0.5.6", - "compatibleCoreVersion": "0.6.1", - "templateVersion": 1, - "author": "Esrin", - "esmodules": ["modules/dice-pool-ffg.js", "modules/swffg-main.js"], - "styles": ["styles/swffg.css", "styles/starwarsffg.css"], - "packs": [ - { - "name": "rollabletables", - "label": "Star Wars FFG: Rollable Tables", - "system": "starwarsffg", - "module": "starwarsffg", - "path": "packs/star-wars-ffg-rollable-tables.db", - "entity": "RollTable", - "tag": "rolltable" - } - ], - "languages": [ - { - "lang": "en", - "name": "English", - "path": "lang/en.json" - } - ], - "gridDistance": 5, - "gridUnits": "ft", - "primaryTokenAttribute": "wounds", - "secondaryTokenAttribute": "strain", - "url": "https://github.com/Esrin/StarWarsFFG/tree/esrin-dev", - "manifest": "https://raw.githubusercontent.com/Esrin/StarWarsFFG/esrin-dev/system.json", - "download": "https://github.com/Esrin/StarWarsFFG/releases/download/esrin-dev_0.05/esrin-dev_0.055.zip", - "license": "LICENSE.txt" -} +{ + "name": "starwarsffg", + "title": "Star Wars FFG", + "description": "A system for playing Star Wars FFG games.", + "version": 0.06, + "minimumCoreVersion": "0.5.6", + "compatibleCoreVersion": "0.6.1", + "templateVersion": 1, + "author": "Esrin and Jaxxa", + "esmodules": ["modules/dice-pool-ffg.js", "modules/swffg-main.js"], + "styles": ["styles/swffg.css", "styles/starwarsffg.css"], + "packs": [ + { + "name": "rollabletables", + "label": "Star Wars FFG: Rollable Tables", + "system": "starwarsffg", + "module": "starwarsffg", + "path": "packs/star-wars-ffg-rollable-tables.db", + "entity": "RollTable", + "tag": "rolltable" + } + ], + "languages": [ + { + "lang": "en", + "name": "English", + "path": "lang/en.json" + } + ], + "gridDistance": 5, + "gridUnits": "ft", + "primaryTokenAttribute": "wounds", + "secondaryTokenAttribute": "strain", + "url": "https://github.com/Esrin/StarWarsFFG/tree/esrin-dev", + "manifest": "https://raw.githubusercontent.com/Esrin/StarWarsFFG/esrin-dev/system.json", + "download": "https://github.com/Esrin/StarWarsFFG/releases/download/esrin-dev_0.06/esrin-dev_0.060.zip", + "license": "LICENSE.txt" +} diff --git a/template.json b/template.json index dc5def41..efb7cd18 100644 --- a/template.json +++ b/template.json @@ -1,698 +1,698 @@ -{ - "Actor": { - "types": ["character", "minion", "vehicle"], - "templates": { - "biography": { - "biography": "" - }, - "species": { - "species": { - "value": "", - "type": "String" - } - }, - "career": { - "career": { - "value": "", - "type": "String" - } - }, - "specialisation": { - "specialisation": { - "value": "", - "type": "String" - } - }, - "stats": { - "stats": { - "wounds": { - "value": 0, - "min": 0, - "max": 10 - }, - "strain": { - "value": 0, - "min": 0, - "max": 10 - }, - "soak": { - "value": 2 - }, - "defence": { - "ranged": 0, - "melee": 0 - }, - "encumbrance": { - "value": 0, - "max": 0 - }, - "forcePool": { - "value": 0, - "max": 0 - }, - "credits": { - "value": 0, - "type": "Number", - "label": "Credits" - } - } - }, - "characteristics": { - "characteristics": { - "Brawn": { - "value": 2, - "label": "Brawn", - "abrev": "Br", - "max": 7 - }, - "Agility": { - "value": 2, - "label": "Agility", - "abrev": "Ag", - "max": 7 - }, - "Intellect": { - "value": 2, - "label": "Intellect", - "abrev": "Int", - "max": 7 - }, - "Cunning": { - "value": 2, - "label": "Cunning", - "abrev": "Cun", - "max": 7 - }, - "Willpower": { - "value": 2, - "label": "Willpower", - "abrev": "Will", - "max": 7 - }, - "Presence": { - "value": 2, - "label": "Presence", - "abrev": "Pr", - "max": 7 - } - } - }, - "skills": { - "skills": { - "Brawl": { - "rank": 0, - "characteristic": "Brawn", - "groupskill": false, - "careerskill": false, - "type": "Combat", - "max": 6 - }, - "Gunnery": { - "rank": 0, - "characteristic": "Agility", - "groupskill": false, - "careerskill": false, - "type": "Combat", - "max": 6 - }, - "Lightsaber": { - "rank": 0, - "characteristic": "Brawn", - "groupskill": false, - "careerskill": false, - "type": "Combat", - "max": 6 - }, - "Melee": { - "rank": 0, - "characteristic": "Brawn", - "groupskill": false, - "careerskill": false, - "type": "Combat", - "max": 6 - }, - "Ranged: Light": { - "rank": 0, - "characteristic": "Agility", - "groupskill": false, - "careerskill": false, - "type": "Combat", - "max": 6 - }, - "Ranged: Heavy": { - "rank": 0, - "characteristic": "Agility", - "groupskill": false, - "careerskill": false, - "type": "Combat", - "max": 6 - }, - "Astrogation": { - "rank": 0, - "characteristic": "Intellect", - "groupskill": false, - "careerskill": false, - "type": "General", - "max": 6 - }, - "Athletics ": { - "rank": 0, - "characteristic": "Brawn", - "groupskill": false, - "careerskill": false, - "type": "General", - "max": 6 - }, - "Charm": { - "rank": 0, - "characteristic": "Presence", - "groupskill": false, - "careerskill": false, - "type": "General", - "max": 6 - }, - "Coercion": { - "rank": 0, - "characteristic": "Willpower", - "groupskill": false, - "careerskill": false, - "type": "General", - "max": 6 - }, - "Computers": { - "rank": 0, - "characteristic": "Intellect", - "groupskill": false, - "careerskill": false, - "type": "General", - "max": 6 - }, - "Cool": { - "rank": 0, - "characteristic": "Presence", - "groupskill": false, - "careerskill": false, - "type": "General", - "max": 6 - }, - "Coordination": { - "rank": 0, - "characteristic": "Agility", - "groupskill": false, - "careerskill": false, - "type": "General", - "max": 6 - }, - "Deception": { - "rank": 0, - "characteristic": "Cunning", - "groupskill": false, - "careerskill": false, - "type": "General", - "max": 6 - }, - "Discipline": { - "rank": 0, - "characteristic": "Willpower", - "groupskill": false, - "careerskill": false, - "type": "General", - "max": 6 - }, - "Leadership": { - "rank": 0, - "characteristic": "Presence", - "groupskill": false, - "careerskill": false, - "type": "General", - "max": 6 - }, - "Mechanics": { - "rank": 0, - "characteristic": "Intellect", - "groupskill": false, - "careerskill": false, - "type": "General", - "max": 6 - }, - "Medicine": { - "rank": 0, - "characteristic": "Intellect", - "groupskill": false, - "careerskill": false, - "type": "General", - "max": 6 - }, - "Negotiation": { - "rank": 0, - "characteristic": "Presence", - "groupskill": false, - "careerskill": false, - "type": "General", - "max": 6 - }, - "Perception": { - "rank": 0, - "characteristic": "Cunning", - "groupskill": false, - "careerskill": false, - "type": "General", - "max": 6 - }, - "Piloting: Planetary": { - "rank": 0, - "characteristic": "Agility", - "groupskill": false, - "careerskill": false, - "type": "General", - "max": 6 - }, - "Piloting: Space": { - "rank": 0, - "characteristic": "Agility", - "groupskill": false, - "careerskill": false, - "type": "General", - "max": 6 - }, - "Resilience": { - "rank": 0, - "characteristic": "Brawn", - "groupskill": false, - "careerskill": false, - "type": "General", - "max": 6 - }, - "Skulduggery": { - "rank": 0, - "characteristic": "Cunning", - "groupskill": false, - "careerskill": false, - "type": "General", - "max": 6 - }, - "Stealth": { - "rank": 0, - "characteristic": "Agility", - "groupskill": false, - "careerskill": false, - "type": "General", - "max": 6 - }, - "Streetwise": { - "rank": 0, - "characteristic": "Cunning", - "groupskill": false, - "careerskill": false, - "type": "General", - "max": 6 - }, - "Survival": { - "rank": 0, - "characteristic": "Cunning", - "groupskill": false, - "careerskill": false, - "type": "General", - "max": 6 - }, - "Vigilance": { - "rank": 0, - "characteristic": "Willpower", - "groupskill": false, - "careerskill": false, - "type": "General", - "max": 6 - }, - "Knowledge: Core Worlds": { - "rank": 0, - "characteristic": "Intellect", - "groupskill": false, - "careerskill": false, - "type": "Knowledge", - "max": 6 - }, - "Knowledge: Education": { - "rank": 0, - "characteristic": "Intellect", - "groupskill": false, - "careerskill": false, - "type": "Knowledge", - "max": 6 - }, - "Knowledge: Lore": { - "rank": 0, - "characteristic": "Intellect", - "groupskill": false, - "careerskill": false, - "type": "Knowledge", - "max": 6 - }, - "Knowledge: Outer Rim": { - "rank": 0, - "characteristic": "Intellect", - "groupskill": false, - "careerskill": false, - "type": "Knowledge", - "max": 6 - }, - "Knowledge: Underworld": { - "rank": 0, - "characteristic": "Intellect", - "groupskill": false, - "careerskill": false, - "type": "Knowledge", - "max": 6 - }, - "Knowledge: Warfare": { - "rank": 0, - "characteristic": "Intellect", - "groupskill": false, - "careerskill": false, - "type": "Knowledge", - "max": 6 - }, - "Knowledge: Xenology": { - "rank": 0, - "characteristic": "Intellect", - "groupskill": false, - "careerskill": false, - "type": "Knowledge", - "max": 6 - } - } - }, - "attributes": { - "attributes": {} - }, - "modifiers": { - "modifiers": { - "Characteristic": {}, - "Skill Rank": {}, - "Stat": {} - } - } - }, - "character": { - "templates": ["biography", "species", "career", "specialisation", "stats", "characteristics", "skills", "attributes", "modifiers"], - "encumbrance": { - "value": 0, - "type": "Number", - "label": "Encumbrance", - "abrev": "Encum" - }, - "obligation": { - "value": 0, - "type": "Number", - "label": "Obligation" - }, - "duty": { - "value": 0, - "type": "Number", - "label": "Duty" - }, - "morality": { - "value": 0, - "type": "Number", - "label": "Morality" - }, - "conflict": { - "value": 0, - "type": "Number", - "label": "Conflict" - }, - "experience": { - "total": 0, - "available": 0 - } - }, - "minion": { - "templates": ["biography", "stats", "characteristics", "skills", "attributes", "modifiers"], - "quantity": { - "value": 1, - "type": "Number", - "label": "Quantity", - "abrev": "Qty" - }, - "unit_wounds": { - "value": 0, - "type": "Number", - "label": "Unit Wounds" - } - }, - "vehicle": { - "templates": ["biography", "attributes"], - "stats": { - "silhouette": { - "value": 1, - "type": "Number", - "label": "Silhouette" - }, - "speed": { - "value": 0, - "max": 0, - "type": "Number", - "label": "Speed" - }, - "handling": { - "value": 0, - "type": "Number", - "label": "Handling" - }, - "hullTrauma": { - "value": 0, - "min": 0, - "max": 10, - "label": "Hull Trauma" - }, - "systemStrain": { - "value": 0, - "min": 0, - "max": 10, - "label": "System Strain" - }, - "shields": { - "fore": 0, - "port": 0, - "starboard": 0, - "aft": 0, - "label": "Shields" - }, - "armour": { - "value": 0, - "type": "Number", - "label": "Armour" - }, - "sensorRange": { - "value": "Short", - "type": "String" - }, - "crew": {}, - "passengerCapacity": { - "value": 0, - "type": "Number", - "label": "Passenger Capacity" - }, - "encumbrance": { - "value": 0, - "min": 0, - "max": 10 - }, - "cost": { - "value": 0, - "type": "Number", - "label": "Cost" - }, - "rarity": { - "value": 0, - "type": "Number", - "label": "Rarity" - }, - "customizationHardPoints": { - "value": 0, - "type": "Number", - "label": "Hard Points" - } - } - } - }, - "Item": { - "types": ["gear", "weapon", "armour", "talent", "shipweapon", "shipattachment"], - "templates": { - "basic": { - "description": "", - "quantity": { - "value": 1, - "type": "Number", - "label": "Quantity", - "abrev": "Qty" - }, - "encumbrance": { - "value": 0, - "type": "Number", - "label": "Encumbrance", - "abrev": "Encum" - }, - "price": { - "value": 0, - "type": "Number", - "label": "Price" - }, - "rarity": { - "value": 0, - "type": "Number", - "label": "Rarity" - }, - "attributes": {} - }, - "hardpoints": { - "hardpoints": { - "value": 0, - "type": "Number", - "label": "Hard Points", - "abrev": "HP" - } - }, - "equippable": { - "equippable": { - "value": true, - "type": "Boolean", - "equipped": false - } - } - }, - "gear": { - "templates": ["basic"] - }, - "weapon": { - "templates": ["basic", "hardpoints", "equippable"], - "skill": { - "value": "Ranged: Light", - "type": "String", - "label": "Skill" - }, - "damage": { - "value": 0, - "type": "Number", - "label": "Damage", - "abrev": "Dam" - }, - "crit": { - "value": 0, - "type": "Number", - "label": "Critical Rating", - "abrev": "Crit" - }, - "range": { - "value": "Short", - "type": "String", - "label": "Range" - }, - "special": { - "value": "", - "type": "String", - "label": "Special" - } - }, - "armour": { - "templates": ["basic", "hardpoints", "equippable"], - "defence": { - "value": 0, - "type": "Number", - "label": "Defence", - "abrev": "Def" - }, - "soak": { - "value": 0, - "type": "Number", - "label": "Soak" - } - }, - "talent": { - "templates": ["basic"], - "description": "", - "activation": { - "value": "Passive", - "type": "String", - "label": "Activation" - }, - "ranks": { - "ranked": false, - "current": 1, - "min": 0 - }, - "trees": [], - "attributes": {} - }, - "shipweapon": { - "templates": ["basic", "hardpoints", "equippable"], - "label": "Ship Weapon", - "firingarc": { - "value": "Fore", - "type": "String", - "label": "Skill" - }, - "damage": { - "value": 0, - "type": "Number", - "label": "Damage", - "abrev": "Dam" - }, - "crit": { - "value": 0, - "type": "Number", - "label": "Critical Rating", - "abrev": "Crit" - }, - "range": { - "value": "Short", - "type": "String", - "label": "Range" - }, - "special": { - "value": "", - "type": "String", - "label": "Special" - } - }, - "shipattachment": { - "templates": ["basic", "hardpoints", "equippable"], - "label": "Ship Attachment" - }, - "species": { - "description": "", - "careerskills": [], - "characteristics": { - "Brawn": { - "value": 2, - "label": "Brawn", - "abrev": "Br" - }, - "Agility": { - "value": 2, - "label": "Agility", - "abrev": "Ag" - }, - "Intellect": { - "value": 2, - "label": "Intellect", - "abrev": "Int" - }, - "Cunning": { - "value": 2, - "label": "Cunning", - "abrev": "Cun" - }, - "Willpower": { - "value": 2, - "label": "Willpower", - "abrev": "Will" - }, - "Presence": { - "value": 2, - "label": "Presence", - "abrev": "Pr" - } - } - } - } -} +{ + "Actor": { + "types": ["character", "minion", "vehicle"], + "templates": { + "biography": { + "biography": "" + }, + "species": { + "species": { + "value": "", + "type": "String" + } + }, + "career": { + "career": { + "value": "", + "type": "String" + } + }, + "specialisation": { + "specialisation": { + "value": "", + "type": "String" + } + }, + "stats": { + "stats": { + "wounds": { + "value": 0, + "min": 0, + "max": 10 + }, + "strain": { + "value": 0, + "min": 0, + "max": 10 + }, + "soak": { + "value": 2 + }, + "defence": { + "ranged": 0, + "melee": 0 + }, + "encumbrance": { + "value": 0, + "max": 0 + }, + "forcePool": { + "value": 0, + "max": 0 + }, + "credits": { + "value": 0, + "type": "Number", + "label": "Credits" + } + } + }, + "characteristics": { + "characteristics": { + "Brawn": { + "value": 2, + "label": "Brawn", + "abrev": "Br", + "max": 7 + }, + "Agility": { + "value": 2, + "label": "Agility", + "abrev": "Ag", + "max": 7 + }, + "Intellect": { + "value": 2, + "label": "Intellect", + "abrev": "Int", + "max": 7 + }, + "Cunning": { + "value": 2, + "label": "Cunning", + "abrev": "Cun", + "max": 7 + }, + "Willpower": { + "value": 2, + "label": "Willpower", + "abrev": "Will", + "max": 7 + }, + "Presence": { + "value": 2, + "label": "Presence", + "abrev": "Pr", + "max": 7 + } + } + }, + "skills": { + "skills": { + "Brawl": { + "rank": 0, + "characteristic": "Brawn", + "groupskill": false, + "careerskill": false, + "type": "Combat", + "max": 6 + }, + "Gunnery": { + "rank": 0, + "characteristic": "Agility", + "groupskill": false, + "careerskill": false, + "type": "Combat", + "max": 6 + }, + "Lightsaber": { + "rank": 0, + "characteristic": "Brawn", + "groupskill": false, + "careerskill": false, + "type": "Combat", + "max": 6 + }, + "Melee": { + "rank": 0, + "characteristic": "Brawn", + "groupskill": false, + "careerskill": false, + "type": "Combat", + "max": 6 + }, + "Ranged: Light": { + "rank": 0, + "characteristic": "Agility", + "groupskill": false, + "careerskill": false, + "type": "Combat", + "max": 6 + }, + "Ranged: Heavy": { + "rank": 0, + "characteristic": "Agility", + "groupskill": false, + "careerskill": false, + "type": "Combat", + "max": 6 + }, + "Astrogation": { + "rank": 0, + "characteristic": "Intellect", + "groupskill": false, + "careerskill": false, + "type": "General", + "max": 6 + }, + "Athletics ": { + "rank": 0, + "characteristic": "Brawn", + "groupskill": false, + "careerskill": false, + "type": "General", + "max": 6 + }, + "Charm": { + "rank": 0, + "characteristic": "Presence", + "groupskill": false, + "careerskill": false, + "type": "General", + "max": 6 + }, + "Coercion": { + "rank": 0, + "characteristic": "Willpower", + "groupskill": false, + "careerskill": false, + "type": "General", + "max": 6 + }, + "Computers": { + "rank": 0, + "characteristic": "Intellect", + "groupskill": false, + "careerskill": false, + "type": "General", + "max": 6 + }, + "Cool": { + "rank": 0, + "characteristic": "Presence", + "groupskill": false, + "careerskill": false, + "type": "General", + "max": 6 + }, + "Coordination": { + "rank": 0, + "characteristic": "Agility", + "groupskill": false, + "careerskill": false, + "type": "General", + "max": 6 + }, + "Deception": { + "rank": 0, + "characteristic": "Cunning", + "groupskill": false, + "careerskill": false, + "type": "General", + "max": 6 + }, + "Discipline": { + "rank": 0, + "characteristic": "Willpower", + "groupskill": false, + "careerskill": false, + "type": "General", + "max": 6 + }, + "Leadership": { + "rank": 0, + "characteristic": "Presence", + "groupskill": false, + "careerskill": false, + "type": "General", + "max": 6 + }, + "Mechanics": { + "rank": 0, + "characteristic": "Intellect", + "groupskill": false, + "careerskill": false, + "type": "General", + "max": 6 + }, + "Medicine": { + "rank": 0, + "characteristic": "Intellect", + "groupskill": false, + "careerskill": false, + "type": "General", + "max": 6 + }, + "Negotiation": { + "rank": 0, + "characteristic": "Presence", + "groupskill": false, + "careerskill": false, + "type": "General", + "max": 6 + }, + "Perception": { + "rank": 0, + "characteristic": "Cunning", + "groupskill": false, + "careerskill": false, + "type": "General", + "max": 6 + }, + "Piloting: Planetary": { + "rank": 0, + "characteristic": "Agility", + "groupskill": false, + "careerskill": false, + "type": "General", + "max": 6 + }, + "Piloting: Space": { + "rank": 0, + "characteristic": "Agility", + "groupskill": false, + "careerskill": false, + "type": "General", + "max": 6 + }, + "Resilience": { + "rank": 0, + "characteristic": "Brawn", + "groupskill": false, + "careerskill": false, + "type": "General", + "max": 6 + }, + "Skulduggery": { + "rank": 0, + "characteristic": "Cunning", + "groupskill": false, + "careerskill": false, + "type": "General", + "max": 6 + }, + "Stealth": { + "rank": 0, + "characteristic": "Agility", + "groupskill": false, + "careerskill": false, + "type": "General", + "max": 6 + }, + "Streetwise": { + "rank": 0, + "characteristic": "Cunning", + "groupskill": false, + "careerskill": false, + "type": "General", + "max": 6 + }, + "Survival": { + "rank": 0, + "characteristic": "Cunning", + "groupskill": false, + "careerskill": false, + "type": "General", + "max": 6 + }, + "Vigilance": { + "rank": 0, + "characteristic": "Willpower", + "groupskill": false, + "careerskill": false, + "type": "General", + "max": 6 + }, + "Knowledge: Core Worlds": { + "rank": 0, + "characteristic": "Intellect", + "groupskill": false, + "careerskill": false, + "type": "Knowledge", + "max": 6 + }, + "Knowledge: Education": { + "rank": 0, + "characteristic": "Intellect", + "groupskill": false, + "careerskill": false, + "type": "Knowledge", + "max": 6 + }, + "Knowledge: Lore": { + "rank": 0, + "characteristic": "Intellect", + "groupskill": false, + "careerskill": false, + "type": "Knowledge", + "max": 6 + }, + "Knowledge: Outer Rim": { + "rank": 0, + "characteristic": "Intellect", + "groupskill": false, + "careerskill": false, + "type": "Knowledge", + "max": 6 + }, + "Knowledge: Underworld": { + "rank": 0, + "characteristic": "Intellect", + "groupskill": false, + "careerskill": false, + "type": "Knowledge", + "max": 6 + }, + "Knowledge: Warfare": { + "rank": 0, + "characteristic": "Intellect", + "groupskill": false, + "careerskill": false, + "type": "Knowledge", + "max": 6 + }, + "Knowledge: Xenology": { + "rank": 0, + "characteristic": "Intellect", + "groupskill": false, + "careerskill": false, + "type": "Knowledge", + "max": 6 + } + } + }, + "attributes": { + "attributes": {} + }, + "modifiers": { + "modifiers": { + "Characteristic": {}, + "Skill Rank": {}, + "Stat": {} + } + } + }, + "character": { + "templates": ["biography", "species", "career", "specialisation", "stats", "characteristics", "skills", "attributes", "modifiers"], + "encumbrance": { + "value": 0, + "type": "Number", + "label": "Encumbrance", + "abrev": "Encum" + }, + "obligation": { + "value": 0, + "type": "Number", + "label": "Obligation" + }, + "duty": { + "value": 0, + "type": "Number", + "label": "Duty" + }, + "morality": { + "value": 0, + "type": "Number", + "label": "Morality" + }, + "conflict": { + "value": 0, + "type": "Number", + "label": "Conflict" + }, + "experience": { + "total": 0, + "available": 0 + } + }, + "minion": { + "templates": ["biography", "stats", "characteristics", "skills", "attributes", "modifiers"], + "quantity": { + "value": 1, + "type": "Number", + "label": "Quantity", + "abrev": "Qty" + }, + "unit_wounds": { + "value": 0, + "type": "Number", + "label": "Unit Wounds" + } + }, + "vehicle": { + "templates": ["biography", "attributes"], + "stats": { + "silhouette": { + "value": 1, + "type": "Number", + "label": "Silhouette" + }, + "speed": { + "value": 0, + "max": 0, + "type": "Number", + "label": "Speed" + }, + "handling": { + "value": 0, + "type": "Number", + "label": "Handling" + }, + "hullTrauma": { + "value": 0, + "min": 0, + "max": 10, + "label": "Hull Trauma" + }, + "systemStrain": { + "value": 0, + "min": 0, + "max": 10, + "label": "System Strain" + }, + "shields": { + "fore": 0, + "port": 0, + "starboard": 0, + "aft": 0, + "label": "Shields" + }, + "armour": { + "value": 0, + "type": "Number", + "label": "Armour" + }, + "sensorRange": { + "value": "Short", + "type": "String" + }, + "crew": {}, + "passengerCapacity": { + "value": 0, + "type": "Number", + "label": "Passenger Capacity" + }, + "encumbrance": { + "value": 0, + "min": 0, + "max": 10 + }, + "cost": { + "value": 0, + "type": "Number", + "label": "Cost" + }, + "rarity": { + "value": 0, + "type": "Number", + "label": "Rarity" + }, + "customizationHardPoints": { + "value": 0, + "type": "Number", + "label": "Hard Points" + } + } + } + }, + "Item": { + "types": ["gear", "weapon", "armour", "talent", "shipweapon", "shipattachment"], + "templates": { + "basic": { + "description": "", + "quantity": { + "value": 1, + "type": "Number", + "label": "Quantity", + "abrev": "Qty" + }, + "encumbrance": { + "value": 0, + "type": "Number", + "label": "Encumbrance", + "abrev": "Encum" + }, + "price": { + "value": 0, + "type": "Number", + "label": "Price" + }, + "rarity": { + "value": 0, + "type": "Number", + "label": "Rarity" + }, + "attributes": {} + }, + "hardpoints": { + "hardpoints": { + "value": 0, + "type": "Number", + "label": "Hard Points", + "abrev": "HP" + } + }, + "equippable": { + "equippable": { + "value": true, + "type": "Boolean", + "equipped": false + } + } + }, + "gear": { + "templates": ["basic"] + }, + "weapon": { + "templates": ["basic", "hardpoints", "equippable"], + "skill": { + "value": "Ranged: Light", + "type": "String", + "label": "Skill" + }, + "damage": { + "value": 0, + "type": "Number", + "label": "Damage", + "abrev": "Dam" + }, + "crit": { + "value": 0, + "type": "Number", + "label": "Critical Rating", + "abrev": "Crit" + }, + "range": { + "value": "Short", + "type": "String", + "label": "Range" + }, + "special": { + "value": "", + "type": "String", + "label": "Special" + } + }, + "armour": { + "templates": ["basic", "hardpoints", "equippable"], + "defence": { + "value": 0, + "type": "Number", + "label": "Defence", + "abrev": "Def" + }, + "soak": { + "value": 0, + "type": "Number", + "label": "Soak" + } + }, + "talent": { + "templates": ["basic"], + "description": "", + "activation": { + "value": "Passive", + "type": "String", + "label": "Activation" + }, + "ranks": { + "ranked": false, + "current": 1, + "min": 0 + }, + "trees": [], + "attributes": {} + }, + "shipweapon": { + "templates": ["basic", "hardpoints", "equippable"], + "label": "Ship Weapon", + "firingarc": { + "value": "Fore", + "type": "String", + "label": "Skill" + }, + "damage": { + "value": 0, + "type": "Number", + "label": "Damage", + "abrev": "Dam" + }, + "crit": { + "value": 0, + "type": "Number", + "label": "Critical Rating", + "abrev": "Crit" + }, + "range": { + "value": "Short", + "type": "String", + "label": "Range" + }, + "special": { + "value": "", + "type": "String", + "label": "Special" + } + }, + "shipattachment": { + "templates": ["basic", "hardpoints", "equippable"], + "label": "Ship Attachment" + }, + "species": { + "description": "", + "careerskills": [], + "characteristics": { + "Brawn": { + "value": 2, + "label": "Brawn", + "abrev": "Br" + }, + "Agility": { + "value": 2, + "label": "Agility", + "abrev": "Ag" + }, + "Intellect": { + "value": 2, + "label": "Intellect", + "abrev": "Int" + }, + "Cunning": { + "value": 2, + "label": "Cunning", + "abrev": "Cun" + }, + "Willpower": { + "value": 2, + "label": "Willpower", + "abrev": "Will" + }, + "Presence": { + "value": 2, + "label": "Presence", + "abrev": "Pr" + } + } + } + } +} diff --git a/templates/actors/ffg-minion-sheet.html b/templates/actors/ffg-minion-sheet.html index 32b00c67..cc916c30 100644 --- a/templates/actors/ffg-minion-sheet.html +++ b/templates/actors/ffg-minion-sheet.html @@ -1,4 +1,4 @@ -
                    + {{!-- Sheet Header --}}
                    diff --git a/templates/actors/ffg-vehicle-sheet.html b/templates/actors/ffg-vehicle-sheet.html index 58994ffe..c83795db 100644 --- a/templates/actors/ffg-vehicle-sheet.html +++ b/templates/actors/ffg-vehicle-sheet.html @@ -1,4 +1,4 @@ - + {{!-- Sheet Header --}}
                    From 85db39ccb743ddd52cbca50cc0109aab54a32ea8 Mon Sep 17 00:00:00 2001 From: Esrin Date: Tue, 2 Jun 2020 13:00:10 +0100 Subject: [PATCH 42/44] Bringing repos in line. --- README.md | 1 + package-lock.json | 14 +++---- package.json | 2 +- scss/components/_tabs.scss | 49 +++++++++++++++---------- styles/starwarsffg.css | 24 +++++++++++- templates/actors/ffg-minion-sheet.html | 2 +- templates/actors/ffg-vehicle-sheet.html | 2 +- 7 files changed, 63 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index 2e7cade4..d25bb80e 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,7 @@ NICE TO HAVE: - 02/06/2020 - Esrin - Minor bugfix to character sheet, soak value set to disabled for auto-calculation, encumbrance max and current values swapped to correct fields and current set to disabled for auto-calculation. - 02/06/2020 - CStadther - Major sheet restyling +- 02/06/2020 - Jaxxa - Added Icons in the Dice roller, visually indicating the dice types. - 31/05/2020 - Esrin - Work in progress on the group management GM tool. Destiny Pool now working (will reset on page refresh). Player Character list under construction. - 31/05/2020 - Esrin - Bugfix to localisation hook for Gear Quantity on Character Sheet (thanks Alex | HDScurox for the bug report). - 31/05/2020 - CStadther - Added SASS configuration using Gulp. diff --git a/package-lock.json b/package-lock.json index fc4d9b13..d3f7873a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "starwarsffg", - "version": "0.053", + "version": "1.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1709,9 +1709,9 @@ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.3.0.tgz", + "integrity": "sha512-RDVhhDkycLoSQtE9o0vpK/vOccVDsCbWVzRxArGYnlQLcihPl2loFbPyiH7CM0m2/ijOJU3+PZbnBPaB6NJ1MA==" }, "invert-kv": { "version": "1.0.0", @@ -3780,9 +3780,9 @@ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" }, "v8flags": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz", - "integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", "requires": { "homedir-polyfill": "^1.0.1" } diff --git a/package.json b/package.json index c878966d..d4f6ace2 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "main": "index.js", "scripts": { "compile": "gulp css", - "watch" : "gulp" + "watch": "gulp" }, "author": "", "license": "MIT", diff --git a/scss/components/_tabs.scss b/scss/components/_tabs.scss index ab6b1df5..d222fc5d 100644 --- a/scss/components/_tabs.scss +++ b/scss/components/_tabs.scss @@ -21,7 +21,29 @@ .tabs { height: 15px; margin-bottom: 10px; - border : 0; + border: 0; + .item { + line-height: 15px; + } + } +} + +.minion { + .tabs { + height: 15px; + margin-bottom: 10px; + border: 0; + .item { + line-height: 15px; + } + } +} + +.vehicle { + .tabs { + height: 15px; + margin-bottom: 10px; + border: 0; .item { line-height: 15px; } @@ -30,29 +52,18 @@ .tabs { height: 40px; - border-top: 1px solid #AAA; - border-bottom: 1px solid #AAA; + border-top: 1px solid #aaa; + border-bottom: 1px solid #aaa; .item { line-height: 15px; font-weight: bold; background-color: rgb(81, 98, 77); - padding:3px; + padding: 3px; margin: 0 5px; --notchSize: 10px; - - - clip-path: - polygon( - 0% var(--notchSize), - var(--notchSize) 0%, - calc(100% - var(--notchSize)) 0%, - 100% var(--notchSize), - 100% calc(100% - var(--notchSize)), - calc(100% - var(--notchSize)) 100%, - var(--notchSize) 100%, - 0% calc(100% - var(--notchSize)) - ); + + clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); &:hover { text-shadow: 0 0 8px white; @@ -62,8 +73,8 @@ .item.active { text-decoration: underline; text-shadow: none; - background-color: rgb(73, 12, 11); + background-color: rgb(73, 12, 11); color: white; font-weight: normal; } -} \ No newline at end of file +} diff --git a/styles/starwarsffg.css b/styles/starwarsffg.css index d10ec214..9832d528 100644 --- a/styles/starwarsffg.css +++ b/styles/starwarsffg.css @@ -171,10 +171,30 @@ line-height: 15px; } +.starwarsffg .minion .tabs { + height: 15px; + margin-bottom: 10px; + border: 0; +} + +.starwarsffg .minion .tabs .item { + line-height: 15px; +} + +.starwarsffg .vehicle .tabs { + height: 15px; + margin-bottom: 10px; + border: 0; +} + +.starwarsffg .vehicle .tabs .item { + line-height: 15px; +} + .starwarsffg .tabs { height: 40px; - border-top: 1px solid #AAA; - border-bottom: 1px solid #AAA; + border-top: 1px solid #aaa; + border-bottom: 1px solid #aaa; } .starwarsffg .tabs .item { diff --git a/templates/actors/ffg-minion-sheet.html b/templates/actors/ffg-minion-sheet.html index 86380388..c304716d 100644 --- a/templates/actors/ffg-minion-sheet.html +++ b/templates/actors/ffg-minion-sheet.html @@ -1,4 +1,4 @@ - + {{!-- Sheet Header --}}
                    diff --git a/templates/actors/ffg-vehicle-sheet.html b/templates/actors/ffg-vehicle-sheet.html index c95cf263..4491b793 100644 --- a/templates/actors/ffg-vehicle-sheet.html +++ b/templates/actors/ffg-vehicle-sheet.html @@ -1,4 +1,4 @@ - + {{!-- Sheet Header --}}
                    From 10b02e2369a8999307ed93084b52b97aa95f44d7 Mon Sep 17 00:00:00 2001 From: Esrin Date: Tue, 2 Jun 2020 13:10:44 +0100 Subject: [PATCH 43/44] Repo alignment --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 2e7cade4..d25bb80e 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,7 @@ NICE TO HAVE: - 02/06/2020 - Esrin - Minor bugfix to character sheet, soak value set to disabled for auto-calculation, encumbrance max and current values swapped to correct fields and current set to disabled for auto-calculation. - 02/06/2020 - CStadther - Major sheet restyling +- 02/06/2020 - Jaxxa - Added Icons in the Dice roller, visually indicating the dice types. - 31/05/2020 - Esrin - Work in progress on the group management GM tool. Destiny Pool now working (will reset on page refresh). Player Character list under construction. - 31/05/2020 - Esrin - Bugfix to localisation hook for Gear Quantity on Character Sheet (thanks Alex | HDScurox for the bug report). - 31/05/2020 - CStadther - Added SASS configuration using Gulp. From 746be14ae44d26b6299bb561ca1535b322610720 Mon Sep 17 00:00:00 2001 From: Esrin Date: Tue, 2 Jun 2020 14:13:12 +0100 Subject: [PATCH 44/44] Temporary display fixes to Minion and Vehicle sheets awaiting CStadther's eventual restyle. --- README.md | 1 + scss/components/_tabs.scss | 49 +++++++++++++++---------- styles/starwarsffg.css | 24 +++++++++++- styles/swffg.css | 2 +- system.json | 4 +- templates/actors/ffg-minion-sheet.html | 4 +- templates/actors/ffg-vehicle-sheet.html | 6 +-- 7 files changed, 61 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index d25bb80e..9dcbe040 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,7 @@ NICE TO HAVE: # Changelog +- 02/06/2020 - Esrin - Temporary display fixes to Minion and Vehicle sheets awaiting CStadther's eventual restyle. - 02/06/2020 - Esrin - Minor bugfix to character sheet, soak value set to disabled for auto-calculation, encumbrance max and current values swapped to correct fields and current set to disabled for auto-calculation. - 02/06/2020 - CStadther - Major sheet restyling - 02/06/2020 - Jaxxa - Added Icons in the Dice roller, visually indicating the dice types. diff --git a/scss/components/_tabs.scss b/scss/components/_tabs.scss index ab6b1df5..d222fc5d 100644 --- a/scss/components/_tabs.scss +++ b/scss/components/_tabs.scss @@ -21,7 +21,29 @@ .tabs { height: 15px; margin-bottom: 10px; - border : 0; + border: 0; + .item { + line-height: 15px; + } + } +} + +.minion { + .tabs { + height: 15px; + margin-bottom: 10px; + border: 0; + .item { + line-height: 15px; + } + } +} + +.vehicle { + .tabs { + height: 15px; + margin-bottom: 10px; + border: 0; .item { line-height: 15px; } @@ -30,29 +52,18 @@ .tabs { height: 40px; - border-top: 1px solid #AAA; - border-bottom: 1px solid #AAA; + border-top: 1px solid #aaa; + border-bottom: 1px solid #aaa; .item { line-height: 15px; font-weight: bold; background-color: rgb(81, 98, 77); - padding:3px; + padding: 3px; margin: 0 5px; --notchSize: 10px; - - - clip-path: - polygon( - 0% var(--notchSize), - var(--notchSize) 0%, - calc(100% - var(--notchSize)) 0%, - 100% var(--notchSize), - 100% calc(100% - var(--notchSize)), - calc(100% - var(--notchSize)) 100%, - var(--notchSize) 100%, - 0% calc(100% - var(--notchSize)) - ); + + clip-path: polygon(0% var(--notchSize), var(--notchSize) 0%, calc(100% - var(--notchSize)) 0%, 100% var(--notchSize), 100% calc(100% - var(--notchSize)), calc(100% - var(--notchSize)) 100%, var(--notchSize) 100%, 0% calc(100% - var(--notchSize))); &:hover { text-shadow: 0 0 8px white; @@ -62,8 +73,8 @@ .item.active { text-decoration: underline; text-shadow: none; - background-color: rgb(73, 12, 11); + background-color: rgb(73, 12, 11); color: white; font-weight: normal; } -} \ No newline at end of file +} diff --git a/styles/starwarsffg.css b/styles/starwarsffg.css index d10ec214..9832d528 100644 --- a/styles/starwarsffg.css +++ b/styles/starwarsffg.css @@ -171,10 +171,30 @@ line-height: 15px; } +.starwarsffg .minion .tabs { + height: 15px; + margin-bottom: 10px; + border: 0; +} + +.starwarsffg .minion .tabs .item { + line-height: 15px; +} + +.starwarsffg .vehicle .tabs { + height: 15px; + margin-bottom: 10px; + border: 0; +} + +.starwarsffg .vehicle .tabs .item { + line-height: 15px; +} + .starwarsffg .tabs { height: 40px; - border-top: 1px solid #AAA; - border-bottom: 1px solid #AAA; + border-top: 1px solid #aaa; + border-bottom: 1px solid #aaa; } .starwarsffg .tabs .item { diff --git a/styles/swffg.css b/styles/swffg.css index 044ef63d..bb18b50e 100644 --- a/styles/swffg.css +++ b/styles/swffg.css @@ -234,7 +234,7 @@ div .container.talents { } .starwarsffg.sheet .sheet-body.vehicle { - height: calc(100% - 25em); + height: calc(100% - 17em); overflow: auto; } diff --git a/system.json b/system.json index 723e7c4b..75b6ac0b 100644 --- a/system.json +++ b/system.json @@ -31,8 +31,8 @@ "gridUnits": "ft", "primaryTokenAttribute": "wounds", "secondaryTokenAttribute": "strain", - "url": "https://github.com/Esrin/StarWarsFFG/tree/esrin-dev", - "manifest": "https://raw.githubusercontent.com/Esrin/StarWarsFFG/esrin-dev/system.json", + "url": "https://github.com/StarWarsFoundryVTT/StarWarsFFG/tree/esrin-dev", + "manifest": "https://raw.githubusercontent.com/StarWarsFoundryVTT/StarWarsFFG/esrin-dev/system.json", "download": "https://github.com/Esrin/StarWarsFFG/releases/download/esrin-dev_0.06/esrin-dev_0.060.zip", "license": "LICENSE.txt" } diff --git a/templates/actors/ffg-minion-sheet.html b/templates/actors/ffg-minion-sheet.html index 86380388..df8ca8dd 100644 --- a/templates/actors/ffg-minion-sheet.html +++ b/templates/actors/ffg-minion-sheet.html @@ -1,11 +1,11 @@ - + {{!-- Sheet Header --}}
                    -
                    +
                    {{!-- Character Name and Player --}}
                    diff --git a/templates/actors/ffg-vehicle-sheet.html b/templates/actors/ffg-vehicle-sheet.html index c95cf263..ce351d9a 100644 --- a/templates/actors/ffg-vehicle-sheet.html +++ b/templates/actors/ffg-vehicle-sheet.html @@ -1,4 +1,4 @@ - + {{!-- Sheet Header --}}
                    @@ -12,7 +12,7 @@
                    {{!-- Defence Grid --}} -
                    +
                    {{!-- Fore and Aft Box --}}
                    @@ -251,7 +251,7 @@

                    {{item.name}}
                    {{item.safe_desc}}
                    {{!-- Biography Tab --}} -
                    +
                    {{editor content=data.biography target="data.biography" button=true owner=owner editable=editable}} {{!-- Obligations Section --}}