From 3627ee3b49883a5af6452e23136a9f1ec522f2ec Mon Sep 17 00:00:00 2001 From: Scott Tolksdorf Date: Sun, 15 Nov 2015 16:28:17 -0500 Subject: [PATCH] Sidebar is nearing completion --- client/naturalCrit/encounter/encounter.jsx | 106 +++ client/naturalCrit/encounter/encounter.less | 3 + .../monsterCard/attackSlot/attackSlot.jsx | 2 +- .../monsterCard/attackSlot/attackSlot.less | 0 .../monsterCard/monsterCard.jsx | 0 .../monsterCard/monsterCard.less | 0 client/naturalCrit/naturalCrit.jsx | 122 ++-- client/naturalCrit/naturalCrit.less | 5 + client/naturalCrit/sidebar/CODE Bold.otf | Bin 0 -> 24108 bytes client/naturalCrit/sidebar/CODE Light.otf | Bin 0 -> 22920 bytes client/naturalCrit/sidebar/sidebar.jsx | 108 +++ client/naturalCrit/sidebar/sidebar.less | 69 ++ gulpfile.js | 4 +- package.json | 1 + .../jsonFileEditor/img/jsoneditor-icons.png | Bin 0 -> 14438 bytes .../jsonFileEditor/jsonFileEditor.jsx | 103 +++ .../jsonFileEditor/jsonFileEditor.less | 30 + .../naturalCrit/jsonFileEditor/jsoneditor.css | 625 ++++++++++++++++++ 18 files changed, 1137 insertions(+), 41 deletions(-) create mode 100644 client/naturalCrit/encounter/encounter.jsx create mode 100644 client/naturalCrit/encounter/encounter.less rename client/naturalCrit/{ => encounter}/monsterCard/attackSlot/attackSlot.jsx (98%) rename client/naturalCrit/{ => encounter}/monsterCard/attackSlot/attackSlot.less (100%) rename client/naturalCrit/{ => encounter}/monsterCard/monsterCard.jsx (100%) rename client/naturalCrit/{ => encounter}/monsterCard/monsterCard.less (100%) create mode 100644 client/naturalCrit/sidebar/CODE Bold.otf create mode 100644 client/naturalCrit/sidebar/CODE Light.otf create mode 100644 client/naturalCrit/sidebar/sidebar.jsx create mode 100644 client/naturalCrit/sidebar/sidebar.less create mode 100644 shared/naturalCrit/jsonFileEditor/img/jsoneditor-icons.png create mode 100644 shared/naturalCrit/jsonFileEditor/jsonFileEditor.jsx create mode 100644 shared/naturalCrit/jsonFileEditor/jsonFileEditor.less create mode 100644 shared/naturalCrit/jsonFileEditor/jsoneditor.css 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 0000000000000000000000000000000000000000..50dd77d237ee7b62a76a179604d23b52037794f8 GIT binary patch literal 24108 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 bt~#$?(Aph_;Cl-lnzLP3%`!v9Z%qCd6ZvXE literal 0 HcmV?d00001 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( +
+
+ + + NaturalCrit + +
+
+ +
+ + +
+
+

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 0000000000000000000000000000000000000000..7120088f9475d17ba3bd5f716bdf8bf4eeb1f32a GIT binary patch literal 14438 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 CdkcvG literal 0 HcmV?d00001 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