This commit is contained in:
Kyle
2019-11-29 17:33:12 -08:00
parent 5bbe1ead04
commit 4e8f664300
17 changed files with 842 additions and 842 deletions

View File

@@ -44,18 +44,9 @@
--clear-mid: #fff4;
--clear-dark: #fff6;
}
footer {
background-color: var(--dark-color);
padding: 2.5em;
font: 1.3em gothammedium;
color: var(--light-color);
}
body {
margin: 0px;
background-image: url(images/lowpoly.png);
background-attachment: fixed;
background-size: cover;
}
/*Background & Footer*/
html {
background-image: linear-gradient(to bottom right, var(--shifting-color-1), var(--shifting-color-1-light));
background-attachment: fixed;
@@ -66,9 +57,21 @@ html {
user-select: none;
font-size: 8pt;
}
.selectable {
user-select: all;
body {
margin: 0px;
background-image: url(images/lowpoly.png);
background-attachment: fixed;
background-size: cover;
}
footer {
background-color: var(--dark-color);
padding: 2.5em;
font: 1.3em gothammedium;
color: var(--light-color);
}
/*Canvas*/
canvas {
width: calc(100%);
height: auto;
@@ -78,6 +81,9 @@ canvas {
.canvasContainer {
text-align: center;
}
/*Grids*/
.mainGrid {
padding: 0.3em;
display: grid;
@@ -85,13 +91,36 @@ canvas {
grid-template-columns: auto;
font: 1.6em mplantin;
}
.imageGrid {
.splitGrid {
display: grid;
grid-template-columns: auto 9em;
min-height: 12.5em;
grid-template-columns: 50% 50%;
}
.imgPreview {
width: 100%;
.frameGrid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(4em, 1fr));
grid-auto-rows: min-content;
}
.footerGrid {
display: grid;
grid-template-columns: auto;
grid-gap: 2em;
}
.autoGrid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(6em, 1fr));
grid-auto-rows: min-content;
}
/*Misc elements*/
.download {
text-align: center;
font: 1.5em belerenbsc;
}
.pageTitle {
font: 5em belerenbsc;
text-align: center;
padding-top: 0.3em;
}
.bar {
background-image: url(../images/manaSymbols/63.png);
@@ -101,78 +130,55 @@ canvas {
width: 100%;
height: 1em;
}
.cardMenu > div > div:nth-child(1) {
/* border: 1px solid blue;*/
/* text-align: center;*/
/* font: 1.5em belerenbsc;*/
}
.twoGrid {
display: grid;
grid-template-columns: 50% auto;
}
.input, .textarea, .button, .select {
font: 1em mplantin;
background-color: var(--light-color);
border: 1px solid #aaae;
border-radius: 0.2em;
padding: 0px 0.2em;
outline: none;
}
.textarea {
min-height: 6em;
max-height: 18em;
resize: vertical;
}
.select {
background: #fafafa url(../images/manaSymbols/49.png) no-repeat calc(100% - 0.1em) 50%;
background-size: 1em 1em;
-webkit-appearance: none;
}
.autoGrid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(6em, 1fr));
grid-auto-rows: min-content;
}
.input.file {
padding: 0px;
height: 1.26em;
}
.tooltip {
position: relative;
}
.tooltip .tooltiptext {
visibility: hidden;
background-color: var(--dark-color);
color: var(--light-color);
text-align: center;
border-radius: 5px;
padding: 5px;
top: calc(100% + 5px);
left: 0px;
max-width: calc(100% - 10px);
width: auto;
position: absolute;
z-index: 1;
opacity: 0;
transition: opacity 0.5s;
}
.tooltip .tooltiptext::after {
content: " ";
position: absolute;
bottom: 100%;
left: 50%;
margin-left: -5px;
border-width: 5px;
border-style: solid;
border-color: transparent transparent var(--dark-color) transparent;
}
.tooltip .tooltiptext:hover {
/*visibility: hidden;*/
opacity: 0;
}
div.tooltip > * {
.imgPreview {
width: 100%;
}
.layer {
padding: 2em 2em;
color: black;
font-size: 2em;
text-align: center;
margin-bottom: 3em;
background-color: var(--light-color);
background-image: url(images/layerBackground.png);
background-position: center;
background-repeat: no-repeat;
}
/*Various text modifications*/
.title {
text-align: center;
font: 1.5em belerenbsc;
}
.truncate {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
text-indent: 0em;
}
.paragraph {
font: 1em mplantin;
text-align: left;
}
.indent {
text-indent: 2em;
}
/*General modifications*/
.hidden {
display: none;
}
.visible {
display: inline-block;
}
.selectable {
user-select: all;
}
/*Hyperlinks*/
a {
color: black;
}
@@ -185,63 +191,10 @@ footer a {
footer a:hover {
color: var(--shifting-color-1-light);
}
.hidden {
display: none;
}
.footerGrid {
display: grid;
grid-template-columns: auto;
grid-gap: 2em;
}
.layer {
padding: 2em 2em;
color: black;
font-size: 2em;
text-align: center;
margin-bottom: 3em;
}
.layer { /*:nth-child(even)*/
background-color: var(--light-color);
background-image: url(images/layerBackground.png);
background-position: center;
background-repeat: no-repeat;
}
.title {
text-align: center;
font: 1.5em belerenbsc;
}
.pageTitle {
font: 5em belerenbsc;
text-align: center;
padding-top: 0.3em;
}
.paragraph {
font: 1em mplantin;
text-align: left;
}
.indent {
text-indent: 2em;
}
.leftMargin {
margin-left: 2em;
}
.donate > div:hover {
text-decoration: underline;
}
.donate > div {
background-color: var(--clear-light);
border-radius: 2em;
font: 2em belerenbsc;
}
.donate > div > img {
height: 1em;
position: relative;
top: 0.15em;
left: 0.15em;
}
/*Controls the area taken by the canvas*/
@media screen and (min-width: 888pt) {
@media screen and (min-width: 905pt) {
/*Makes room for the canvas and controls to be side by side*/
.mainGrid {
padding: 1.5em;
@@ -262,7 +215,7 @@ footer a:hover {
}
}
/*These control tooltips for mobile devices vs. desktops/laptops*/
@media screen and (min-width: 1024px) {
/*@media screen and (min-width: 1024px) {
.tooltip:hover .tooltiptext {
visibility: visible;
opacity: 1;
@@ -273,8 +226,8 @@ footer a:hover {
visibility: visible;
opacity: 1;
}
}
/*The footer can now fit horizontally!*/
}*/
/*Allows the footer to be displayed horizontally on Desktop*/
@media screen and (min-width: 375pt) {
.footerGrid {
display: grid;
@@ -284,106 +237,131 @@ footer a:hover {
}
/*WIP*/
.tab {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(6.5em, 1fr));
grid-auto-rows: min-content;
/*WIP (or I'm too lazy to sort these)*/
.tabMenu {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(8em, 1fr));
grid-auto-rows: min-content;
}
.tab.tabSelect {
grid-template-columns: repeat(auto-fit, minmax(8em, 1fr));
.tabOption, .textTabButton {
font: 1.5em belerenbsc;
text-align: center;
background-color: var(--clear-light);
border: 1px solid var(--light-color);
transition: 0.5s;
}
.tabButton.tabSelectButton {
font: 1em belerenb;
.tabOption:hover, .textTabButton:hover {
background-color: var(--clear-mid);
transition: 0s;
}
.tabButton {
text-align: center;
background: var(--clear-light);
border: 1px solid var(--light-color);
font: 1.2em belerenbsc;
padding: 0.1em 0em;
transition: 0.33s;
.tabOption.tabOptionSelected, .textTabButton.activeTextTab {
background-color: var(--clear-dark);
}
.tabButton:hover {
background-color: var(--clear-mid);
transition: 0s;
}
.tabButton.activeTab {
background: var(--clear-dark);
text-decoration: underline;
text-decoration-color: var(--shifting-color-1-light)
}
.tabContent {
display: none;
}
.tabContent.displayed {
display: block;
.tabContent:not(.tabVisible) {
display: none;
}
.download {
text-align: center;
font: 1.5em belerenbsc;
.cardMasterElement {
font: 1em belerenbsc;
background-color: var(--clear-light);
border: 1px solid var(--light-color);
border-radius: 0.25em;
padding: 0.5em;
margin-top: 0.25em;
}
.truncate {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
text-indent: 0em;
.cardMasterElement img {
max-height: 2em;
max-width: 2em;
position: absolute;
transform: translate(1em, -0.35em);
}
.tab, button, select, option {
cursor: pointer;
.cardmasterElement img.cardMasterElementMaskImage {
transform: translate(3.5em, -0.35em);
}
/*Custom Checkboxes*/
.realCheckboxContainer {
margin-top: 0.45em
.cardMasterElementMoving {
background-color: var(--clear-dark);
}
.checkboxContainer {
position: relative;
padding-left: 1.5em;
padding-top: 0.25em;
cursor: pointer;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
.closeCardMasterElement {
cursor: pointer;
position: absolute;
/*top: 50%;*/
left: 96%;
/*padding: 12px 16px;*/
/*transform: translate(0%, -50%);*/
}
.checkboxContainer input {
position: absolute;
opacity: 0;
height: 0;
width: 0;
#framePicker, #maskPicker {
max-height: 260pt;
overflow-y: auto;
overflow-x: hidden;
border: 1px solid var(--light-color);
}
.checkmark {
position: absolute;
top: 0;
left: 0;
height: 1.2em;
width: 1.2em;
transition: 0.33s;
background-color: var(--clear-light);
border: 1px solid var(--light-color)
.frameOption {
height: 4em;
text-align: center;
width: 100%;
}
.checkboxContainer:hover input ~ .checkmark {
background-color: var(--clear-dark);
.frameOption img {
max-width: 4em;
max-height: 4em;
}
.checkboxContainer input:checked ~ .checkmark {
background-color: var(--dark-color);
.maskOption img {
max-width: 2em;
max-height: 2em;
}
.checkmark:after {
content: "X";
font: 1.2em gothammedium;
color: white;
position: absolute;
opacity: 0;
transition: 0.33s;
.frameOption.frameOptionSelected, .maskOption.maskOptionSelected {
background-color: var(--clear-dark);
}
.checkboxContainer input:checked ~ .checkmark:after {
opacity: 1;
.maskOption, .frameOption {
background-color: var(--clear-light);
border: 1px solid var(--light-color);
border-radius: 0.25em;
}
.checkboxContainer .checkmark:after {
left: 0.15em;
top: -0.1em;
.maskOption {
margin-left: 0.5em;
padding: 0.125em;
width: calc(100% - 1.4em);
}
.textarea {
width: 100%;
min-height: 8em;
max-height: 24em;
resize: vertical;
}
.textTabButton {
font-size: 1em;
}
.textTab {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(6em, 1fr));
grid-auto-rows: min-content;
}
.input, .textarea, .button, .select {
font: 1em mplantin;
background-color: var(--light-color);
border: 1px solid #aaa;
border-radius: 0.2em;
padding: 0px 0.2em;
outline: none;
width: 100%;
}
.inputOpacity {
font: 1em mplantin;
background-color: var(--light-color);
border: 1px solid #aaa;
border-radius: 0.2em;
padding: 0px 0.2em;
outline: none;
width: 2.9em;
}
#textCodeTutorial {
display: grid;
grid-template-columns: 6.5em auto;
@@ -398,3 +376,6 @@ footer a:hover {
}
input[type="checkbox"], .frameOption, .maskOption, .button {
cursor: pointer;
}

View File

@@ -14,95 +14,81 @@
</div>
<div class="mainGrid">
<div class="canvasContainer">
<canvas id="mainCanvas" class="canvas"></canvas>
<canvas id="displayCanvas"></canvas>
</div>
<div class="cardMenu">
<div class="tab">
<div class="tabButton editor activeTab" onclick="tabFunction(event, `editor`, `optionFrame`)">Frame</div>
<div class="tabButton editor" onclick="tabFunction(event, `editor`, `optionText`)">Text</div>
<div class="tabButton editor" onclick="tabFunction(event, `editor`, `optionArt`)">Art</div>
<div class="tabButton editor" onclick="tabFunction(event, `editor`, `optionInfo`)">Collector</div>
<div class="tabButton editor" onclick="tabFunction(event, `editor`, `optionSet`)">Set</div>
<div class="tabButton editor" onclick="tabFunction(event, `editor`, `optionWatermark`)">Watermark</div>
<!-- Card editor tabs begin here! -->
<div class="tabMenu">
<div class="tabOption mainEditor tabOptionSelected" onclick="toggleTabs(event, 'frame', 'mainEditor')">Frame</div>
<div class="tabOption mainEditor" onclick="toggleTabs(event, 'text', 'mainEditor')">Text</div>
<div class="tabOption mainEditor" onclick="toggleTabs(event, 'art', 'mainEditor')">Art</div>
<div class="tabOption mainEditor" onclick="toggleTabs(event, 'collector', 'mainEditor')">Collector</div>
<div class="tabOption mainEditor" onclick="toggleTabs(event, 'set', 'mainEditor')">Set Symbol</div>
<div class="tabOption mainEditor" onclick="toggleTabs(event, 'watermark', 'mainEditor')">Watermark</div>
</div>
<div class="bar"></div>
<div class="tabContent editor displayed" id="optionFrame">
Select the part of the card frame:<br>
<div class="tab tabSelect" id="frameType"></div>
<div class="realCheckboxContainer">
<label class="checkboxContainer">
Right Half
<input type="checkbox" id="checkboxSecondary">
<span class="checkmark"></span>
</label>
</div>
Select the color:<br>
<div class="tab tabSelect" id="tabSelectColor"></div><br>
<div class="imageGrid">
<div class="autoGrid">
<button class="button tooltip" onclick="userEnterImage()">Enter<span class="tooltiptext">Add the selected image to the card</span></button>
<button class="button tooltip" onclick="userRemoveImage()">Remove<span class="tooltiptext">Remove the select image type from the card</span></button>
</div>
<div>
<div class="tooltip"><img id="imgPreview" class="imgPreview"><span class="tooltiptext">Preview of the selected image</span></div>
</div>
</div>
<div class="autoGrid">
<div class="tooltip"><select class="select" id="inputImageTypeOpacity" onchange="loadOpacityValue()"></select><span class="tooltiptext">Select the part of the card frame</span></div>
<div class="tooltip"><input type="number" class="input number" id="inputOpacityValue" min="0" max="100" oninput="opacityValueUpdated()"><span class="tooltiptext">Enter the opacity for the selected part of the frame</span></div>
</div>
</div>
<div class="tabContent editor" id="optionText">
<div id="inputWhichTextTabs" class="tab"></div>
<div class="tooltip"><textarea class="textarea tooltip" id="inputText" placeholder="" oninput="updateText()"></textarea><span class="tooltiptext">Edit the selected text</span></div>
<div class="tooltip"><input type="text" class="input text" placeholder="Mana Cost" id="inputManaCost" oninput="updateCardCanvas()" value=""><span class="tooltiptext">Enter the mana cost. Include spaces!</span></div>
<div class="tabContent mainEditor tabVisible" id="frame">
<div class="splitGrid">
<div id="framePicker" class="frameGrid"></div>
<div id="maskPicker"></div>
</div>
<div class="splitGrid">
<button onclick="addFrameToCardMaster()" class="button">Add</button>
<button onclick="addFrameToCardMaster(' - Right')" class="button">Add To Right Half</button>
</div>
<div id="selectedFramePreview">No frame selected</div>
<div id="cardMaster"></div>
</div>
<div class="tabContent mainEditor" id="text">
<div id="inputWhichTextTabs" class="textTab"></div>
<textarea class="textarea" id="inputText" placeholder="" oninput="updateText()"></textarea>
<input type="text" class="input text" placeholder="Mana Cost" id="inputManaCost" oninput="cardImageUpdated()" value="">
<div class="bar"></div>
<div class="title">How To Use Text Codes</div>
<div class="paragraph indent">
Remember to surround each code with curly brackets ("{" and "}"). The codes are not caps sensitive. The following is a list of available text codes and what they do:
</div>
<div id="textCodeTutorial"></div>
</div>
<div class="tabContent editor" id="optionArt">
<div class="autoGrid">
</div>
<div class="tabContent mainEditor" id="art">
<div class="splitGrid">
<div>
<div class="tooltip"><input type="file" class="input file" accept="image/*" onchange="uploadImage(event, cardArt)" placeholder="Via File Upload"><span class="tooltiptext">Upload an image for the card art</span></div>
<div class="tooltip"><input type="text" class="input text" placeholder="Via URL" onchange="cardArt.src = 'https://cors-anywhere.herokuapp.com/' + this.value"><span class="tooltiptext">Enter a URL for the card art</span></div>
<div class="tooltip"><input type="text" class="input text" id="inputCardArtName" onchange="inputCardArtName(this.value)" placeholder="Via Card Name"><span class="tooltiptext">Enter a card name to use its art</span></div>
<div class="tooltip"><input type="number" class="input number" id="inputCardArtNameNumber" onchange="inputCardArtNameNumber(this.value)" value="" min="1" max="1" placeholder="Which Art From Card Name"><span class="tooltiptext">Select which art to use (from the entered card name)</span></div>
<input type="file" class="input file" accept="image/*" onchange="uploadImage(event, cardArt)" placeholder="Via File Upload">
<input type="text" class="input text" placeholder="Via URL" onchange="cardArt.src = 'https://cors-anywhere.herokuapp.com/' + this.value">
<input type="text" class="input text" id="inputCardArtName" onchange="inputCardArtName(this.value)" placeholder="Via Card Name">
<input type="number" class="input number" id="inputCardArtNameNumber" onchange="inputCardArtNameNumber(this.value)" value="" min="1" max="1" placeholder="Which Art From Card Name">
</div>
<div>
<div style="text-align: center; margin: 0.18em 0px">Placement &amp; Zoom:</div>
<div class="tooltip"><input type="number" class="input number" value="0" id="inputCardArtX" oninput="updateCardCanvas()"><span class="tooltiptext">Shift art to the right</span></div>
<div class="tooltip"><input type="number" class="input number" value="0" id="inputCardArtY" oninput="updateCardCanvas()"><span class="tooltiptext">Shift art down</span></div>
<div class="tooltip"><input type="number" class="input number" value="100" step="0.1" min="0" id="inputCardArtZoom" oninput="updateCardCanvas()"><span class="tooltiptext">Art zoom level</span></div>
<div style="text-align: center; margin: 0.18em 0px">X, Y, &amp; Zoom:</div>
<input type="number" class="input number" value="0" id="inputCardArtX" oninput="cardImageUpdated()">
<input type="number" class="input number" value="0" id="inputCardArtY" oninput="cardImageUpdated()">
<input type="number" class="input number" value="100" step="0.1" min="0" id="inputCardArtZoom" oninput="cardImageUpdated()">
</div>
</div>
</div>
<div class="tabContent editor" id="optionInfo">
<div class="autoGrid">
<div class="tooltip"><input type="text" class="input text" placeholder="Number" id="inputInfoNumber" oninput="updateBottomInfoCanvas()" value=""><span class="tooltiptext">Card Number</span></div>
<div class="tooltip"><input type="text" class="input text" placeholder="Rarity" id="inputInfoRarity" oninput="updateBottomInfoCanvas()" value="P"><span class="tooltiptext">Rarity</span></div>
<div class="tooltip"><input type="text" class="input text" placeholder="Set" id="inputInfoSet" oninput="updateBottomInfoCanvas()" value="MTG"><span class="tooltiptext">Set Code</span></div>
<div class="tooltip"><input type="text" class="input text" placeholder="Language" id="inputInfoLanguage" oninput="updateBottomInfoCanvas()" value="EN"><span class="tooltiptext">Language</span></div>
<div class="tooltip"><input type="text" class="input text" placeholder="Artist's Name" id="inputInfoArtist" oninput="updateBottomInfoCanvas()" value=""><span class="tooltiptext">Artist's Name<br>(necessary)</span></div>
</div>
<div class="tabContent mainEditor" id="collector">
<div class="autoGrid">
<input type="text" class="input text" placeholder="Number" id="inputInfoNumber" oninput="updateBottomInfoCanvas()" value="">
<input type="text" class="input text" placeholder="Rarity" id="inputInfoRarity" oninput="updateBottomInfoCanvas()" value="P">
<input type="text" class="input text" placeholder="Set" id="inputInfoSet" oninput="updateBottomInfoCanvas()" value="MTG">
<input type="text" class="input text" placeholder="Language" id="inputInfoLanguage" oninput="updateBottomInfoCanvas()" value="EN">
<input type="text" class="input text" placeholder="Artist's Name" id="inputInfoArtist" oninput="updateBottomInfoCanvas()" value="">
</div>
</div>
<div class="tabContent editor" id="optionSet">
<div class="autoGrid">
<div class="tooltip"><input type="file" class="input file" accept="image/*" onchange="uploadImage(event, setSymbol)" placeholder="Via File Upload"><span class="tooltiptext">Upload an image for the set symbol</span></div>
<div class="tooltip"><input type="text" class="input text" placeholder="Via URL" onchange="whiteToTransparent(setSymbol, 'https://cors-anywhere.herokuapp.com/' + this.value)"><span class="tooltiptext">Enter a URL for the set symbol</span></div>
<div class="tooltip"><input type="text" class="input text" id="inputSetCode" placeholder="Via Set Code" onchange="whiteToTransparent(setSymbol, 'https://cors-anywhere.herokuapp.com/http://gatherer.wizards.com/Handlers/Image.ashx?type=symbol&set=' + this.value + '&size=large&rarity=' + document.getElementById('inputSetRarity').value)"><span class="tooltiptext">Use a set code<br>(2-3 letters, as seen on the bottom of cards)</span></div>
<div class="tooltip"><input type="text" class="input text" id="inputSetRarity" placeholder="Rarity" onchange="whiteToTransparent(setSymbol, 'https://cors-anywhere.herokuapp.com/http://gatherer.wizards.com/Handlers/Image.ashx?type=symbol&set=' + document.getElementById('inputSetCode').value + '&size=large&rarity=' + this.value)"><span class="tooltiptext">C, U, R, M, or S<br>(Not every set has every rarity)</span></div>
<div class="tooltip"><button class="button" onclick="randomSet()">Random</button><span class="tooltiptext">Use a random set symbol and rarity</span></div>
</div>
<div class="tabContent mainEditor" id="set">
<div class="autoGrid">
<input type="file" class="input file" accept="image/*" onchange="uploadImage(event, setSymbol)" placeholder="Via File Upload">
<input type="text" class="input text" placeholder="Via URL" onchange="whiteToTransparent(setSymbol, 'https://cors-anywhere.herokuapp.com/' + this.value)">
<input type="text" class="input text" id="inputSetCode" placeholder="Via Set Code" onchange="whiteToTransparent(setSymbol, 'https://cors-anywhere.herokuapp.com/http://gatherer.wizards.com/Handlers/Image.ashx?type=symbol&set=' + this.value + '&size=large&rarity=' + document.getElementById('inputSetRarity').value)">
<input type="text" class="input text" id="inputSetRarity" placeholder="Rarity" onchange="whiteToTransparent(setSymbol, 'https://cors-anywhere.herokuapp.com/http://gatherer.wizards.com/Handlers/Image.ashx?type=symbol&set=' + document.getElementById('inputSetCode').value + '&size=large&rarity=' + this.value)">
<button class="button" onclick="randomSet()">Random</button>
</div>
</div>
<div class="tabContent editor" id="optionWatermark">
<div class="autoGrid">
<div class="tooltip"><input type="file" class="input file" accept="image/*" onchange="uploadImage(event, watermark)" placeholder="Via File Upload"><span class="tooltiptext">Upload an image for the watermark</span></div>
<div class="tooltip"><input type="text" class="input text" placeholder="Via URL" onchange="whiteToTransparent(watermark, 'https://cors-anywhere.herokuapp.com/' + this.value)"><span class="tooltiptext">Enter a URL for the watermark</span></div>
<div class="tooltip"><input type="text" class="input text" placeholder="Via Set Code" onchange="whiteToTransparent(watermark, 'https://cors-anywhere.herokuapp.com/http://gatherer.wizards.com/Handlers/Image.ashx?type=symbol&set=' + this.value + '&size=large')"><span class="tooltiptext">Use a set code<br>(2-3 letters, as seen on the bottom of cards)</span></div>
<div class="tooltip"><select class="select" id="inputWatermarkPrimary" onchange="updateWatermarkCanvas()">
</div>
<div class="tabContent mainEditor" id="watermark">
<div class="autoGrid">
<input type="file" class="input file" accept="image/*" onchange="uploadImage(event, watermark)" placeholder="Via File Upload">
<input type="text" class="input text" placeholder="Via URL" onchange="whiteToTransparent(watermark, 'https://cors-anywhere.herokuapp.com/' + this.value)">
<input type="text" class="input text" placeholder="Via Set Code" onchange="whiteToTransparent(watermark, 'https://cors-anywhere.herokuapp.com/http://gatherer.wizards.com/Handlers/Image.ashx?type=symbol&set=' + this.value + '&size=large')">
<select class="select" id="inputWatermarkPrimary" onchange="updateWatermark()">
<option value="none">None</option>
<option value="default">Default</option>
<option value="#ccc8b1" selected="selected">White</option>
@@ -112,8 +98,8 @@
<option value="#b9c8b5">Green</option>
<option value="#e4d49b">Gold</option>
<option value="#cfc8be">Artifact/Colorless</option>
</select><span class="tooltiptext">Select the watermark color</span></div>
<div class="tooltip"><select class="select" id="inputWatermarkSecondary" onchange="updateWatermarkCanvas()">
</select>
<select class="select" id="inputWatermarkSecondary" onchange="updateWatermark()">
<option value="none">None</option>
<option value="default">Default</option>
<option value="#ccc8b1">White</option>
@@ -123,9 +109,10 @@
<option value="#b9c8b5">Green</option>
<option value="#e4d49b">Gold</option>
<option value="#cfc8be">Artifact/Colorless</option>
</select><span class="tooltiptext">Select the secondary watermark color</span></div>
</select>
</div>
</div>
</div>
<!-- Card editor tabs end here! -->
<div class="bar"></div>
<div>
<div class="download">
@@ -147,23 +134,13 @@
</div>
<div class="layer">
<div class="title">Want More Customization?</div>
<div class="paragraph indent">
<!-- <div class="paragraph indent">
If you'd like to try out some more frames, scroll to the bottom of this page and check the box next to "Advanced Borders" - CardConjurer.com will remember this setting, so you only need to do this once per device.
</div>
</div> -->
<div class="paragraph indent">
This version of the website is currently a work in progress, so it doesn't have all the features the original Card Conjurer had. If you'd like to go back to the old version, <a href="old/index.html">click here</a>.
</div>
</div>
<!-- <div class="layer">-->
<!-- <div class="title">How You Can Help</div>-->
<!-- <div class="paragraph indent">-->
<!-- I hope that you found Card Conjurer useful! If you did, you can help me out tremendously by using one of the following referral links:-->
<!-- </div>-->
<!-- <div class="autoGrid donate">-->
<!-- <div onclick="window.open('https://pucatrade.com/invite/gift/186748', '_blank');" style="color:#3d213a;">PucaTrade<img src="data/site/icons/pucatrade.png"></div>-->
<!-- <div onclick="window.open('https://www.massdrop.com/?referer=LNWNLL', '_blank');" style="color:#ffffff;">Massdrop<img src="data/site/icons/massdrop.png"></div>-->
<!-- </div>-->
<!-- </div>-->
<div class="layer">
<div class="title">Have Any Questions?</div>
<div class="paragraph indent">
@@ -176,8 +153,6 @@
<div class="footerGrid">
<div>
Card Conjurer By Kyle Burton<br>
<input type="checkbox" checked="true" onchange="toggleTooltips(this.checked)" id="tooltipToggler"> Display tooltips<br>
<input type="checkbox" onchange="advancedBordersClicked()" id="checkboxAdvanced"> Advanced Borders<br>
</div>
<div>
Navigation:<br>
@@ -191,7 +166,8 @@
</div>
</div>
</footer>
<script src="data/scripts/colors.js"></script>
<script src="data/site/main.js"></script>
<script src="data/scripts/setCodeList.js"></script>
<script async src="data/scripts/sortable.js"></script>
<script async src="data/scripts/setCodeList.js"></script>
<script defer src="data/scripts/main.js"></script>
<script defer src="data/scripts/colors.js"></script>
<html>

View File

Before

Width:  |  Height:  |  Size: 7.3 KiB

After

Width:  |  Height:  |  Size: 7.3 KiB

View File

Before

Width:  |  Height:  |  Size: 7.3 KiB

After

Width:  |  Height:  |  Size: 7.3 KiB

View File

Before

Width:  |  Height:  |  Size: 7.4 KiB

After

Width:  |  Height:  |  Size: 7.4 KiB

View File

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 6.2 KiB

View File

Before

Width:  |  Height:  |  Size: 5.9 KiB

After

Width:  |  Height:  |  Size: 5.9 KiB

View File

Before

Width:  |  Height:  |  Size: 5.9 KiB

After

Width:  |  Height:  |  Size: 5.9 KiB

View File

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

View File

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

197
old/3.0/index.html Normal file
View File

@@ -0,0 +1,197 @@
<!DOCTYPE html5>
<html>
<head>
<title>Card Conjurer</title>
<!-- Other things -->
<link rel="stylesheet" href="data/site/styles.css">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<div class="mainDiv">
<div class="pageTitle">
Card Conjurer
</div>
<div class="mainGrid">
<div class="canvasContainer">
<canvas id="mainCanvas" class="canvas"></canvas>
</div>
<div class="cardMenu">
<div class="tab">
<div class="tabButton editor activeTab" onclick="tabFunction(event, `editor`, `optionFrame`)">Frame</div>
<div class="tabButton editor" onclick="tabFunction(event, `editor`, `optionText`)">Text</div>
<div class="tabButton editor" onclick="tabFunction(event, `editor`, `optionArt`)">Art</div>
<div class="tabButton editor" onclick="tabFunction(event, `editor`, `optionInfo`)">Collector</div>
<div class="tabButton editor" onclick="tabFunction(event, `editor`, `optionSet`)">Set</div>
<div class="tabButton editor" onclick="tabFunction(event, `editor`, `optionWatermark`)">Watermark</div>
</div>
<div class="bar"></div>
<div class="tabContent editor displayed" id="optionFrame">
Select the part of the card frame:<br>
<div class="tab tabSelect" id="frameType"></div>
<div class="realCheckboxContainer">
<label class="checkboxContainer">
Right Half
<input type="checkbox" id="checkboxSecondary">
<span class="checkmark"></span>
</label>
</div>
Select the color:<br>
<div class="tab tabSelect" id="tabSelectColor"></div><br>
<div class="imageGrid">
<div class="autoGrid">
<button class="button tooltip" onclick="userEnterImage()">Enter<span class="tooltiptext">Add the selected image to the card</span></button>
<button class="button tooltip" onclick="userRemoveImage()">Remove<span class="tooltiptext">Remove the select image type from the card</span></button>
</div>
<div>
<div class="tooltip"><img id="imgPreview" class="imgPreview"><span class="tooltiptext">Preview of the selected image</span></div>
</div>
</div>
<div class="autoGrid">
<div class="tooltip"><select class="select" id="inputImageTypeOpacity" onchange="loadOpacityValue()"></select><span class="tooltiptext">Select the part of the card frame</span></div>
<div class="tooltip"><input type="number" class="input number" id="inputOpacityValue" min="0" max="100" oninput="opacityValueUpdated()"><span class="tooltiptext">Enter the opacity for the selected part of the frame</span></div>
</div>
</div>
<div class="tabContent editor" id="optionText">
<div id="inputWhichTextTabs" class="tab"></div>
<div class="tooltip"><textarea class="textarea tooltip" id="inputText" placeholder="" oninput="updateText()"></textarea><span class="tooltiptext">Edit the selected text</span></div>
<div class="tooltip"><input type="text" class="input text" placeholder="Mana Cost" id="inputManaCost" oninput="updateCardCanvas()" value=""><span class="tooltiptext">Enter the mana cost. Include spaces!</span></div>
<div class="bar"></div>
<div class="title">How To Use Text Codes</div>
<div class="paragraph indent">
Remember to surround each code with curly brackets ("{" and "}"). The codes are not caps sensitive. The following is a list of available text codes and what they do:
</div>
<div id="textCodeTutorial"></div>
</div>
<div class="tabContent editor" id="optionArt">
<div class="autoGrid">
<div>
<div class="tooltip"><input type="file" class="input file" accept="image/*" onchange="uploadImage(event, cardArt)" placeholder="Via File Upload"><span class="tooltiptext">Upload an image for the card art</span></div>
<div class="tooltip"><input type="text" class="input text" placeholder="Via URL" onchange="cardArt.src = 'https://cors-anywhere.herokuapp.com/' + this.value"><span class="tooltiptext">Enter a URL for the card art</span></div>
<div class="tooltip"><input type="text" class="input text" id="inputCardArtName" onchange="inputCardArtName(this.value)" placeholder="Via Card Name"><span class="tooltiptext">Enter a card name to use its art</span></div>
<div class="tooltip"><input type="number" class="input number" id="inputCardArtNameNumber" onchange="inputCardArtNameNumber(this.value)" value="" min="1" max="1" placeholder="Which Art From Card Name"><span class="tooltiptext">Select which art to use (from the entered card name)</span></div>
</div>
<div>
<div style="text-align: center; margin: 0.18em 0px">Placement &amp; Zoom:</div>
<div class="tooltip"><input type="number" class="input number" value="0" id="inputCardArtX" oninput="updateCardCanvas()"><span class="tooltiptext">Shift art to the right</span></div>
<div class="tooltip"><input type="number" class="input number" value="0" id="inputCardArtY" oninput="updateCardCanvas()"><span class="tooltiptext">Shift art down</span></div>
<div class="tooltip"><input type="number" class="input number" value="100" step="0.1" min="0" id="inputCardArtZoom" oninput="updateCardCanvas()"><span class="tooltiptext">Art zoom level</span></div>
</div>
</div>
</div>
<div class="tabContent editor" id="optionInfo">
<div class="autoGrid">
<div class="tooltip"><input type="text" class="input text" placeholder="Number" id="inputInfoNumber" oninput="updateBottomInfoCanvas()" value=""><span class="tooltiptext">Card Number</span></div>
<div class="tooltip"><input type="text" class="input text" placeholder="Rarity" id="inputInfoRarity" oninput="updateBottomInfoCanvas()" value="P"><span class="tooltiptext">Rarity</span></div>
<div class="tooltip"><input type="text" class="input text" placeholder="Set" id="inputInfoSet" oninput="updateBottomInfoCanvas()" value="MTG"><span class="tooltiptext">Set Code</span></div>
<div class="tooltip"><input type="text" class="input text" placeholder="Language" id="inputInfoLanguage" oninput="updateBottomInfoCanvas()" value="EN"><span class="tooltiptext">Language</span></div>
<div class="tooltip"><input type="text" class="input text" placeholder="Artist's Name" id="inputInfoArtist" oninput="updateBottomInfoCanvas()" value=""><span class="tooltiptext">Artist's Name<br>(necessary)</span></div>
</div>
</div>
<div class="tabContent editor" id="optionSet">
<div class="autoGrid">
<div class="tooltip"><input type="file" class="input file" accept="image/*" onchange="uploadImage(event, setSymbol)" placeholder="Via File Upload"><span class="tooltiptext">Upload an image for the set symbol</span></div>
<div class="tooltip"><input type="text" class="input text" placeholder="Via URL" onchange="whiteToTransparent(setSymbol, 'https://cors-anywhere.herokuapp.com/' + this.value)"><span class="tooltiptext">Enter a URL for the set symbol</span></div>
<div class="tooltip"><input type="text" class="input text" id="inputSetCode" placeholder="Via Set Code" onchange="whiteToTransparent(setSymbol, 'https://cors-anywhere.herokuapp.com/http://gatherer.wizards.com/Handlers/Image.ashx?type=symbol&set=' + this.value + '&size=large&rarity=' + document.getElementById('inputSetRarity').value)"><span class="tooltiptext">Use a set code<br>(2-3 letters, as seen on the bottom of cards)</span></div>
<div class="tooltip"><input type="text" class="input text" id="inputSetRarity" placeholder="Rarity" onchange="whiteToTransparent(setSymbol, 'https://cors-anywhere.herokuapp.com/http://gatherer.wizards.com/Handlers/Image.ashx?type=symbol&set=' + document.getElementById('inputSetCode').value + '&size=large&rarity=' + this.value)"><span class="tooltiptext">C, U, R, M, or S<br>(Not every set has every rarity)</span></div>
<div class="tooltip"><button class="button" onclick="randomSet()">Random</button><span class="tooltiptext">Use a random set symbol and rarity</span></div>
</div>
</div>
<div class="tabContent editor" id="optionWatermark">
<div class="autoGrid">
<div class="tooltip"><input type="file" class="input file" accept="image/*" onchange="uploadImage(event, watermark)" placeholder="Via File Upload"><span class="tooltiptext">Upload an image for the watermark</span></div>
<div class="tooltip"><input type="text" class="input text" placeholder="Via URL" onchange="whiteToTransparent(watermark, 'https://cors-anywhere.herokuapp.com/' + this.value)"><span class="tooltiptext">Enter a URL for the watermark</span></div>
<div class="tooltip"><input type="text" class="input text" placeholder="Via Set Code" onchange="whiteToTransparent(watermark, 'https://cors-anywhere.herokuapp.com/http://gatherer.wizards.com/Handlers/Image.ashx?type=symbol&set=' + this.value + '&size=large')"><span class="tooltiptext">Use a set code<br>(2-3 letters, as seen on the bottom of cards)</span></div>
<div class="tooltip"><select class="select" id="inputWatermarkPrimary" onchange="updateWatermarkCanvas()">
<option value="none">None</option>
<option value="default">Default</option>
<option value="#ccc8b1" selected="selected">White</option>
<option value="#b0c3d5">Blue</option>
<option value="#b3b3b3">Black</option>
<option value="#ddac9b">Red</option>
<option value="#b9c8b5">Green</option>
<option value="#e4d49b">Gold</option>
<option value="#cfc8be">Artifact/Colorless</option>
</select><span class="tooltiptext">Select the watermark color</span></div>
<div class="tooltip"><select class="select" id="inputWatermarkSecondary" onchange="updateWatermarkCanvas()">
<option value="none">None</option>
<option value="default">Default</option>
<option value="#ccc8b1">White</option>
<option value="#b0c3d5">Blue</option>
<option value="#b3b3b3">Black</option>
<option value="#ddac9b">Red</option>
<option value="#b9c8b5">Green</option>
<option value="#e4d49b">Gold</option>
<option value="#cfc8be">Artifact/Colorless</option>
</select><span class="tooltiptext">Select the secondary watermark color</span></div>
</div>
</div>
<div class="bar"></div>
<div>
<div class="download">
<a onclick="downloadCardImage(this)" id="downloadCardImage" href="" target="_blank" download="card.png">Download</a>
</div>
</div>
</div>
</div>
<div class="hidden"></div>
<div class="layer">
<div class="title">Welcome to Card Conjurer!</div>
<div class="paragraph indent">Card Conjurer is a free program that helps you create custom Magic: The Gathering cards. There are already plenty of custom card makers out there, but what sets Card Conjurer apart from the rest is its live-edit capabilities. You can immediatly see the effects of any change you make, which makes card customization easier and overall a better experience.</div>
</div>
<div class="layer">
<div class="title">About Me</div>
<div class="paragraph indent">
Hi! My name is Kyle Burton and I am currently a high school student. I used to play Pokemon, but when a friend introduced me to Magic in 2013 I sold my pocket monsters and bought an M14 Intro Pack. Ever since that day Magic has been my all time favorite game. In addition to playing games, I've always <a href="https://www.youtube.com/watch?v=ERCzN91JicA" target="blank">loved technology</a>. During the 2017-18 school year I tought myself how to code Javascript, and a little bit of HTML and CSS. The following summer I created Kyle's Card Imager (<a href="https://scryfall.com/card/5dn/134/krark-clan-ironworks" target="blank">KCI</a>). It was pretty simple but I soon began to add more border images like Miracle or Nyx. After a few months I decided to share my creation, so I renamed it Card Conjurer and uploaded it to Github, and then in April of 2019 I bought the domain <a href="#" onclick="alert('You\'re already there, silly!')">cardconjurer.com</a>.
</div>
</div>
<div class="layer">
<div class="title">Want More Customization?</div>
<div class="paragraph indent">
If you'd like to try out some more frames, scroll to the bottom of this page and check the box next to "Advanced Borders" - CardConjurer.com will remember this setting, so you only need to do this once per device.
</div>
<div class="paragraph indent">
This version of the website is currently a work in progress, so it doesn't have all the features the original Card Conjurer had. If you'd like to go back to the old version, <a href="old/index.html">click here</a>.
</div>
</div>
<!-- <div class="layer">-->
<!-- <div class="title">How You Can Help</div>-->
<!-- <div class="paragraph indent">-->
<!-- I hope that you found Card Conjurer useful! If you did, you can help me out tremendously by using one of the following referral links:-->
<!-- </div>-->
<!-- <div class="autoGrid donate">-->
<!-- <div onclick="window.open('https://pucatrade.com/invite/gift/186748', '_blank');" style="color:#3d213a;">PucaTrade<img src="data/site/icons/pucatrade.png"></div>-->
<!-- <div onclick="window.open('https://www.massdrop.com/?referer=LNWNLL', '_blank');" style="color:#ffffff;">Massdrop<img src="data/site/icons/massdrop.png"></div>-->
<!-- </div>-->
<!-- </div>-->
<div class="layer">
<div class="title">Have Any Questions?</div>
<div class="paragraph indent">
If you have any questions please don't hesitate to email me at: <div class="truncate"><a href="https://mail.google.com/mail/u/0/?view=cm&fs=1&to=CardConjurerMTG@gmail.com&su=Card%20Conjurer&tf=1" target="_blank">CardConjurerMTG@gmail.com</a></div>Even if you made a cool card and want to share, I'd love to see it!
</div>
</div>
</div>
</body>
<footer>
<div class="footerGrid">
<div>
Card Conjurer By Kyle Burton<br>
<input type="checkbox" checked="true" onchange="toggleTooltips(this.checked)" id="tooltipToggler"> Display tooltips<br>
<input type="checkbox" onchange="advancedBordersClicked()" id="checkboxAdvanced"> Advanced Borders<br>
</div>
<div>
Navigation:<br>
<a href="index.html">Card Creator</a><br>
<a href="life.html">Life Counter</a>
</div>
<div>
Legal:<br>
<a href="disclaimer.html">Disclaimer</a><br>
<a href="termsOfUse.html">Terms of Use</a>
</div>
</div>
</footer>
<script src="data/scripts/colors.js"></script>
<script src="data/site/main.js"></script>
<script src="data/scripts/setCodeList.js"></script>
<html>

View File

@@ -44,9 +44,18 @@
--clear-mid: #fff4;
--clear-dark: #fff6;
}
/*Background & Footer*/
footer {
background-color: var(--dark-color);
padding: 2.5em;
font: 1.3em gothammedium;
color: var(--light-color);
}
body {
margin: 0px;
background-image: url(images/lowpoly.png);
background-attachment: fixed;
background-size: cover;
}
html {
background-image: linear-gradient(to bottom right, var(--shifting-color-1), var(--shifting-color-1-light));
background-attachment: fixed;
@@ -57,21 +66,9 @@ html {
user-select: none;
font-size: 8pt;
}
body {
margin: 0px;
background-image: url(images/lowpoly.png);
background-attachment: fixed;
background-size: cover;
.selectable {
user-select: all;
}
footer {
background-color: var(--dark-color);
padding: 2.5em;
font: 1.3em gothammedium;
color: var(--light-color);
}
/*Canvas*/
canvas {
width: calc(100%);
height: auto;
@@ -81,9 +78,6 @@ canvas {
.canvasContainer {
text-align: center;
}
/*Grids*/
.mainGrid {
padding: 0.3em;
display: grid;
@@ -91,36 +85,13 @@ canvas {
grid-template-columns: auto;
font: 1.6em mplantin;
}
.splitGrid {
.imageGrid {
display: grid;
grid-template-columns: 50% 50%;
grid-template-columns: auto 9em;
min-height: 12.5em;
}
.frameGrid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(4em, 1fr));
grid-auto-rows: min-content;
}
.footerGrid {
display: grid;
grid-template-columns: auto;
grid-gap: 2em;
}
.autoGrid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(6em, 1fr));
grid-auto-rows: min-content;
}
/*Misc elements*/
.download {
text-align: center;
font: 1.5em belerenbsc;
}
.pageTitle {
font: 5em belerenbsc;
text-align: center;
padding-top: 0.3em;
.imgPreview {
width: 100%;
}
.bar {
background-image: url(../images/manaSymbols/63.png);
@@ -130,55 +101,78 @@ canvas {
width: 100%;
height: 1em;
}
.imgPreview {
.cardMenu > div > div:nth-child(1) {
/* border: 1px solid blue;*/
/* text-align: center;*/
/* font: 1.5em belerenbsc;*/
}
.twoGrid {
display: grid;
grid-template-columns: 50% auto;
}
.input, .textarea, .button, .select {
font: 1em mplantin;
background-color: var(--light-color);
border: 1px solid #aaae;
border-radius: 0.2em;
padding: 0px 0.2em;
outline: none;
}
.textarea {
min-height: 6em;
max-height: 18em;
resize: vertical;
}
.select {
background: #fafafa url(../images/manaSymbols/49.png) no-repeat calc(100% - 0.1em) 50%;
background-size: 1em 1em;
-webkit-appearance: none;
}
.autoGrid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(6em, 1fr));
grid-auto-rows: min-content;
}
.input.file {
padding: 0px;
height: 1.26em;
}
.tooltip {
position: relative;
}
.tooltip .tooltiptext {
visibility: hidden;
background-color: var(--dark-color);
color: var(--light-color);
text-align: center;
border-radius: 5px;
padding: 5px;
top: calc(100% + 5px);
left: 0px;
max-width: calc(100% - 10px);
width: auto;
position: absolute;
z-index: 1;
opacity: 0;
transition: opacity 0.5s;
}
.tooltip .tooltiptext::after {
content: " ";
position: absolute;
bottom: 100%;
left: 50%;
margin-left: -5px;
border-width: 5px;
border-style: solid;
border-color: transparent transparent var(--dark-color) transparent;
}
.tooltip .tooltiptext:hover {
/*visibility: hidden;*/
opacity: 0;
}
div.tooltip > * {
width: 100%;
}
.layer {
padding: 2em 2em;
color: black;
font-size: 2em;
text-align: center;
margin-bottom: 3em;
background-color: var(--light-color);
background-image: url(images/layerBackground.png);
background-position: center;
background-repeat: no-repeat;
}
/*Various text modifications*/
.title {
text-align: center;
font: 1.5em belerenbsc;
}
.truncate {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
text-indent: 0em;
}
.paragraph {
font: 1em mplantin;
text-align: left;
}
.indent {
text-indent: 2em;
}
/*General modifications*/
.hidden {
display: none;
}
.visible {
display: inline-block;
}
.selectable {
user-select: all;
}
/*Hyperlinks*/
a {
color: black;
}
@@ -191,10 +185,63 @@ footer a {
footer a:hover {
color: var(--shifting-color-1-light);
}
.hidden {
display: none;
}
.footerGrid {
display: grid;
grid-template-columns: auto;
grid-gap: 2em;
}
.layer {
padding: 2em 2em;
color: black;
font-size: 2em;
text-align: center;
margin-bottom: 3em;
}
.layer { /*:nth-child(even)*/
background-color: var(--light-color);
background-image: url(images/layerBackground.png);
background-position: center;
background-repeat: no-repeat;
}
.title {
text-align: center;
font: 1.5em belerenbsc;
}
.pageTitle {
font: 5em belerenbsc;
text-align: center;
padding-top: 0.3em;
}
.paragraph {
font: 1em mplantin;
text-align: left;
}
.indent {
text-indent: 2em;
}
.leftMargin {
margin-left: 2em;
}
.donate > div:hover {
text-decoration: underline;
}
.donate > div {
background-color: var(--clear-light);
border-radius: 2em;
font: 2em belerenbsc;
}
.donate > div > img {
height: 1em;
position: relative;
top: 0.15em;
left: 0.15em;
}
/*Controls the area taken by the canvas*/
@media screen and (min-width: 905pt) {
@media screen and (min-width: 888pt) {
/*Makes room for the canvas and controls to be side by side*/
.mainGrid {
padding: 1.5em;
@@ -215,7 +262,7 @@ footer a:hover {
}
}
/*These control tooltips for mobile devices vs. desktops/laptops*/
/*@media screen and (min-width: 1024px) {
@media screen and (min-width: 1024px) {
.tooltip:hover .tooltiptext {
visibility: visible;
opacity: 1;
@@ -226,8 +273,8 @@ footer a:hover {
visibility: visible;
opacity: 1;
}
}*/
/*Allows the footer to be displayed horizontally on Desktop*/
}
/*The footer can now fit horizontally!*/
@media screen and (min-width: 375pt) {
.footerGrid {
display: grid;
@@ -237,131 +284,106 @@ footer a:hover {
}
/*WIP (or I'm too lazy to sort these)*/
.tabMenu {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(8em, 1fr));
grid-auto-rows: min-content;
/*WIP*/
.tab {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(6.5em, 1fr));
grid-auto-rows: min-content;
}
.tabOption, .textTabButton {
font: 1.5em belerenbsc;
text-align: center;
background-color: var(--clear-light);
border: 1px solid var(--light-color);
transition: 0.5s;
.tab.tabSelect {
grid-template-columns: repeat(auto-fit, minmax(8em, 1fr));
}
.tabOption:hover, .textTabButton:hover {
background-color: var(--clear-mid);
transition: 0s;
.tabButton.tabSelectButton {
font: 1em belerenb;
}
.tabOption.tabOptionSelected, .textTabButton.activeTextTab {
background-color: var(--clear-dark);
.tabButton {
text-align: center;
background: var(--clear-light);
border: 1px solid var(--light-color);
font: 1.2em belerenbsc;
padding: 0.1em 0em;
transition: 0.33s;
}
.tabContent:not(.tabVisible) {
display: none;
.tabButton:hover {
background-color: var(--clear-mid);
transition: 0s;
}
.tabButton.activeTab {
background: var(--clear-dark);
text-decoration: underline;
text-decoration-color: var(--shifting-color-1-light)
}
.tabContent {
display: none;
}
.tabContent.displayed {
display: block;
}
.cardMasterElement {
font: 1em belerenbsc;
background-color: var(--clear-light);
border: 1px solid var(--light-color);
border-radius: 0.25em;
padding: 0.5em;
margin-top: 0.25em;
.download {
text-align: center;
font: 1.5em belerenbsc;
}
.cardMasterElement img {
max-height: 2em;
max-width: 2em;
position: absolute;
transform: translate(1em, -0.35em);
.truncate {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
text-indent: 0em;
}
.cardmasterElement img.cardMasterElementMaskImage {
transform: translate(3.5em, -0.35em);
.tab, button, select, option {
cursor: pointer;
}
.cardMasterElementMoving {
background-color: var(--clear-dark);
/*Custom Checkboxes*/
.realCheckboxContainer {
margin-top: 0.45em
}
.closeCardMasterElement {
cursor: pointer;
position: absolute;
/*top: 50%;*/
left: 96%;
/*padding: 12px 16px;*/
/*transform: translate(0%, -50%);*/
.checkboxContainer {
position: relative;
padding-left: 1.5em;
padding-top: 0.25em;
cursor: pointer;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
#framePicker, #maskPicker {
max-height: 260pt;
overflow-y: auto;
overflow-x: hidden;
border: 1px solid var(--light-color);
.checkboxContainer input {
position: absolute;
opacity: 0;
height: 0;
width: 0;
}
.frameOption {
height: 4em;
text-align: center;
width: 100%;
.checkmark {
position: absolute;
top: 0;
left: 0;
height: 1.2em;
width: 1.2em;
transition: 0.33s;
background-color: var(--clear-light);
border: 1px solid var(--light-color)
}
.frameOption img {
max-width: 4em;
max-height: 4em;
.checkboxContainer:hover input ~ .checkmark {
background-color: var(--clear-dark);
}
.maskOption img {
max-width: 2em;
max-height: 2em;
.checkboxContainer input:checked ~ .checkmark {
background-color: var(--dark-color);
}
.frameOption.frameOptionSelected, .maskOption.maskOptionSelected {
background-color: var(--clear-dark);
.checkmark:after {
content: "X";
font: 1.2em gothammedium;
color: white;
position: absolute;
opacity: 0;
transition: 0.33s;
}
.maskOption, .frameOption {
background-color: var(--clear-light);
border: 1px solid var(--light-color);
border-radius: 0.25em;
.checkboxContainer input:checked ~ .checkmark:after {
opacity: 1;
}
.maskOption {
margin-left: 0.5em;
padding: 0.125em;
width: calc(100% - 1.4em);
.checkboxContainer .checkmark:after {
left: 0.15em;
top: -0.1em;
}
.textarea {
width: 100%;
min-height: 8em;
max-height: 24em;
resize: vertical;
}
.textTabButton {
font-size: 1em;
}
.textTab {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(6em, 1fr));
grid-auto-rows: min-content;
}
.input, .textarea, .button, .select {
font: 1em mplantin;
background-color: var(--light-color);
border: 1px solid #aaa;
border-radius: 0.2em;
padding: 0px 0.2em;
outline: none;
width: 100%;
}
.inputOpacity {
font: 1em mplantin;
background-color: var(--light-color);
border: 1px solid #aaa;
border-radius: 0.2em;
padding: 0px 0.2em;
outline: none;
width: 2.9em;
}
#textCodeTutorial {
display: grid;
grid-template-columns: 6.5em auto;
@@ -376,6 +398,3 @@ footer a:hover {
}
input[type="checkbox"], .frameOption, .maskOption, .button {
cursor: pointer;
}

173
test.html
View File

@@ -1,173 +0,0 @@
<!DOCTYPE html5>
<html>
<head>
<title>Card Conjurer</title>
<!-- Other things -->
<link rel="stylesheet" href="data/site/newStyles.css">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<div class="mainDiv">
<div class="pageTitle">
Card Conjurer
</div>
<div class="mainGrid">
<div class="canvasContainer">
<canvas id="displayCanvas"></canvas>
</div>
<div class="cardMenu">
<!-- Card editor tabs begin here! -->
<div class="tabMenu">
<div class="tabOption mainEditor tabOptionSelected" onclick="toggleTabs(event, 'frame', 'mainEditor')">Frame</div>
<div class="tabOption mainEditor" onclick="toggleTabs(event, 'text', 'mainEditor')">Text</div>
<div class="tabOption mainEditor" onclick="toggleTabs(event, 'art', 'mainEditor')">Art</div>
<div class="tabOption mainEditor" onclick="toggleTabs(event, 'collector', 'mainEditor')">Collector</div>
<div class="tabOption mainEditor" onclick="toggleTabs(event, 'set', 'mainEditor')">Set Symbol</div>
<div class="tabOption mainEditor" onclick="toggleTabs(event, 'watermark', 'mainEditor')">Watermark</div>
</div>
<div class="tabContent mainEditor tabVisible" id="frame">
<div class="splitGrid">
<div id="framePicker" class="frameGrid"></div>
<div id="maskPicker"></div>
</div>
<div class="splitGrid">
<button onclick="addFrameToCardMaster()" class="button">Add</button>
<button onclick="addFrameToCardMaster(' - Right')" class="button">Add To Right Half</button>
</div>
<div id="selectedFramePreview">No frame selected</div>
<div id="cardMaster"></div>
</div>
<div class="tabContent mainEditor" id="text">
<div id="inputWhichTextTabs" class="textTab"></div>
<textarea class="textarea" id="inputText" placeholder="" oninput="updateText()"></textarea>
<input type="text" class="input text" placeholder="Mana Cost" id="inputManaCost" oninput="cardImageUpdated()" value="">
<div class="bar"></div>
<div class="title">How To Use Text Codes</div>
<div class="paragraph indent">
Remember to surround each code with curly brackets ("{" and "}"). The codes are not caps sensitive. The following is a list of available text codes and what they do:
</div>
<div id="textCodeTutorial"></div>
</div>
<div class="tabContent mainEditor" id="art">
<div class="splitGrid">
<div>
<input type="file" class="input file" accept="image/*" onchange="uploadImage(event, cardArt)" placeholder="Via File Upload">
<input type="text" class="input text" placeholder="Via URL" onchange="cardArt.src = 'https://cors-anywhere.herokuapp.com/' + this.value">
<input type="text" class="input text" id="inputCardArtName" onchange="inputCardArtName(this.value)" placeholder="Via Card Name">
<input type="number" class="input number" id="inputCardArtNameNumber" onchange="inputCardArtNameNumber(this.value)" value="" min="1" max="1" placeholder="Which Art From Card Name">
</div>
<div>
<div style="text-align: center; margin: 0.18em 0px">X, Y, &amp; Zoom:</div>
<input type="number" class="input number" value="0" id="inputCardArtX" oninput="cardImageUpdated()">
<input type="number" class="input number" value="0" id="inputCardArtY" oninput="cardImageUpdated()">
<input type="number" class="input number" value="100" step="0.1" min="0" id="inputCardArtZoom" oninput="cardImageUpdated()">
</div>
</div>
</div>
<div class="tabContent mainEditor" id="collector">
<div class="autoGrid">
<input type="text" class="input text" placeholder="Number" id="inputInfoNumber" oninput="updateBottomInfoCanvas()" value="">
<input type="text" class="input text" placeholder="Rarity" id="inputInfoRarity" oninput="updateBottomInfoCanvas()" value="P">
<input type="text" class="input text" placeholder="Set" id="inputInfoSet" oninput="updateBottomInfoCanvas()" value="MTG">
<input type="text" class="input text" placeholder="Language" id="inputInfoLanguage" oninput="updateBottomInfoCanvas()" value="EN">
<input type="text" class="input text" placeholder="Artist's Name" id="inputInfoArtist" oninput="updateBottomInfoCanvas()" value="">
</div>
</div>
<div class="tabContent mainEditor" id="set">
<div class="autoGrid">
<input type="file" class="input file" accept="image/*" onchange="uploadImage(event, setSymbol)" placeholder="Via File Upload">
<input type="text" class="input text" placeholder="Via URL" onchange="whiteToTransparent(setSymbol, 'https://cors-anywhere.herokuapp.com/' + this.value)">
<input type="text" class="input text" id="inputSetCode" placeholder="Via Set Code" onchange="whiteToTransparent(setSymbol, 'https://cors-anywhere.herokuapp.com/http://gatherer.wizards.com/Handlers/Image.ashx?type=symbol&set=' + this.value + '&size=large&rarity=' + document.getElementById('inputSetRarity').value)">
<input type="text" class="input text" id="inputSetRarity" placeholder="Rarity" onchange="whiteToTransparent(setSymbol, 'https://cors-anywhere.herokuapp.com/http://gatherer.wizards.com/Handlers/Image.ashx?type=symbol&set=' + document.getElementById('inputSetCode').value + '&size=large&rarity=' + this.value)">
<button class="button" onclick="randomSet()">Random</button>
</div>
</div>
<div class="tabContent mainEditor" id="watermark">
<div class="autoGrid">
<input type="file" class="input file" accept="image/*" onchange="uploadImage(event, watermark)" placeholder="Via File Upload">
<input type="text" class="input text" placeholder="Via URL" onchange="whiteToTransparent(watermark, 'https://cors-anywhere.herokuapp.com/' + this.value)">
<input type="text" class="input text" placeholder="Via Set Code" onchange="whiteToTransparent(watermark, 'https://cors-anywhere.herokuapp.com/http://gatherer.wizards.com/Handlers/Image.ashx?type=symbol&set=' + this.value + '&size=large')">
<select class="select" id="inputWatermarkPrimary" onchange="updateWatermark()">
<option value="none">None</option>
<option value="default">Default</option>
<option value="#ccc8b1" selected="selected">White</option>
<option value="#b0c3d5">Blue</option>
<option value="#b3b3b3">Black</option>
<option value="#ddac9b">Red</option>
<option value="#b9c8b5">Green</option>
<option value="#e4d49b">Gold</option>
<option value="#cfc8be">Artifact/Colorless</option>
</select>
<select class="select" id="inputWatermarkSecondary" onchange="updateWatermark()">
<option value="none">None</option>
<option value="default">Default</option>
<option value="#ccc8b1">White</option>
<option value="#b0c3d5">Blue</option>
<option value="#b3b3b3">Black</option>
<option value="#ddac9b">Red</option>
<option value="#b9c8b5">Green</option>
<option value="#e4d49b">Gold</option>
<option value="#cfc8be">Artifact/Colorless</option>
</select>
</div>
</div>
<!-- Card editor tabs end here! -->
<div class="bar"></div>
<div>
<div class="download">
<a onclick="downloadCardImage(this)" id="downloadCardImage" href="" target="_blank" download="card.png">Download</a>
</div>
</div>
</div>
</div>
<div class="hidden"></div>
<div class="layer">
<div class="title">Welcome to Card Conjurer!</div>
<div class="paragraph indent">Card Conjurer is a free program that helps you create custom Magic: The Gathering cards. There are already plenty of custom card makers out there, but what sets Card Conjurer apart from the rest is its live-edit capabilities. You can immediatly see the effects of any change you make, which makes card customization easier and overall a better experience.</div>
</div>
<div class="layer">
<div class="title">About Me</div>
<div class="paragraph indent">
Hi! My name is Kyle Burton and I am currently a high school student. I used to play Pokemon, but when a friend introduced me to Magic in 2013 I sold my pocket monsters and bought an M14 Intro Pack. Ever since that day Magic has been my all time favorite game. In addition to playing games, I've always <a href="https://www.youtube.com/watch?v=ERCzN91JicA" target="blank">loved technology</a>. During the 2017-18 school year I tought myself how to code Javascript, and a little bit of HTML and CSS. The following summer I created Kyle's Card Imager (<a href="https://scryfall.com/card/5dn/134/krark-clan-ironworks" target="blank">KCI</a>). It was pretty simple but I soon began to add more border images like Miracle or Nyx. After a few months I decided to share my creation, so I renamed it Card Conjurer and uploaded it to Github, and then in April of 2019 I bought the domain <a href="#" onclick="alert('You\'re already there, silly!')">cardconjurer.com</a>.
</div>
</div>
<div class="layer">
<div class="title">Want More Customization?</div>
<!-- <div class="paragraph indent">
If you'd like to try out some more frames, scroll to the bottom of this page and check the box next to "Advanced Borders" - CardConjurer.com will remember this setting, so you only need to do this once per device.
</div> -->
<div class="paragraph indent">
This version of the website is currently a work in progress, so it doesn't have all the features the original Card Conjurer had. If you'd like to go back to the old version, <a href="old/index.html">click here</a>.
</div>
</div>
<div class="layer">
<div class="title">Have Any Questions?</div>
<div class="paragraph indent">
If you have any questions please don't hesitate to email me at: <div class="truncate"><a href="https://mail.google.com/mail/u/0/?view=cm&fs=1&to=CardConjurerMTG@gmail.com&su=Card%20Conjurer&tf=1" target="_blank">CardConjurerMTG@gmail.com</a></div>Even if you made a cool card and want to share, I'd love to see it!
</div>
</div>
</div>
</body>
<footer>
<div class="footerGrid">
<div>
Card Conjurer By Kyle Burton<br>
</div>
<div>
Navigation:<br>
<a href="index.html">Card Creator</a><br>
<a href="life.html">Life Counter</a>
</div>
<div>
Legal:<br>
<a href="disclaimer.html">Disclaimer</a><br>
<a href="termsOfUse.html">Terms of Use</a>
</div>
</div>
</footer>
<script async src="data/scripts/sortable.js"></script>
<script async src="data/scripts/setCodeList.js"></script>
<script defer src="data/scripts/main.js"></script>
<script defer src="data/scripts/colors.js"></script>
<html>