Compare commits

..

No commits in common. "temp-png" and "master" have entirely different histories.

30 changed files with 359 additions and 923 deletions

View File

@ -1,5 +1,6 @@
# Deck Generator/Playfield # Sentinels of the Multiverse Deck Generator/Playfield
Currently hosted at http://adamgoldsmith.name:8080
Currently hosted at https://playfield.adamgoldsmith.name
This project has two major parts: a deck generator, and a virtual This project has two major parts: a deck generator, and a virtual
playfield. The purpose is to allow for creating and playing custom playfield. The purpose is to allow for creating and playing custom
@ -29,9 +30,9 @@ Templates are based on those from BoardGameGeek user Koga, found here:
https://boardgamegeek.com/thread/813176/card-templates/, but have been https://boardgamegeek.com/thread/813176/card-templates/, but have been
converted to SVG and rather heavily modified/cleaned up. converted to SVG and rather heavily modified/cleaned up.
There are some example input jsons in the `testInputs` folder of this repo. There are some example input files in the `example` folder of this repo.
## Playfield ## Playfield (currently down for maintenance)
Can load decks created by the generator. In theory, can play any deck Can load decks created by the generator. In theory, can play any deck
from Tabletop Simulator, with minor effort (it needs to be pointed at from Tabletop Simulator, with minor effort (it needs to be pointed at
@ -53,11 +54,6 @@ Best on a touch screen, but works okay with a mouse.
* long press on a deck to open a listing, where you can search, * long press on a deck to open a listing, where you can search,
rearrange, and tap to add to playfield rearrange, and tap to add to playfield
## Libraries
* The backend uses PhantomJS for rendering decks
* The playfield uses interact.js
## To do: ## To do:
There are a lot of things still to be done here, including: There are a lot of things still to be done here, including:

View File

@ -1,9 +0,0 @@
{
"meta": {
"name": "Environment Example",
"type": "environment"
},
"deck": [
{"count": 1, "keywords": "Ongoing", "name": "Example Card 1", "text": "Card text 1", "hp": 12, "artist": "Art By Adam", "flavor": "Test flavor"},
{"count": 1, "keywords": "Oneshot", "name": "Example Card 2", "text": "Card text 2"}]
}

16
example/environment.yaml Normal file
View File

@ -0,0 +1,16 @@
meta:
name: Environment Example
type: environment
cards:
deck:
- keywords: Ongoing
name: Example Card 1
text: Card text 1
hp: 12
artist: Art By Adam
flavor: Test flavor
- count: 2
keywords: Oneshot
name: Example Card 2
text: Card text 2

View File

@ -1,15 +0,0 @@
{
"meta": {
"name": "Hero Example",
"type": "hero"
},
"character": [{"name": "Hero Example",
"hp": 42,
"power": "Power Name",
"powerText": "Power: Power description",
"incapacitated": "{incapacitated effect 1\n\n{incapacitated effect 2"}],
"deck": [
{"count": 1, "keywords": "Ongoing", "name": "Card 1", "text": "Card text 1", "hp": 12, "artist": "Art By Adam", "quote": "Test Quote", "quoteCitation": "- Adam"},
{"count": 2, "keywords": "Oneshot", "name": "Card 2", "text": "Card text 2"}
]
}

24
example/hero.yaml Normal file
View File

@ -0,0 +1,24 @@
meta:
name: Hero Example
type: hero
cards:
character:
- name: Hero Example
hp: 42
power: Power Name
powerText: 'Power: Power description'
incapacitated: |-
<p>{incapacitated effect 1</p>
<p>{incapacitated effect 2</p>
deck:
- name: Card 1
hp: 12
keywords: Ongoing
text: Card text 1
quote: Test Quote
quoteCitation: "- Adam"
artist: Art By Adam
- count: 2
name: Card 2
keywords: Oneshot
text: Card text 2

View File

@ -1,29 +0,0 @@
{
"meta": {
"name": "Villain Example",
"type": "villain"
},
"character": [
{"name": "Villain Example",
"hp": 32,
"title": "Test Front",
"back": {
"hp": 25,
"title": "Test Back"
}}],
"instructions": [
{"name": "Test",
"title": "Test Front",
"setup": "setup text",
"gameplay": "front text",
"advanced": "advanced front",
"back": {
"title": "Test Back",
"gameplay": "back text",
"advanced": "advanced back"
}}],
"deck": [
{"count": 1, "keywords": "Ongoing", "name": "Test 1", "text": "Example Text 1", "hp": 12, "artist": "Art By Adam", "quote": "Test Quote", "quoteCitation": "- Adam"},
{"count": 2, "keywords": "One-shot", "name": "Test 2", "text": "Example Text 2"}
]
}

34
example/villain.yaml Normal file
View File

@ -0,0 +1,34 @@
meta:
name: Villain Example
type: villain
cards:
character:
- name: Villain Example
hp: 32
title: Test Front
back:
hp: 25
title: Test Back
instructions:
- name: Test
title: Test Front
setup: setup text
gameplay: front text
advanced: advanced front
back:
title: Test Back
gameplay: back text
advanced: advanced back
deck:
- keywords: Ongoing
name: Test 1
text: Example Text 1
hp: 12
artist: Art By Adam
quote: Test Quote
quoteCitation: "- Adam"
- count: 2
keywords: One-shot
name: Test 2
text: Example Text 2

567
package-lock.json generated
View File

@ -835,19 +835,19 @@
"integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==" "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ=="
}, },
"@vue/component-compiler-utils": { "@vue/component-compiler-utils": {
"version": "2.3.1", "version": "2.5.0",
"resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-2.3.1.tgz", "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-2.5.0.tgz",
"integrity": "sha512-8VuzMhHTf5UU7+HvBeEbBmYiNLvRxIXtDpvxUl5x26WBPgKmQuuJVFY3dN3GFgnWK9Rveh/u/8NF4quhdUUQ1Q==", "integrity": "sha512-mSB8jWmE/ZeYZHPDEx9hNiiRh5P2V1Q0tObxEQWtxxfXtkIAvPnj7oucGm5SO8Y/QwIlDJgAGqHfj5MCjoKoOg==",
"dev": true, "dev": true,
"requires": { "requires": {
"consolidate": "^0.15.1", "consolidate": "^0.15.1",
"hash-sum": "^1.0.2", "hash-sum": "^1.0.2",
"lru-cache": "^4.1.2", "lru-cache": "^4.1.2",
"merge-source-map": "^1.1.0", "merge-source-map": "^1.1.0",
"postcss": "^6.0.20", "postcss": "^7.0.7",
"postcss-selector-parser": "^3.1.1", "postcss-selector-parser": "^5.0.0",
"prettier": "1.13.7", "prettier": "1.13.7",
"source-map": "^0.5.6", "source-map": "^0.7.3",
"vue-template-es2015-compiler": "^1.6.0" "vue-template-es2015-compiler": "^1.6.0"
}, },
"dependencies": { "dependencies": {
@ -868,40 +868,10 @@
} }
} }
}, },
"postcss": {
"version": "6.0.23",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
"integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
"dev": true,
"requires": {
"chalk": "^2.4.1",
"source-map": "^0.6.1",
"supports-color": "^5.4.0"
},
"dependencies": {
"source-map": { "source-map": {
"version": "0.6.1", "version": "0.7.3",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
"dev": true
}
}
},
"postcss-selector-parser": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz",
"integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=",
"dev": true,
"requires": {
"dot-prop": "^4.1.1",
"indexes-of": "^1.0.1",
"uniq": "^1.0.1"
}
},
"source-map": {
"version": "0.5.7",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
"dev": true "dev": true
} }
} }
@ -925,17 +895,6 @@
"resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz",
"integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==" "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw=="
}, },
"ajv": {
"version": "6.6.2",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.2.tgz",
"integrity": "sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g==",
"requires": {
"fast-deep-equal": "^2.0.1",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
"uri-js": "^4.2.2"
}
},
"alphanum-sort": { "alphanum-sort": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz",
@ -1004,14 +963,6 @@
"resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
"integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" "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"
}
},
"asn1.js": { "asn1.js": {
"version": "4.10.1", "version": "4.10.1",
"resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
@ -1045,21 +996,11 @@
} }
} }
}, },
"assert-plus": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
},
"assign-symbols": { "assign-symbols": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
"integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c="
}, },
"async": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
"integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k="
},
"async-each": { "async-each": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
@ -1070,11 +1011,6 @@
"resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
"integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg=="
}, },
"asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
},
"atob": { "atob": {
"version": "2.1.2", "version": "2.1.2",
"resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
@ -1170,16 +1106,6 @@
} }
} }
}, },
"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.8.0",
"resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
"integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ=="
},
"babel-runtime": { "babel-runtime": {
"version": "6.26.0", "version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
@ -1289,14 +1215,6 @@
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz",
"integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw=="
}, },
"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": { "binary-extensions": {
"version": "1.12.0", "version": "1.12.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.12.0.tgz", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.12.0.tgz",
@ -1580,11 +1498,6 @@
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000923.tgz", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000923.tgz",
"integrity": "sha512-j5ur7eeluOFjjPUkydtXP4KFAsmH3XaQNch5tvWSO+dLHYt5PE+VgJZLWtbVOodfWij6m6zas28T4gB/cLYq1w==" "integrity": "sha512-j5ur7eeluOFjjPUkydtXP4KFAsmH3XaQNch5tvWSO+dLHYt5PE+VgJZLWtbVOodfWij6m6zas28T4gB/cLYq1w=="
}, },
"caseless": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
"integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
},
"chalk": { "chalk": {
"version": "2.4.1", "version": "2.4.1",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
@ -1798,19 +1711,6 @@
} }
} }
}, },
"colors": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
"integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs="
},
"combined-stream": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz",
"integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==",
"requires": {
"delayed-stream": "~1.0.0"
}
},
"command-exists": { "command-exists": {
"version": "1.2.8", "version": "1.2.8",
"resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.8.tgz", "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.8.tgz",
@ -2160,19 +2060,6 @@
} }
} }
}, },
"cycle": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
"integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI="
},
"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"
}
},
"date-now": { "date-now": {
"version": "0.1.4", "version": "0.1.4",
"resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
@ -2281,11 +2168,6 @@
"resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
"integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM="
}, },
"delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
},
"depd": { "depd": {
"version": "1.1.2", "version": "1.1.2",
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
@ -2384,15 +2266,6 @@
"readable-stream": "^2.0.2" "readable-stream": "^2.0.2"
} }
}, },
"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"
}
},
"editorconfig": { "editorconfig": {
"version": "0.15.2", "version": "0.15.2",
"resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.2.tgz", "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.2.tgz",
@ -2470,11 +2343,6 @@
"is-symbol": "^1.0.2" "is-symbol": "^1.0.2"
} }
}, },
"es6-promise": {
"version": "4.2.5",
"resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz",
"integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg=="
},
"escape-html": { "escape-html": {
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
@ -2600,11 +2468,6 @@
"vary": "~1.1.2" "vary": "~1.1.2"
} }
}, },
"extend": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
},
"extend-shallow": { "extend-shallow": {
"version": "3.0.2", "version": "3.0.2",
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
@ -2683,27 +2546,6 @@
} }
} }
}, },
"extract-zip": {
"version": "1.6.7",
"resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz",
"integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=",
"requires": {
"concat-stream": "1.6.2",
"debug": "2.6.9",
"mkdirp": "0.5.1",
"yauzl": "2.4.1"
}
},
"extsprintf": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
"integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
},
"eyes": {
"version": "0.1.8",
"resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
"integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A="
},
"falafel": { "falafel": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/falafel/-/falafel-2.1.0.tgz", "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.1.0.tgz",
@ -2722,11 +2564,6 @@
} }
} }
}, },
"fast-deep-equal": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
"integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk="
},
"fast-glob": { "fast-glob": {
"version": "2.2.4", "version": "2.2.4",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.4.tgz", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.4.tgz",
@ -2740,24 +2577,11 @@
"micromatch": "^3.1.10" "micromatch": "^3.1.10"
} }
}, },
"fast-json-stable-stringify": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
"integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I="
},
"fast-levenshtein": { "fast-levenshtein": {
"version": "2.0.6", "version": "2.0.6",
"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
"integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
}, },
"fd-slicer": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz",
"integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=",
"requires": {
"pend": "~1.2.0"
}
},
"filesize": { "filesize": {
"version": "3.6.1", "version": "3.6.1",
"resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz",
@ -2813,21 +2637,6 @@
"resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
"integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k="
}, },
"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"
}
},
"forwarded": { "forwarded": {
"version": "0.1.2", "version": "0.1.2",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
@ -2846,16 +2655,6 @@
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
"integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
}, },
"fs-extra": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz",
"integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=",
"requires": {
"graceful-fs": "^4.1.2",
"jsonfile": "^2.1.0",
"klaw": "^1.0.0"
}
},
"fs.realpath": { "fs.realpath": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
@ -3338,14 +3137,6 @@
"resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
"integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" "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": { "glob": {
"version": "7.1.3", "version": "7.1.3",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
@ -3402,20 +3193,6 @@
"unicode-trie": "^0.3.1" "unicode-trie": "^0.3.1"
} }
}, },
"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": { "has": {
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
@ -3502,15 +3279,6 @@
"minimalistic-assert": "^1.0.1" "minimalistic-assert": "^1.0.1"
} }
}, },
"hasha": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz",
"integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=",
"requires": {
"is-stream": "^1.0.1",
"pinkie-promise": "^2.0.0"
}
},
"he": { "he": {
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
@ -4006,16 +3774,6 @@
"statuses": ">= 1.4.0 < 2" "statuses": ">= 1.4.0 < 2"
} }
}, },
"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"
}
},
"https-browserify": { "https-browserify": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
@ -4266,11 +4024,6 @@
"resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
"integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg=="
}, },
"is-stream": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
"integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
},
"is-svg": { "is-svg": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz",
@ -4287,11 +4040,6 @@
"has-symbols": "^1.0.0" "has-symbols": "^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-url": { "is-url": {
"version": "1.2.4", "version": "1.2.4",
"resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz",
@ -4322,11 +4070,6 @@
"resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
"integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" "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": { "js-base64": {
"version": "2.5.0", "version": "2.5.0",
"resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.0.tgz", "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.0.tgz",
@ -4355,9 +4098,9 @@
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
}, },
"js-yaml": { "js-yaml": {
"version": "3.12.0", "version": "3.12.1",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.1.tgz",
"integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", "integrity": "sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA==",
"requires": { "requires": {
"argparse": "^1.0.7", "argparse": "^1.0.7",
"esprima": "^4.0.0" "esprima": "^4.0.0"
@ -4370,11 +4113,6 @@
} }
} }
}, },
"jsbn": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
"integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
},
"jsesc": { "jsesc": {
"version": "2.5.2", "version": "2.5.2",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
@ -4385,21 +4123,6 @@
"resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
"integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw=="
}, },
"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-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="
},
"json5": { "json5": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "http://registry.npmjs.org/json5/-/json5-1.0.1.tgz", "resolved": "http://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
@ -4415,43 +4138,11 @@
} }
} }
}, },
"jsonfile": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz",
"integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=",
"requires": {
"graceful-fs": "^4.1.6"
}
},
"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"
}
},
"kew": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz",
"integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s="
},
"kind-of": { "kind-of": {
"version": "6.0.2", "version": "6.0.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
"integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
}, },
"klaw": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz",
"integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=",
"requires": {
"graceful-fs": "^4.1.9"
}
},
"levn": { "levn": {
"version": "0.3.0", "version": "0.3.0",
"resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
@ -4866,11 +4557,6 @@
"resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz",
"integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4="
}, },
"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": { "object-assign": {
"version": "4.1.1", "version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@ -5237,60 +4923,11 @@
"sha.js": "^2.4.8" "sha.js": "^2.4.8"
} }
}, },
"pend": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
"integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA="
},
"performance-now": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
"integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
},
"phantom": {
"version": "4.0.12",
"resolved": "https://registry.npmjs.org/phantom/-/phantom-4.0.12.tgz",
"integrity": "sha512-Tz82XhtPmwCk1FFPmecy7yRGZG2btpzY2KI9fcoPT7zT9det0CcMyfBFPp1S8DqzsnQnm8ZYEfdy528mwVtksA==",
"requires": {
"phantomjs-prebuilt": "^2.1.16",
"split": "^1.0.1",
"winston": "^2.4.0"
}
},
"phantomjs-prebuilt": {
"version": "2.1.16",
"resolved": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz",
"integrity": "sha1-79ISpKOWbTZHaE6ouniFSb4q7+8=",
"requires": {
"es6-promise": "^4.0.3",
"extract-zip": "^1.6.5",
"fs-extra": "^1.0.0",
"hasha": "^2.2.0",
"kew": "^0.7.0",
"progress": "^1.1.8",
"request": "^2.81.0",
"request-progress": "^2.0.1",
"which": "^1.2.10"
}
},
"physical-cpu-count": { "physical-cpu-count": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/physical-cpu-count/-/physical-cpu-count-2.0.0.tgz", "resolved": "https://registry.npmjs.org/physical-cpu-count/-/physical-cpu-count-2.0.0.tgz",
"integrity": "sha1-GN4vl+S/epVRrXURlCtUlverpmA=" "integrity": "sha1-GN4vl+S/epVRrXURlCtUlverpmA="
}, },
"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"
}
},
"posix-character-classes": { "posix-character-classes": {
"version": "0.1.1", "version": "0.1.1",
"resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
@ -6086,11 +5723,6 @@
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
"integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw=="
}, },
"progress": {
"version": "1.1.8",
"resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz",
"integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74="
},
"proto-list": { "proto-list": {
"version": "1.2.4", "version": "1.2.4",
"resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
@ -6110,11 +5742,6 @@
"resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
"integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
}, },
"psl": {
"version": "1.1.31",
"resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz",
"integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw=="
},
"public-encrypt": { "public-encrypt": {
"version": "4.0.3", "version": "4.0.3",
"resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
@ -6128,11 +5755,6 @@
"safe-buffer": "^5.1.2" "safe-buffer": "^5.1.2"
} }
}, },
"punycode": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
},
"q": { "q": {
"version": "1.5.1", "version": "1.5.1",
"resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
@ -6351,41 +5973,6 @@
"resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
"integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
}, },
"request": {
"version": "2.88.0",
"resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
"integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
"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.0",
"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.4.3",
"tunnel-agent": "^0.6.0",
"uuid": "^3.3.2"
}
},
"request-progress": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz",
"integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=",
"requires": {
"throttleit": "^1.0.0"
}
},
"resolve": { "resolve": {
"version": "1.9.0", "version": "1.9.0",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.9.0.tgz", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.9.0.tgz",
@ -6745,14 +6332,6 @@
"resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
"integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM="
}, },
"split": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz",
"integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==",
"requires": {
"through": "2"
}
},
"split-string": { "split-string": {
"version": "3.1.0", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
@ -6766,32 +6345,11 @@
"resolved": "http://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "resolved": "http://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
"integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
}, },
"sshpk": {
"version": "1.15.2",
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.2.tgz",
"integrity": "sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA==",
"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"
}
},
"stable": { "stable": {
"version": "0.1.8", "version": "0.1.8",
"resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
"integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w=="
}, },
"stack-trace": {
"version": "0.0.10",
"resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
"integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA="
},
"static-eval": { "static-eval": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.0.tgz", "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.0.tgz",
@ -6962,16 +6520,6 @@
} }
} }
}, },
"throttleit": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz",
"integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw="
},
"through": {
"version": "2.3.8",
"resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
"integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
},
"through2": { "through2": {
"version": "2.0.5", "version": "2.0.5",
"resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
@ -7047,22 +6595,6 @@
"repeat-string": "^1.6.1" "repeat-string": "^1.6.1"
} }
}, },
"tough-cookie": {
"version": "2.4.3",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
"integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
"requires": {
"psl": "^1.1.24",
"punycode": "^1.4.1"
},
"dependencies": {
"punycode": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
"integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
}
}
},
"trim-right": { "trim-right": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
@ -7073,19 +6605,6 @@
"resolved": "http://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", "resolved": "http://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
"integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY="
}, },
"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-check": { "type-check": {
"version": "0.3.2", "version": "0.3.2",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
@ -7239,14 +6758,6 @@
"resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz",
"integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==" "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw=="
}, },
"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": { "urix": {
"version": "0.1.0", "version": "0.1.0",
"resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
@ -7300,11 +6811,6 @@
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
"integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
}, },
"uuid": {
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
"integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA=="
},
"v-runtime-template": { "v-runtime-template": {
"version": "1.5.2", "version": "1.5.2",
"resolved": "https://registry.npmjs.org/v-runtime-template/-/v-runtime-template-1.5.2.tgz", "resolved": "https://registry.npmjs.org/v-runtime-template/-/v-runtime-template-1.5.2.tgz",
@ -7325,16 +6831,6 @@
"resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.2.tgz", "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.2.tgz",
"integrity": "sha512-w/hry/368nO21AN9QljsaIhb9ZiZtZARoVH5f3CsFbawdLdayCgKRPup7CggujvySMxx0I91NOyxdVENohprLQ==" "integrity": "sha512-w/hry/368nO21AN9QljsaIhb9ZiZtZARoVH5f3CsFbawdLdayCgKRPup7CggujvySMxx0I91NOyxdVENohprLQ=="
}, },
"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"
}
},
"vlq": { "vlq": {
"version": "0.2.3", "version": "0.2.3",
"resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz",
@ -7349,9 +6845,9 @@
} }
}, },
"vue": { "vue": {
"version": "2.5.21", "version": "2.5.22",
"resolved": "https://registry.npmjs.org/vue/-/vue-2.5.21.tgz", "resolved": "https://registry.npmjs.org/vue/-/vue-2.5.22.tgz",
"integrity": "sha512-Aejvyyfhn0zjVeLvXd70h4hrE4zZDx1wfZqia6ekkobLmUZ+vNFQer53B4fu0EjWBSiqApxPejzkO1Znt3joxQ==" "integrity": "sha512-pxY3ZHlXNJMFQbkjEgGVMaMMkSV1ONpz+4qB55kZuJzyJOhn6MSy/YZdzhdnumegNzVTL/Dn3Pp4UrVBYt1j/g=="
}, },
"vue-headful": { "vue-headful": {
"version": "2.0.1", "version": "2.0.1",
@ -7372,9 +6868,9 @@
"integrity": "sha512-opKtsxjp9eOcFWdp6xLQPLmRGgfM932Tl56U9chYTnoWqKxQ8M20N7AkdEbM5beUh6wICoFGYugAX9vQjyJLFg==" "integrity": "sha512-opKtsxjp9eOcFWdp6xLQPLmRGgfM932Tl56U9chYTnoWqKxQ8M20N7AkdEbM5beUh6wICoFGYugAX9vQjyJLFg=="
}, },
"vue-template-compiler": { "vue-template-compiler": {
"version": "2.5.21", "version": "2.5.22",
"resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.5.21.tgz", "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.5.22.tgz",
"integrity": "sha512-Vmk5Cv7UcmI99B9nXJEkaK262IQNnHp5rJYo+EwYpe2epTAXqcVyExhV6pk8jTkxQK2vRc8v8KmZBAwdmUZvvw==", "integrity": "sha512-1VTw/NPTUeHNiwhkq6NkFzO7gYLjFCueBN0FX8NEiQIemd5EUMQ5hxrF7O0zCPo5tae+U9S/scETPea+hIz8Eg==",
"dev": true, "dev": true,
"requires": { "requires": {
"de-indent": "^1.0.2", "de-indent": "^1.0.2",
@ -7382,9 +6878,9 @@
} }
}, },
"vue-template-es2015-compiler": { "vue-template-es2015-compiler": {
"version": "1.6.0", "version": "1.8.1",
"resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.6.0.tgz", "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.8.1.tgz",
"integrity": "sha512-x3LV3wdmmERhVCYy3quqA57NJW7F3i6faas++pJQWtknWT+n7k30F4TVdHvCLn48peTJFRvCpxs3UuFPqgeELg==", "integrity": "sha512-mxBBMuSaPG9+NkVMbh28r8gvWQJ8UXxqDxVNeLy2KBUZiSNxZsagjYwLL8gjROb4oaaYtwRv3K8gAmw76I/U7Q==",
"dev": true "dev": true
}, },
"wcwidth": { "wcwidth": {
@ -7408,19 +6904,6 @@
"isexe": "^2.0.0" "isexe": "^2.0.0"
} }
}, },
"winston": {
"version": "2.4.4",
"resolved": "https://registry.npmjs.org/winston/-/winston-2.4.4.tgz",
"integrity": "sha512-NBo2Pepn4hK4V01UfcWcDlmiVTs7VTB1h7bgnB0rgP146bYhMxX0ypCz3lBOfNxCO4Zuek7yeT+y/zM1OfMw4Q==",
"requires": {
"async": "~1.0.0",
"colors": "1.0.x",
"cycle": "1.0.x",
"eyes": "0.1.x",
"isstream": "0.1.x",
"stack-trace": "0.0.x"
}
},
"wordwrap": { "wordwrap": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
@ -7448,14 +6931,6 @@
"version": "2.1.2", "version": "2.1.2",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
"integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
},
"yauzl": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz",
"integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=",
"requires": {
"fd-slicer": "~1.0.1"
}
} }
} }
} }

