diff --git a/client/naturalCrit/encounter/encounter.jsx b/client/naturalCrit/encounter/encounter.jsx
new file mode 100644
index 0000000..479bda8
--- /dev/null
+++ b/client/naturalCrit/encounter/encounter.jsx
@@ -0,0 +1,106 @@
+var React = require('react');
+var _ = require('lodash');
+var cx = require('classnames');
+
+var MonsterCard = require('./monsterCard/monsterCard.jsx');
+
+var attrMod = function(attr){
+ return Math.floor(attr/2) - 5;
+}
+
+var Encounter = React.createClass({
+
+ getDefaultProps: function() {
+ return {
+ name : '',
+ desc : '',
+ reward : '',
+ enemies : [],
+ index : {},
+
+
+ monsterManual : {}
+ };
+ },
+
+ getInitialState: function() {
+ return {
+ enemies: this.createEnemies(this.props)
+ };
+ },
+
+ componentWillReceiveProps: function(nextProps) {
+ this.setState({
+ enemies : this.createEnemies(nextProps)
+ })
+ },
+
+ createEnemies : function(props){
+ var self = this;
+ return _.indexBy(_.map(props.enemies, function(type, index){
+ return self.createEnemy(props, type, index)
+ }), 'id')
+ },
+
+ createEnemy : function(props, type, index){
+ var stats = props.index[type] || props.monsterManual[type];
+ return _.extend({
+ id : type + index,
+ name : type,
+ currentHP : stats.hp,
+ initiative : _.random(1,20) + attrMod(stats.attr.dex)
+ }, stats);
+ },
+
+
+ updateHP : function(enemyId, newHP){
+ this.state.enemies[enemyId].currentHP = newHP;
+ this.setState({
+ enemies : this.state.enemies
+ });
+ },
+ removeEnemy : function(enemyId){
+ delete this.state.enemies[enemyId];
+ this.setState({
+ enemies : this.state.enemies
+ });
+ },
+
+
+ renderEnemies : function(){
+ var self = this;
+
+ var sortedEnemies = _.sortBy(this.state.enemies, function(e){
+ return -e.initiative;
+ });
+
+ return _.map(sortedEnemies, function(enemy){
+ return
+ })
+ },
+
+ render : function(){
+ var self = this;
+
+
+ return(
+
+
+
+ {this.props.name}
+
+
+
+
+ {this.renderEnemies()}
+
+
+ );
+ }
+});
+
+module.exports = Encounter;
diff --git a/client/naturalCrit/encounter/encounter.less b/client/naturalCrit/encounter/encounter.less
new file mode 100644
index 0000000..7cbd2ba
--- /dev/null
+++ b/client/naturalCrit/encounter/encounter.less
@@ -0,0 +1,3 @@
+.encounter{
+
+}
\ No newline at end of file
diff --git a/client/naturalCrit/monsterCard/attackSlot/attackSlot.jsx b/client/naturalCrit/encounter/monsterCard/attackSlot/attackSlot.jsx
similarity index 98%
rename from client/naturalCrit/monsterCard/attackSlot/attackSlot.jsx
rename to client/naturalCrit/encounter/monsterCard/attackSlot/attackSlot.jsx
index 7b638dc..c22d3e3 100644
--- a/client/naturalCrit/monsterCard/attackSlot/attackSlot.jsx
+++ b/client/naturalCrit/encounter/monsterCard/attackSlot/attackSlot.jsx
@@ -68,7 +68,7 @@ var AttackSlot = React.createClass({
renderNotes : function(){
var notes = _.omit(this.props, ['name', 'atk', 'dmg', 'uses', 'heal']);
return _.map(notes, function(text, key){
- return {key + ': ' + text}
+ return {key + ': ' + text}
});
},
diff --git a/client/naturalCrit/monsterCard/attackSlot/attackSlot.less b/client/naturalCrit/encounter/monsterCard/attackSlot/attackSlot.less
similarity index 100%
rename from client/naturalCrit/monsterCard/attackSlot/attackSlot.less
rename to client/naturalCrit/encounter/monsterCard/attackSlot/attackSlot.less
diff --git a/client/naturalCrit/monsterCard/monsterCard.jsx b/client/naturalCrit/encounter/monsterCard/monsterCard.jsx
similarity index 100%
rename from client/naturalCrit/monsterCard/monsterCard.jsx
rename to client/naturalCrit/encounter/monsterCard/monsterCard.jsx
diff --git a/client/naturalCrit/monsterCard/monsterCard.less b/client/naturalCrit/encounter/monsterCard/monsterCard.less
similarity index 100%
rename from client/naturalCrit/monsterCard/monsterCard.less
rename to client/naturalCrit/encounter/monsterCard/monsterCard.less
diff --git a/client/naturalCrit/naturalCrit.jsx b/client/naturalCrit/naturalCrit.jsx
index 98f9b55..30fac0a 100644
--- a/client/naturalCrit/naturalCrit.jsx
+++ b/client/naturalCrit/naturalCrit.jsx
@@ -2,16 +2,50 @@ var React = require('react');
var _ = require('lodash');
var cx = require('classnames');
-var MonsterCard = require('./monsterCard/monsterCard.jsx');
+
+var Sidebar = require('./sidebar/sidebar.jsx');
+
+var Encounter = require('./encounter/encounter.jsx');
-var encounter = {
+var encounters = [
+ {
+ name : 'The Big Bad',
+ desc : 'The big fight!',
+ reward : 'gems',
+ enemies : ['goblin', 'goblin'],
+ reserve : ['goblin'],
+ },
+ {
+ name : 'Demon Goats',
+ desc : 'Gross fight',
+ reward : 'curved horn, goat sac',
+ enemies : ['demon_goat', 'demon_goat', 'demon_goat'],
+ index : {
+ demon_goat : {
+ "hp" : 140,
+ "ac" : 16,
+ "attr" : {
+ "str" : 8,
+ "con" : 8,
+ "dex" : 8,
+ "int" : 8,
+ "wis" : 8,
+ "cha" : 8
+ },
+ "attacks" : {
+ "charge" : {
+ "atk" : "1d20+5",
+ "dmg" : "1d8+5",
+ "type" : "bludge"
+ }
+ },
+ "abilities" : ["charge"],
+ }
+ }
+ },
- name : 'The Big Bad',
- enemies : ['goblin', 'goblin'],
- reserve : ['goblin'],
-
-}
+];
var MonsterManual = {
'goblin' : {
@@ -65,9 +99,12 @@ var NaturalCrit = React.createClass({
var self = this;
return {
- enemies: _.indexBy(_.map(encounter.enemies, function(type, index){
- return self.createEnemy(type, index)
- }), 'id')
+
+ selectedEncounterIndex : 0,
+
+ encounters : encounters,
+ monsterManual : MonsterManual,
+
};
},
@@ -103,53 +140,62 @@ var NaturalCrit = React.createClass({
},
- updateHP : function(enemyId, newHP){
- this.state.enemies[enemyId].currentHP = newHP;
+
+ handleJSONChange : function(encounterIndex, json){
+
+ this.state.encounters[encounterIndex] = json;
this.setState({
- enemies : this.state.enemies
- });
+ encounters : this.state.encounters
+ })
+
},
- removeEnemy : function(enemyId){
- delete this.state.enemies[enemyId];
+
+ handleEncounterChange : function(encounterIndex){
this.setState({
- enemies : this.state.enemies
+ selectedEncounterIndex : encounterIndex
});
},
+ renderSelectedEncounter : function(){
+ var self = this;
+ var selectedEncounter = _.find(this.state.encounters, function(encounter){
+ return encounter.name == self.state.selectedEncounter;
+ });
+ if(this.state.selectedEncounterIndex != null){
+ var selectedEncounter = this.state.encounters[this.state.selectedEncounterIndex]
+ return
+ }
+
+ return null;
+ },
render : function(){
var self = this;
- console.log();
-
- var sortedEnemies = _.sortBy(this.state.enemies, function(e){
- return -e.initiative;
- });
-
-
- var cards = _.map(sortedEnemies, function(enemy){
- return
- })
-
-
+ console.log(this.state.encounters);
return(
-
- Project Ready!
+
- {cards}
+
+ {this.renderSelectedEncounter()}
+
-
- {JSON.stringify(MonsterManual, null, ' ')}
);
}
diff --git a/client/naturalCrit/naturalCrit.less b/client/naturalCrit/naturalCrit.less
index 40a6b2f..a2aa886 100644
--- a/client/naturalCrit/naturalCrit.less
+++ b/client/naturalCrit/naturalCrit.less
@@ -16,4 +16,9 @@ body{
.naturalCrit{
color : #333;
background-color: #eee;
+
+ .encounterContainer{
+ display: inline-block;
+ vertical-align: top;
+ }
}
\ No newline at end of file
diff --git a/client/naturalCrit/sidebar/CODE Bold.otf b/client/naturalCrit/sidebar/CODE Bold.otf
new file mode 100644
index 0000000..50dd77d
Binary files /dev/null and b/client/naturalCrit/sidebar/CODE Bold.otf differ
diff --git a/client/naturalCrit/sidebar/CODE Light.otf b/client/naturalCrit/sidebar/CODE Light.otf
new file mode 100644
index 0000000..1ff9d87
Binary files /dev/null and b/client/naturalCrit/sidebar/CODE Light.otf differ
diff --git a/client/naturalCrit/sidebar/sidebar.jsx b/client/naturalCrit/sidebar/sidebar.jsx
new file mode 100644
index 0000000..833fef9
--- /dev/null
+++ b/client/naturalCrit/sidebar/sidebar.jsx
@@ -0,0 +1,108 @@
+var React = require('react');
+var _ = require('lodash');
+var cx = require('classnames');
+
+var JSONFileEditor = require('naturalCrit/jsonFileEditor/jsonFileEditor.jsx');
+
+var Sidebar = React.createClass({
+
+ getDefaultProps: function() {
+ return {
+ selectedEncounter : null,
+
+ monsterManual : {},
+ encounters : [],
+
+ onSelectEncounter : function(){},
+
+ onJSONChange : function(encounterIndex, json){},
+ };
+ },
+
+ getInitialState: function() {
+ return {
+ hide : false
+ };
+ },
+
+ handleLogoClick : function(){
+ this.setState({
+ hide : !this.state.hide
+ })
+ },
+
+ handleJSONChange : function(encounterIndex, json){
+
+
+ this.props.onJSONChange(encounterIndex, json);
+
+
+ },
+
+ handleSelectEncounter : function(encounterIndex){
+ console.log(encounterIndex);
+ this.props.onSelectEncounter(encounterIndex);
+ },
+
+ renderEncounters : function(){
+ var self = this;
+
+ return _.map(this.props.encounters, function(encounter, index){
+ console.log(self.props.selectedEncounter, index);
+
+ var isSelected = self.props.selectedEncounter == index;
+ return
+
+
+
+
+
+
+ })
+ },
+
+ render : function(){
+ var self = this;
+ return(
+
+
+
+
+
+
+
+
+
+
encounters
+ {this.renderEncounters()}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+});
+
+module.exports = Sidebar;
diff --git a/client/naturalCrit/sidebar/sidebar.less b/client/naturalCrit/sidebar/sidebar.less
new file mode 100644
index 0000000..c115cd8
--- /dev/null
+++ b/client/naturalCrit/sidebar/sidebar.less
@@ -0,0 +1,69 @@
+
+@font-face {
+ font-family : CodeLight;
+ src : url('/assets/naturalCrit/sidebar/CODE Light.otf');
+}
+@font-face {
+ font-family : CodeBold;
+ src : url('/assets/naturalCrit/sidebar/CODE Bold.otf');
+}
+.sidebar{
+ .animateAll();
+ display : inline-block;
+ vertical-align : top;
+ box-sizing : border-box;
+ height : 100%;
+ width : 300px;
+
+ &.hide{
+ height : 50px;
+ width : 50px;
+ .logo .name{
+ left : -200px;
+ }
+ .contents{
+ opacity : 0;
+ }
+ }
+ .logo{
+ padding : 10px 10px;
+ background-color : @steel;
+ font-family : 'CodeLight', sans-serif;
+ font-size : 1.8em;
+ color : white;
+ svg{
+ vertical-align : middle;
+ height : 1em;
+ margin-right : 0.2em;
+ cursor : pointer;
+ fill : white;
+ }
+ span.name{
+ .animateAll();
+ position : absolute;
+ top : 13px;
+ left : 50px;
+ span.crit{
+ font-family : 'CodeBold';
+ }
+ }
+ }
+
+ .contents{
+ .animate(opacity);
+ width : 100%;
+ &>*{
+ width : 100%;
+ }
+
+ .encounterContainer{
+ .encounter{
+ &.selected{
+ background-color : @green;
+ }
+ }
+ }
+
+
+ }
+}
\ No newline at end of file
diff --git a/gulpfile.js b/gulpfile.js
index 1e5864d..7af1c6f 100644
--- a/gulpfile.js
+++ b/gulpfile.js
@@ -13,7 +13,7 @@ var gulp = vitreumTasks(gulp, {
projectModules: ["./shared/naturalCrit"],
additionalRequirePaths : ['./shared'],
- assetExts: ["*.svg", "*.png", "*.jpg", "*.pdf", "*.eot", "*.ttf", "*.woff", "*.woff2", "*.ico"],
+ assetExts: ["*.svg", "*.png", "*.jpg", "*.pdf", "*.eot", "*.otf", "*.woff", "*.woff2", "*.ico"],
serverWatchPaths: ["server"],
serverScript: "server.js",
@@ -22,7 +22,7 @@ var gulp = vitreumTasks(gulp, {
"react-dom",
"lodash",
"classnames",
-
+ "jsoneditor"
],
clientLibs: [],
});
diff --git a/package.json b/package.json
index 181abd4..be73d9a 100644
--- a/package.json
+++ b/package.json
@@ -13,6 +13,7 @@
"classnames": "^2.2.0",
"express": "^4.13.3",
"gulp": "^3.9.0",
+ "jsoneditor": "^4.2.1",
"lodash": "^3.10.1",
"react": "^0.14.2",
"react-dom": "^0.14.2",
diff --git a/shared/naturalCrit/jsonFileEditor/img/jsoneditor-icons.png b/shared/naturalCrit/jsonFileEditor/img/jsoneditor-icons.png
new file mode 100644
index 0000000..7120088
Binary files /dev/null and b/shared/naturalCrit/jsonFileEditor/img/jsoneditor-icons.png differ
diff --git a/shared/naturalCrit/jsonFileEditor/jsonFileEditor.jsx b/shared/naturalCrit/jsonFileEditor/jsonFileEditor.jsx
new file mode 100644
index 0000000..144d196
--- /dev/null
+++ b/shared/naturalCrit/jsonFileEditor/jsonFileEditor.jsx
@@ -0,0 +1,103 @@
+var React = require('react');
+var _ = require('lodash');
+var cx = require('classnames');
+
+
+var JSONEditor = require('jsoneditor');
+
+//var editor = new JSONEditor(container);
+
+var json = {
+ test : 6,
+ arr : [true, 1,2,3,4],
+ yo : {
+ yeah : true
+ }
+}
+
+
+var JsonFileEditor = React.createClass({
+ getDefaultProps: function() {
+ return {
+ name : "yo",
+
+ json : json,
+
+ onJSONChange : function(){}
+ };
+ },
+
+ getInitialState: function() {
+ return {
+ showEditor: false
+ };
+ },
+
+ componentWillReceiveProps: function(nextProps) {
+ //this.editor.set(nextProps.json);
+ },
+
+ componentDidMount: function() {
+ this.editor = new JSONEditor(this.refs.editor, {
+ change : this.handleJSONChange,
+ search : false
+ }, this.props.json)
+ },
+
+
+
+
+ handleJSONChange : function(){
+
+ this.props.onJSONChange(this.editor.get());
+
+ //try to store in local storage?
+
+ },
+
+ handleShowEditorClick : function(){
+ this.setState({
+ showEditor : !this.state.showEditor
+ })
+ },
+
+ handleDownload : function(){
+
+ },
+ handleRemove : function(){
+
+ },
+
+
+ renderEditor : function(){
+ return
+ },
+
+
+ render : function(){
+ var self = this;
+ return(
+
+
+
{this.props.name}
+
+
+
+
+
+ {this.renderEditor()}
+
+
+ );
+ }
+});
+
+module.exports = JsonFileEditor;
diff --git a/shared/naturalCrit/jsonFileEditor/jsonFileEditor.less b/shared/naturalCrit/jsonFileEditor/jsonFileEditor.less
new file mode 100644
index 0000000..7c06cf6
--- /dev/null
+++ b/shared/naturalCrit/jsonFileEditor/jsonFileEditor.less
@@ -0,0 +1,30 @@
+
+@import (less) "./jsoneditor.css";
+.jsonFileEditor{
+ position : relative;
+ width : 100%;
+ &.showEditor{
+ .jsonEditor{
+ display : initial;
+ }
+ }
+
+ .jsonEditor{
+ position : absolute;
+ display : none;
+ top : 100%;
+ left : 0px;
+ z-index : 1000;
+ background-color : white;
+ }
+ .name{
+ display : inline-block;
+ font-size : 0.8em;
+ font-weight : 800;
+ }
+ .controls{
+ position : absolute;
+ top : 0px;
+ right : 0px;
+ }
+}
\ No newline at end of file
diff --git a/shared/naturalCrit/jsonFileEditor/jsoneditor.css b/shared/naturalCrit/jsonFileEditor/jsoneditor.css
new file mode 100644
index 0000000..c355013
--- /dev/null
+++ b/shared/naturalCrit/jsonFileEditor/jsoneditor.css
@@ -0,0 +1,625 @@
+.jsoneditor .field,
+.jsoneditor .value,
+.jsoneditor .readonly {
+ border: 1px solid transparent;
+ min-height: 16px;
+ min-width: 32px;
+ padding: 2px;
+ margin: 1px;
+ word-wrap: break-word;
+ float: left;
+}
+
+/* adjust margin of p elements inside editable divs, needed for Opera, IE */
+
+.jsoneditor .field p,
+.jsoneditor .value p {
+ margin: 0;
+}
+
+.jsoneditor .value {
+ word-break: break-word;
+}
+
+.jsoneditor .readonly {
+ min-width: 16px;
+ color: gray;
+}
+
+.jsoneditor .empty {
+ border-color: lightgray;
+ border-style: dashed;
+ border-radius: 2px;
+}
+
+.jsoneditor .field.empty {
+ background-image: url("/assets/naturalCrit/jsonFileEditor/img/jsoneditor-icons.png");
+ background-position: 0 -144px;
+}
+
+.jsoneditor .value.empty {
+ background-image: url("/assets/naturalCrit/jsonFileEditor/img/jsoneditor-icons.png");
+ background-position: -48px -144px;
+}
+
+.jsoneditor .value.url {
+ color: green;
+ text-decoration: underline;
+}
+
+.jsoneditor a.value.url:hover,
+.jsoneditor a.value.url:focus {
+ color: red;
+}
+
+.jsoneditor .separator {
+ padding: 3px 0;
+ vertical-align: top;
+ color: gray;
+}
+
+.jsoneditor .field[contenteditable=true]:focus,
+.jsoneditor .field[contenteditable=true]:hover,
+.jsoneditor .value[contenteditable=true]:focus,
+.jsoneditor .value[contenteditable=true]:hover,
+.jsoneditor .field.highlight,
+.jsoneditor .value.highlight {
+ background-color: #FFFFAB;
+ border: 1px solid yellow;
+ border-radius: 2px;
+}
+
+.jsoneditor .field.highlight-active,
+.jsoneditor .field.highlight-active:focus,
+.jsoneditor .field.highlight-active:hover,
+.jsoneditor .value.highlight-active,
+.jsoneditor .value.highlight-active:focus,
+.jsoneditor .value.highlight-active:hover {
+ background-color: #ffee00;
+ border: 1px solid #ffc700;
+ border-radius: 2px;
+}
+
+.jsoneditor div.tree button {
+ width: 24px;
+ height: 24px;
+ padding: 0;
+ margin: 0;
+ border: none;
+ cursor: pointer;
+ background: transparent url("/assets/naturalCrit/jsonFileEditor/img/jsoneditor-icons.png");
+}
+
+.jsoneditor div.tree button.collapsed {
+ background-position: 0 -48px;
+}
+
+.jsoneditor div.tree button.expanded {
+ background-position: 0 -72px;
+}
+
+.jsoneditor div.tree button.contextmenu {
+ background-position: -48px -72px;
+}
+
+.jsoneditor div.tree button.contextmenu:hover,
+.jsoneditor div.tree button.contextmenu:focus,
+.jsoneditor div.tree button.contextmenu.selected {
+ background-position: -48px -48px;
+}
+
+.jsoneditor div.tree *:focus {
+ outline: none;
+}
+
+.jsoneditor div.tree button:focus {
+ /* TODO: nice outline for buttons with focus
+ outline: #97B0F8 solid 2px;
+ box-shadow: 0 0 8px #97B0F8;
+ */
+ background-color: #f5f5f5;
+ outline: #e5e5e5 solid 1px;
+}
+
+.jsoneditor div.tree button.invisible {
+ visibility: hidden;
+ background: none;
+}
+
+.jsoneditor {
+ color: #1A1A1A;
+ border: 1px solid #97B0F8;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ width: 100%;
+ height: 100%;
+ overflow: auto;
+ position: relative;
+ padding: 0;
+ line-height: 100%;
+}
+
+.jsoneditor div.tree table.tree {
+ border-collapse: collapse;
+ border-spacing: 0;
+ width: 100%;
+ margin: 0;
+}
+
+.jsoneditor div.outer {
+ width: 100%;
+ height: 100%;
+ margin: -35px 0 0 0;
+ padding: 35px 0 0 0;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ overflow: hidden;
+}
+
+.jsoneditor div.tree {
+ width: 100%;
+ height: 100%;
+ position: relative;
+ overflow: auto;
+}
+
+.jsoneditor textarea.text {
+ width: 100%;
+ height: 100%;
+ margin: 0;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ border: none;
+ background-color: white;
+ resize: none;
+}
+
+.jsoneditor tr.highlight {
+ background-color: #FFFFAB;
+}
+
+.jsoneditor div.tree button.dragarea {
+ background: url("/assets/naturalCrit/jsonFileEditor/img/jsoneditor-icons.png") -72px -72px;
+ cursor: move;
+}
+
+.jsoneditor div.tree button.dragarea:hover,
+.jsoneditor div.tree button.dragarea:focus {
+ background-position: -72px -48px;
+}
+
+.jsoneditor tr,
+.jsoneditor th,
+.jsoneditor td {
+ padding: 0;
+ margin: 0;
+}
+
+.jsoneditor td {
+ vertical-align: top;
+}
+
+.jsoneditor td.tree {
+ vertical-align: top;
+}
+
+.jsoneditor .field,
+.jsoneditor .value,
+.jsoneditor td,
+.jsoneditor th,
+.jsoneditor textarea {
+ font-family: droid sans mono, consolas, monospace, courier new, courier, sans-serif;
+ font-size: 10pt;
+ color: #1A1A1A;
+}
+/* ContextMenu - main menu */
+
+.jsoneditor-contextmenu {
+ position: absolute;
+ z-index: 99999;
+}
+
+.jsoneditor-contextmenu ul {
+ position: relative;
+ left: 0;
+ top: 0;
+ width: 124px;
+ background: white;
+ border: 1px solid #d3d3d3;
+ box-shadow: 2px 2px 12px rgba(128, 128, 128, 0.3);
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+
+.jsoneditor-contextmenu ul li button {
+ padding: 0;
+ margin: 0;
+ width: 124px;
+ height: 24px;
+ border: none;
+ cursor: pointer;
+ color: #4d4d4d;
+ background: transparent;
+ line-height: 26px;
+ text-align: left;
+}
+
+/* Fix button padding in firefox */
+
+.jsoneditor-contextmenu ul li button::-moz-focus-inner {
+ padding: 0;
+ border: 0;
+}
+
+.jsoneditor-contextmenu ul li button:hover,
+.jsoneditor-contextmenu ul li button:focus {
+ color: #1a1a1a;
+ background-color: #f5f5f5;
+ outline: none;
+}
+
+.jsoneditor-contextmenu ul li button.default {
+ width: 92px;
+}
+
+.jsoneditor-contextmenu ul li button.expand {
+ float: right;
+ width: 32px;
+ height: 24px;
+ border-left: 1px solid #e5e5e5;
+}
+
+.jsoneditor-contextmenu div.icon {
+ float: left;
+ width: 24px;
+ height: 24px;
+ border: none;
+ padding: 0;
+ margin: 0;
+ background-image: url("/assets/naturalCrit/jsonFileEditor/img/jsoneditor-icons.png");
+}
+
+.jsoneditor-contextmenu ul li button div.expand {
+ float: right;
+ width: 24px;
+ height: 24px;
+ padding: 0;
+ margin: 0 4px 0 0;
+ background: url("/assets/naturalCrit/jsonFileEditor/img/jsoneditor-icons.png") 0 -72px;
+ opacity: 0.4;
+}
+
+.jsoneditor-contextmenu ul li button:hover div.expand,
+.jsoneditor-contextmenu ul li button:focus div.expand,
+.jsoneditor-contextmenu ul li.selected div.expand,
+.jsoneditor-contextmenu ul li button.expand:hover div.expand,
+.jsoneditor-contextmenu ul li button.expand:focus div.expand {
+ opacity: 1;
+}
+
+.jsoneditor-contextmenu .separator {
+ height: 0;
+ border-top: 1px solid #e5e5e5;
+ padding-top: 5px;
+ margin-top: 5px;
+}
+
+.jsoneditor-contextmenu button.remove > .icon {
+ background-position: -24px -24px;
+}
+
+.jsoneditor-contextmenu button.remove:hover > .icon,
+.jsoneditor-contextmenu button.remove:focus > .icon {
+ background-position: -24px 0;
+}
+
+.jsoneditor-contextmenu button.append > .icon {
+ background-position: 0 -24px;
+}
+
+.jsoneditor-contextmenu button.append:hover > .icon,
+.jsoneditor-contextmenu button.append:focus > .icon {
+ background-position: 0 0;
+}
+
+.jsoneditor-contextmenu button.insert > .icon {
+ background-position: 0 -24px;
+}
+
+.jsoneditor-contextmenu button.insert:hover > .icon,
+.jsoneditor-contextmenu button.insert:focus > .icon {
+ background-position: 0 0;
+}
+
+.jsoneditor-contextmenu button.duplicate > .icon {
+ background-position: -48px -24px;
+}
+
+.jsoneditor-contextmenu button.duplicate:hover > .icon,
+.jsoneditor-contextmenu button.duplicate:focus > .icon {
+ background-position: -48px 0;
+}
+
+.jsoneditor-contextmenu button.sort-asc > .icon {
+ background-position: -168px -24px;
+}
+
+.jsoneditor-contextmenu button.sort-asc:hover > .icon,
+.jsoneditor-contextmenu button.sort-asc:focus > .icon {
+ background-position: -168px 0;
+}
+
+.jsoneditor-contextmenu button.sort-desc > .icon {
+ background-position: -192px -24px;
+}
+
+.jsoneditor-contextmenu button.sort-desc:hover > .icon,
+.jsoneditor-contextmenu button.sort-desc:focus > .icon {
+ background-position: -192px 0;
+}
+
+/* ContextMenu - sub menu */
+
+.jsoneditor-contextmenu ul li .selected {
+ background-color: #D5DDF6;
+}
+
+.jsoneditor-contextmenu ul li {
+ overflow: hidden;
+}
+
+.jsoneditor-contextmenu ul li ul {
+ display: none;
+ position: relative;
+ left: -10px;
+ top: 0;
+ border: none;
+ box-shadow: inset 0 0 10px rgba(128, 128, 128, 0.5);
+ padding: 0 10px;
+ /* TODO: transition is not supported on IE8-9 */
+ -webkit-transition: all 0.3s ease-out;
+ -moz-transition: all 0.3s ease-out;
+ -o-transition: all 0.3s ease-out;
+ transition: all 0.3s ease-out;
+}
+
+
+
+.jsoneditor-contextmenu ul li ul li button {
+ padding-left: 24px;
+}
+
+.jsoneditor-contextmenu ul li ul li button:hover,
+.jsoneditor-contextmenu ul li ul li button:focus {
+ background-color: #f5f5f5;
+}
+
+.jsoneditor-contextmenu button.type-string > .icon {
+ background-position: -144px -24px;
+}
+
+.jsoneditor-contextmenu button.type-string:hover > .icon,
+.jsoneditor-contextmenu button.type-string:focus > .icon,
+.jsoneditor-contextmenu button.type-string.selected > .icon {
+ background-position: -144px 0;
+}
+
+.jsoneditor-contextmenu button.type-auto > .icon {
+ background-position: -120px -24px;
+}
+
+.jsoneditor-contextmenu button.type-auto:hover > .icon,
+.jsoneditor-contextmenu button.type-auto:focus > .icon,
+.jsoneditor-contextmenu button.type-auto.selected > .icon {
+ background-position: -120px 0;
+}
+
+.jsoneditor-contextmenu button.type-object > .icon {
+ background-position: -72px -24px;
+}
+
+.jsoneditor-contextmenu button.type-object:hover > .icon,
+.jsoneditor-contextmenu button.type-object:focus > .icon,
+.jsoneditor-contextmenu button.type-object.selected > .icon {
+ background-position: -72px 0;
+}
+
+.jsoneditor-contextmenu button.type-array > .icon {
+ background-position: -96px -24px;
+}
+
+.jsoneditor-contextmenu button.type-array:hover > .icon,
+.jsoneditor-contextmenu button.type-array:focus > .icon,
+.jsoneditor-contextmenu button.type-array.selected > .icon {
+ background-position: -96px 0;
+}
+
+.jsoneditor-contextmenu button.type-modes > .icon {
+ background-image: none;
+ width: 6px;
+}
+.jsoneditor .menu {
+ width: 100%;
+ height: 35px;
+ padding: 2px;
+ margin: 0;
+ overflow: hidden;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ color: #1A1A1A;
+ background-color: #D5DDF6;
+ border-bottom: 1px solid #97B0F8;
+}
+
+.jsoneditor .menu button {
+ width: 26px;
+ height: 26px;
+ margin: 2px;
+ padding: 0;
+ border-radius: 2px;
+ border: 1px solid #aec0f8;
+ background: #e3eaf6 url("/assets/naturalCrit/jsonFileEditor/img/jsoneditor-icons.png");
+ color: #4D4D4D;
+ opacity: 0.8;
+ font-family: arial, sans-serif;
+ font-size: 10pt;
+ float: left;
+}
+
+.jsoneditor .menu button:hover {
+ background-color: #f0f2f5;
+}
+
+.jsoneditor .menu button:focus,
+.jsoneditor .menu button:active {
+ background-color: #ffffff;
+}
+
+.jsoneditor .menu button:disabled {
+ background-color: #e3eaf6;
+}
+
+.jsoneditor .menu button.collapse-all {
+ background-position: 0 -96px;
+}
+
+.jsoneditor .menu button.expand-all {
+ background-position: 0 -120px;
+}
+
+.jsoneditor .menu button.undo {
+ background-position: -24px -96px;
+}
+
+.jsoneditor .menu button.undo:disabled {
+ background-position: -24px -120px;
+}
+
+.jsoneditor .menu button.redo {
+ background-position: -48px -96px;
+}
+
+.jsoneditor .menu button.redo:disabled {
+ background-position: -48px -120px;
+}
+
+.jsoneditor .menu button.compact {
+ background-position: -72px -96px;
+}
+
+.jsoneditor .menu button.format {
+ background-position: -72px -120px;
+}
+
+.jsoneditor .menu button.modes {
+ background-image: none;
+ width: auto;
+ padding-left: 6px;
+ padding-right: 6px;
+}
+
+.jsoneditor .menu button.separator {
+ margin-left: 10px;
+}
+
+.jsoneditor .menu a {
+ font-family: arial, sans-serif;
+ font-size: 10pt;
+ color: #97B0F8;
+ vertical-align: middle;
+}
+
+.jsoneditor .menu a:hover {
+ color: red;
+}
+
+.jsoneditor .menu a.poweredBy {
+ font-size: 8pt;
+ position: absolute;
+ right: 0;
+ top: 0;
+ padding: 10px;
+}
+
+/* TODO: css for button:disabled is not supported by IE8 */
+.jsoneditor .search input,
+.jsoneditor .search .results {
+ font-family: arial, sans-serif;
+ font-size: 10pt;
+ color: #1A1A1A;
+ background: transparent;
+ /* For Firefox */
+}
+
+.jsoneditor .search {
+ position: absolute;
+ right: 2px;
+ top: 2px;
+}
+
+.jsoneditor .search .frame {
+ border: 1px solid #97B0F8;
+ background-color: white;
+ padding: 0 2px;
+ margin: 0;
+}
+
+.jsoneditor .search .frame table {
+ border-collapse: collapse;
+}
+
+.jsoneditor .search input {
+ width: 120px;
+ border: none;
+ outline: none;
+ margin: 1px;
+}
+
+.jsoneditor .search .results {
+ color: #4d4d4d;
+ padding-right: 5px;
+ line-height: 24px;
+}
+
+.jsoneditor .search button {
+ width: 16px;
+ height: 24px;
+ padding: 0;
+ margin: 0;
+ border: none;
+ background: url("/assets/naturalCrit/jsonFileEditor/img/jsoneditor-icons.png");
+ vertical-align: top;
+}
+
+.jsoneditor .search button:hover {
+ background-color: transparent;
+}
+
+.jsoneditor .search button.refresh {
+ width: 18px;
+ background-position: -99px -73px;
+}
+
+.jsoneditor .search button.next {
+ cursor: pointer;
+ background-position: -124px -73px;
+}
+
+.jsoneditor .search button.next:hover {
+ background-position: -124px -49px;
+}
+
+.jsoneditor .search button.previous {
+ cursor: pointer;
+ background-position: -148px -73px;
+ margin-right: 2px;
+}
+
+.jsoneditor .search button.previous:hover {
+ background-position: -148px -49px;
+}
\ No newline at end of file