dnd-character-sheets
Version:
Dungeons and Dragons 5th Edition character sheets created in ReactJS.
1,573 lines (1,469 loc) • 58 kB
JavaScript
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
var React = _interopDefault(require('react'));
require('bootstrap/dist/css/bootstrap.css');
var DnDCharacter = function DnDCharacter() {};
function _inheritsLoose(subClass, superClass) {
subClass.prototype = Object.create(superClass.prototype);
subClass.prototype.constructor = subClass;
_setPrototypeOf(subClass, superClass);
}
function _setPrototypeOf(o, p) {
_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {
o.__proto__ = p;
return o;
};
return _setPrototypeOf(o, p);
}
function StatBox(props) {
var classes = 'd-and-d-statbox';
if (props.classes) {
classes += ' ' + props.classes;
}
var modifier = '';
if (props.value && !isNaN(Number(props.value))) {
var modifierNum = Math.floor((Number(props.value) - 10) / 2);
if (modifierNum > 0) {
modifier = '+' + modifierNum;
} else {
modifier = modifierNum.toString();
}
}
return React.createElement("div", null, React.createElement("div", {
className: classes
}, React.createElement("label", null, props.label), React.createElement("div", {
className: 'd-and-d-statbox-modifier'
}, modifier)), React.createElement("div", {
className: 'd-and-d-statbox-value'
}, React.createElement("input", {
type: 'text',
value: props.value ? props.value : '',
onChange: function onChange(e) {
return props.onChange(props.name, e.target.value);
}
})));
}
function StatRow(props) {
var classes = 'd-and-d-statrow';
if (props.classes) {
classes += ' ' + props.classes;
}
return React.createElement("div", {
className: classes
}, React.createElement("div", {
className: 'd-and-d-statrow-value'
}, React.createElement("input", {
type: 'text',
value: props.value ? props.value : '',
onChange: function onChange(e) {
return props.onChange(props.name, e.target.value);
}
})), React.createElement("div", {
className: 'd-and-d-statrow-label'
}, React.createElement("label", null, props.label)));
}
function Skill(props) {
var classes = 'd-and-d-skill';
if (props.classes) {
classes += ' ' + props.classes;
}
return React.createElement("div", {
className: classes
}, React.createElement("div", {
className: props.checked ? 'd-and-d-skill-circle active' : 'd-and-d-skill-circle',
onClick: function onClick() {
return props.onChange(props.name + 'Checked', !props.checked);
}
}), React.createElement("input", {
type: 'text',
value: props.value ? props.value : '',
onChange: function onChange(e) {
return props.onChange(props.name, e.target.value);
}
}), React.createElement("label", null, props.label), props.hint ? React.createElement("span", {
className: 'd-and-d-skill-hint'
}, props.hint) : null);
}
function StatBox2(props) {
var classes = 'd-and-d-statbox type2';
if (props.classes) {
classes += ' ' + props.classes;
}
return React.createElement("div", null, React.createElement("div", {
className: classes
}, React.createElement("div", {
className: 'd-and-d-statbox-modifier'
}, React.createElement("input", {
type: 'text',
value: props.value ? props.value : '',
onChange: function onChange(e) {
return props.onChange(props.name, e.target.value);
}
})), props.labelTop != null ? React.createElement("div", null, React.createElement("label", {
className: 'label-top'
}, props.labelTop)) : null, props.label != null ? React.createElement("div", null, React.createElement("label", null, props.label)) : null));
}
function DeathSave(props) {
var classes = 'd-and-d-deathsave';
if (props.classes) {
classes += ' ' + props.classes;
}
return React.createElement("div", {
className: classes
}, React.createElement("label", null, props.label), React.createElement("div", {
style: {
display: 'inline-block'
}
}, React.createElement("div", {
className: props.value && props.value >= 1 ? 'd-and-d-skill-circle active' : 'd-and-d-skill-circle',
onClick: function onClick() {
return props.onChange(props.name, props.value === 1 ? null : 1);
}
}), "=", React.createElement("div", {
className: props.value && props.value >= 2 ? 'd-and-d-skill-circle active' : 'd-and-d-skill-circle',
onClick: function onClick() {
return props.onChange(props.name, props.value === 2 ? null : 2);
}
}), "=", React.createElement("div", {
className: props.value && props.value >= 3 ? 'd-and-d-skill-circle active' : 'd-and-d-skill-circle',
onClick: function onClick() {
return props.onChange(props.name, props.value === 3 ? null : 3);
}
})));
}
function AttackTable(props) {
function updateValue(index, field, v) {
var value = getValue().slice();
value[index][field] = v;
props.onChange(props.name, value);
}
function getValue() {
var value = props.value;
if (!value) {
value = [];
}
while (value.length < props.rows) {
value.push({});
}
return value;
}
var classes = 'd-and-d-table';
if (props.classes) {
classes += ' ' + props.classes;
}
return React.createElement("table", {
className: classes
}, React.createElement("thead", null, React.createElement("tr", null, React.createElement("th", null, "Name"), React.createElement("th", {
style: {
width: '70px'
}
}, "Atk Bonus"), React.createElement("th", null, "Damage/Type"))), React.createElement("tbody", null, getValue().map(function (v, index) {
return React.createElement("tr", {
key: 'd-and-d-table-row-' + props.name + index
}, React.createElement("td", null, React.createElement("input", {
type: 'text',
value: v.name ? v.name : '',
onChange: function onChange(e) {
return updateValue(index, 'name', e.target.value);
}
})), React.createElement("td", null, React.createElement("input", {
type: 'text',
value: v.bonus ? v.bonus : '',
onChange: function onChange(e) {
return updateValue(index, 'bonus', e.target.value);
}
})), React.createElement("td", null, React.createElement("input", {
type: 'text',
value: v.damage ? v.damage : '',
onChange: function onChange(e) {
return updateValue(index, 'damage', e.target.value);
}
})));
})));
}
function Currency(props) {
var classes = 'd-and-d-currency';
if (props.classes) {
classes += ' ' + props.classes;
}
return React.createElement("div", {
className: classes
}, React.createElement("div", {
className: 'd-and-d-currency-label'
}, React.createElement("label", null, props.label)), React.createElement("div", {
className: 'd-and-d-currency-value'
}, React.createElement("input", {
type: 'text',
value: props.value ? props.value : '',
onChange: function onChange(e) {
return props.onChange(props.name, e.target.value);
}
})));
}
var initialState = {
character: {}
};
var DnDCharacterStatsSheet = /*#__PURE__*/function (_React$Component) {
_inheritsLoose(DnDCharacterStatsSheet, _React$Component);
function DnDCharacterStatsSheet(props) {
var _this;
_this = _React$Component.call(this, props) || this;
if (props.defaultCharacter) {
initialState.character = props.defaultCharacter;
}
_this.state = initialState;
return _this;
}
var _proto = DnDCharacterStatsSheet.prototype;
_proto.updateCharacter = function updateCharacter(name, value) {
var oldCharacter = this.getCharacter();
var newCharacter = {};
Object.assign(newCharacter, oldCharacter);
newCharacter[name] = value;
if (!this.props.character) {
this.setState({
character: newCharacter
});
}
if (typeof this.props.onCharacterChanged === 'function') {
this.props.onCharacterChanged(newCharacter, name, value);
}
};
_proto.getCharacter = function getCharacter() {
var character = this.state.character;
if (this.props.character) {
character = this.props.character;
}
return character;
};
_proto.render = function render() {
var _this2 = this;
var character = this.getCharacter();
return React.createElement("div", {
className: 'd-and-d-character-sheet container-xl mt-5 mb-5'
}, React.createElement("div", null, React.createElement("div", {
className: 'row mb-4'
}, React.createElement("div", {
className: 'col-md-3 pr-2 pl-2'
}, React.createElement("div", {
className: 'd-and-d-page-title'
}, "D&D"), React.createElement("div", {
className: 'd-and-d-attribute-collection char-name pr-3 pl-3'
}, React.createElement("input", {
type: 'text',
value: character.name ? character.name : '',
onChange: function onChange(e) {
return _this2.updateCharacter('name', e.target.value);
}
})), React.createElement("label", {
style: {
width: '100%',
textAlign: 'right',
textTransform: 'uppercase',
fontSize: '11px'
}
}, "Character Name")), React.createElement("div", {
className: 'col-md-9 pr-2 pl-2'
}, React.createElement("div", {
className: 'd-and-d-attribute-collection pr-3 pl-3'
}, React.createElement("div", {
className: 'row pl-3 pr-3'
}, React.createElement("div", {
className: 'col-md-3 col-6 pl-0 pr-0'
}, React.createElement("input", {
type: 'text',
value: character.classLevel ? character.classLevel : '',
onChange: function onChange(e) {
return _this2.updateCharacter('classLevel', e.target.value);
}
}), React.createElement("label", null, "Class & Level")), React.createElement("div", {
className: 'col-md-3 col-6 pl-0 pr-0'
}, React.createElement("input", {
type: 'text',
value: character.background ? character.background : '',
onChange: function onChange(e) {
return _this2.updateCharacter('background', e.target.value);
}
}), React.createElement("label", null, "Background")), React.createElement("div", {
className: 'col-md-3 col-6 pl-0 pr-0'
}, React.createElement("input", {
type: 'text',
value: character.playerName ? character.playerName : '',
onChange: function onChange(e) {
return _this2.updateCharacter('playerName', e.target.value);
}
}), React.createElement("label", null, "Player Name")), React.createElement("div", {
className: 'col-md-3 col-6 pl-0 pr-0'
}, React.createElement("input", {
type: 'text',
value: character.faction ? character.faction : '',
onChange: function onChange(e) {
return _this2.updateCharacter('faction', e.target.value);
}
}), React.createElement("label", null, "Faction"))), React.createElement("div", {
className: 'row pl-3 pr-3'
}, React.createElement("div", {
className: 'col-md-3 col-6 pl-0 pr-0'
}, React.createElement("input", {
type: 'text',
value: character.race ? character.race : '',
onChange: function onChange(e) {
return _this2.updateCharacter('race', e.target.value);
}
}), React.createElement("label", null, "Race")), React.createElement("div", {
className: 'col-md-3 col-6 pl-0 pr-0'
}, React.createElement("input", {
type: 'text',
value: character.alignment ? character.alignment : '',
onChange: function onChange(e) {
return _this2.updateCharacter('alignment', e.target.value);
}
}), React.createElement("label", null, "Alignment")), React.createElement("div", {
className: 'col-md-3 col-6 pl-0 pr-0'
}, React.createElement("input", {
type: 'text',
value: character.xp ? character.xp : '',
onChange: function onChange(e) {
return _this2.updateCharacter('xp', e.target.value);
}
}), React.createElement("label", null, "Experience Points")), React.createElement("div", {
className: 'col-md-3 col-6 pl-0 pr-0'
}, React.createElement("input", {
type: 'text',
value: character.dciNo ? character.dciNo : '',
onChange: function onChange(e) {
return _this2.updateCharacter('dciNo', e.target.value);
}
}), React.createElement("label", null, "DCI Number")))))), React.createElement("div", {
className: 'row'
}, React.createElement("div", {
className: 'col-md-4'
}, React.createElement("div", {
className: 'row'
}, React.createElement("div", {
className: 'col-4 pr-1'
}, React.createElement("div", {
className: 'd-and-d-box gray'
}, React.createElement(StatBox, {
label: 'Strength',
name: 'str',
value: character.str,
onChange: function onChange(name, value) {
_this2.updateCharacter(name, value);
}
}), React.createElement(StatBox, {
label: 'Dexterity',
name: 'dex',
value: character.dex,
onChange: function onChange(name, value) {
_this2.updateCharacter(name, value);
}
}), React.createElement(StatBox, {
label: 'Constitution',
name: 'con',
value: character.con,
onChange: function onChange(name, value) {
_this2.updateCharacter(name, value);
}
}), React.createElement(StatBox, {
label: 'Intelligence',
name: 'int',
value: character["int"],
onChange: function onChange(name, value) {
_this2.updateCharacter(name, value);
}
}), React.createElement(StatBox, {
label: 'Wisdom',
name: 'wis',
value: character.wis,
onChange: function onChange(name, value) {
_this2.updateCharacter(name, value);
}
}), React.createElement(StatBox, {
label: 'Charisma',
name: 'cha',
value: character.cha,
onChange: function onChange(name, value) {
_this2.updateCharacter(name, value);
}
}))), React.createElement("div", {
className: 'col-8'
}, React.createElement(StatRow, {
label: 'Inspiration',
name: 'inspiration',
value: character.inspiration,
onChange: function onChange(name, value) {
_this2.updateCharacter(name, value);
}
}), React.createElement(StatRow, {
classes: 'rounded',
label: 'Proficiency Bonus',
name: 'proficiencyBonus',
value: character.proficiencyBonus,
onChange: function onChange(name, value) {
_this2.updateCharacter(name, value);
}
}), React.createElement("div", {
className: 'd-and-d-box'
}, React.createElement("div", {
style: {
textAlign: 'left'
}
}, React.createElement(Skill, {
label: 'Strength',
name: 'strSave',
value: character.strSave,
checked: character.strSaveChecked,
onChange: function onChange(name, value) {
_this2.updateCharacter(name, value);
}
}), React.createElement(Skill, {
label: 'Dexterity',
name: 'dexSave',
value: character.dexSave,
checked: character.dexSaveChecked,
onChange: function onChange(name, value) {
_this2.updateCharacter(name, value);
}
}), React.createElement(Skill, {
label: 'Constitution',
name: 'conSave',
value: character.conSave,
checked: character.conSaveChecked,
onChange: function onChange(name, value) {
_this2.updateCharacter(name, value);
}
}), React.createElement(Skill, {
label: 'Intelligence',
name: 'intSave',
value: character.intSave,
checked: character.intSaveChecked,
onChange: function onChange(name, value) {
_this2.updateCharacter(name, value);
}
}), React.createElement(Skill, {
label: 'Wisdom',
name: 'wisSave',
value: character.wisSave,
checked: character.wisSaveChecked,
onChange: function onChange(name, value) {
_this2.updateCharacter(name, value);
}
}), React.createElement(Skill, {
label: 'Charisma',
name: 'chaSave',
value: character.chaSave,
checked: character.chaSaveChecked,
onChange: function onChange(name, value) {
_this2.updateCharacter(name, value);
}
})), React.createElement("label", {
className: 'd-and-d-title',
style: {
marginTop: '10px'
}
}, "Saving Throws")), React.createElement("div", {
className: 'd-and-d-box'
}, React.createElement("div", {
style: {
textAlign: 'left'
}
}, React.createElement(Skill, {
label: 'Acrobatics',
hint: '(Dex)',
name: 'skillAcrobatics',
value: character.skillAcrobatics,
checked: character.skillAcrobaticsChecked,
onChange: function onChange(name, value) {
_this2.updateCharacter(name, value);
}
}), React.createElement(Skill, {
label: 'Animal Handling',
hint: '(Wis)',
name: 'skillAnimalHandling',
value: character.skillAnimalHandling,
checked: character.skillAnimalHandlingChecked,
onChange: function onChange(name, value) {
_this2.updateCharacter(name, value);
}
}), React.createElement(Skill, {
label: 'Arcana',
hint: '(Int)',
name: 'skillArcana',
value: character.skillArcana,
checked: character.skillArcanaChecked,
onChange: function onChange(name, value) {
_this2.updateCharacter(name, value);
}
}), React.createElement(Skill, {
label: 'Athletics',
hint: '(Str)',
name: 'skillAthletics',
value: character.skillAthletics,
checked: character.skillAthleticsChecked,
onChange: function onChange(name, value) {
_this2.updateCharacter(name, value);
}
}), React.createElement(Skill, {
label: 'Deception',
hint: '(Cha)',
name: 'skillDeception',
value: character.skillDeception,
checked: character.skillDeceptionChecked,
onChange: function onChange(name, value) {
_this2.updateCharacter(name, value);
}
}), React.createElement(Skill, {
label: 'History',
hint: '(Int)',
name: 'skillHistory',
value: character.skillHistory,
checked: character.skillHistoryChecked,
onChange: function onChange(name, value) {
_this2.updateCharacter(name, value);
}
}), React.createElement(Skill, {
label: 'Insight',
hint: '(Wis)',
name: 'skillInsight',
value: character.skillInsight,
checked: character.skillInsightChecked,
onChange: function onChange(name, value) {
_this2.updateCharacter(name, value);
}
}), React.createElement(Skill, {
label: 'Intimidation',
hint: '(Cha)',
name: 'skillIntimidation',
value: character.skillIntimidation,
checked: character.skillIntimidationChecked,
onChange: function onChange(name, value) {
_this2.updateCharacter(name, value);
}
}), React.createElement(Skill, {
label: 'Investigation',
hint: '(Int)',
name: 'skillInvestigation',
value: character.skillInvestigation,
checked: character.skillInvestigationChecked,
onChange: function onChange(name, value) {
_this2.updateCharacter(name, value);
}
}), React.createElement(Skill, {
label: 'Medicine',
hint: '(Wis)',
name: 'skillMedicine',
value: character.skillMedicine,
checked: character.skillMedicineChecked,
onChange: function onChange(name, value) {
_this2.updateCharacter(name, value);
}
}), React.createElement(Skill, {
label: 'Nature',
hint: '(Int)',
name: 'skillNature',
value: character.skillNature,
checked: character.skillNatureChecked,
onChange: function onChange(name, value) {
_this2.updateCharacter(name, value);
}
}), React.createElement(Skill, {
label: 'Perception',
hint: '(Wis)',
name: 'skillPerception',
value: character.skillPerception,
checked: character.skillPerceptionChecked,
onChange: function onChange(name, value) {
_this2.updateCharacter(name, value);
}
}), React.createElement(Skill, {
label: 'Performance',
hint: '(Cha)',
name: 'skillPerformance',
value: character.skillPerformance,
checked: character.skillPerformanceChecked,
onChange: function onChange(name, value) {
_this2.updateCharacter(name, value);
}
}), React.createElement(Skill, {
label: 'Persuasion',
hint: '(Cha)',
name: 'skillPersuasion',
value: character.skillPersuasion,
checked: character.skillPersuasionChecked,
onChange: function onChange(name, value) {
_this2.updateCharacter(name, value);
}
}), React.createElement(Skill, {
label: 'Religion',
hint: '(Int)',
name: 'skillReligion',
value: character.skillReligion,
checked: character.skillReligionChecked,
onChange: function onChange(name, value) {
_this2.updateCharacter(name, value);
}
}), React.createElement(Skill, {
label: 'Sleight of Hand',
hint: '(Dex)',
name: 'skillSlightOfHand',
value: character.skillSlightOfHand,
checked: character.skillSlightOfHandChecked,
onChange: function onChange(name, value) {
_this2.updateCharacter(name, value);
}
}), React.createElement(Skill, {
label: 'Stealth',
hint: '(Dex)',
name: 'skillStealth',
value: character.skillStealth,
checked: character.skillStealthChecked,
onChange: function onChange(name, value) {
_this2.updateCharacter(name, value);
}
}), React.createElement(Skill, {
label: 'Survival',
hint: '(Wis)',
name: 'skillSurvival',
value: character.skillSurvival,
checked: character.skillSurvivalChecked,
onChange: function onChange(name, value) {
_this2.updateCharacter(name, value);
}
})), React.createElement("label", {
className: 'd-and-d-title',
style: {
marginTop: '10px'
}
}, "Skills")))), React.createElement("div", {
className: 'mt-2'
}, React.createElement(StatRow, {
classes: 'rounded rounded-sides',
label: 'Passive Wisdom (Perception)',
name: 'passivePerception',
value: character.passivePerception,
onChange: function onChange(name, value) {
_this2.updateCharacter(name, value);
}
})), React.createElement("div", {
className: 'd-and-d-box mt-4'
}, React.createElement("textarea", {
value: character.otherProficiencies ? character.otherProficiencies : '',
onChange: function onChange(e) {
return _this2.updateCharacter('otherProficiencies', e.target.value);
},
rows: 12
}), React.createElement("label", {
className: 'd-and-d-title',
style: {
marginTop: '10px'
}
}, "Other Proficiencies & Languages"))), React.createElement("div", {
className: 'col-md-4'
}, React.createElement("div", {
className: 'd-and-d-box gray'
}, React.createElement("div", {
className: 'row'
}, React.createElement("div", {
className: 'col-4 pr-2'
}, React.createElement(StatBox2, {
classes: 'shield',
labelTop: 'Armour',
label: 'Class',
name: 'ac',
value: character.ac,
onChange: function onChange(name, value) {
_this2.updateCharacter(name, value);
}
})), React.createElement("div", {
className: 'col-4 pr-2 pl-2'
}, React.createElement(StatBox2, {
label: 'Initiative',
name: 'init',
value: character.init,
onChange: function onChange(name, value) {
_this2.updateCharacter(name, value);
}
})), React.createElement("div", {
className: 'col-4 pl-2'
}, React.createElement(StatBox2, {
label: 'Speed',
name: 'speed',
value: character.speed,
onChange: function onChange(name, value) {
_this2.updateCharacter(name, value);
}
}))), React.createElement("div", {
className: 'd-and-d-box white',
style: {
borderRadius: '8px 8px 0 0',
marginBottom: '5px',
paddingBottom: '5px'
}
}, React.createElement("div", {
className: 'd-and-d-gray-text'
}, React.createElement("label", {
style: {
width: '95px'
}
}, "Hit Point Maximum"), React.createElement("input", {
type: 'text',
style: {
width: 'calc(100% - 95px)'
},
className: 'd-and-d-linput',
value: character.maxHp ? character.maxHp : '',
onChange: function onChange(e) {
return _this2.updateCharacter('maxHp', e.target.value);
}
})), React.createElement("input", {
type: 'text',
className: 'd-and-d-cinput',
value: character.hp ? character.hp : '',
onChange: function onChange(e) {
return _this2.updateCharacter('hp', e.target.value);
}
}), React.createElement("label", {
className: 'd-and-d-title',
style: {
marginTop: '5px'
}
}, "Current Hit Points")), React.createElement("div", {
className: 'd-and-d-box white mb-2',
style: {
borderRadius: '0 0 8px 8px',
paddingBottom: '5px'
}
}, React.createElement("input", {
type: 'text',
className: 'd-and-d-cinput',
value: character.tempHp ? character.tempHp : '',
onChange: function onChange(e) {
return _this2.updateCharacter('tempHp', e.target.value);
}
}), React.createElement("label", {
className: 'd-and-d-title',
style: {
marginTop: '5px'
}
}, "Temporary Hit Points")), React.createElement("div", {
className: 'row mt-1'
}, React.createElement("div", {
className: 'col-6 pr-1'
}, React.createElement("div", {
className: 'd-and-d-box white mb-0',
style: {
paddingBottom: '5px'
}
}, React.createElement("div", {
className: 'd-and-d-gray-text'
}, React.createElement("label", {
style: {
width: '25px'
}
}, "Total"), React.createElement("input", {
type: 'text',
style: {
width: 'calc(100% - 25px)'
},
className: 'd-and-d-linput',
value: character.hitDiceMax ? character.hitDiceMax : '',
onChange: function onChange(e) {
return _this2.updateCharacter('hitDiceMax', e.target.value);
}
})), React.createElement("input", {
type: 'text',
className: 'd-and-d-cinput',
value: character.hitDice ? character.hitDice : '',
onChange: function onChange(e) {
return _this2.updateCharacter('hitDice', e.target.value);
}
}), React.createElement("label", {
className: 'd-and-d-title',
style: {
marginTop: '5px'
}
}, "Hit Dice"))), React.createElement("div", {
className: 'col-6 pl-1'
}, React.createElement("div", {
className: 'd-and-d-box white mb-0',
style: {
paddingBottom: '5px'
}
}, React.createElement(DeathSave, {
classes: 'd-and-d-save-success',
label: 'Successes',
name: 'deathsaveSuccesses',
value: character.deathsaveSuccesses,
onChange: function onChange(name, value) {
_this2.updateCharacter(name, value);
}
}), React.createElement(DeathSave, {
classes: 'd-and-d-save-failure',
label: 'Failures',
name: 'deathsaveFailures',
value: character.deathsaveFailures,
onChange: function onChange(name, value) {
_this2.updateCharacter(name, value);
}
}), React.createElement("label", {
className: 'd-and-d-title',
style: {
marginTop: '6px'
}
}, "Death Saves"))))), React.createElement("div", {
className: 'd-and-d-box mt-3'
}, React.createElement(AttackTable, {
rows: 3,
name: 'attacks',
value: character.attacks,
onChange: function onChange(name, value) {
_this2.updateCharacter(name, value);
}
}), React.createElement("textarea", {
value: character.attacksText ? character.attacksText : '',
onChange: function onChange(e) {
return _this2.updateCharacter('attacksText', e.target.value);
},
rows: 6
}), React.createElement("label", {
className: 'd-and-d-title',
style: {
marginTop: '10px'
}
}, "Attacks & Spellcasting")), React.createElement("div", {
className: 'd-and-d-box mt-4'
}, React.createElement("div", {
className: 'row'
}, React.createElement("div", {
className: '',
style: {
width: '100px'
}
}, React.createElement(Currency, {
label: 'CP',
name: 'cp',
value: character.cp,
onChange: function onChange(name, value) {
_this2.updateCharacter(name, value);
}
}), React.createElement(Currency, {
label: 'SP',
name: 'sp',
value: character.sp,
onChange: function onChange(name, value) {
_this2.updateCharacter(name, value);
}
}), React.createElement(Currency, {
label: 'EP',
name: 'ep',
value: character.ep,
onChange: function onChange(name, value) {
_this2.updateCharacter(name, value);
}
}), React.createElement(Currency, {
label: 'GP',
name: 'gp',
value: character.gp,
onChange: function onChange(name, value) {
_this2.updateCharacter(name, value);
}
}), React.createElement(Currency, {
label: 'PP',
name: 'pp',
value: character.pp,
onChange: function onChange(name, value) {
_this2.updateCharacter(name, value);
}
})), React.createElement("div", {
className: 'col'
}, React.createElement("textarea", {
className: 'd-and-d-equipment-indent',
value: character.equipment ? character.equipment : '',
onChange: function onChange(e) {
return _this2.updateCharacter('equipment', e.target.value);
},
rows: 10
})), React.createElement("div", {
className: 'col-md-12'
}, React.createElement("textarea", {
value: character.equipment2 ? character.equipment2 : '',
onChange: function onChange(e) {
return _this2.updateCharacter('equipment2', e.target.value);
},
rows: 4
}))), React.createElement("label", {
className: 'd-and-d-title',
style: {
marginTop: '10px'
}
}, "Equipment"))), React.createElement("div", {
className: 'col-md-4'
}, React.createElement("div", {
className: 'd-and-d-box gray',
style: {
marginBottom: '17px'
}
}, React.createElement("div", {
className: 'd-and-d-box white',
style: {
borderRadius: '8px 8px 0 0',
marginBottom: '5px',
paddingTop: '1px',
paddingBottom: '5px'
}
}, React.createElement("textarea", {
value: character.personalityTraits ? character.personalityTraits : '',
onChange: function onChange(e) {
return _this2.updateCharacter('personalityTraits', e.target.value);
},
rows: 3
}), React.createElement("label", {
className: 'd-and-d-title'
}, "Personality Traits")), React.createElement("div", {
className: 'd-and-d-box white',
style: {
borderRadius: '0 0 0 0',
marginBottom: '5px',
paddingTop: '1px',
paddingBottom: '5px'
}
}, React.createElement("textarea", {
value: character.ideals ? character.ideals : '',
onChange: function onChange(e) {
return _this2.updateCharacter('ideals', e.target.value);
},
rows: 3
}), React.createElement("label", {
className: 'd-and-d-title'
}, "Ideals")), React.createElement("div", {
className: 'd-and-d-box white',
style: {
borderRadius: '0 0 0 0',
marginBottom: '5px',
paddingTop: '1px',
paddingBottom: '5px'
}
}, React.createElement("textarea", {
value: character.bonds ? character.bonds : '',
onChange: function onChange(e) {
return _this2.updateCharacter('bonds', e.target.value);
},
rows: 2
}), React.createElement("label", {
className: 'd-and-d-title'
}, "Bonds")), React.createElement("div", {
className: 'd-and-d-box white',
style: {
borderRadius: '0 0 8px 8px',
marginBottom: '0px',
paddingTop: '1px',
paddingBottom: '4px'
}
}, React.createElement("textarea", {
value: character.flaws ? character.flaws : '',
onChange: function onChange(e) {
return _this2.updateCharacter('flaws', e.target.value);
},
rows: 2
}), React.createElement("label", {
className: 'd-and-d-title'
}, "Flaws"))), React.createElement("div", {
className: 'd-and-d-box mt-3'
}, React.createElement("textarea", {
style: {
paddingBottom: '5px'
},
value: character.featuresTraits ? character.featuresTraits : '',
onChange: function onChange(e) {
return _this2.updateCharacter('featuresTraits', e.target.value);
},
rows: 27
}), React.createElement("label", {
className: 'd-and-d-title',
style: {
marginTop: '10px'
}
}, "Features & Traits"))))));
};
return DnDCharacterStatsSheet;
}(React.Component);
function Image(props) {
function importImage(event) {
console.log(event);
if (event.target.files.length > 0) {
console.log(event.target.files);
if (event.target.files[0].size > 2000000) {
window.alert('Image is too large. Max size is 2 Mb. Please reduce the size and upload again.');
return;
}
var fr = new FileReader();
fr.onload = function (e) {
if (e.target && e.target.result && typeof e.target.result === 'string') {
props.onChange(props.name, e.target.result);
}
};
fr.readAsDataURL(event.target.files[0]);
}
}
var classes = 'd-and-d-image';
if (props.classes) {
classes += ' ' + props.classes;
}
var elementId = 'd-and-d-image-' + props.name;
return React.createElement("div", {
className: classes,
style: {
backgroundImage: props.value ? 'url(' + props.value + ')' : ''
},
onClick: function onClick() {
var _document$getElementB;
return (_document$getElementB = document.getElementById(elementId)) === null || _document$getElementB === void 0 ? void 0 : _document$getElementB.click();
}
}, React.createElement("input", {
style: {
display: 'none'
},
type: 'file',
id: elementId,
accept: 'image/*',
onChange: function onChange(e) {
return importImage(e);
}
}));
}
var initialState$1 = {
character: {}
};
var DnDCharacterProfileSheet = /*#__PURE__*/function (_React$Component) {
_inheritsLoose(DnDCharacterProfileSheet, _React$Component);
function DnDCharacterProfileSheet(props) {
var _this;
_this = _React$Component.call(this, props) || this;
if (props.defaultCharacter) {
initialState$1.character = props.defaultCharacter;
}
_this.state = initialState$1;
return _this;
}
var _proto = DnDCharacterProfileSheet.prototype;
_proto.updateCharacter = function updateCharacter(name, value) {
var oldCharacter = this.getCharacter();
var newCharacter = {};
Object.assign(newCharacter, oldCharacter);
newCharacter[name] = value;
if (!this.props.character) {
this.setState({
character: newCharacter
});
}
if (typeof this.props.onCharacterChanged === 'function') {
this.props.onCharacterChanged(newCharacter, name, value);
}
};
_proto.getCharacter = function getCharacter() {
var character = this.state.character;
if (this.props.character) {
character = this.props.character;
}
return character;
};
_proto.render = function render() {
var _this2 = this;
var character = this.getCharacter();
return React.createElement("div", {
className: 'd-and-d-character-sheet container-xl mt-5 mb-5'
}, React.createElement("div", null, React.createElement("div", {
className: 'row mb-4'
}, React.createElement("div", {
className: 'col-md-3 pr-2 pl-2'
}, React.createElement("div", {
className: 'd-and-d-page-title'
}, "D&D"), React.createElement("div", {
className: 'd-and-d-attribute-collection char-name pr-3 pl-3'
}, React.createElement("input", {
type: 'text',
value: character.name ? character.name : '',
onChange: function onChange(e) {
return _this2.updateCharacter('name', e.target.value);
}
})), React.createElement("label", {
style: {
width: '100%',
textAlign: 'right',
textTransform: 'uppercase',
fontSize: '11px'
}
}, "Character Name")), React.createElement("div", {
className: 'col-md-9 pr-2 pl-2'
}, React.createElement("div", {
className: 'd-and-d-attribute-collection pr-3 pl-3'
}, React.createElement("div", {
className: 'row pl-3 pr-3'
}, React.createElement("div", {
className: 'col-md-4 col-6 pl-0 pr-0'
}, React.createElement("input", {
type: 'text',
value: character.age ? character.age : '',
onChange: function onChange(e) {
return _this2.updateCharacter('age', e.target.value);
}
}), React.createElement("label", null, "Age")), React.createElement("div", {
className: 'col-md-4 col-6 pl-0 pr-0'
}, React.createElement("input", {
type: 'text',
value: character.height ? character.height : '',
onChange: function onChange(e) {
return _this2.updateCharacter('height', e.target.value);
}
}), React.createElement("label", null, "Height")), React.createElement("div", {
className: 'col-md-4 col-6 pl-0 pr-0'
}, React.createElement("input", {
type: 'text',
value: character.weight ? character.weight : '',
onChange: function onChange(e) {
return _this2.updateCharacter('weight', e.target.value);
}
}), React.createElement("label", null, "Weight"))), React.createElement("div", {
className: 'row pl-3 pr-3'
}, React.createElement("div", {
className: 'col-md-4 col-6 pl-0 pr-0'
}, React.createElement("input", {
type: 'text',
value: character.eyes ? character.eyes : '',
onChange: function onChange(e) {
return _this2.updateCharacter('eyes', e.target.value);
}
}), React.createElement("label", null, "Eyes")), React.createElement("div", {
className: 'col-md-4 col-6 pl-0 pr-0'
}, React.createElement("input", {
type: 'text',
value: character.skin ? character.skin : '',
onChange: function onChange(e) {
return _this2.updateCharacter('skin', e.target.value);
}
}), React.createElement("label", null, "Skin")), React.createElement("div", {
className: 'col-md-4 col-6 pl-0 pr-0'
}, React.createElement("input", {
type: 'text',
value: character.hair ? character.hair : '',
onChange: function onChange(e) {
return _this2.updateCharacter('hair', e.target.value);
}
}), React.createElement("label", null, "Hair")))))), React.createElement("div", {
className: 'row'
}, React.createElement("div", {
className: 'col-md-4'
}, React.createElement("div", {
className: 'd-and-d-box square'
}, React.createElement(Image, {
name: 'appearance',
value: character.appearance,
onChange: function onChange(name, value) {
_this2.updateCharacter(name, value);
}
}), React.createElement("label", {
className: 'd-and-d-title',
style: {
marginTop: '10px'
}
}, "Character Appearance")), React.createElement("div", {
className: 'd-and-d-box mt-3'
}, React.createElement("textarea", {
style: {
paddingBottom: '5px'
},
value: character.backstory ? character.backstory : '',
onChange: function onChange(e) {
return _this2.updateCharacter('backstory', e.target.value);
},
rows: 26
}), React.createElement("label", {
className: 'd-and-d-title',
style: {
marginTop: '10px'
}
}, "Character Backstory"))), React.createElement("div", {
className: 'col-md-8'
}, React.createElement("div", {
className: 'd-and-d-box'
}, React.createElement("div", {
className: 'row'
}, React.createElement("div", {
className: 'col-md-6 border-right'
}, React.createElement("div", {
className: 'd-and-d-gray-text',
style: {
paddingBottom: '1px'
}
}, React.createElement("label", {
style: {
width: '70px'
}
}, "Faction Rank"), React.createElement("input", {
type: 'text',
style: {
width: 'calc(100% - 70px)'
},
className: 'd-and-d-linput',
value: character.factionRank ? character.factionRank : '',
onChange: function onChange(e) {
return _this2.updateCharacter('factionRank', e.target.value);
}
})), React.createElement("textarea", {
style: {
paddingBottom: '5px'
},
value: character.allies ? character.allies : '',
onChange: function onChange(e) {
return _this2.updateCharacter('allies', e.target.value);
},
rows: 16
})), React.createElement("div", {
className: 'col-md-6'
}, React.createElement("div", {
className: 'd-and-d-box gray noborder',
style: {
marginBottom: '13px'
}
}, React.createElement("div", {
className: 'd-and-d-faction-input'
}, React.createElement("label", null, "Faction"), React.createElement("input", {
type: 'text',
value: character.faction ? character.faction : '',
onChange: function onChange(e) {
return _this2.updateCharacter('faction', e.target.value);
}
})), React.createElement(Image, {
classes: 'faction',
name: 'factionImg',
value: character.factionImg,
onChange: function onChange(name, value) {
_this2.updateCharacter(name, value);
}
})), React.createElement("textarea", {
style: {
paddingBottom: '5px'
},
value: character.allies2 ? character.allies2 : '',
onChange: function onChange(e) {
return _this2.updateCharacter('allies2', e.target.value);
},
rows: 3
}))), React.createElement("label", {
className: 'd-and-d-title',
style: {
marginTop: '10px'
}
}, "Allies & Organisations")), React.createElement("div", {
className: 'd-and-d-box mt-3'
}, React.createElement("div", {
className: 'row'
}, React.createElement("div", {
className: 'col-md-6 border-right'
}, React.createElement("textarea", {
style: {
paddingBottom: '5px'
},
value: character.additionalFeatures ? character.additionalFeatures : '',
onChange: function onChange(e) {
return _this2.updateCharacter('additionalFeatures', e.target.value);
},
rows: 13
})), React.createElement("div", {
className: 'col-md-6'
}, React.createElement("textarea", {
style: {
paddingBottom: '5px'
},
value: character.additionalFeatures2 ? character.additionalFeatures2 : '',
onChange: function onChange(e) {
return _this2.updateCharacter('additionalFeatures2', e.target.value);
},
rows: 13
}))), React.createElement("label", {
className: 'd-and-d-title',
style: {
marginTop: '10px'
}
}, "Additional Features & Traits")), React.createElement("div", {
className: 'd-and-d-box mt-3'
}, React.createElement("div", {
className: 'row'
}, React.createElement("div", {
className: 'col-md-6 border-right'
}, React.createElement(StatRow, {
classes: 'm-2 rounded rounded-sides wide-input',
label: 'Total Non-Consumable Magic Items',
name: 'totalNonConsumableMagicItems',
value: character.totalNonConsumableMagicItems,
onChange: function onChange(name, value) {
_this2.updateCharacter(name, value);
}
}), React.createElement("textarea", {
style: {
paddingBottom: '5px',
marginTop: '2px'
},
value: character.treasure ? character.treasure : '',
onChange: function onChange(e) {
return _this2.updateCharacter('treasure', e.target.value);
},
rows: 8
})), React.createElement("div", {
className: 'col-md-6'
}, React.createElement("textarea", {
style: {
paddingBottom: '5px',
marginTop: '4px'
},
value: character.treasure2 ? character.treasure2 : '',
onChange: function onChange(e) {
return _this2.updateCharacter('treasure2', e.target.value);
},
rows: 10
}))), React.createElement("label", {
className: 'd-and-d-title',
style: {
marginTop: '4px'
}
}, "Treasure"))))));
};
return DnDCharacterProfileSheet;
}(React.Component);
function SpellTable(props) {
function updateValue(index, field, v) {
var value = getValue().slice();
value[index][field] = v;
props.onChange(props.name, value);
}
function getValue() {
var value = props.value;
if (!value) {
value = [];
}
while (value.length < props.rows) {
value.push({});
}
return value;
}
function renderSlotsRemaining() {
var slotCount = 6;
if (props.slotsValue != null && props.slotsValue !== '' && Number(props.slotsValue) != null) {
slotCount = Number(props.slotsValue);
}
var slots = [];
var _loop = function _loop(i1) {
slots.push(React.createElement("div", {
key: 'd-and-d-table-slot-' + props.name + i1,
className: props.slotsUsedValue && props.slotsUsedValue >= i1 ? 'd-and-d-skill-circle active' : 'd-and-d-skill-circle',
onClick: function onClick() {
return props.onChange(props.slotsUsedName, props.slotsUsedValue === i1 ? null : i1);
}
}));
};
for (var i1 = 1; i1 <= slotCount; i1++) {
_loop(i1);
}
return slots;
}
var classes = 'd-and-d-spelllist';
if (props.classes) {
classes += ' ' + props.classes;
}
return React.createElement("div", {
className: classes,
style: props.style
}, props.showLabels ? React.createElement("div", {
className: 'd-and-d-spell-header-labels'
}, React.createElement("label", {
style: {
width: '20px'
}
}, "Spell Level"), React.createElement("label", {
style: {
width: '80px'
}
}, "Slots Total"), React.createElement("label", {
style: {
width: 'calc(100% - 100px)'
}
}, "Slots Remaining")) : null, React.createElement("div", {
className: 'd-and-d-spell-header'
}, React.createElement("div", {
className: 'd-and-d-spell-level'
}, props.level), props.level === 0 ? React.createElement("div", {
className: 'd-and-d-spell-slots'
}, React.createElement("label", null, "Cantrips")) : React.createElement("div", {
className: 'd-and-d-spell-slots'
}, React.createElement("div", {
className: 'd-and-d-spell-slots-total'
}, React.createElement("input", {
type: 'text',
value: props.slotsValue ? props.slotsValue : '',
onChange: function onChange(e) {
return props.onChange(props.slotsName, e.target.value);
}
})), React.createElement("div", {
className: 'd-and-d-spell-slots-remaining'
}, renderSlotsRemaining()))), React.createElement("table", null, props.showLabels ? React.createElement("thead", null, React.createElement("tr", null, React.createElement("th", {
style: {
width: '30px',
position: 'absolute',
left: '-7px'
}
}, "Prepared"), React.createElement("th", null, "Spell Name"))) : null, React.createElement("tbody", null, getValue().map(function (v, index) {
return React.createElement("tr", {
key: 'd-and-d-table-row-' + props.name + index
}, props.level > 0 ? React.createElement("td", {
className: 'd-and-d-spell-prepared'
}, React.createElement("div", {
className: v.prepared ? 'd-and-d-skill-circle active' : 'd-and-d-skill-circle',
onClick: function onClick() {
return updateValue(index, 'prepared', !v.prepared);
}
})) : null, React.createElement("td", null, React.createElement("input", {
type: 'text',
value: v.name ? v.name : '',
onChange: function onChange(e) {
return updateValue(index, 'name', e.target.value);
}
})));
}))));
}
var initialState$2 = {
character: {}
};
var DnDCharacterSpellsSheet = /*#__PURE__*/function (_React$Component) {
_inheritsLoose(DnDCharacterSpellsSheet, _React$Component);
function DnDCharacterSpellsSheet(props) {
var _this;
_this = _React$Component.call(this, props) || this;
if (props.defaultCharacter) {
initialState$2.character = props.defaultCharacter;
}
_this.state = initialState$2;
return _this;
}
var _proto = DnDCharacterSpellsSheet.prototype;
_proto.updateCharacter = function updateCharacter(name, value) {
var oldCharacter = this.getCharacter();
var newCharacter = {};
Object.assign(newCharacter, oldCharacter);
newCharacter[name] = value;
if (!this.props.character) {
this.setState({
character: newCharacter
});
}
if (typeof this.props.onCharacterChanged === 'function') {
this.props.onCharacterChanged(newCharacter, name, value);
}
};
_proto.getCharacter = function getCharacter() {
var character = this.state.character;
if (this.props.character) {
character = this.props.character;
}
return character;
};
_proto.re