View File

@ -15,20 +15,19 @@
"express": "^4.16.4", "express": "^4.16.4",
"html2canvas": "^1.0.0-alpha.12", "html2canvas": "^1.0.0-alpha.12",
"interactjs": "^1.3.4", "interactjs": "^1.3.4",
"js-yaml": "^3.12.0", "js-yaml": "^3.12.1",
"nedb-promises": "^3.0.2", "nedb-promises": "^3.0.2",
"parcel-bundler": "^1.11.0", "parcel-bundler": "^1.11.0",
"phantom": "^4.0.12",
"v-runtime-template": "^1.5.2", "v-runtime-template": "^1.5.2",
"vue": "^2.5.21", "vue": "^2.5.22",
"vue-headful": "^2.0.1", "vue-headful": "^2.0.1",
"vue-hot-reload-api": "^2.3.1", "vue-hot-reload-api": "^2.3.1",
"vue-router": "^3.0.2" "vue-router": "^3.0.2"
}, },
"devDependencies": { "devDependencies": {
"@vue/component-compiler-utils": "^2.3.1", "@vue/component-compiler-utils": "^2.5.0",
"parcel": "^1.11.0", "parcel": "^1.11.0",
"vue-template-compiler": "^2.5.21" "vue-template-compiler": "^2.5.22"
}, },
"alias": { "alias": {
"vue": "./node_modules/vue/dist/vue.common.js" "vue": "./node_modules/vue/dist/vue.common.js"

40
src/Card.vue Normal file
View File

@ -0,0 +1,40 @@
<template>
<span @click="$emit('input', {card: card, props: props})">
<v-runtime-template :template="template"> </v-runtime-template>
</span>
</template>
<script>
import HTMLEmbed from './HTMLEmbed.vue';
import VRuntimeTemplate from "v-runtime-template";
import propTypes from './template/*/input.yaml';
import templates from './template/*/*.svg';
export default {
name: 'Card',
props: ['deckType', 'type', 'card'],
components: {VRuntimeTemplate, HTMLEmbed},
computed: {
props() {
return {count: 'number', ...propTypes[this.deckType][this.type]};
},
template() {
return templates[this.deckType][this.type]
.replace('<?xml version="1.0" encoding="UTF-8"?>\n', '');
},
},
}
</script>
<style>
.htmlEmbed {
line-height: .8em;
}
.htmlEmbed p {
margin-top: 0;
margin-bottom: .5em;
}
</style>

View File

@ -1,19 +1,20 @@
<template> <template>
<div class="deck"> <div class="deck">
<div v-for="cardRow in chunkedCards"> <div v-for="cardRow in chunkedCards">
<Hero v-for="card in cardRow" v-model="selected" <Card v-for="card in cardRow" v-model="selected"
:type="card.type" :card="card.card"> </Hero> :deckType="deckInfo.meta.type"
:type="card.type" :card="card.card"> </Card>
</div> </div>
</div> </div>
</template> </template>
<script> <script>
import Hero from './template/hero/Hero.vue' import Card from './Card.vue'
export default { export default {
name: 'Deck', name: 'Deck',
props: ['cards'], props: ['deckInfo'],
components: {Hero}, components: {Card},
data() { data() {
return { return {
@ -30,8 +31,8 @@
computed: { computed: {
allCards() { allCards() {
return Object return Object
.keys(this.cards) .keys(this.deckInfo.cards)
.flatMap(cardType => this.cards[cardType].flatMap((card, index) => { .flatMap(cardType => this.deckInfo.cards[cardType].flatMap((card, index) => {
let cardWrapper = [{ let cardWrapper = [{
type: cardType, type: cardType,
card: card, card: card,
@ -42,7 +43,7 @@
card: card.back, card: card.back,
}); });
} }
return Array(card.count || 1).fill(cardWrapper).flat(); return cardWrapper;
})); }));
}, },
@ -62,14 +63,10 @@
<style> <style>
.deck { .deck {
white-space: nowrap; white-space: nowrap;
width: fit-content;
} }
.deck svg { .deck svg {
white-space: initial; white-space: initial;
} }
.deck svg p {
margin-top: 0;
margin-bottom: .5em;
}
</style> </style>

View File

@ -6,11 +6,11 @@
<button type="button" @click="upload"> Save Deck </button> <button type="button" @click="upload"> Save Deck </button>
<Loader :loading="uploading"></Loader> <Loader :loading="uploading"></Loader>
Download: Download:
<a class="download" :href="inputJSON" <a class="download" :href="downloadJSON(deckInfo)"
:download="deckInfo.meta.name + '.input.json'"> :download="deckInfo.meta.name + '.input.json'">
Input JSON Input JSON
</a> </a>
<a class="download" :href="`/decks/${deckID}.tts.json`" <a class="download" :href="downloadJSON(makeTTSJSON())"
:download="deckInfo.meta.name + '.tts.json'"> :download="deckInfo.meta.name + '.tts.json'">
Tabletop Sim Output JSON Tabletop Sim Output JSON
</a> </a>
@ -22,8 +22,9 @@
<div> <div>
<label> Upload JSON: WARNING: WILL CLEAR DECK <label> Upload JSON: WARNING: WILL CLEAR DECK
<input @change="jsonUpload" type="file"> <input ref="jsonUpload" type="file">
</label> </label>
<button type="button" @click="jsonUpload"> Load </button>
</div> </div>
<div> <div>
@ -50,7 +51,7 @@
</div> </div>
</div> </div>
<Deck ref="deck" :cards="deckInfo.cards" v-model="selected"> </Deck> <Deck ref="deck" :deckInfo="deckInfo" v-model="selected"> </Deck>
</div> </div>
</template> </template>
@ -59,6 +60,7 @@
import html2canvas from 'html2canvas'; import html2canvas from 'html2canvas';
import Deck from './Deck.vue'; import Deck from './Deck.vue';
import Loader from './Loader.vue'; import Loader from './Loader.vue';
import tts_templates from './template/tts/*.json';
export default { export default {
name: 'Editor', name: 'Editor',
@ -86,17 +88,10 @@
* 'beforeunload', e => e.returnValue = "Unsaved changes blah blah"); */ * 'beforeunload', e => e.returnValue = "Unsaved changes blah blah"); */
}, },
computed: {
inputJSON() {
return 'data:application/json;charset=utf-8,' +
encodeURIComponent(JSON.stringify(this.deckInfo))
},
},
methods: { methods: {
// deck JSON uploader // deck JSON uploader
jsonUpload(event) { jsonUpload(event) {
let files = event.target.files; let files = this.$refs.jsonUpload.files;
let reader = new FileReader(); let reader = new FileReader();
reader.onload = e => this.deckInfo = yaml.safeLoad(e.target.result); reader.onload = e => this.deckInfo = yaml.safeLoad(e.target.result);
reader.readAsText(files[0]); reader.readAsText(files[0]);
@ -110,12 +105,91 @@
reader.readAsDataURL(event.target.files[0]); reader.readAsDataURL(event.target.files[0]);
}, },
upload() { downloadJSON(json) {
let node = this.$refs.deck.$el; return 'data:application/json;charset=utf-8,' +
encodeURIComponent(JSON.stringify(json))
},
html2canvas(node, {scale: 2, width: node.scrollWidth, makeTTSJSON() {
backgroundColor: 'black'}) // make a copy
.then(canvas => document.body.appendChild(canvas)); let deckOut = JSON.parse(JSON.stringify(tts_templates['deck']));
deckOut.ObjectStates[0].Nickname = this.deckInfo.meta.name;
let index = 100;
deckOut.ObjectStates[0].ContainedObjects = Object
.keys(this.deckInfo.cards)
.flatMap(cardType => this.deckInfo.cards[cardType].flatMap(card => {
let cardOut = {...JSON.parse(JSON.stringify(tts_templates['card'])),
Nickname: card.name,
Description: card.keywords,
CardID: index};
deckOut.ObjectStates[0].DeckIDs.push(
...Array(card.count || 1).fill(index));
index++;
if(card.back) {
cardOut.States = {
"2": {...JSON.parse(JSON.stringify(tts_templates['card'])),
Nickname: card.back.name,
Description: card.back.keywords,
CardID: index}};
index++;
}
return Array(card.count || 1).fill(cardOut);
}))
let cardCount = index - 100;
let columns = Math.ceil(Math.sqrt(cardCount));
Object.assign(
deckOut.ObjectStates[0].CustomDeck['1'],
{NumWidth: columns,
NumHeight: Math.ceil(cardCount / columns),
FaceURL: `${location.origin}/decks/${this.deckID}.png`,
BackURL: "http://cloud-3.steamusercontent.com/ugc/156906385556221451/CE2C3AFE1759790CB0B532FFD636D05A99EC91F4/"});
return deckOut;
},
upload() {
this.uploading = true;
// TODO: remove this nasty hack
function bindStyles(doc) {
console.log(doc);
// get existing styles from CSS...
let style = Array.from(document.styleSheets[0].rules)
.map(rule => rule.cssText)
.join('\n');
// ...and jam them into a <style> in each foreignObject
doc.querySelectorAll('foreignObject')
.forEach(o => {
let styleElement = o.appendChild(document.createElement('style'));
styleElement.innerHTML = style;
});
}
let node = this.$refs.deck.$el;
html2canvas(node, {scale: 2,
backgroundColor: 'black',
onclone: bindStyles})
.then(canvas => canvas.toDataURL("image/png"))
.then(image =>
// POST the inputed json to the server
fetch('/upload', {
method: 'post',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
deck: this.deckInfo,
_id: this.deckID === 'new' ? undefined : this.deckID,
image: image,
})}))
.then(r => r.json())
.then(j => {
this.$router.replace('/edit/' + j.id);
this.uploading = false;
})
.catch(err => console.log('Failed to upload' + err));
}, },
}, },
} }

12
src/HTMLEmbed.vue Normal file
View File

@ -0,0 +1,12 @@
<template>
<foreignObject>
<div class="htmlEmbed" v-html="html"> </div>
</foreignObject>
</template>
<script>
export default {
name: 'HTMLEmbed',
props: ['html'],
}
</script>

16
src/RawStringAsset.js Normal file
View File

@ -0,0 +1,16 @@
const { Asset } = require('parcel-bundler');
class RawStringAsset extends Asset {
constructor(filename, options) {
super(filename, options);
this.type = 'js';
}
parse(str) {
return JSON.stringify(str);
}
generate() {
return `module.exports = ${this.ast}`;
}
}
module.exports = RawStringAsset;

View File

@ -6,7 +6,6 @@ const express = require('express'),
Bundler = require('parcel-bundler'), Bundler = require('parcel-bundler'),
fs = require('fs'), fs = require('fs'),
path = require('path'), path = require('path'),
phantom = require('phantom'),
Datastore = require('nedb-promises'), Datastore = require('nedb-promises'),
port = process.env.PORT || 1234; port = process.env.PORT || 1234;
@ -17,13 +16,13 @@ const app = express();
app.use(express.json({limit: '50mb'})); app.use(express.json({limit: '50mb'}));
app.use('/template', express.static('template')); app.use('/template', express.static('template'));
app.get('/decks/:deckID.tts.json', getTTSJSON);
app.get('/decks/:deckID.json', getInputJSON); app.get('/decks/:deckID.json', getInputJSON);
app.get('/decks/:deckID.png', getDeckImage); app.get('/decks/:deckID.png', getDeckImage);
app.get('/decks.json', getDecksList); app.get('/decks.json', getDecksList);
app.post('/upload', handleUpload); app.post('/upload', handleUpload);
let bundler = new Bundler(path.join(__dirname, 'index.html')); let bundler = new Bundler(path.join(__dirname, 'index.html'));
bundler.addAssetType('.svg', require.resolve('./RawStringAsset'));
app.use(bundler.middleware()); app.use(bundler.middleware());
app.listen(port, () => console.log(`App listening on port ${port}!`)); app.listen(port, () => console.log(`App listening on port ${port}!`));
@ -46,79 +45,12 @@ function getDeckImage(req, res) {
.catch(err => res.status(404).end()); .catch(err => res.status(404).end());
} }
function getTTSJSON(req, res) { function handleUpload(req, res) {
// TODO: fix
db.findOne({_id: req.params.deckID})
.then(doc => {
let deckIn = doc.deck;
const cardTemplate = fs.readFileSync(__dirname + '/template/card.json');
const template = JSON.parse(fs.readFileSync(__dirname + `/template/${deckIn.type}/input.json`));
const cardCount = Object.entries(template.cardTypes)
.map(ct => deckIn[ct[0]].length * (ct[1].back ? 2 : 1))
.reduce((sum, current) => sum + current, 0);
let deckOut = JSON.parse(fs.readFileSync(__dirname + '/template/deck.json'));
deckOut.ObjectStates[0].Nickname = deckIn.meta.name;
Object.assign(deckOut.ObjectStates[0].CustomDeck['1'],
{NumWidth: Math.ceil(Math.sqrt(cardCount)),
NumHeight: Math.ceil(cardCount/Math.ceil(Math.sqrt(cardCount))),
FaceURL: `http://${req.headers.host}/decks/${doc.meta.name}.png`,
BackURL: "http://cloud-3.steamusercontent.com/ugc/156906385556221451/CE2C3AFE1759790CB0B532FFD636D05A99EC91F4/"});
let index = 100;
deckOut.ObjectStates[0].ContainedObjects = Object
.keys(deckIn)
.filter(cardType => cardType !== 'meta')
.map(cardType => deckIn[cardType].map((card, index) => {
let cardOut = {...JSON.parse(cardTemplate),
Nickname: card.name,
Description: card.keywords,
CardID: index};
deckOut.ObjectStates[0].DeckIDs.push(...Array(card.count || 1).fill(index));
index++;
if(card.back) {
cardOut.States = {"2": {...JSON.parse(cardTemplate),
Nickname: card.back.name,
Description: card.back.keywords,
CardID: index}};
index++;
}
return cardOut;
}))
.reduce((sum, cur) => sum.concat(cur), []); // flatten
res.json(deckOut);
});
}
async function handleUpload(req, res) {
const json = req.body; const json = req.body;
console.log("Got deck upload!");
console.log("Making deck image"); db.update({_id: json._id},
const ph = await phantom.create(); {deck: json.deck,
const page = await ph.createPage(); image: json.image.substr("data:image/png;base64,".length)},
{upsert: true, returnUpdatedDocs: true})
page.on('onLoadFinished', status => { .then(doc => res.status(201).json({id: doc._id}));
if (status === 'success') {
page.renderBase64(`PNG`)
.then(image => db.update(
{_id: json.id},
{deck: json.deck, image: image},
{upsert: true, returnUpdatedDocs: true}))
.then(doc => res.status(201).json({id: doc._id}))
.then(() => page.close().then(() => ph.exit()));
}
else {
console.log('Failed to load page');
ph.exit(1);
}
});
page.property('zoomFactor', 2); // pretty arbitrary
page.property('content',
'<head><link rel="stylesheet" href="' + json.css + '"></head>' +
'<body style="margin:0;">' + json.dom + '</body>');
} }

View File

@ -320,10 +320,10 @@
<path d="m143.36 238.45h-127.38v-26.102h127.38z" fill="#94dc63" stroke="#000" stroke-miterlimit="10" stroke-width=".75"/> <path d="m143.36 238.45h-127.38v-26.102h127.38z" fill="#94dc63" stroke="#000" stroke-miterlimit="10" stroke-width=".75"/>
<use transform="translate(15.453 211.51)" width="100%" height="100%" mask="url(#mask26)" xlink:href="#surface769"/> <use transform="translate(15.453 211.51)" width="100%" height="100%" mask="url(#mask26)" xlink:href="#surface769"/>
<path d="m143.36 238.45h-127.38v-26.102h127.38z" fill="none" stroke="#000" stroke-miterlimit="10" stroke-width="1.25"/> <path d="m143.36 238.45h-127.38v-26.102h127.38z" fill="none" stroke="#000" stroke-miterlimit="10" stroke-width="1.25"/>
<text id="name" x="14.177066" y="24.167519" width="100" fill="url(#linearGradient583)" font-family="'CrashLanding BB'" font-size="23px" stroke="#000000" stroke-width=".7">Header</text> <text x="14.177066" y="24.167519" width="100" fill="url(#linearGradient583)" font-family="'CrashLanding BB'" font-size="23px" stroke="#000000" stroke-width=".7"> {{ card.name }} </text>
<image id="image" x="9.453" y="27.512" width="162" height="121" preserveAspectRatio="xMidYMid"/> <image v-bind:xlink:href="card.art" x="9.453" y="27.512" width="162" height="121" preserveAspectRatio="xMidYMid"/>
<path d="m171.5 27.502h-162v121.59h162z" fill="none" stroke="#000" stroke-miterlimit="10" stroke-width="2"/> <path d="m171.5 27.502h-162v121.59h162z" fill="none" stroke="#000" stroke-miterlimit="10" stroke-width="2"/>
<g id="keywordBox" transform="translate(-11.547,-6.4883)" font-family="'RedStateBlueState BB'"> <g v-if="card.keywords" transform="translate(-11.547,-6.4883)" font-family="'RedStateBlueState BB'">
<g clip-path="url(#clip90)"> <g clip-path="url(#clip90)">
<path d="m138.51 151.36h-108.41v12.805h108.41zm-0.75 12.055h-106.91v-11.305h106.91z"/> <path d="m138.51 151.36h-108.41v12.805h108.41zm-0.75 12.055h-106.91v-11.305h106.91z"/>
</g> </g>
@ -331,18 +331,12 @@
<path d="m137.76 163.41h-106.91v-11.305h106.91z" fill="#4fb84a"/> <path d="m137.76 163.41h-106.91v-11.305h106.91z" fill="#4fb84a"/>
<use transform="translate(30,152)" width="100%" height="100%" mask="url(#mask35)" xlink:href="#surface823"/> <use transform="translate(30,152)" width="100%" height="100%" mask="url(#mask35)" xlink:href="#surface823"/>
</g> </g>
<text id="keywords" x="84" y="160" font-size="11.696px" font-weight="bold" text-anchor="middle"> <text x="84" y="160" font-size="11.696px" font-weight="bold" text-anchor="middle"> {{ card.keywords }} </text>
<tspan>Keywords</tspan>
</text>
</g> </g>
<text id="text" x="15.453" y="163.5117" width="152" height="50" fill="#000000" font-family="'RedStateBlueState BB'" font-size="10px" xml:space="preserve"><tspan>Text Here</tspan></text> <HTMLEmbed x="15.453" y="163.5117" width="152" height="50" fill="#000000" font-family="'RedStateBlueState BB'" font-size="10px" :html="card.text"> Text Here </HTMLEmbed>
<text id="flavor" x="18.452999" y="219.5117" width="123" height="19" fill="#000000" font-family="'RedStateBlueState BB'" font-size="6px" font-style="italic"> <HTMLEmbed x="18.452999" y="219.5117" width="123" height="19" fill="#000000" font-family="'RedStateBlueState BB'" font-size="6px" font-style="italic" :html="card.flavor"> Flavor Text Here </HTMLEmbed>
<tspan>Text Here</tspan> <text x="168.59091" y="247.55464" fill="#ffffff" font-family="'RedStateBlueState BB'" font-size="5.3px" text-align="end" text-anchor="end"> Art By {{ card.artist }} </text>
</text> <g v-if="card.hp" transform="translate(-11.547,-6.4883)">
<text id="artist" x="168.59091" y="247.55464" fill="#ffffff" font-family="'RedStateBlueState BB'" font-size="5.3px" text-align="end" text-anchor="end">
<tspan>art by</tspan>
</text>
<g id="hpMark" transform="translate(-11.547,-6.4883)">
<g clip-path="url(#clip155)"> <g clip-path="url(#clip155)">
<g clip-path="url(#clip156)"> <g clip-path="url(#clip156)">
<path d="m183.05 15.988h-46.879v39.898h46.879z" fill="url(#linearGradient585)"/> <path d="m183.05 15.988h-46.879v39.898h46.879z" fill="url(#linearGradient585)"/>
@ -358,6 +352,6 @@
<g clip-path="url(#clip162)"> <g clip-path="url(#clip162)">
<path transform="translate(183.05,15.988)" d="m0.0014562-3.205e-5h-34.301" fill="none" stroke="#000" stroke-miterlimit="10" stroke-width="2"/> <path transform="translate(183.05,15.988)" d="m0.0014562-3.205e-5h-34.301" fill="none" stroke="#000" stroke-miterlimit="10" stroke-width="2"/>
</g> </g>
<text id="hp" x="165.95107" y="37.060463" fill="#000000" font-family="'CrashLanding BB'" font-size="35px" text-align="center" text-anchor="middle" xml:space="preserve">3</text> <text x="165.95107" y="37.060463" fill="#000000" font-family="'CrashLanding BB'" font-size="35px" text-align="center" text-anchor="middle" xml:space="preserve"> {{ card.hp }} </text>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 278 KiB

After

Width:  |  Height:  |  Size: 278 KiB

View File

@ -1,20 +0,0 @@
{
"cardTypes": {
"deck": {
"meta": ["count"],
"inputs": {
"name": "text",
"keywords": "text",
"text": "textarea",
"flavor": "textarea",
"artist": "text",
"hp": "number",
"image": "image"
},
"hide": {
"hpMark": "hp",
"keywordBox": "keywords"
}
}
}
}

View File

@ -0,0 +1,8 @@
deck:
name: text
art: image
hp: number
keywords: text
text: textarea
flavor: textarea
artist: text

View File

@ -1,58 +0,0 @@
<template>
<span @click="$emit('input', {card: card, props: props})">
<v-runtime-template :template="template">
</v-runtime-template>
</span>
</template>
<script>
import fs from 'fs';
import VRuntimeTemplate from "v-runtime-template";
let propTypes = {
character: {
hp: "number",
power: "text",
art: "image",
powerText: "textarea"
},
"character-back": {
incapacitated: "textarea"
},
deck: {
name: "text",
hp: "number",
art: "image",
keywords: "text",
text: "textarea",
quote: "textarea",
quoteCitation: "text",
artist: "text"
}
};
const templates = {
'character': fs.readFileSync(__dirname + '/character.svg', 'utf8'),
'character-back': fs.readFileSync(__dirname + '/character-back.svg', 'utf8'),
'deck': fs.readFileSync(__dirname + '/deck.svg', 'utf8'),
}
export default {
name: 'HeroCharacter',
props: ['type', 'card'],
components: {VRuntimeTemplate},
data() {
return {
props: propTypes[this.type],
}
},
computed: {
template() {
return templates[this.type]
.replace('<?xml version="1.0" encoding="UTF-8"?>\n', '');
},
},
}
</script>

View File

@ -4,7 +4,5 @@
<path d="m9.498 243.5h162v-234h-162z" fill="#fff" stroke="#000" stroke-miterlimit="10"/> <path d="m9.498 243.5h162v-234h-162z" fill="#fff" stroke="#000" stroke-miterlimit="10"/>
<path d="m9.5 243.5h162v-234h-162z" fill="none" stroke="#000" stroke-miterlimit="10" stroke-width="2"/> <path d="m9.5 243.5h162v-234h-162z" fill="none" stroke="#000" stroke-miterlimit="10" stroke-width="2"/>
<path d="m168.08 239.87h-154.91v-52.371h154.91z" fill="#cfd1d4" stroke="#000" stroke-linejoin="round" stroke-miterlimit="10"/> <path d="m168.08 239.87h-154.91v-52.371h154.91z" fill="#cfd1d4" stroke="#000" stroke-linejoin="round" stroke-miterlimit="10"/>
<foreignObject x="16" y="194" width="150" height="20" fill="#000000" font-family="'RedStateBlueState BB'" font-size="8px"> <HTMLEmbed x="16" y="194" width="150" height="20" fill="#000000" font-family="'RedStateBlueState BB'" font-size="8px" :html="card.incapacitated"> </HTMLEmbed>
<div xmlns="http://www.w3.org/1999/xhtml" v-html="card.incapacitated"> </div>
</foreignObject>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 760 B

After

Width:  |  Height:  |  Size: 695 B

View File

@ -28,8 +28,6 @@
<path d="m30.672 21.242h-1.6094v-6.4844h0.81641v5.8086h0.79297z"/> <path d="m30.672 21.242h-1.6094v-6.4844h0.81641v5.8086h0.79297z"/>
<text x="12.953" y="93.105858" fill="#ffffff" font-family="'Armor Piercing'" font-size="29px" stroke="#000000"> {{card.hp }} </text> <text x="12.953" y="93.105858" fill="#ffffff" font-family="'Armor Piercing'" font-size="29px" stroke="#000000"> {{card.hp }} </text>
<text x="90.2556" y="220.35289" font-family="'RedStateBlueState BB'" font-size="10px" font-style="italic" text-align="center" text-anchor="middle"> {{ card.power }} </text> <text x="90.2556" y="220.35289" font-family="'RedStateBlueState BB'" font-size="10px" font-style="italic" text-align="center" text-anchor="middle"> {{ card.power }} </text>
<foreignObject x="21.452999" y="222" width="137.06" height="14.694" font-family="'RedStateBlueState BB'" font-size="8px"> <HTMLEmbed x="21.452999" y="222" width="137.06" height="14.694" font-family="'RedStateBlueState BB'" font-size="8px" :html="card.powerText"> </HTMLEmbed>
<div xmlns="http://www.w3.org/1999/xhtml" v-html="card.powerText"> Power Text </div>
</foreignObject>
<text x="168.46541" y="247.8423" fill="#ffffff" font-family="'RedStateBlueState BB'" font-size="5.3px" text-align="end" text-anchor="end">Art By {{ card.artist }} </text> <text x="168.46541" y="247.8423" fill="#ffffff" font-family="'RedStateBlueState BB'" font-size="5.3px" text-align="end" text-anchor="end">Art By {{ card.artist }} </text>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 74 KiB

After

Width:  |  Height:  |  Size: 74 KiB

View File

@ -322,9 +322,7 @@
<text x="154.03" y="30.44" fill="#000000" font-family="'CrashLanding BB'" font-size="35px" text-align="center" text-anchor="middle"> {{ card.hp }} </text> <text x="154.03" y="30.44" fill="#000000" font-family="'CrashLanding BB'" font-size="35px" text-align="center" text-anchor="middle"> {{ card.hp }} </text>
</g> </g>
<image v-bind:xlink:href="card.art" x="21" y="34" width="162px" height="121px" preserveAspectRatio="xMidYMid"/> <image v-bind:xlink:href="card.art" x="21" y="34" width="162px" height="121px" preserveAspectRatio="xMidYMid"/>
<foreignObject x="14.5" y="160" width="152" height="48.5" font-family="'RedStateBlueState BB'" font-size="8.7px"> <HTMLEmbed x="14.5" y="160" width="152" height="48.5" font-family="'RedStateBlueState BB'" font-size="8.7px" v-bind:html="card.text"> </HTMLEmbed>
<div xmlns="http://www.w3.org/1999/xhtml" v-html="card.text"> Text Here </div>
</foreignObject>
<text x="72.514046" y="222" font-size="6.8px" font-style="italic" text-align="center" text-anchor="middle"> {{ card.quote }} </text> <text x="72.514046" y="222" font-size="6.8px" font-style="italic" text-align="center" text-anchor="middle"> {{ card.quote }} </text>
<text x="101.80201" y="230" font-size="5.8px" text-align="end" text-anchor="end">- {{ card.quoteCitation }} </text> <text x="101.80201" y="230" font-size="5.8px" text-align="end" text-anchor="end">- {{ card.quoteCitation }} </text>
<text x="168.4621" y="247.85452" fill="#ffffff" font-family="'RedStateBlueState BB'" font-size="5.3px" text-align="end" text-anchor="end"> Art By {{ card.artist }} </text> <text x="168.4621" y="247.85452" fill="#ffffff" font-family="'RedStateBlueState BB'" font-size="5.3px" text-align="end" text-anchor="end"> Art By {{ card.artist }} </text>

Before

Width:  |  Height:  |  Size: 314 KiB

After

Width:  |  Height:  |  Size: 314 KiB

View File

@ -1,32 +0,0 @@
{
"cardTypes": {
"character": {
"back": {
"inputs": {
"incapacitated": "text"
}
},
"inputs": {
"hp": "number",
"power": "text",
"powerText": "textarea"
}
},
"deck": {
"inputs": {
"name": "text",
"hp": "number",
"image": "image",
"keywords": "text",
"text": "textarea",
"quote": "textarea",
"quoteCitation": "text",
"artist": "text"
},
"hide": {
"hpMark": "hp",
"keywordBox": "keywords"
}
}
}
}

View File

@ -0,0 +1,16 @@
character:
hp: number
power: text
art: image
powerText: textarea
character-back:
incapacitated: textarea
deck:
name: text
hp: number
art: image
keywords: text
text: textarea
quote: textarea
quoteCitation: text
artist: text

View File

@ -14,9 +14,9 @@
<path d="m111.53 226.71h-81.75v-8.5h81.75z" fill="#ebe130" stroke="#000" stroke-linejoin="round" stroke-miterlimit="10"/> <path d="m111.53 226.71h-81.75v-8.5h81.75z" fill="#ebe130" stroke="#000" stroke-linejoin="round" stroke-miterlimit="10"/>
<path d="m154 208.87c-6.6953 0-12.145 5.4492-12.145 12.145s5.4492 12.148 12.145 12.148c6.6953 0 12.145-5.4531 12.145-12.148s-5.4492-12.145-12.145-12.145m0 0.24219c6.5703 0 11.898 5.3281 11.898 11.902s-5.3281 11.902-11.898 11.902c-6.5742 0-11.902-5.3281-11.902-11.902s5.3281-11.902 11.902-11.902"/> <path d="m154 208.87c-6.6953 0-12.145 5.4492-12.145 12.145s5.4492 12.148 12.145 12.148c6.6953 0 12.145-5.4531 12.145-12.148s-5.4492-12.145-12.145-12.145m0 0.24219c6.5703 0 11.898 5.3281 11.898 11.902s-5.3281 11.902-11.898 11.902c-6.5742 0-11.902-5.3281-11.902-11.902s5.3281-11.902 11.902-11.902"/>
<use transform="matrix(.044443 0 0 .044443 140.66 207.66)" width="100%" height="100%" mask="url(#mask0)" xlink:href="#image404"/> <use transform="matrix(.044443 0 0 .044443 140.66 207.66)" width="100%" height="100%" mask="url(#mask0)" xlink:href="#image404"/>
<text id="title" x="89.850975" y="235.60347" fill="#000000" font-family="'RedStateBlueState BB'" font-size="11px" font-style="italic" text-align="center" text-anchor="middle">Villain Title</text> <text x="89.850975" y="235.60347" fill="#000000" font-family="'RedStateBlueState BB'" font-size="11px" font-style="italic" text-align="center" text-anchor="middle"> {{ card.title }} </text>
<text x="58.169796" y="225.06613" fill="#000000" font-family="'RedStateBlueState BB'" font-size="10px" font-style="italic"> villain </text> <text x="58.169796" y="225.06613" fill="#000000" font-family="'RedStateBlueState BB'" font-size="10px" font-style="italic"> villain </text>
<text id="name" transform="scale(.98507 1.0152)" x="14.22963" y="42.862007" fill="#000000" font-family="'Armor Piercing'" font-size="28.676px" stroke-width=".98507">Villain Name</text> <text transform="scale(.98507 1.0152)" x="14.22963" y="42.862007" fill="#000000" font-family="'Armor Piercing'" font-size="28.676px" stroke-width=".98507"> {{ card.name }} </text>
<text id="hp" x="155.13855" y="43.5117" fill="#ffffff" font-family="'Armor Piercing'" font-size="30px" stroke="#000000" stroke-width=".75" text-align="center" text-anchor="middle">000</text> <text x="155.13855" y="43.5117" fill="#ffffff" font-family="'Armor Piercing'" font-size="30px" stroke="#000000" stroke-width=".75" text-align="center" text-anchor="middle"> {{ card.hp }} </text>
<text id="artist" x="168.59201" y="247.54639" fill="#ffffff" font-family="'RedStateBlueState BB'" font-size="5.3px" text-align="end" text-anchor="end">Art By</text> <text x="168.59201" y="247.54639" fill="#ffffff" font-family="'RedStateBlueState BB'" font-size="5.3px" text-align="end" text-anchor="end"> {{ card.artist }} </text>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 72 KiB

After

Width:  |  Height:  |  Size: 72 KiB

View File

@ -285,7 +285,7 @@
<path d="m0.503 252.5h180v-252h-180z" stroke="#000" stroke-miterlimit="10"/> <path d="m0.503 252.5h180v-252h-180z" stroke="#000" stroke-miterlimit="10"/>
<path d="m9.503 243.5h162v-234h-162z" fill="#fff" stroke="#000" stroke-miterlimit="10"/> <path d="m9.503 243.5h162v-234h-162z" fill="#fff" stroke="#000" stroke-miterlimit="10"/>
<path d="m171.5 27.502h-162v121.59h162z" fill="#fff" stroke="#000" stroke-miterlimit="10" stroke-width="2"/> <path d="m171.5 27.502h-162v121.59h162z" fill="#fff" stroke="#000" stroke-miterlimit="10" stroke-width="2"/>
<image id="image" x="10" y="29" width="162px" height="121px" preserveAspectRatio="xMidYMid"/> <image v-bind:xlink:href="card.art" x="10" y="29" width="162px" height="121px" preserveAspectRatio="xMidYMid"/>
<path d="m171.5 217.03h-162v-67.938h162z" fill="#e6e1ba" stroke="#000" stroke-miterlimit="10" stroke-width="2"/> <path d="m171.5 217.03h-162v-67.938h162z" fill="#e6e1ba" stroke="#000" stroke-miterlimit="10" stroke-width="2"/>
<use transform="translate(9.449 148.51)" width="100%" height="100%" mask="url(#mask32)" xlink:href="#surface1165"/> <use transform="translate(9.449 148.51)" width="100%" height="100%" mask="url(#mask32)" xlink:href="#surface1165"/>
<path d="m171.5 217.03h-162v-67.938h162z" fill="none" stroke="#000" stroke-miterlimit="10" stroke-width="2"/> <path d="m171.5 217.03h-162v-67.938h162z" fill="none" stroke="#000" stroke-miterlimit="10" stroke-width="2"/>
@ -323,22 +323,22 @@
<path d="m171.5 27.502h-162v121.59h162z" fill="none" stroke="#000" stroke-miterlimit="10" stroke-width="2"/> <path d="m171.5 27.502h-162v121.59h162z" fill="none" stroke="#000" stroke-miterlimit="10" stroke-width="2"/>
<path d="m171.5 9.4997v14.668" fill="none" stroke="#000" stroke-miterlimit="10" stroke-width="2"/> <path d="m171.5 9.4997v14.668" fill="none" stroke="#000" stroke-miterlimit="10" stroke-width="2"/>
<path d="m171.5 9.4997h-34.301" fill="none" stroke="#000" stroke-miterlimit="10" stroke-width="2"/> <path d="m171.5 9.4997h-34.301" fill="none" stroke="#000" stroke-miterlimit="10" stroke-width="2"/>
<text id="name" x="14.173298" y="24.167526" font-family="'CrashLanding BB'" font-size="23px">Header</text> <text x="14.173298" y="24.167526" font-family="'CrashLanding BB'" font-size="23px"> {{ card.name }} </text>
<g id="keywordBox"> <g v-if="card.keywords">
<path d="m126.21 156.92h-106.91v-11.305h106.91z" fill="#e11c1c"/> <path d="m126.21 156.92h-106.91v-11.305h106.91z" fill="#e11c1c"/>
<use transform="translate(18.449 145.51)" width="100%" height="100%" mask="url(#mask44)" xlink:href="#surface1237"/> <use transform="translate(18.449 145.51)" width="100%" height="100%" mask="url(#mask44)" xlink:href="#surface1237"/>
<path d="m126.96 144.87h-108.41v12.805h108.41zm-0.75 12.055h-106.91v-11.305h106.91z"/> <path d="m126.96 144.87h-108.41v12.805h108.41zm-0.75 12.055h-106.91v-11.305h106.91z"/>
<text id="keywords" x="21.05547" y="154.41197" font-family="'RedStateBlueState BB'" font-size="11.5px" font-weight="bold">Keywords</text> <text x="21.05547" y="154.41197" font-family="'RedStateBlueState BB'" font-size="11.5px" font-weight="bold"> {{ card.keywords }} </text>
</g> </g>
<text id="text" x="14.5" y="165.175" width="152" height="48.5" font-family="'RedStateBlueState BB'" font-size="8.7px">Text Here</text> <HTMLEmbed x="14.5" y="165.175" width="152" height="48.5" font-family="'RedStateBlueState BB'" font-size="8.7px" :html="card.text"> </HTMLEmbed>
<text id="quote" x="72.514046" y="221.9552" font-family="'RedStateBlueState BB'" font-size="6.8px" font-style="italic" text-align="center" text-anchor="middle">"Type Quote Here!"</text> <text x="72.514046" y="221.9552" font-family="'RedStateBlueState BB'" font-size="6.8px" font-style="italic" text-align="center" text-anchor="middle"> {{ card.quote }} </text>
<text id="quoteCitation" x="101.80201" y="229.85782" font-family="'RedStateBlueState BB'" font-size="5.8px" text-align="end" text-anchor="end">- Name, Comic #</text> <text x="101.80201" y="229.85782" font-family="'RedStateBlueState BB'" font-size="5.8px" text-align="end" text-anchor="end"> {{ card.quoteCitation }} </text>
<text id="artist" x="168.4621" y="247.85452" fill="#ffffff" font-family="'RedStateBlueState BB'" font-size="5.3px" text-align="end" text-anchor="end">Art By</text> <text x="168.4621" y="247.85452" fill="#ffffff" font-family="'RedStateBlueState BB'" font-size="5.3px" text-align="end" text-anchor="end"> Art By {{ card.artist }} </text>
<g id="hpMark" transform="translate(-375.55 -6.4883)" style=""> <g v-if="card.hp" transform="translate(-375.55 -6.4883)" style="">
<path d="m547.05 15.988h-46.879v39.898h46.879z" clip-path="url(#clip174-7)" fill="url(#linear6)"/> <path d="m547.05 15.988h-46.879v39.898h46.879z" clip-path="url(#clip174-7)" fill="url(#linear6)"/>
<path d="m547.05 15.988h-29.047l-17.832 3.8359 16.25 5.9336-14.375 8.5625 13.312-0.25-9.5 13.379 15.312-8.2539-8.25 15.941 13.875-13.004 5.0625 13.754 7.125-19.379 6.9375 4.3125-3.0898-9.9141 4.2188-0.25z" fill="none" stroke="#000" stroke-miterlimit="10" stroke-width=".8"/> <path d="m547.05 15.988h-29.047l-17.832 3.8359 16.25 5.9336-14.375 8.5625 13.312-0.25-9.5 13.379 15.312-8.2539-8.25 15.941 13.875-13.004 5.0625 13.754 7.125-19.379 6.9375 4.3125-3.0898-9.9141 4.2188-0.25z" fill="none" stroke="#000" stroke-miterlimit="10" stroke-width=".8"/>
<path d="m547.05 15.988v14.668" fill="none" stroke="#000" stroke-miterlimit="10" stroke-width="2"/> <path d="m547.05 15.988v14.668" fill="none" stroke="#000" stroke-miterlimit="10" stroke-width="2"/>
<path d="m547.05 15.988h-34.301" fill="none" stroke="#000" stroke-miterlimit="10" stroke-width="2"/> <path d="m547.05 15.988h-34.301" fill="none" stroke="#000" stroke-miterlimit="10" stroke-width="2"/>
<text id="hp" x="529.58063" y="36.929356" fill="#000000" font-family="'CrashLanding BB'" font-size="35px" text-align="center" text-anchor="middle" xml:space="preserve">3</text> <text x="529.58063" y="36.929356" fill="#000000" font-family="'CrashLanding BB'" font-size="35px" text-align="center" text-anchor="middle" xml:space="preserve"> {{ card.hp }} </text>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 316 KiB

After

Width:  |  Height:  |  Size: 316 KiB

View File

@ -1,55 +0,0 @@
{
"cardTypes": {
"character": {
"back": {
"template": "character",
"inputs": {
"name": "text",
"hp": "number",
"title": "text"
}
},
"inputs": {
"name": "text",
"hp": "number",
"title": "text"
}
},
"instructions": {
"back": {
"template": "instructions",
"inputs": {
"name": "text",
"title": "text",
"gameplay": "textarea"
},
"hide": {
"setupBox": "setup"
}
},
"inputs": {
"name": "text",
"title": "text",
"setup": "textarea",
"gameplay": "textarea",
"advanced": "textarea"
}
},
"deck": {
"inputs": {
"name": "text",
"hp": "number",
"image": "image",
"keywords": "text",
"text": "textarea",
"quote": "textarea",
"quoteCitation": "text",
"artist": "text"
},
"hide": {
"hpMark": "hp",
"keywordBox": "keywords"
}
}
}
}

View File

@ -0,0 +1,27 @@
character:
name: text
hp: number
title: text
character-back:
name: text
hp: number
title: text
instructions:
name: text
title: text
setup: textarea
gameplay: textarea
advanced: textarea
instructions-back:
name: text
title: text
gameplay: textarea
deck:
name: text
hp: number
art: image
keywords: text
text: textarea
quote: textarea
quoteCitation: text
artist: text