'+(helper.link('Eject', 'eject', {'ejectBeaker' : 1}, data.isBeakerLoaded ? null : 'disabled'))+'
';var arr3=data.beakerTransferAmounts;if(arr3){var amount,i=-1,l3=arr3.length-1;while(i
Contents:
';if(data.isBeakerLoaded){out+='Volume: '+(data.beakerCurrentVolume)+'/'+(data.beakerMaxVolume)+' Units
';if(data.beakerContents.length){var arr4=data.beakerContents;if(arr4){var reagent,i=-1,l4=arr4.length-1;while(i'+(reagent.volume)+' units of '+(reagent.name)+'
';} } }else{out+='Beaker Empty';}}else{out+='No Beaker Loaded';}out+='
';return out;
-},
- chem_heater:function anonymous(data, config, helper
+};
+TMPL["chem_heater"] = function anonymous(data, config, helper
/**/) {
var out='
Status
Power:
'+(helper.link(data.isActive ? 'On' : 'Off', data.isActive ? 'power' : 'close', {'toggle_on' : 1}, data.isBeakerLoaded ? null : 'disabled'))+'
Target:
'+(helper.link(data.targetTemp + 'K', 'pencil', {'adjust_temperature' : 'input'}))+'
Beaker
'+(helper.link('Eject', 'eject', {'eject_beaker' : 1}, data.isBeakerLoaded ? null : 'disabled'))+'
Contents:
';if(data.isBeakerLoaded){out+='Temperature: '+(data.currentTemp)+'K
';if(data.beakerContents.length){var arr1=data.beakerContents;if(arr1){var reagent,i=-1,l1=arr1.length-1;while(i'+(reagent.volume)+' units of '+(reagent.name)+'
';} } }else{out+='Beaker Empty';}}else{out+='No Beaker Loaded';}out+='
';return out;
-},
- cryo:function anonymous(data, config, helper
+};
+TMPL["cryo"] = function anonymous(data, config, helper
/**/) {
var out='
Occupant
Occupant:
';if(data.hasOccupant){out+=''+(data.occupant.name);}else{out+='No Occupant';}out+='
';if(data.hasOccupant){out+='
State:
';if(data.occupant.stat == 0){out+='Conscious';}else if(data.occupant.stat == 1){out+='Unconscious';}else{out+='Dead';}out+='
Temperature:
'+(helper.round(data.occupant.bodyTemperature))+' K
';}if(data.occupant.stat < 2){out+='
Health:
';if(data.occupant.health >= 0){out+=''+(helper.bar(data.occupant.health, 0, data.occupant.maxHealth, 'good'));}else{out+=''+(helper.bar(data.occupant.health, 0, data.occupant.minHealth, 'average'));}out+=''+(helper.round(data.occupant.health))+'
Brute:
'+(helper.bar(data.occupant.bruteLoss, 0, data.occupant.maxHealth, 'bad'))+(helper.round(data.occupant.bruteLoss))+'
Respiratory:
'+(helper.bar(data.occupant.oxyLoss, 0, data.occupant.maxHealth, 'bad'))+(helper.round(data.occupant.oxyLoss))+'
Toxin:
'+(helper.bar(data.occupant.toxLoss, 0, data.occupant.maxHealth, 'bad'))+(helper.round(data.occupant.toxLoss))+'
Burn:
'+(helper.bar(data.occupant.fireLoss, 0, data.occupant.maxHealth, 'bad'))+(helper.round(data.occupant.fireLoss))+'
';}out+='
Cell
Power:
'+(helper.link('On', 'power', {'switchOn': 1}, data.isOperating ? 'selected' : null))+(helper.link('Off', 'close', {'switchOff': 1}, data.isOperating ? null : 'selected'))+'
Temperature:
'+(data.cellTemperature)+' K
Door:
'+(helper.link('Open', 'unlocked', {'openCell' : 1}, data.isOpen ? 'disabled' : null))+(helper.link('Close', 'locked', {'closeCell' : 1}, data.isOpen ? null : 'disabled'))+'
Eject:
'+(helper.link('Auto', 'eject', {'autoEject' : 1}, data.autoEject ? 'selected' : null))+(helper.link('Manual', 'pin-s', {'autoEject' : 0}, data.autoEject ? null : 'selected'))+'
Beaker
'+(helper.link('Eject', 'eject', {'ejectBeaker' : 1}, data.isBeakerLoaded ? null : 'disabled'))+'
Contents:
';if(data.isBeakerLoaded){if(data.beakerContents.length){var arr1=data.beakerContents;if(arr1){var reagent,i=-1,l1=arr1.length-1;while(i'+(reagent.volume)+' units of '+(reagent.name)+'
';} } }else{out+='Beaker Empty';}}else{out+='No Beaker Loaded';}out+='
';return out;
-},
- smes:function anonymous(data, config, helper
+};
+TMPL["smes"] = function anonymous(data, config, helper
/**/) {
var out='
Storage
Stored Energy:
'+(helper.bar(data.capacityPercent, 0, 100, data.capacityPercent >= 50 ? 'good' : data.capacityPercent >= 15 ? 'average' : 'bad'))+'
'+(helper.round(data.capacityPercent))+'%
Input
Charge Mode:
'+(helper.link('Auto', 'refresh', {'input_attempt': 1}, data.inputAttempt ? 'selected' : null))+(helper.link('Off', 'close', {'input_attempt': 0}, data.inputAttempt ? null : 'selected'))+' ';if(data.capacityPercent >= 99){out+='[Fully Charged]';}else if(data.inputting){out+='[Charging]';}else{out+='[Not Charging]';}out+='
Input Setting:
'+(helper.bar(data.inputLevel, 0, data.inputLevelMax))+' '+(data.inputLevel)+' W
'+(helper.link('', 'fast-backward', {'set_input_level': '0'}, data.inputLevel ? null : 'selected'))+(helper.link('', 'backward', {'set_input_level': 'minus'}, data.inputLevel ? null : 'disabled'))+(helper.link('Set', 'pencil', {'set_input_level': 'custom'}, null))+(helper.link('', 'forward', {'set_input_level': 'plus'}, data.inputLevel == data.inputLevelMax ? 'disabled' : null))+(helper.link('', 'fast-forward', {'set_input_level': 'max'}, data.inputLevel == data.inputLevelMax ? 'selected' : null))+'
Available:
'+(data.inputAvailable)+' W
Output
Charge Mode:
'+(helper.link('On', 'power-off', {'output_attempt': 1}, data.outputAttempt ? 'selected' : null))+(helper.link('Off', 'close', {'output_attempt': 0}, data.outputAttempt ? null : 'selected'))+' ';if(data.outputting){out+='[Sending]';}else if(data.charge > 0){out+='[Not Sending]';}else{out+='[No Charge]';}out+='
Output Setting:
'+(helper.bar(data.outputLevel, 0, data.outputLevelMax))+' '+(data.outputLevel)+' W
'+(helper.link('', 'fast-backward', {'set_output_level': '0'}, data.outputLevel ? null : 'selected'))+(helper.link('', 'backward', {'set_output_level': 'minus'}, data.outputLevel ? null : 'disabled'))+(helper.link('Set', 'pencil', {'set_output_level': 'custom'}, null))+(helper.link('', 'forward', {'set_output_level': 'plus'}, data.outputLevel == data.outputLevelMax ? 'disabled' : null))+(helper.link('', 'fast-forward', {'set_output_level': 'max'}, data.outputLevel == data.outputLevelMax ? 'selected' : null))+'
Outputting:
'+(data.outputUsed)+' W
';return out;
-},
- solar_control:function anonymous(data, config, helper
+};
+TMPL["solar_control"] = function anonymous(data, config, helper
/**/) {
var out='
Status
Generated Power:
'+(data.generated)+' W
Orientation:
'+(data.angle)+'° ('+(data.direction)+')'+(helper.link('15°', 'minus', {'rate_control': '1', 'cdir': '-15'}))+(helper.link('1°', 'minus', {'rate_control': '1', 'cdir': '-1'}))+(helper.link('1°', 'plus', {'rate_control': '1', 'cdir': '1'}))+(helper.link('15°', 'plus', {'rate_control': '1', 'cdir': '15'}))+'
Tracking
Tracker Mode:
'+(helper.link('Off', 'close', {'track': '0'}, (data.tracking_state == 0) ? 'selected' : ''))+(helper.link('Timed', 'clock', {'track': '1'}, (data.tracking_state == 1) ? 'selected' : ''));if(data.connected_tracker){out+=''+(helper.link('Auto', 'signal-diag', {'track': '2'}, (data.tracking_state == 2) ? 'selected' : ''));}else{out+=''+(helper.link('Auto', 'signal-diag', null, 'disabled'));}out+='
Tracking Rate:
'+(data.tracking_rate)+' deg/h ('+(data.rotating_way)+')'+(helper.link('180°', 'minus', {'rate_control': '1', 'tdir': '-180'}))+(helper.link('30°', 'minus', {'rate_control': '1', 'tdir': '-30'}))+(helper.link('1°', 'minus', { 'rate_control': '1', 'tdir': '-1'}))+(helper.link('1°', 'plus', { 'rate_control': '1', 'tdir': '1'}))+(helper.link('30°', 'plus', { 'rate_control': '1', 'tdir': '30'}))+(helper.link('180°', 'plus', { 'rate_control': '1', 'tdir': '180'}))+'
Devices
Solar Tracker:
';if(data.connected_tracker){out+='Found';}else{out+='Not Found';}out+='
Solars Panels:
'+(data.connected_panels)+' Connected
'+(helper.link('', 'refresh', {'search_connected': '1'}))+'
';return out;
-},
- space_heater:function anonymous(data, config, helper
+};
+TMPL["space_heater"] = function anonymous(data, config, helper
/**/) {
var out='
Status
Power:
'+(helper.link('On', 'power', {'power': 1}, !data.on ? null : 'selected'))+(helper.link('Off', 'close', {'power': 0}, data.on ? null : 'selected'))+'
Stored Energy:
';if(data.hasPowercell){out+=''+(helper.bar(data.powerLevel, 0, 100, 'good'))+' '+(data.powerLevel)+'%';if(data.open){out+='
'+(helper.link('Eject', 'eject', {'cellremove' : 1}, null));}}else{out+='No power cell loaded.';if(data.open){out+=''+(helper.link('Install', 'eject', {'cellinstall' : 1}, null ));}}out+='
Thermostat
Current Temp:
'+(data.currentTemp)+'°C
Target Temp:
'+(data.targetTemp)+'°C';if(data.open){out+='
'+(helper.link('','seek-prev',{'temp': -20}, data.targetTemp > data.minTemp ? null : 'disabled'))+(helper.link('','triangle-1-w', {'temp': -5}, data.targetTemp > data.minTemp ? null : 'disabled'))+(helper.link('Set', 'pencil', {'temp': 'custom'}, null))+(helper.link('','triangle-1-e', {'temp': 5}, data.targetTemp < data.maxTemp ? null : 'disabled'))+(helper.link('','seek-next',{'temp': 20}, data.targetTemp < data.maxTemp ? null : 'disabled'));}out+='
Operational Mode:
';if(data.open){out+=''+(helper.link('Heat', 'arrowthick-1-n', {'mode' : 'heat'}, data.mode != "heat" ? null : 'selected'))+(helper.link('Cool', 'arrowthick-1-s', {'mode' : 'cool'}, data.mode != "cool" ? null : 'selected'))+(helper.link('Auto', 'arrowthick-2-n-s', {'mode' : 'auto'}, (data.mode == "heat" || data.mode == "cool") ? null : 'selected'));}else{if(data.mode == "heat"){out+='Heat';}else if(data.mode == "cool"){out+='Cool';}else{out+='Auto';}}out+='
';return out;
-},
- tanks:function anonymous(data, config, helper
+};
+TMPL["tanks"] = function anonymous(data, config, helper
/**/) {
var out='';if(data.maskConnected){out+='
The regulator is connected to a mask.
';}else{out+='
The regulator is not connected to a mask.
';}out+='
Tank Pressure:
'+(helper.bar(data.tankPressure, 0, 1013, (data.tankPressure > 200) ? 'good' : ((data.tankPressure > 100) ? 'average' : 'bad')))+(data.tankPressure)+' kPa
Release Pressure:
'+(helper.bar(data.releasePressure, data.minReleasePressure, data.maxReleasePressure))+(data.releasePressure)+' kPa
Pressure Regulator:
'+(helper.link('Reset', 'refresh', {'dist_p': 'reset'}, (data.releasePressure != data.defaultReleasePressure) ? null : 'disabled'))+(helper.link('Min', 'minus', {'dist_p': 'min'}, (data.releasePressure > data.minReleasePressure) ? null : 'disabled'))+(helper.link('Set', 'pencil', {'dist_p': 'custom'}, null))+(helper.link('Max', 'plus', {'dist_p': 'max'}, (data.releasePressure < data.maxReleasePressure) ? null : 'disabled'))+'
'+(helper.link('Open', 'unlock', {'stat': 1}, data.maskConnected ? (data.valveOpen ? 'selected' : null) : 'disabled'))+(helper.link('Close', 'lock', {'stat': 1}, data.valveOpen ? null : 'selected'))+'
';return out;
-} };}());
\ No newline at end of file
+};
+TMPL["_generic"] = function anonymous(data, config, helper
+/**/) {
+var out='
';return out;
+};
+TMPL["_nanotrasen"] = function anonymous(data, config, helper
+/**/) {
+var out='
';return out;
+};
\ No newline at end of file
diff --git a/nano/bower.json b/nano/bower.json
new file mode 100644
index 00000000000..a49aeb17192
--- /dev/null
+++ b/nano/bower.json
@@ -0,0 +1,40 @@
+{
+ "name": "nanoui",
+ "private": true,
+ "dependencies": {
+ "DOM4": "dom4#~1.5.2",
+ "eddy-js": "~0.7.0",
+ "es5-shim": "~4.3.1",
+ "font-awesome": "~4.5.0",
+ "IE8": "ie8#~2.9.10",
+ "html5shiv": "~3.7.3",
+ "json3": "~3.3.2",
+ "jsurl": "*",
+ "normalize-css": "normalize.css#~3.0.3"
+ },
+ "overrides": {
+ "IE8": {
+ "main": "build/ie8.max.js"
+ },
+ "DOM4": {
+ "dependencies": {
+ "IE8": "*"
+ }
+ },
+ "eddy-js": {
+ "main": "build/eddy.dom.max.js",
+ "dependencies": {
+ "IE8": "*",
+ "DOM4": "*"
+ }
+ },
+ "font-awesome": {
+ "main": ["css/font-awesome.css", "fonts/*"]
+ },
+ "jsurl": {
+ "dependencies": {
+ "es5-shim": "*"
+ }
+ }
+ }
+}
diff --git a/nano/coffeelint.json b/nano/coffeelint.json
new file mode 100644
index 00000000000..8b80bb6c787
--- /dev/null
+++ b/nano/coffeelint.json
@@ -0,0 +1,6 @@
+{
+ "max_line_length": {
+ "name": "max_line_length",
+ "level": "ignore"
+ }
+}
diff --git a/nano/compiled/_generic.css b/nano/compiled/_generic.css
deleted file mode 100644
index 158dcb0b32a..00000000000
--- a/nano/compiled/_generic.css
+++ /dev/null
@@ -1 +0,0 @@
-h1,h2,h3{padding:6px 0;margin:0;clear:both}body,h1,h2,h3,ul{margin:0}.clearBoth,h1,h2,h3{clear:both}body{padding:0;font-family:Verdana,Geneva,sans-serif;font-size:12px;line-height:170%;color:#fff}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}hr{background-color:#40628a;height:1px;border:none}ul{padding:4px 0 0 10px;list-style-type:none}ul li{padding:0 0 2px}noscript{margin:33% auto;width:50%;height:33%;background:#fff;border:2px solid red;z-index:9999;padding:0 10px;text-align:center}#statusicon{width:24px;height:24px;background:url(statusicon.png) no-repeat}.bar,.link,.notice img{height:16px}.link,.link.active{background-color:#40628a}#statusicon.good{background-position:0 0}#statusicon.average{background-position:0 -24px}#statusicon.bad{background-position:0 -48px}.normal{color:#40628a}.good{color:#4f7529}.average{color:#cd6500}.bad{color:#e00}.label{color:#e9C183}.highlight{color:#8ba5c4}.dark{color:#272727}#loading,.bold,.notice,.noticePlaceholder{font-weight:700}#loading,.italic,.notice,.noticePlaceholder{font-style:italic}.fontReset,.link{color:#fff;font-size:12px;font-style:normal;text-decoration:none;font-weight:400}.hidden{display:none}.link,.link i.main{display:inline-block}.clearLeft{clear:left}.clearRight{clear:right}#content,.item,.itemGroup,.line,div.notice{clear:both}.floatNone{float:none}.floatLeft{float:left}.floatRight{float:right}.alignTop{vertical-align:top}.alignBottom{vertical-align:bottom}.alignLeft{text-align:left}.alignCenter{text-align:center}.alignRight{text-align:right}.link{margin:2px;padding:0 4px 4px;border:1px solid #111010;box-sizing:content-box;white-space:nowrap;cursor:default}.link .iconed{padding-left:3px}.link i{margin-right:3px}.link i.pending,.link.pending i.main{display:none}.item,.link.pending i.pending{display:inline-block}.link.active:hover{background-color:#486e9b}.link.active.selected{background-color:#2f943c}.link.active.selected:hover{background-color:#35a744}.link.active.caution{background-color:#adaf00}.link.active.caution:hover{background-color:#c6c900}.link.active.danger{background-color:#ea0000}.link.active.danger:hover{background-color:#ff0404}.link.inactive{background-color:#999}.link.inactive.selected{background-color:#2f943c}.link.inactive.caution{background-color:#adaf00}.link.inactive.danger{background-color:#ea0000}.link.disabled{background-color:#999}#loading,.notice,.noticePlaceholder{padding:2px 4px;margin:4px 0;color:#000;background:url(background_notice.jpg) 50% 50%}.noticePlaceholder{color:#fff;background:0 0}.notice img{position:absolute;top:0;left:0;width:16px}.itemGroup{border:1px solid #e9c183;background:#2c2c2c;padding:4px}.block,.statusDisplay{border:1px solid #40628a}.item{width:100%}.itemContent,.itemContentNarrow{float:left}.itemContentNarrow{width:30%}.itemContent{width:69%}.itemLabel,.itemLabelNarrow,.itemLabelWide,.itemLabelWider,.itemLabelWidest{float:left;color:#e9c183}.itemLabelNarrow{width:20%}.itemLabel{width:30%}.itemLabelWide{width:45%}.itemLabelWider{width:69%}.itemLabelWidest{width:100%}.itemContentWide{float:left;width:79%}.itemContentSmall{float:left;width:33%}.itemContentMedium{float:left;width:55%}.statusDisplay{display:block;position:relative;background:#000;color:#fff;padding:4px;margin:2px}.statusDisplay .itemLabel,.statusDisplay .itemLabelNarrow,.statusDisplay .itemLabelWide,.statusDisplay .itemLabelWider,.statusDisplay .itemLabelWidest{color:#98B0C3}.block{padding:8px;margin:10px 4px 4px;background-color:#202020}.line{width:100%}.fixedLeft{width:110px;float:left}.fixedLeftWide{width:165px;float:left}.fixedLeftWider{width:220px;float:left}.fixedLeftWidest{width:250px;float:left}.fixedLeftWiderRed{width:220px;float:left;background:#e00}.bar{position:relative;width:236px;border:1px solid #666;float:left;margin:0 5px 0 0;overflow:hidden;background:#000;box-sizing:border-box}.bar .barText{position:absolute;top:-2px;left:5px;width:100%;height:100%;color:#fff;font-weight:400}.bar .barFill{width:0;height:100%;background:#40628a;overflow:hidden;float:left}.bar .barFill.good{background:#4f7529}.bar .barFill.average{background:#cd6500}.bar .barFill.bad{background:#ea0000}.bar .barFill.highlight{background:#8BA5C4}body{background:url(background.png) 50% 0 repeat-x #272727}#content{padding:8px}
\ No newline at end of file
diff --git a/nano/compiled/_nanotrasen.css b/nano/compiled/_nanotrasen.css
deleted file mode 100644
index dbc3992c6cb..00000000000
--- a/nano/compiled/_nanotrasen.css
+++ /dev/null
@@ -1 +0,0 @@
-h1,h2,h3{padding:6px 0;margin:0;clear:both}body,h1,h2,h3,ul{margin:0}#content,.clearBoth,h1,h2,h3{clear:both}#titletext,.bar,.bar .barFill{overflow:hidden}body{padding:0;font-family:Verdana,Geneva,sans-serif;font-size:12px;line-height:170%;color:#fff}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}hr{background-color:#40628a;height:1px;border:none}ul{padding:4px 0 0 10px;list-style-type:none}ul li{padding:0 0 2px}noscript{margin:33% auto;width:50%;height:33%;background:#fff;border:2px solid red;z-index:9999;padding:0 10px;text-align:center}#statusicon{width:24px;height:24px;background:url(statusicon.png) no-repeat}.bar,.link,.notice img{height:16px}.link,.link.active{background-color:#40628a}#statusicon.good{background-position:0 0}#statusicon.average{background-position:0 -24px}#statusicon.bad{background-position:0 -48px}.normal{color:#40628a}.good{color:#4f7529}.average{color:#cd6500}.bad{color:#e00}.label{color:#e9C183}.highlight{color:#8ba5c4}.dark{color:#272727}#loading,.bold,.notice,.noticePlaceholder{font-weight:700}#loading,.italic,.notice,.noticePlaceholder{font-style:italic}.fontReset,.link{color:#fff;font-size:12px;font-style:normal;text-decoration:none;font-weight:400}.hidden{display:none}.link,.link i.main{display:inline-block}.clearLeft{clear:left}.clearRight{clear:right}.item,.itemGroup,.line,div.notice{clear:both}.floatNone{float:none}.floatLeft{float:left}.floatRight{float:right}.alignTop{vertical-align:top}.alignBottom{vertical-align:bottom}.alignLeft{text-align:left}.alignCenter{text-align:center}.alignRight{text-align:right}.link{margin:2px;padding:0 4px 4px;border:1px solid #111010;box-sizing:content-box;white-space:nowrap;cursor:default}.link .iconed{padding-left:3px}.link i{margin-right:3px}.link i.pending,.link.pending i.main{display:none}.item,.link.pending i.pending{display:inline-block}.link.active:hover{background-color:#486e9b}.link.active.selected{background-color:#2f943c}.link.active.selected:hover{background-color:#35a744}.link.active.caution{background-color:#adaf00}.link.active.caution:hover{background-color:#c6c900}.link.active.danger{background-color:#ea0000}.link.active.danger:hover{background-color:#ff0404}.link.inactive{background-color:#999}.link.inactive.selected{background-color:#2f943c}.link.inactive.caution{background-color:#adaf00}.link.inactive.danger{background-color:#ea0000}.link.disabled{background-color:#999}#loading,.notice,.noticePlaceholder{padding:2px 4px;margin:4px 0;color:#000;background:url(background_notice.jpg) 50% 50%}.noticePlaceholder{color:#fff;background:0 0}.notice img{position:absolute;top:0;left:0;width:16px}.itemGroup{border:1px solid #e9c183;background:#2c2c2c;padding:4px}.block,.statusDisplay{border:1px solid #40628a}.item{width:100%}.itemContent,.itemContentNarrow{float:left}.itemContentNarrow{width:30%}.itemContent{width:69%}.itemLabel,.itemLabelNarrow,.itemLabelWide,.itemLabelWider,.itemLabelWidest{float:left;color:#e9c183}.itemLabelNarrow{width:20%}.itemLabel{width:30%}.itemLabelWide{width:45%}.itemLabelWider{width:69%}.itemLabelWidest{width:100%}.itemContentWide{float:left;width:79%}.itemContentSmall{float:left;width:33%}.itemContentMedium{float:left;width:55%}.statusDisplay{display:block;position:relative;background:#000;color:#fff;padding:4px;margin:2px}#content,.block{padding:8px}.statusDisplay .itemLabel,.statusDisplay .itemLabelNarrow,.statusDisplay .itemLabelWide,.statusDisplay .itemLabelWider,.statusDisplay .itemLabelWidest{color:#98B0C3}.block{margin:10px 4px 4px;background-color:#202020}.line{width:100%}.fixedLeft{width:110px;float:left}.fixedLeftWide{width:165px;float:left}.fixedLeftWider{width:220px;float:left}.fixedLeftWidest{width:250px;float:left}.fixedLeftWiderRed{width:220px;float:left;background:#e00}.bar{position:relative;width:236px;border:1px solid #666;float:left;margin:0 5px 0 0;background:#000;box-sizing:border-box}.bar .barText{position:absolute;top:-2px;left:5px;width:100%;height:100%;color:#fff;font-weight:400}#statusicon,#titlelogo{position:absolute;top:4px}.bar .barFill{width:0;height:100%;background:#40628a;float:left}.bar .barFill.good{background:#4f7529}.bar .barFill.average{background:#cd6500}.bar .barFill.bad{background:#ea0000}.bar .barFill.highlight{background:#8BA5C4}body{background:url(background_nanotrasen.png) 50% 0 repeat-x #272727}#title{position:relative;height:30px}#statusicon{left:12px}#titletext{position:absolute;top:6px;left:44px;width:66%;color:#E9C183;font-size:16px}#titlelogo{right:12px;width:42px;height:24px;background:url(logo_nanotrasen.png) 50% 50% no-repeat}
\ No newline at end of file
diff --git a/nano/compiled/background.png b/nano/compiled/background.png
deleted file mode 100644
index 424b59cb76a..00000000000
Binary files a/nano/compiled/background.png and /dev/null differ
diff --git a/nano/compiled/background_nanotrasen.png b/nano/compiled/background_nanotrasen.png
deleted file mode 100644
index 5ff6e7e453b..00000000000
Binary files a/nano/compiled/background_nanotrasen.png and /dev/null differ
diff --git a/nano/compiled/background_notice.jpg b/nano/compiled/background_notice.jpg
deleted file mode 100644
index cd7b89fa9f0..00000000000
Binary files a/nano/compiled/background_notice.jpg and /dev/null differ
diff --git a/nano/compiled/background_syndicate.png b/nano/compiled/background_syndicate.png
deleted file mode 100644
index ee434c2d652..00000000000
Binary files a/nano/compiled/background_syndicate.png and /dev/null differ
diff --git a/nano/compiled/generic.css b/nano/compiled/generic.css
deleted file mode 100644
index e573873fdd5..00000000000
--- a/nano/compiled/generic.css
+++ /dev/null
@@ -1 +0,0 @@
-h1,h2,h3{padding:6px 0;margin:0;clear:both}body,h1,h2,h3,ul{margin:0}.clearBoth,h1,h2,h3{clear:both}body{padding:0;font-family:Verdana,Geneva,sans-serif;font-size:12px;line-height:170%;color:#fff}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}hr{background-color:#40628a;height:1px;border:none}ul{padding:4px 0 0 10px;list-style-type:none}ul li{padding:0 0 2px}noscript{margin:33% auto;width:50%;height:33%;background:#fff;border:2px solid red;z-index:9999;padding:0 10px;text-align:center}#statusicon{width:24px;height:24px;background:url(statusicon.png) no-repeat}.bar,.link,.notice img{height:16px}#statusicon.good{background-position:0 0}#statusicon.average{background-position:0 -24px}#statusicon.bad{background-position:0 -48px}.normal{color:#40628a}.good{color:#4f7529}.average{color:#cd6500}.bad{color:#e00}.label{color:#e9C183}.highlight{color:#8ba5c4}.dark{color:#272727}#loading,.bold,.notice,.noticePlaceholder{font-weight:700}#loading,.italic,.notice,.noticePlaceholder{font-style:italic}.fontReset,.link{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}.hidden{display:none}.link,.link i.main{display:inline-block}.clearLeft{clear:left}.clearRight{clear:right}#content,.item,.itemGroup,.line,div.notice{clear:both}.floatNone{float:none}.floatLeft{float:left}.floatRight{float:right}.alignTop{vertical-align:top}.alignBottom{vertical-align:bottom}.alignLeft{text-align:left}.alignCenter{text-align:center}.alignRight{text-align:right}.link{margin:2px;padding:0 4px 4px;border:1px solid #111010;box-sizing:content-box;cursor:default}.link .iconed{padding-left:3px}.link i{margin-right:3px}.link i.pending,.link.pending i.main{display:none}.item,.link.pending i.pending{display:inline-block}.link.normal.active{background:#40628a}.link.normal.active:hover{background:#507bad}.link.normal.inactive{background:#40628a}.link.normal.pending{background:#304967}.link.selected.active{background:#2f943c}.link.selected.active:hover{background:#3bbb4c}.link.selected.inactive{background:#2f943c}.link.selected.pending{background:#236d2c}.link.caution.active{background:#adaf00}.link.caution.active:hover{background:#dfe200}.link.caution.inactive{background:#adaf00}.link.caution.pending{background:#7b7c00}.link.danger.active{background:#ea0000}.link.danger.active:hover{background:#ff1e1e}.link.danger.inactive{background:#ea0000}.link.danger.pending{background:#b70000}.link.disabled.active{background:#999}.link.disabled.active:hover{background:#b3b3b3}.link.disabled.inactive{background:#999}.link.disabled.pending{background:grey}.link[disabled]{pointer-events:none;border-color:#000}.link[disabled].active{background:#999}.link[disabled].active:hover{background:#b3b3b3}.link[disabled].inactive{background:#999}.link[disabled].pending{background:grey}#loading,.notice,.noticePlaceholder{padding:2px 4px;margin:4px 0;color:#000;background:url(background_notice.jpg) 50% 50%}.noticePlaceholder{color:#fff;background:0 0}.notice img{position:absolute;top:0;left:0;width:16px}.itemGroup{border:1px solid #e9c183;background:#2c2c2c;padding:4px}.block,.statusDisplay{border:1px solid #40628a}.item{width:100%}.itemContent,.itemContentNarrow{float:left}.itemContentNarrow{width:30%}.itemContent{width:69%}.itemLabel,.itemLabelNarrow,.itemLabelWide,.itemLabelWider,.itemLabelWidest{float:left;color:#e9c183}.itemLabelNarrow{width:20%}.itemLabel{width:30%}.itemLabelWide{width:45%}.itemLabelWider{width:69%}.itemLabelWidest{width:100%}.itemContentWide{float:left;width:79%}.itemContentSmall{float:left;width:33%}.itemContentMedium{float:left;width:55%}.statusDisplay{display:block;position:relative;background:#000;color:#fff;padding:4px;margin:4px 0}.statusDisplay .itemLabel,.statusDisplay .itemLabelNarrow,.statusDisplay .itemLabelWide,.statusDisplay .itemLabelWider,.statusDisplay .itemLabelWidest{color:#98B0C3}.block{padding:8px;margin:10px 4px 4px;background-color:#202020}.line{width:100%}.fixedLeft{width:110px;float:left}.fixedLeftWide{width:165px;float:left}.fixedLeftWider{width:220px;float:left}.fixedLeftWidest{width:250px;float:left}.fixedLeftWiderRed{width:220px;float:left;background:#e00}.bar{position:relative;width:236px;border:1px solid #666;float:left;margin:0 5px 0 0;overflow:hidden;background:#000;box-sizing:border-box}.bar .barText{position:absolute;top:-2px;left:5px;width:100%;height:100%;color:#fff;font-weight:400}.bar .barFill{width:0;height:100%;background:#40628a;overflow:hidden;float:left}.bar .barFill.good{background:#4f7529}.bar .barFill.average{background:#cd6500}.bar .barFill.bad{background:#ea0000}.bar .barFill.highlight{background:#8BA5C4}body{background:url(background.png) 50% 0 repeat-x #272727}#content{padding:8px}
\ No newline at end of file
diff --git a/nano/compiled/logo_syndicate.png b/nano/compiled/logo_syndicate.png
deleted file mode 100644
index 05807dacc19..00000000000
Binary files a/nano/compiled/logo_syndicate.png and /dev/null differ
diff --git a/nano/compiled/nanotrasen.css b/nano/compiled/nanotrasen.css
deleted file mode 100644
index 35f76c74888..00000000000
--- a/nano/compiled/nanotrasen.css
+++ /dev/null
@@ -1 +0,0 @@
-h1,h2,h3{padding:6px 0;margin:0;clear:both}body,h1,h2,h3,ul{margin:0}#content,.clearBoth,h1,h2,h3{clear:both}#titletext,.bar,.bar .barFill{overflow:hidden}body{padding:0;font-family:Verdana,Geneva,sans-serif;font-size:12px;line-height:170%;color:#fff}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}hr{background-color:#40628a;height:1px;border:none}ul{padding:4px 0 0 10px;list-style-type:none}ul li{padding:0 0 2px}noscript{margin:33% auto;width:50%;height:33%;background:#fff;border:2px solid red;z-index:9999;padding:0 10px;text-align:center}#statusicon{width:24px;height:24px;background:url(statusicon.png) no-repeat}.bar,.link,.notice img{height:16px}#statusicon.good{background-position:0 0}#statusicon.average{background-position:0 -24px}#statusicon.bad{background-position:0 -48px}.normal{color:#40628a}.good{color:#4f7529}.average{color:#cd6500}.bad{color:#e00}.label{color:#e9C183}.highlight{color:#8ba5c4}.dark{color:#272727}#loading,.bold,.notice,.noticePlaceholder{font-weight:700}#loading,.italic,.notice,.noticePlaceholder{font-style:italic}.fontReset,.link{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}.hidden{display:none}.link,.link i.main{display:inline-block}.clearLeft{clear:left}.clearRight{clear:right}.item,.itemGroup,.line,div.notice{clear:both}.floatNone{float:none}.floatLeft{float:left}.floatRight{float:right}.alignTop{vertical-align:top}.alignBottom{vertical-align:bottom}.alignLeft{text-align:left}.alignCenter{text-align:center}.alignRight{text-align:right}.link{margin:2px;padding:0 4px 4px;border:1px solid #111010;box-sizing:content-box;cursor:default}.link .iconed{padding-left:3px}.link i{margin-right:3px}.link i.pending,.link.pending i.main{display:none}.item,.link.pending i.pending{display:inline-block}.link.normal.active{background:#40628a}.link.normal.active:hover{background:#507bad}.link.normal.inactive{background:#40628a}.link.normal.pending{background:#304967}.link.selected.active{background:#2f943c}.link.selected.active:hover{background:#3bbb4c}.link.selected.inactive{background:#2f943c}.link.selected.pending{background:#236d2c}.link.caution.active{background:#adaf00}.link.caution.active:hover{background:#dfe200}.link.caution.inactive{background:#adaf00}.link.caution.pending{background:#7b7c00}.link.danger.active{background:#ea0000}.link.danger.active:hover{background:#ff1e1e}.link.danger.inactive{background:#ea0000}.link.danger.pending{background:#b70000}.link.disabled.active{background:#999}.link.disabled.active:hover{background:#b3b3b3}.link.disabled.inactive{background:#999}.link.disabled.pending{background:grey}.link[disabled]{pointer-events:none;border-color:#000}.link[disabled].active{background:#999}.link[disabled].active:hover{background:#b3b3b3}.link[disabled].inactive{background:#999}.link[disabled].pending{background:grey}#loading,.notice,.noticePlaceholder{padding:2px 4px;margin:4px 0;color:#000;background:url(background_notice.jpg) 50% 50%}.noticePlaceholder{color:#fff;background:0 0}.notice img{position:absolute;top:0;left:0;width:16px}.itemGroup{border:1px solid #e9c183;background:#2c2c2c;padding:4px}.block,.statusDisplay{border:1px solid #40628a}.item{width:100%}.itemContent,.itemContentNarrow{float:left}.itemContentNarrow{width:30%}.itemContent{width:69%}.itemLabel,.itemLabelNarrow,.itemLabelWide,.itemLabelWider,.itemLabelWidest{float:left;color:#e9c183}.itemLabelNarrow{width:20%}.itemLabel{width:30%}.itemLabelWide{width:45%}.itemLabelWider{width:69%}.itemLabelWidest{width:100%}.itemContentWide{float:left;width:79%}.itemContentSmall{float:left;width:33%}.itemContentMedium{float:left;width:55%}.statusDisplay{display:block;position:relative;background:#000;color:#fff;padding:4px;margin:4px 0}#content,.block{padding:8px}.statusDisplay .itemLabel,.statusDisplay .itemLabelNarrow,.statusDisplay .itemLabelWide,.statusDisplay .itemLabelWider,.statusDisplay .itemLabelWidest{color:#98B0C3}.block{margin:10px 4px 4px;background-color:#202020}.line{width:100%}.fixedLeft{width:110px;float:left}.fixedLeftWide{width:165px;float:left}.fixedLeftWider{width:220px;float:left}.fixedLeftWidest{width:250px;float:left}.fixedLeftWiderRed{width:220px;float:left;background:#e00}.bar{position:relative;width:236px;border:1px solid #666;float:left;margin:0 5px 0 0;background:#000;box-sizing:border-box}.bar .barText{position:absolute;top:-2px;left:5px;width:100%;height:100%;color:#fff;font-weight:400}#statusicon,#titlelogo{position:absolute;top:4px}.bar .barFill{width:0;height:100%;background:#40628a;float:left}.bar .barFill.good{background:#4f7529}.bar .barFill.average{background:#cd6500}.bar .barFill.bad{background:#ea0000}.bar .barFill.highlight{background:#8BA5C4}body{background:url(background_nanotrasen.png) 50% 0 repeat-x #272727}#title{position:relative;height:30px}#statusicon{left:12px}#titletext{position:absolute;top:6px;left:44px;width:66%;color:#E9C183;font-size:16px}#titlelogo{right:12px;width:42px;height:24px;background:url(logo_nanotrasen.png) 50% 50% no-repeat}
\ No newline at end of file
diff --git a/nano/compiled/nanoui.js b/nano/compiled/nanoui.js
deleted file mode 100644
index 9d28f927c1b..00000000000
--- a/nano/compiled/nanoui.js
+++ /dev/null
@@ -1,324 +0,0 @@
-var nanoui = (function (templates) {
- "use strict";
- var nanoui = {};
-
-
- var _initialized = false;
- var _layoutRendered = false;
- var _contentRendered = false;
-
- var _initialData = {};
- var _data = {};
-
-
- var render = function (data) {
- if (!_initialized) {
- data = _initialData;
- }
-
- nanoui.emit('beforeRender', data);
- try {
- if (!_layoutRendered || data.config.autoUpdateLayout) {
- document.query('#layout').innerHTML = templates[data.config.templates.layout](data.data, data.config, nanoui.helpers);
- _layoutRendered = true;
- nanoui.emit('layoutRendered');
- }
- if (!_contentRendered || data.config.autoUpdateContent) {
- document.query('#content').innerHTML = templates[data.config.templates.content](data.data, data.config, nanoui.helpers);
- _contentRendered = true;
- nanoui.emit('contentRendered');
- }
- } catch (error) {
- nanoui.emit('error', error.fileName + ":" + error.lineNumber + ": " + error.message);
- return;
- }
- nanoui.emit('afterRender', data);
-
- if (!_initialized) {
- _initialized = true;
- }
- };
-
- var update = function (data) {
- if (!nanoui.util.hasKey(data, 'data')) {
- if (nanoui.util.hasKey(_data, 'data')) {
- data.data = _data.data;
- } else {
- data.data = {};
- }
- }
-
- _data = data;
-
- if (_initialized) {
- nanoui.emit('render', _data);
- }
-
- nanoui.emit('updateReceived');
- };
-
- var serverUpdate = function (dataString) {
- var data;
- try {
- data = JSON.parse(dataString);
- } catch (error) {
- nanoui.emit('error', error.fileName + ":" + error.lineNumber + ": " + error.message);
- return;
- }
-
- nanoui.emit('serverUpdateReceived');
- nanoui.emit('update', data);
- };
-
- var init = function () {
- nanoui.emit('earlyInit');
-
- _initialData = JSON.parse(document.query('body').data('initial-data'));
- if (_initialData === null || !nanoui.util.hasKey(_initialData, 'config') || !nanoui.util.hasKey(_initialData, 'data')) {
- nanoui.emit('error', "Initial data did not load correctly.");
- return;
- }
-
- nanoui.emit('lateInit');
- };
-
-
- document.when('ready', init);
- nanoui.on('lateInit', render);
- nanoui.on('serverUpdate', serverUpdate);
-
- nanoui.on('render', render);
- nanoui.on('update', update);
-
- return nanoui;
-}(TMPL));
-
-nanoui.handlers = (function (nanoui) {
- "use strict";
-
-
- var updateStatus = function (data) {
- var statusicon = document.query('#statusicon');
- if (!statusicon) {
- return;
- }
-
- switch (data.config.status) {
- case 2:
- statusicon.className = 'good';
- break;
- case 1:
- statusicon.className = 'average';
- break;
- default:
- statusicon.className = 'bad';
- }
- };
-
- var updateLinks = function (data) {
- var links = document.queryAll('.link');
- var pendingLinks = document.queryAll('.link.pending');
-
- if (data.config.status === 2) {
- links.forEach(function (element) {
- element.classList.remove('disabled');
- });
- pendingLinks.forEach(function (element) {
- element.classList.remove('pending');
- });
- } else {
- links.forEach(function (element) {
- element.classList.remove('active');
- element.classList.remove('pending');
- element.classList.add('disabled');
- });
- }
- };
-
- var attachHandlers = function (data) {
- var onClick = function (event) {
- event.preventDefault();
-
- var href = this.data('href');
- if (href !== null) {
- if (data.config.status === 2) {
- this.classList.add('pending');
- }
-
- location.href = href;
- }
- };
-
- document.queryAll('.link.active').forEach(function (element) {
- element.on('click', onClick);
- });
- };
-
- var error = function (message) {
- var url = nanoui.util.href({nanoui_error: message});
-
- location.href = url;
- };
-
-
- nanoui.on('beforeRender', updateStatus);
- nanoui.on('afterRender', updateLinks);
- nanoui.on('afterRender', attachHandlers);
-
- nanoui.on('error', error);
-
- return {};
-}(nanoui));
-
-nanoui.helpers = (function (nanoui) {
- "use strict";
- var helpers = {};
-
-
- helpers.link = function (text, icon, parameters, status, elementClass) {
- var context = {};
-
- context.text = text || "";
- context.icon = "";
- context.parameters = nanoui.util.href(parameters);
- context.status = status;
- context.elementClass = elementClass || "";
-
- if (nanoui.util.yes(icon)) {
- context.icon = nanoui.util.format("
", {icon: icon});
- context.elementClass += ' iconed';
- }
-
- if (nanoui.util.yes(status)) {
- return nanoui.util.format("
#{icon}#{text}
", context);
- }
- return nanoui.util.format("
#{icon}#{text}
", context);
- };
-
- helpers.bar = function (value, rangeMin, rangeMax, styleClass, barText) {
- var context = {};
-
- if (rangeMin < rangeMax) {
- if (value < rangeMin) {
- value = rangeMin;
- } else if (value > rangeMax) {
- value = rangeMax;
- }
- } else {
- if (value > rangeMin) {
- value = rangeMin;
- } else if (value < rangeMax) {
- value = rangeMax;
- }
- }
-
- context.styleClass = styleClass || "";
- context.barText = barText || "";
- context.percentage = Math.round((value - rangeMin) / (rangeMax - rangeMin) * 100);
-
- return nanoui.util.format("
", context);
- };
-
- helpers.round = function (number) {
- return Math.round(number);
- };
-
- helpers.fixed = function (number, decimals) {
- if (nanoui.util.no(decimals)) { decimals = 1; }
- return Number(Math.round(number + 'e'+decimals) + 'e-'+decimals);
- };
-
- helpers.floor = function (number) {
- return Math.floor(number);
- };
-
- helpers.ceil = function (number) {
- return Math.ceil(number);
- };
-
-
- return helpers;
-}(nanoui));
-
-nanoui.util = (function (nanoui) {
- "use strict";
- var util = {};
-
-
- var _urlParameters = {};
-
-
- var init = function () {
- _urlParameters = JSON.parse(document.query('body').data('url-parameters'));
- if (_urlParameters === null) {
- nanoui.emit('error', "URL parameters did not load correctly.");
- return;
- }
- };
-
- util.extend = function (first, second) {
- Object.keys(second).forEach(function (key) {
- var secondVal = second[key];
- if (secondVal && Object.prototype.toString.call(secondVal) === '[object Object]') {
- first[key] = first[key] || {};
- util.extend(first[key], secondVal);
- } else {
- first[key] = secondVal;
- }
- });
-
- return first;
- };
-
- util.format = function (str, obj) {
- if (!obj) {
- return str;
- }
- function getValue(str, context) {
- var ix = str.lastIndexOf('()');
- if (ix > 0 && ix + '()'.length === str.length) {
- return context[str.substring(0, ix)]();
- }
- return context[str];
- }
- return str.replace(/#\{(.+?)\}/g, function (ignore, $1) {
- var split = $1.split('.'),
- tmp = getValue(split[0], obj),
- i,
- l;
- for (i = 1, l = split.length; i < l; i++) {
- tmp = getValue(split[i], tmp);
- }
- return tmp;
- });
- };
-
- util.href = function (parameters) {
- var url = new Url("byond://");
-
- nanoui.util.extend(url.query, nanoui.util.extend(parameters, _urlParameters));
-
- return url;
- };
-
- util.isFunction = function (func) {
- return !!(func && func.call && func.apply);
- };
-
- util.hasKey = function (obj, key) {
- return obj.hasOwnProperty(key);
- };
-
- util.yes = function (arg) {
- return !(arg === 'undefined' || !arg);
- };
-
- util.no = function (arg) {
- return arg === 'undefined' || !arg;
- };
-
-
- nanoui.on('earlyInit', init);
-
- return util;
-}(nanoui));
diff --git a/nano/compiled/nanoui.min.js b/nano/compiled/nanoui.min.js
deleted file mode 100644
index 37aefb3af81..00000000000
--- a/nano/compiled/nanoui.min.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/*! nanoui 09-12-2015 */
-var nanoui=function(a){"use strict";var b={},c=!1,d=!1,e=!1,f={},g={},h=function(g){c||(g=f),b.emit("beforeRender",g);try{(!d||g.config.autoUpdateLayout)&&(document.query("#layout").innerHTML=a[g.config.templates.layout](g.data,g.config,b.helpers),d=!0,b.emit("layoutRendered")),(!e||g.config.autoUpdateContent)&&(document.query("#content").innerHTML=a[g.config.templates.content](g.data,g.config,b.helpers),e=!0,b.emit("contentRendered"))}catch(h){return void b.emit("error",h.fileName+":"+h.lineNumber+": "+h.message)}b.emit("afterRender",g),c||(c=!0)},i=function(a){b.util.hasKey(a,"data")||(b.util.hasKey(g,"data")?a.data=g.data:a.data={}),g=a,c&&b.emit("render",g),b.emit("updateReceived")},j=function(a){var c;try{c=JSON.parse(a)}catch(d){return void b.emit("error",d.fileName+":"+d.lineNumber+": "+d.message)}b.emit("serverUpdateReceived"),b.emit("update",c)},k=function(){return b.emit("earlyInit"),f=JSON.parse(document.query("body").data("initial-data")),null!==f&&b.util.hasKey(f,"config")&&b.util.hasKey(f,"data")?void b.emit("lateInit"):void b.emit("error","Initial data did not load correctly.")};return document.when("ready",k),b.on("lateInit",h),b.on("serverUpdate",j),b.on("render",h),b.on("update",i),b}(TMPL);nanoui.handlers=function(a){"use strict";var b=function(a){var b=document.query("#statusicon");if(b)switch(a.config.status){case 2:b.className="good";break;case 1:b.className="average";break;default:b.className="bad"}},c=function(a){var b=document.queryAll(".link"),c=document.queryAll(".link.pending");2===a.config.status?(b.forEach(function(a){a.classList.remove("disabled")}),c.forEach(function(a){a.classList.remove("pending")})):b.forEach(function(a){a.classList.remove("active"),a.classList.remove("pending"),a.classList.add("disabled")})},d=function(a){var b=function(b){b.preventDefault();var c=this.data("href");null!==c&&(2===a.config.status&&this.classList.add("pending"),location.href=c)};document.queryAll(".link.active").forEach(function(a){a.on("click",b)})},e=function(b){var c=a.util.href({nanoui_error:b});location.href=c};return a.on("beforeRender",b),a.on("afterRender",c),a.on("afterRender",d),a.on("error",e),{}}(nanoui),nanoui.helpers=function(a){"use strict";var b={};return b.link=function(b,c,d,e,f){var g={};return g.text=b||"",g.icon="",g.parameters=a.util.href(d),g.status=e,g.elementClass=f||"",a.util.yes(c)&&(g.icon=a.util.format("
",{icon:c}),g.elementClass+=" iconed"),a.util.yes(e)?a.util.format("
#{icon}#{text}
",g):a.util.format("
#{icon}#{text}
",g)},b.bar=function(b,c,d,e,f){var g={};return d>c?c>b?b=c:b>d&&(b=d):b>c?b=c:d>b&&(b=d),g.styleClass=e||"",g.barText=f||"",g.percentage=Math.round((b-c)/(d-c)*100),a.util.format("
",g)},b.round=function(a){return Math.round(a)},b.fixed=function(b,c){return a.util.no(c)&&(c=1),Number(Math.round(b+"e"+c)+"e-"+c)},b.floor=function(a){return Math.floor(a)},b.ceil=function(a){return Math.ceil(a)},b}(nanoui),nanoui.util=function(a){"use strict";var b={},c={},d=function(){return c=JSON.parse(document.query("body").data("url-parameters")),null===c?void a.emit("error","URL parameters did not load correctly."):void 0};return b.extend=function(a,c){return Object.keys(c).forEach(function(d){var e=c[d];e&&"[object Object]"===Object.prototype.toString.call(e)?(a[d]=a[d]||{},b.extend(a[d],e)):a[d]=e}),a},b.format=function(a,b){function c(a,b){var c=a.lastIndexOf("()");return c>0&&c+"()".length===a.length?b[a.substring(0,c)]():b[a]}return b?a.replace(/#\{(.+?)\}/g,function(a,d){var e,f,g=d.split("."),h=c(g[0],b);for(e=1,f=g.length;f>e;e++)h=c(g[e],h);return h}):a},b.href=function(b){var d=new Url("byond://");return a.util.extend(d.query,a.util.extend(b,c)),d},b.isFunction=function(a){return!!(a&&a.call&&a.apply)},b.hasKey=function(a,b){return a.hasOwnProperty(b)},b.yes=function(a){return!("undefined"===a||!a)},b.no=function(a){return"undefined"===a||!a},a.on("earlyInit",d),b}(nanoui);
\ No newline at end of file
diff --git a/nano/compiled/templates.min.js b/nano/compiled/templates.min.js
deleted file mode 100644
index 3c129d1dc2e..00000000000
--- a/nano/compiled/templates.min.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/*! nanoui 09-12-2015 */
-var TMPL=function(){return{_generic:function(a,b,c){var d="
";return d},_nanotrasen:function(a,b,c){var d="
";return d},air_alarm:function(a,b,c){var d='
';if(d+=a.siliconUser?'
Interface Lock:
'+c.link("Engaged","locked",{toggleaccess:1},a.locked?"selected":null)+c.link("Disengaged","unlocked",{toggleaccess:1},a.locked?null:"selected")+'
':a.locked?"Swipe an ID card to unlock this interface.":"Swipe an ID card to lock this interface.",d+='
Air Status
',a.environment_data){var e=a.environment_data;if(e)for(var f,g=-1,h=e.length-1;h>g;)f=e[g+=1],d+='
'+f.name+':
',d+=2==f.danger_level?"":1==f.danger_level?"":"",d+=""+c.fixed(f.value,2)+""+f.unit+"
";d+='
Local Status:
',d+=2==a.danger_level?"Danger (Internals Required)":1==a.danger_level?"Caution":"Optimal",d+='
Area Status:
',d+=a.atmos_alarm?"Atmosphere Alarm":a.fire_alarm?"Fire Alarm":"Nominal",d+="
"}else d+="
Warning: Cannot obtain air sample for analysis.
";if(a.dangerous&&(d+="
Warning: Safety measures offline. Device may exhibit abnormal behavior.
"),d+="
",!a.locked||a.siliconUser)if(1!=a.screen&&(d+='
'+c.link("Back","arrow-left",{screen:1})+"
"),1==a.screen)d+='
Air Controls
',d+=a.atmos_alarm?""+c.link("Area Atmospheric Alarm","close",{atmos_reset:1},null,"caution"):""+c.link("Area Atmospheric Alarm","hand-stop-o",{atmos_alarm:1}),d+='
',d+=3!=a.mode?""+c.link("Panic Siphon","exclamation",{mode:3}):""+c.link("Panic Siphon","close",{mode:1},null,"danger"),d+='
'+c.link("Vent Controls","sign-out",{screen:2})+'
'+c.link("Scrubber Controls","filter",{screen:3})+'
'+c.link("Set Environmental Mode","cog",{screen:4})+'
'+c.link("Set Alarm Threshold","bar-chart",{screen:5})+"
";else if(2==a.screen){d+="
Vent Controls
";var i=a.vents;if(i)for(var j,g=-1,k=i.length-1;k>g;)j=i[g+=1],d+="
"+j.long_name+'
Power:
',d+=j.power?""+c.link("On","power-off",{id_tag:j.id_tag,command:"power",val:0},null,null):""+c.link("Off","close",{id_tag:j.id_tag,command:"power",val:1},null,"danger"),d+='
Mode:
',d+="sipho"==j.direction?'Siphoning':'Pressurizing',d+='
Pressure Checks:
'+c.link("Internal","sign-in",{id_tag:j.id_tag,command:"incheck",val:j.checks},null,j.incheck?"selected":null)+c.link("External","sign-out",{id_tag:j.id_tag,command:"excheck",val:j.checks},null,j.excheck?"selected":null)+'
Set Pressure:
'+c.link(c.fixed(j.external),"pencil",{id_tag:j.id_tag,command:"set_external_pressure"})+c.link("Reset","refresh",{id_tag:j.id_tag,command:"reset_external_pressure"},j["default"]?"disabled":null)+"
";a.vents.length||(d+="No vents connected.")}else if(3==a.screen){d+="
Scrubber Controls
";var l=a.scrubbers;if(l)for(var m,g=-1,n=l.length-1;n>g;)m=l[g+=1],d+="
"+m.long_name+'
Power:
',d+=m.power?""+c.link("On","power-off",{id_tag:m.id_tag,command:"power",val:0},null,null):""+c.link("Off","close",{id_tag:m.id_tag,command:"power",val:1},null,"danger"),d+='
Mode:
',d+=m.scrubbing?""+c.link("Scrubbing","filter",{id_tag:m.id_tag,command:"scrubbing",val:0},null,null):""+c.link("Siphoning","sign-in",{id_tag:m.id_tag,command:"scrubbing",val:1},null,"danger"),d+='
Range:
',d+=m.widenet?""+c.link("Extended","expand",{id_tag:m.id_tag,command:"widenet",val:0},null,"caution"):""+c.link("Normal","compress",{id_tag:m.id_tag,command:"widenet",val:1},null,null),d+='
Filters:
'+c.link("CO2",m.filter_co2?"check-square-o":"square-o",{id_tag:m.id_tag,command:"co2_scrub",val:m.filter_co2?0:1},null,m.filter_co2?"selected":null)+c.link("N2O",m.filter_n2o?"check-square-o":"square-o",{id_tag:m.id_tag,command:"n2o_scrub",val:m.filter_n2o?0:1},null,m.filter_n2o?"selected":null)+c.link("Plasma",m.filter_toxins?"check-square-o":"square-o",{id_tag:m.id_tag,command:"tox_scrub",val:m.filter_toxins?0:1},null,m.filter_toxins?"selected":null)+"
";a.scrubbers.length||(d+="No scrubbers connected.")}else if(4==a.screen){d+='
Environmental Modes
';var o=a.modes;if(o)for(var p,g=-1,q=o.length-1;q>g;)p=o[g+=1],d+='
'+c.link(p.name,p.selected?"check-square-o":"square-o",{mode:p.mode},null,p.selected?p.danger?"danger":"selected":null)+"
";d+="
"}else if(5==a.screen){d+="
Alarm Thresholds
| min2 | min1 | max1 | max2 |
";var r=a.thresholds;if(r)for(var s,g=-1,t=r.length-1;t>g;){s=r[g+=1],d+="| "+s.name+" | ";var u=s.settings;if(u)for(var v,w=-1,x=u.length-1;x>w;)v=u[w+=1],d+=""+c.link(v.selected>=0?c.round(100*v.selected)/100:"Off",null,{command:"set_threshold",env:v.env,"var":v.val})+" | ";d+="
"}d+=""}return d},airlock_electronics:function(a,b,c){var d=''+c.link(a.oneAccess?"One Required":"All Required",a.oneAccess?"unlock":"lock",{access:"one"})+c.link("Reset","refresh",{access:"clear"})+'
',e=a.regions;if(e)for(var f,g=-1,h=e.length-1;h>g;)f=e[g+=1],d+='| '+f.name+" | ";d+="
";var i=a.regions;if(i)for(var f,g=-1,j=i.length-1;j>g;){f=i[g+=1],d+='';var k=f.accesses;if(k)for(var l,m=-1,n=k.length-1;n>m;)l=k[m+=1],d+=""+c.link(l.name,l.req?"check-square-o":"square-o",{access:l.id},null,l.req?"selected":null)+' ';d+=" | "}return d+="
"},apc:function(a,b,c){var d='';d+=a.siliconUser?'
Interface Lock:
'+c.link("Engaged","lock",{toggleaccess:1},a.locked?"selected":null)+c.link("Disengaged","unlock",{toggleaccess:1},a.malfStatus>=2?"linkOff":a.locked?null:"selected")+'
':a.locked?"Swipe an ID card to unlock this interface.":"Swipe an ID card to lock this interface.",d+='
Power Status
Main Breaker:
',d+=a.locked&&!a.siliconUser?a.isOperating?"On":"Off":""+c.link("On","power-off",{breaker:1},a.isOperating?"selected":null)+c.link("Off","close",{breaker:1},a.isOperating?null:"selected"),d+='
External Power:
',d+=2==a.externalPower?"Good":1==a.externalPower?"Low":"None",d+='
Power Cell:
',d+=null!=a.powerCellStatus?""+c.bar(a.powerCellStatus,0,100,a.powerCellStatus>=50?"good":a.powerCellStatus>=25?"average":"bad")+'
'+c.round(10*a.powerCellStatus)/10+"%
":"
Power cell removed.
",d+="
",null!=a.powerCellStatus&&(d+='
Charge Mode:
',d+=a.locked&&!a.siliconUser?a.chargeMode?"Auto":"Off":""+c.link("Auto","refresh",{cmode:1},a.chargeMode?"selected":null)+c.link("Off","close",{cmode:1},a.chargeMode?null:"selected"),d+=" ",d+=a.chargingStatus>1?"[Fully Charged]":1==a.chargingStatus?"[Charging]":"[Not Charging]",d+="
"),d+='
Power Channels
';var e=a.powerChannels;if(e)for(var f,g=-1,h=e.length-1;h>g;)f=e[g+=1],d+='
'+f.title+':
'+f.powerLoad+' W
',f.status<=1?d+="Off":f.status>=2&&(d+="On"),d+=" ",d+=1==f.status||3==f.status?"[Auto]":"[Manual]",d+="
",(!a.locked||a.siliconUser)&&(d+='
'+c.link("Auto","refresh",f.topicParams.auto,1==f.status||3==f.status?"selected":null)+c.link("On","power-off",f.topicParams.on,2==f.status?"selected":null)+c.link("Off","close",f.topicParams.off,0==f.status?"selected":null)+"
"),d+="
";return d+='
Total Load:
'+a.totalLoad+" W
",a.siliconUser&&(d+='
System Overrides
'+c.link("Overload Lighting Circuit","lightbulb",{overload:1})+'
',1==a.malfStatus?d+=""+c.link("Override Programming","script",{malfhack:1}):2==a.malfStatus?d+=""+c.link("Shunt Core Processes","arrowreturn-1-s",{occupyapc:1}):3==a.malfStatus?d+=""+c.link("Return to Main Core","arrowreturn-1-w",{deoccupyapc:1}):4==a.malfStatus&&(d+=""+c.link("Shunt Core Processes","arrowreturn-1-s",{occupyapc:1},"linkOff")),d+="
"),d+='
Cover Lock:
',d+=a.locked&&!a.siliconUser?a.coverLocked?"Engaged":"Disengaged":""+c.link("Engaged","lock",{lock:1},a.coverLocked?"selected":null)+c.link("Disengaged","unlock",{lock:1},a.coverLocked?null:"selected"),d+='
'},atmos_filter:function(a,b,c){var d='Power:
'+c.link(a.on?"On":"Off",a.on?"power":"close",{power:1})+'
Output Pressure:
'+c.link("Set","pencil",{set_press:"set"})+c.link("Max","plus",{set_press:"max"},a.set_pressure==a.max_pressure?"disabled":null)+a.set_pressure+' kPa
Filter:
'+c.link("Plasma",null,{filterset:0},0==a.filter_type?"selected":null)+c.link("O2",null,{filterset:1},1==a.filter_type?"selected":null)+c.link("N2",null,{filterset:2},2==a.filter_type?"selected":null)+c.link("CO2",null,{filterset:3},3==a.filter_type?"selected":null)+c.link("N2O",null,{filterset:4},4==a.filter_type?"selected":null)+c.link("Nothing",null,{filterset:-1},-1==a.filter_type?"selected":null)+"
";return d},atmos_mixer:function(a,b,c){var d='Power:
'+c.link(a.on?"On":"Off",a.on?"power":"close",{power:1})+'
Output Pressure:
'+c.link("Set","pencil",{set_press:"set"})+c.link("Max","plus",{set_press:"max"},a.set_pressure==a.max_pressure?"disabled":null)+a.set_pressure+' kPa
Node 1:
'+c.link("","seek-start",{node1_c:"-0.1"},null)+c.link("","triangle-1-w",{node1_c:"-0.01"},null)+c.link("","triangle-1-e",{node1_c:"0.01"},null)+c.link("","seek-end",{node1_c:"0.1"},null)+a.node1_concentration+'%
Node 2:
'+c.link("","seek-start",{node2_c:"-0.1"},null)+c.link("","triangle-1-w",{node2_c:"-0.01"},null)+c.link("","triangle-1-e",{node2_c:"0.01"},null)+c.link("","seek-end",{node2_c:"0.1"},null)+a.node2_concentration+"%
";return d},atmos_pump:function(a,b,c){var d='Power:
'+c.link(a.on?"On":"Off",a.on?"power":"close",{power:1})+"
";return d+=a.max_rate?'Transfer Rate:
'+c.link("Set","pencil",{set_transfer_rate:"set"})+c.link("Max","plus",{set_transfer_rate:"max"},a.transfer_rate==a.max_rate?"disabled":null)+a.transfer_rate+" L/s
":'Output Pressure:
'+c.link("Set","pencil",{set_press:"set"})+c.link("Max","plus",{set_press:"max"},a.set_pressure==a.max_pressure?"disabled":null)+a.set_pressure+" kPa
"},canister:function(a,b,c){var d="";return d+=a.hasHoldingTank?'The regulator is connected to a tank.
':'The regulator is not connected to a tank.
',d+='Canister
'+c.link("Relabel","pencil",{relabel:1},a.canLabel?null:"disabled")+'
Pressure:
'+a.tankPressure+' kPa
Port:
',d+=a.portConnected?'Connected':'Disconnected',d+='
Valve
Release Pressure:
'+c.bar(a.releasePressure,a.minReleasePressure,a.maxReleasePressure)+a.releasePressure+' kPa
Pressure Regulator:
'+c.link("Reset","refresh",{release_p:"reset"},a.releasePressure!=a.defaultReleasePressure?null:"disabled")+c.link("Min","minus",{release_p:"min"},a.releasePressure>a.minReleasePressure?null:"disabled")+c.link("Set","pencil",{release_p:"custom"},null)+c.link("Max","plus",{release_p:"max"},a.releasePressure
'+c.link("Open","unlock",{toggle:1},a.valveOpen?"selected":null)+c.link("Close","lock",{toggle:1},a.valveOpen?null:"selected")+"
Holding Tank
",d+=a.hasHoldingTank?""+c.link("Eject","eject",{remove_tank:1})+'Label:
'+a.holdingTank.name+'
Tank Pressure:
'+a.holdingTank.tankPressure+" kPa
":'No Holding Tank
'},chem_dispenser:function(a,b,c){var d='Status
Energy:
'+c.bar(a.energy,0,a.maxEnergy,"good")+a.energy+' Units
Amount:
',e=a.beakerTransferAmounts;if(e)for(var f,g=-1,h=e.length-1;h>g;)f=e[g+=1],d+=""+c.link(f,"plus",{amount:f},a.amount==f?"selected":null);d+='
Dispense
';var i=a.chemicals;if(i)for(var j,g=-1,k=i.length-1;k>g;)j=i[g+=1],d+=""+c.link(j.title,"tint",j.commands,null,"link fixedLeft");d+='
Beaker
'+c.link("Eject","eject",{ejectBeaker:1},a.isBeakerLoaded?null:"disabled")+'
';var l=a.beakerTransferAmounts;if(l)for(var f,g=-1,m=l.length-1;m>g;)f=l[g+=1],d+=""+c.link(f,"minus",{remove:f});if(d+='
Contents:
',a.isBeakerLoaded)if(d+="Volume: "+a.beakerCurrentVolume+"/"+a.beakerMaxVolume+" Units
",a.beakerContents.length){var n=a.beakerContents;if(n)for(var o,g=-1,p=n.length-1;p>g;)o=n[g+=1],d+=''+o.volume+" units of "+o.name+"
"}else d+='Beaker Empty';else d+='No Beaker Loaded';return d+="
"},chem_heater:function(a,b,c){var d='Status
Power:
'+c.link(a.isActive?"On":"Off",a.isActive?"power":"close",{toggle_on:1},a.isBeakerLoaded?null:"disabled")+'
Target:
'+c.link(a.targetTemp+"K","pencil",{adjust_temperature:"input"})+'
Beaker
'+c.link("Eject","eject",{eject_beaker:1},a.isBeakerLoaded?null:"disabled")+'
Contents:
';if(a.isBeakerLoaded)if(d+="Temperature: "+a.currentTemp+"K
",a.beakerContents.length){var e=a.beakerContents;if(e)for(var f,g=-1,h=e.length-1;h>g;)f=e[g+=1],d+=''+f.volume+" units of "+f.name+"
"}else d+='Beaker Empty';else d+='No Beaker Loaded';return d+="
"},cryo:function(a,b,c){var d='Occupant
Occupant:
';if(d+=a.hasOccupant?""+a.occupant.name:'No Occupant',d+="
",a.hasOccupant&&(d+='
State:
',d+=0==a.occupant.stat?'Conscious':1==a.occupant.stat?'Unconscious':'Dead',d+='
Temperature:
'+c.round(a.occupant.bodyTemperature)+" K
"),a.occupant.stat<2&&(d+='
Health:
',d+=a.occupant.health>=0?""+c.bar(a.occupant.health,0,a.occupant.maxHealth,"good"):""+c.bar(a.occupant.health,0,a.occupant.minHealth,"average"),d+=""+c.round(a.occupant.health)+'
Brute:
'+c.bar(a.occupant.bruteLoss,0,a.occupant.maxHealth,"bad")+c.round(a.occupant.bruteLoss)+'
Respiratory:
'+c.bar(a.occupant.oxyLoss,0,a.occupant.maxHealth,"bad")+c.round(a.occupant.oxyLoss)+'
Toxin:
'+c.bar(a.occupant.toxLoss,0,a.occupant.maxHealth,"bad")+c.round(a.occupant.toxLoss)+'
Burn:
'+c.bar(a.occupant.fireLoss,0,a.occupant.maxHealth,"bad")+c.round(a.occupant.fireLoss)+"
"),d+='
Cell
Power:
'+c.link("On","power",{switchOn:1},a.isOperating?"selected":null)+c.link("Off","close",{switchOff:1},a.isOperating?null:"selected")+'
Temperature:
'+a.cellTemperature+' K
Door:
'+c.link("Open","unlocked",{openCell:1},a.isOpen?"disabled":null)+c.link("Close","locked",{closeCell:1},a.isOpen?null:"disabled")+'
Eject:
'+c.link("Auto","eject",{autoEject:1},a.autoEject?"selected":null)+c.link("Manual","pin-s",{autoEject:0},a.autoEject?null:"selected")+'
Beaker
'+c.link("Eject","eject",{ejectBeaker:1},a.isBeakerLoaded?null:"disabled")+'
Contents:
',a.isBeakerLoaded)if(a.beakerContents.length){var e=a.beakerContents;if(e)for(var f,g=-1,h=e.length-1;h>g;)f=e[g+=1],d+=''+f.volume+" units of "+f.name+"
"}else d+='Beaker Empty';else d+='No Beaker Loaded';return d+="
"},smes:function(a,b,c){var d='Storage
Stored Energy:
'+c.bar(a.capacityPercent,0,100,a.capacityPercent>=50?"good":a.capacityPercent>=15?"average":"bad")+'
'+c.round(a.capacityPercent)+'%
Input
Charge Mode:
'+c.link("Auto","refresh",{input_attempt:1},a.inputAttempt?"selected":null)+c.link("Off","close",{input_attempt:0},a.inputAttempt?null:"selected")+" ";return d+=a.capacityPercent>=99?"[Fully Charged]":a.inputting?"[Charging]":"[Not Charging]",d+='
Input Setting:
'+c.bar(a.inputLevel,0,a.inputLevelMax)+" "+a.inputLevel+' W
'+c.link("","fast-backward",{set_input_level:"0"},a.inputLevel?null:"selected")+c.link("","backward",{set_input_level:"minus"},a.inputLevel?null:"disabled")+c.link("Set","pencil",{set_input_level:"custom"},null)+c.link("","forward",{set_input_level:"plus"},a.inputLevel==a.inputLevelMax?"disabled":null)+c.link("","fast-forward",{set_input_level:"max"},a.inputLevel==a.inputLevelMax?"selected":null)+'
Available:
'+a.inputAvailable+' W
Output
Charge Mode:
'+c.link("On","power-off",{output_attempt:1},a.outputAttempt?"selected":null)+c.link("Off","close",{output_attempt:0},a.outputAttempt?null:"selected")+" ",d+=a.outputting?'[Sending]':a.charge>0?'[Not Sending]':'[No Charge]',d+='
Output Setting:
'+c.bar(a.outputLevel,0,a.outputLevelMax)+" "+a.outputLevel+' W
'+c.link("","fast-backward",{set_output_level:"0"},a.outputLevel?null:"selected")+c.link("","backward",{set_output_level:"minus"},a.outputLevel?null:"disabled")+c.link("Set","pencil",{set_output_level:"custom"},null)+c.link("","forward",{set_output_level:"plus"},a.outputLevel==a.outputLevelMax?"disabled":null)+c.link("","fast-forward",{set_output_level:"max"},a.outputLevel==a.outputLevelMax?"selected":null)+'
Outputting:
'+a.outputUsed+" W
"},solar_control:function(a,b,c){var d='Status
Generated Power:
'+a.generated+' W
Orientation:
'+a.angle+"° ("+a.direction+")"+c.link("15°","minus",{rate_control:"1",cdir:"-15"})+c.link("1°","minus",{rate_control:"1",cdir:"-1"})+c.link("1°","plus",{rate_control:"1",cdir:"1"})+c.link("15°","plus",{rate_control:"1",cdir:"15"})+'
Tracking
Tracker Mode:
'+c.link("Off","close",{track:"0"},0==a.tracking_state?"selected":"")+c.link("Timed","clock",{track:"1"},1==a.tracking_state?"selected":"");return d+=a.connected_tracker?""+c.link("Auto","signal-diag",{track:"2"},2==a.tracking_state?"selected":""):""+c.link("Auto","signal-diag",null,"disabled"),d+='
Tracking Rate:
'+a.tracking_rate+" deg/h ("+a.rotating_way+")"+c.link("180°","minus",{rate_control:"1",tdir:"-180"})+c.link("30°","minus",{rate_control:"1",tdir:"-30"})+c.link("1°","minus",{rate_control:"1",tdir:"-1"})+c.link("1°","plus",{rate_control:"1",tdir:"1"})+c.link("30°","plus",{rate_control:"1",tdir:"30"})+c.link("180°","plus",{rate_control:"1",tdir:"180"})+'
Devices
Solar Tracker:
',d+=a.connected_tracker?'Found':'Not Found',d+='
Solars Panels:
'+a.connected_panels+' Connected
'+c.link("","refresh",{search_connected:"1"})+"
"},space_heater:function(a,b,c){var d='Status
Power:
'+c.link("On","power",{power:1},a.on?"selected":null)+c.link("Off","close",{power:0},a.on?null:"selected")+'
Stored Energy:
';return a.hasPowercell?(d+=""+c.bar(a.powerLevel,0,100,"good")+" "+a.powerLevel+"%",a.open&&(d+="
"+c.link("Eject","eject",{cellremove:1},null))):(d+="No power cell loaded.",a.open&&(d+=""+c.link("Install","eject",{cellinstall:1},null))),d+='
Thermostat
Current Temp:
'+a.currentTemp+'°C
Target Temp:
'+a.targetTemp+"°C",a.open&&(d+="
"+c.link("","seek-prev",{temp:-20},a.targetTemp>a.minTemp?null:"disabled")+c.link("","triangle-1-w",{temp:-5},a.targetTemp>a.minTemp?null:"disabled")+c.link("Set","pencil",{temp:"custom"},null)+c.link("","triangle-1-e",{temp:5},a.targetTemp
Operational Mode:
',d+=a.open?""+c.link("Heat","arrowthick-1-n",{mode:"heat"},"heat"!=a.mode?null:"selected")+c.link("Cool","arrowthick-1-s",{mode:"cool"},"cool"!=a.mode?null:"selected")+c.link("Auto","arrowthick-2-n-s",{mode:"auto"},"heat"==a.mode||"cool"==a.mode?null:"selected"):"heat"==a.mode?"Heat":"cool"==a.mode?"Cool":"Auto",d+="
"},tanks:function(a,b,c){var d="";return d+=a.maskConnected?'
The regulator is connected to a mask.
':'
The regulator is not connected to a mask.
',d+='
Tank Pressure:
'+c.bar(a.tankPressure,0,1013,a.tankPressure>200?"good":a.tankPressure>100?"average":"bad")+a.tankPressure+' kPa
Release Pressure:
'+c.bar(a.releasePressure,a.minReleasePressure,a.maxReleasePressure)+a.releasePressure+' kPa
Pressure Regulator:
'+c.link("Reset","refresh",{dist_p:"reset"},a.releasePressure!=a.defaultReleasePressure?null:"disabled")+c.link("Min","minus",{dist_p:"min"},a.releasePressure>a.minReleasePressure?null:"disabled")+c.link("Set","pencil",{dist_p:"custom"},null)+c.link("Max","plus",{dist_p:"max"},a.releasePressure
'+c.link("Open","unlock",{stat:1},a.maskConnected?a.valveOpen?"selected":null:"disabled")+c.link("Close","lock",{stat:1},a.valveOpen?null:"selected")+"
"}}}();
\ No newline at end of file
diff --git a/nano/images/background_notice.jpg b/nano/images/background_notice.jpg
deleted file mode 100644
index cd7b89fa9f0..00000000000
Binary files a/nano/images/background_notice.jpg and /dev/null differ
diff --git a/nano/images/logo_nanotrasen.png b/nano/images/logo_nanotrasen.png
deleted file mode 100644
index 513ba0c4965..00000000000
Binary files a/nano/images/logo_nanotrasen.png and /dev/null differ
diff --git a/nano/images/statusicon.png b/nano/images/statusicon.png
deleted file mode 100644
index ddf88b0dcda..00000000000
Binary files a/nano/images/statusicon.png and /dev/null differ
diff --git a/nano/package.json b/nano/package.json
index ef948bb00bb..b2c80fb3a9e 100644
--- a/nano/package.json
+++ b/nano/package.json
@@ -1,19 +1,30 @@
{
"name": "nanoui",
- "version": "0.3.0",
+ "private": true,
+ "dependencies": {
+ "autoprefixer": "^6.1.2",
+ "coffeelint-stylish": "^0.1.2",
+ "cssnano": "^3.4.0",
+ "del": "^2.2.0",
+ "gulp": "^3.9.0",
+ "gulp-coffee": "^2.3.1",
+ "gulp-concat": "^2.6.0",
+ "gulp-dot-precompiler": "git+https://github.com/kentliau/gulp-dot-precompiler.git",
+ "gulp-header": "^1.7.1",
+ "gulp-if": "^2.0.0",
+ "gulp-jsbeautifier": "^1.0.1",
+ "gulp-less": "^3.0.5",
+ "gulp-postcss": "^6.0.1",
+ "gulp-replace": "^0.5.4",
+ "gulp-uglify": "^1.5.1",
+ "gulp-util": "^3.0.7",
+ "main-bower-files": "^2.9.0",
+ "merge-stream": "^1.0.0",
+ "postcss-clearfix": "^0.2.0",
+ "postcss-url": "^5.0.2"
+ },
"devDependencies": {
- "grunt": "^0.4.5",
- "grunt-concurrent": "^2.1.0",
- "grunt-contrib-concat": "^0.5.1",
- "grunt-contrib-imagemin": "^1.0.0",
- "grunt-contrib-jshint": "^0.11.3",
- "grunt-contrib-less": "^1.1.0",
- "grunt-contrib-uglify": "^0.11.0",
- "grunt-contrib-watch": "^0.6.1",
- "grunt-dot": "git+ssh://git@github.com/neersighted/grunt-dot.git",
- "grunt-lesslint": "^2.0.0",
- "grunt-newer": "^1.1.1",
- "less-plugin-autoprefix": "^1.5.1",
- "less-plugin-clean-css": "^1.5.1"
+ "gulp-csscomb": "^3.0.6",
+ "gulp-filter": "^3.0.1"
}
}
diff --git a/nano/reload.bat b/nano/reload.bat
new file mode 100644
index 00000000000..11286ecfafa
--- /dev/null
+++ b/nano/reload.bat
@@ -0,0 +1,2 @@
+FOR /F "tokens=3* delims= " %%a in ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal"') do (set documents=%%a)
+copy assets\* "%documents%\BYOND\cache" /y
diff --git a/nano/scripts/handlers.coffee b/nano/scripts/handlers.coffee
new file mode 100644
index 00000000000..089e188ed03
--- /dev/null
+++ b/nano/scripts/handlers.coffee
@@ -0,0 +1,48 @@
+class @Handlers
+ constructor: (@bus) ->
+ @bus.on "rendered", @updateStatus
+ @bus.on "rendered", @updateLinks
+ @bus.on "rendered", @attachHandlers
+ @bus.on "error", @error
+
+ updateStatus: (data) ->
+ statusicons = document.queryAll(".statusicon")
+ statusicons.forEach (statusicon) ->
+ switch data.config.status
+ when 2
+ statusicon.className = "statusicon good"
+ when 1
+ statusicon.className = "statusicon average"
+ else
+ statusicon.className = "statusicon bad"
+ return
+ return
+
+
+ updateLinks: (data) ->
+ links = document.queryAll(".link")
+ if data.config.status isnt 2
+ links.forEach (element) ->
+ element.className = "link disabled"
+ return
+ return
+
+
+ attachHandlers: (data) ->
+ onClick = (event) ->
+ href = @data("href")
+ if href? and data.config.status is 2
+ @classList.add "pending"
+ location.href = href
+ return
+
+ document.queryAll(".link").forEach (element) ->
+ element.on "click", onClick
+ return
+ return
+
+
+ error: (message) ->
+ url = Util.href(nanoui_error: message)
+ location.href = url
+ return
diff --git a/nano/scripts/helpers.coffee b/nano/scripts/helpers.coffee
new file mode 100644
index 00000000000..5ddbc11ac75
--- /dev/null
+++ b/nano/scripts/helpers.coffee
@@ -0,0 +1,53 @@
+@Helpers =
+ link: (text = "", icon = "", parameters = {}, \
+ status = "", elementClass = "") ->
+ parameters = window.Util.href(parameters)
+
+ if !!icon
+ icon = "
"
+ elementClass += " iconed"
+
+ if !!status
+ "
#{icon}#{text}
"
+ else
+ "
#{icon}#{text}
"
+
+
+ bar: (value = 0, rangeMin = 0, rangeMax = 100,
+ styleClass = "", barText = "") ->
+ if rangeMin < rangeMax
+ if value < rangeMin
+ value = rangeMin
+ else if value > rangeMax
+ value = rangeMax
+ else
+ if value > rangeMin
+ value = rangeMin
+ else if value < rangeMax
+ value = rangeMax
+
+ percentage = Math.round((value - rangeMin) / (rangeMax - rangeMin) * 100)
+
+ "
\
+ \
+ #{barText} \
+
"
+
+
+ round: (number) ->
+ Math.round number
+
+
+ fixed: (number, decimals = 1) ->
+ Number Math.round(number + "e" + decimals) + "e-" + decimals
+
+
+ floor: (number) ->
+ Math.floor number
+
+
+ ceil: (number) ->
+ Math.ceil number
diff --git a/nano/scripts/main.coffee b/nano/scripts/main.coffee
new file mode 100644
index 00000000000..f9100ac68b1
--- /dev/null
+++ b/nano/scripts/main.coffee
@@ -0,0 +1,9 @@
+document.when "ready", =>
+ coderbus = {}
+
+ nanoui = new @NanoUI coderbus
+ handlers = new @Handlers coderbus
+ coderbus.emit "memes"
+
+ @NanoBus = coderbus
+ return
diff --git a/nano/scripts/nanoui.coffee b/nano/scripts/nanoui.coffee
new file mode 100644
index 00000000000..8fdd7c21a35
--- /dev/null
+++ b/nano/scripts/nanoui.coffee
@@ -0,0 +1,74 @@
+class @NanoUI
+ constructor: (@bus) ->
+ @bus.on "serverUpdate", @serverUpdate
+ @bus.on "update", @update
+ @bus.on "render", @render
+ @bus.on "memes", @render
+
+ @initialized = false
+ @layoutRendered = false
+ @contentRendered = false
+
+ @data = {}
+ @initialData = JSON.parse document.query("#data").data("initial")
+
+ unless @initialData? or
+ not ("data" of @initialData or "config" of @initalData)
+ @bus.emit "error", "Initial data did not load correctly."
+ return
+
+
+ serverUpdate: (dataString) =>
+ try
+ data = JSON.parse(dataString)
+ catch error
+ NanoBus.emit "error", \
+ "#{error.fileName}:#{error.lineNumber} #{error.message}"
+ return
+
+ @bus.emit "update", data
+ return
+
+
+ update: (data) =>
+ unless data.data?
+ if @data.data?
+ data.data = @data.data
+ else
+ data.data = {}
+
+ @data = data
+
+ @bus.emit "render", @data if @initialized
+ @bus.emit "updated"
+ return
+
+
+ render: (data) =>
+ data = @initialData unless @initialized
+
+ try
+ if not @layoutRendered or data.config.autoUpdateLayout
+ layout = document.query("#layout")
+ layout.innerHTML = TMPL[data.config.templates.layout]\
+ (data.data, data.config, Helpers)
+
+ @layoutRendered = true
+ @bus.emit "layoutRendered"
+
+ if not @contentRendered or data.config.autoUpdateContent
+ content = document.query("#content")
+ content.innerHTML = TMPL[data.config.templates.content]\
+ (data.data, data.config, Helpers)
+
+ @contentRendered = true
+ @bus.emit "contentRendered"
+
+ catch error
+ @bus.emit "error", \
+ "#{error.fileName}:#{error.lineNumber} #{error.message}"
+ return
+
+ @bus.emit "rendered", data
+ @initialized = true unless @initialized
+ return
diff --git a/nano/scripts/nanoui.handlers.js b/nano/scripts/nanoui.handlers.js
deleted file mode 100644
index 8accf0be21c..00000000000
--- a/nano/scripts/nanoui.handlers.js
+++ /dev/null
@@ -1,76 +0,0 @@
-nanoui.handlers = (function (nanoui) {
- "use strict";
-
-
- var updateStatus = function (data) {
- var statusicon = document.query('#statusicon');
- if (!statusicon) {
- return;
- }
-
- switch (data.config.status) {
- case 2:
- statusicon.className = 'good';
- break;
- case 1:
- statusicon.className = 'average';
- break;
- default:
- statusicon.className = 'bad';
- }
- };
-
- var updateLinks = function (data) {
- var links = document.queryAll('.link');
- var pendingLinks = document.queryAll('.link.pending');
-
- if (data.config.status === 2) {
- links.forEach(function (element) {
- element.classList.remove('disabled');
- });
- pendingLinks.forEach(function (element) {
- element.classList.remove('pending');
- });
- } else {
- links.forEach(function (element) {
- element.classList.remove('active');
- element.classList.remove('pending');
- element.classList.add('disabled');
- });
- }
- };
-
- var attachHandlers = function (data) {
- var onClick = function (event) {
- event.preventDefault();
-
- var href = this.data('href');
- if (href !== null) {
- if (data.config.status === 2) {
- this.classList.add('pending');
- }
-
- location.href = href;
- }
- };
-
- document.queryAll('.link.active').forEach(function (element) {
- element.on('click', onClick);
- });
- };
-
- var error = function (message) {
- var url = nanoui.util.href({nanoui_error: message});
-
- location.href = url;
- };
-
-
- nanoui.on('beforeRender', updateStatus);
- nanoui.on('afterRender', updateLinks);
- nanoui.on('afterRender', attachHandlers);
-
- nanoui.on('error', error);
-
- return {};
-}(nanoui));
diff --git a/nano/scripts/nanoui.helpers.js b/nano/scripts/nanoui.helpers.js
deleted file mode 100644
index 92e0ae91cb5..00000000000
--- a/nano/scripts/nanoui.helpers.js
+++ /dev/null
@@ -1,69 +0,0 @@
-nanoui.helpers = (function (nanoui) {
- "use strict";
- var helpers = {};
-
-
- helpers.link = function (text, icon, parameters, status, elementClass) {
- var context = {};
-
- context.text = text || "";
- context.icon = "";
- context.parameters = nanoui.util.href(parameters);
- context.status = status;
- context.elementClass = elementClass || "";
-
- if (nanoui.util.yes(icon)) {
- context.icon = nanoui.util.format("
", {icon: icon});
- context.elementClass += ' iconed';
- }
-
- if (nanoui.util.yes(status)) {
- return nanoui.util.format("
#{icon}#{text}
", context);
- }
- return nanoui.util.format("
#{icon}#{text}
", context);
- };
-
- helpers.bar = function (value, rangeMin, rangeMax, styleClass, barText) {
- var context = {};
-
- if (rangeMin < rangeMax) {
- if (value < rangeMin) {
- value = rangeMin;
- } else if (value > rangeMax) {
- value = rangeMax;
- }
- } else {
- if (value > rangeMin) {
- value = rangeMin;
- } else if (value < rangeMax) {
- value = rangeMax;
- }
- }
-
- context.styleClass = styleClass || "";
- context.barText = barText || "";
- context.percentage = Math.round((value - rangeMin) / (rangeMax - rangeMin) * 100);
-
- return nanoui.util.format("
", context);
- };
-
- helpers.round = function (number) {
- return Math.round(number);
- };
-
- helpers.fixed = function (number, decimals) {
- if (nanoui.util.no(decimals)) { decimals = 1; }
- return Number(Math.round(number + 'e'+decimals) + 'e-'+decimals);
- };
-
- helpers.floor = function (number) {
- return Math.floor(number);
- };
-
- helpers.ceil = function (number) {
- return Math.ceil(number);
- };
-
-
- return helpers;
-}(nanoui));
diff --git a/nano/scripts/nanoui.js b/nano/scripts/nanoui.js
deleted file mode 100644
index 68719403812..00000000000
--- a/nano/scripts/nanoui.js
+++ /dev/null
@@ -1,94 +0,0 @@
-var nanoui = (function (templates) {
- "use strict";
- var nanoui = {};
-
-
- var _initialized = false;
- var _layoutRendered = false;
- var _contentRendered = false;
-
- var _initialData = {};
- var _data = {};
-
-
- var render = function (data) {
- if (!_initialized) {
- data = _initialData;
- }
-
- nanoui.emit('beforeRender', data);
- try {
- if (!_layoutRendered || data.config.autoUpdateLayout) {
- document.query('#layout').innerHTML = templates[data.config.templates.layout](data.data, data.config, nanoui.helpers);
- _layoutRendered = true;
- nanoui.emit('layoutRendered');
- }
- if (!_contentRendered || data.config.autoUpdateContent) {
- document.query('#content').innerHTML = templates[data.config.templates.content](data.data, data.config, nanoui.helpers);
- _contentRendered = true;
- nanoui.emit('contentRendered');
- }
- } catch (error) {
- nanoui.emit('error', error.fileName + ":" + error.lineNumber + ": " + error.message);
- return;
- }
- nanoui.emit('afterRender', data);
-
- if (!_initialized) {
- _initialized = true;
- }
- };
-
- var update = function (data) {
- if (!nanoui.util.hasKey(data, 'data')) {
- if (nanoui.util.hasKey(_data, 'data')) {
- data.data = _data.data;
- } else {
- data.data = {};
- }
- }
-
- _data = data;
-
- if (_initialized) {
- nanoui.emit('render', _data);
- }
-
- nanoui.emit('updateReceived');
- };
-
- var serverUpdate = function (dataString) {
- var data;
- try {
- data = JSON.parse(dataString);
- } catch (error) {
- nanoui.emit('error', error.fileName + ":" + error.lineNumber + ": " + error.message);
- return;
- }
-
- nanoui.emit('serverUpdateReceived');
- nanoui.emit('update', data);
- };
-
- var init = function () {
- nanoui.emit('earlyInit');
-
- _initialData = JSON.parse(document.query('body').data('initial-data'));
- if (_initialData === null || !nanoui.util.hasKey(_initialData, 'config') || !nanoui.util.hasKey(_initialData, 'data')) {
- nanoui.emit('error', "Initial data did not load correctly.");
- return;
- }
-
- nanoui.emit('lateInit');
- };
-
-
- document.when('ready', init);
- nanoui.on('lateInit', render);
- nanoui.on('serverUpdate', serverUpdate);
-
- nanoui.on('render', render);
- nanoui.on('update', update);
-
- return nanoui;
-}(TMPL));
diff --git a/nano/scripts/nanoui.util.js b/nano/scripts/nanoui.util.js
deleted file mode 100644
index 85319e8012f..00000000000
--- a/nano/scripts/nanoui.util.js
+++ /dev/null
@@ -1,82 +0,0 @@
-nanoui.util = (function (nanoui) {
- "use strict";
- var util = {};
-
-
- var _urlParameters = {};
-
-
- var init = function () {
- _urlParameters = JSON.parse(document.query('body').data('url-parameters'));
- if (_urlParameters === null) {
- nanoui.emit('error', "URL parameters did not load correctly.");
- return;
- }
- };
-
- util.extend = function (first, second) {
- Object.keys(second).forEach(function (key) {
- var secondVal = second[key];
- if (secondVal && Object.prototype.toString.call(secondVal) === '[object Object]') {
- first[key] = first[key] || {};
- util.extend(first[key], secondVal);
- } else {
- first[key] = secondVal;
- }
- });
-
- return first;
- };
-
- util.format = function (str, obj) {
- if (!obj) {
- return str;
- }
- function getValue(str, context) {
- var ix = str.lastIndexOf('()');
- if (ix > 0 && ix + '()'.length === str.length) {
- return context[str.substring(0, ix)]();
- }
- return context[str];
- }
- return str.replace(/#\{(.+?)\}/g, function (ignore, $1) {
- var split = $1.split('.'),
- tmp = getValue(split[0], obj),
- i,
- l;
- for (i = 1, l = split.length; i < l; i++) {
- tmp = getValue(split[i], tmp);
- }
- return tmp;
- });
- };
-
- util.href = function (parameters) {
- var url = new Url("byond://");
-
- nanoui.util.extend(url.query, nanoui.util.extend(parameters, _urlParameters));
-
- return url;
- };
-
- util.isFunction = function (func) {
- return !!(func && func.call && func.apply);
- };
-
- util.hasKey = function (obj, key) {
- return obj.hasOwnProperty(key);
- };
-
- util.yes = function (arg) {
- return !(arg === 'undefined' || !arg);
- };
-
- util.no = function (arg) {
- return arg === 'undefined' || !arg;
- };
-
-
- nanoui.on('earlyInit', init);
-
- return util;
-}(nanoui));
diff --git a/nano/scripts/util.coffee b/nano/scripts/util.coffee
new file mode 100644
index 00000000000..4c03f449220
--- /dev/null
+++ b/nano/scripts/util.coffee
@@ -0,0 +1,21 @@
+@Util =
+ extend: (first, second) ->
+ Object.keys(second).forEach (key) ->
+ secondVal = second[key]
+ if secondVal and Object::toString.call(secondVal) is "[object Object]"
+ first[key] = first[key] or {}
+ @extend first[key], secondVal
+ else
+ first[key] = secondVal
+ return
+
+ first
+
+
+ href: (parameters) ->
+ baseParameters = JSON.parse(document.query("#data").data("url-parameters"))
+
+ url = new Url("byond://")
+ @extend url.query, @extend(parameters, baseParameters)
+
+ url
diff --git a/nano/styles/_bar.less b/nano/styles/_bar.less
new file mode 100644
index 00000000000..50e074f1b6e
--- /dev/null
+++ b/nano/styles/_bar.less
@@ -0,0 +1,48 @@
+@import "_config";
+@import "_util";
+
+
+.bar {
+ display: inline-block;
+ position: relative;
+ top: 4px; // Because this is an empty div, hack it so that it lines up.
+ vertical-align: top;
+ box-sizing: border-box;
+ width: 100%;
+ height: 20px; // Buttons are 22px, but look 20px because of their dark borders.
+ margin: 1px;
+ padding: 1px;
+
+ border: 1px solid @normal;
+
+ background: @dark;
+
+ .barText {
+ position: absolute;
+ top: 1px;
+ right: 3px;
+
+ .fontReset;
+ }
+
+ .barFill {
+ display: block;
+ height: 100%;
+
+ overflow: hidden;
+
+ background: @normal;
+ &.good {
+ background: @good;
+ }
+ &.average {
+ background: @average;
+ }
+ &.bad {
+ background: @bad;
+ }
+ &.highlight {
+ background: @highlight;
+ }
+ }
+}
diff --git a/nano/styles/_common.less b/nano/styles/_common.less
new file mode 100644
index 00000000000..95f25341f4c
--- /dev/null
+++ b/nano/styles/_common.less
@@ -0,0 +1,10 @@
+@import "_config";
+@import "_util";
+
+.content {
+ margin: 3px;
+}
+
+.loading {
+ .noticeStripes;
+}
diff --git a/nano/styles/config.less b/nano/styles/_config.less
similarity index 57%
rename from nano/styles/config.less
rename to nano/styles/_config.less
index 5b06e0b1dce..0dae788a97c 100644
--- a/nano/styles/config.less
+++ b/nano/styles/_config.less
@@ -1,31 +1,33 @@
-// Fonts
-@font: Verdana, Geneva, sans-serif;
-@font-size: 12px;
-
-// Global Colors
-@normal: #40628a;
-@good: #4f7529;
-@average: #cd6500;
-@bad: #ee0000;
-@label: #e9C183;
-@highlight: #8ba5c4;
-@dark: #272727;
-
-// Body Colors
-@title: @label;
-@text: white;
-@text-inverse: black;
-@background: @dark;
-
-// Component Colors
-@border: @normal;
-
-// Link Colors
-@selected: #2f943c;
-@caution: #adaf00;
-@danger: #ea0000;
-@disabled: #999999;
-
-@link-border: #393939;
-
-@hover: 5%;
+// Fonts
+@font: Verdana, Geneva, sans-serif;
+@fontsize: 12px;
+
+// Global Colors
+@normal: #40628a;
+@good: #4f7529;
+@average: #cd6500;
+@bad: #ee0000;
+@highlight: #8ba5c4;
+@info: #e9C183;
+@label: @highlight;
+@dark: #272727;
+
+// Body Colors
+@title: #98b0c3;
+@text: white;
+@textinverse: black;
+@background: @dark;
+
+// Component Colors
+@border: @dark;
+@rule: @normal;
+@display: darken(@dark, 5%);
+@notice1: #bb9b68;
+@notice2: #b1905d;
+
+// Link Colors
+@hover: 5%;
+@selected: #2f943c;
+@caution: #bbbe00;
+@danger: #ea0000;
+@disabled: #999999;
diff --git a/nano/styles/_document.less b/nano/styles/_document.less
new file mode 100644
index 00000000000..e6f3b9d0435
--- /dev/null
+++ b/nano/styles/_document.less
@@ -0,0 +1,33 @@
+@import "_config";
+@import "_util";
+
+
+body {
+ padding: 0;
+ margin: 0;
+
+ font-family: @font;
+ font-size: @fontsize;
+ color: @text;
+
+ background: @background;
+}
+
+h1 {
+ font-size: @fontsize + 6px;
+ margin: 0;
+ padding: 6px 0;
+}
+h2 {
+ &:extend(h1);
+ font-size: @fontsize + 4px;
+}
+h3 {
+ &:extend(h1);
+ font-size: @fontsize + 2px;
+}
+
+hr {
+ background-color: @rule;
+ border: none;
+}
diff --git a/nano/styles/_generic.less b/nano/styles/_generic.less
deleted file mode 100644
index 56797255a54..00000000000
--- a/nano/styles/_generic.less
+++ /dev/null
@@ -1,19 +0,0 @@
-@import "config";
-@import "common";
-@import "util";
-@import "link";
-@import "machines";
-@import "bar";
-
-body {
- background: @background url(background.png) 50% 0 repeat-x;
-}
-
-#content {
- clear: both;
- padding: 8px;
-}
-
-#loading {
- &:extend(.notice);
-}
diff --git a/nano/styles/_interface.less b/nano/styles/_interface.less
new file mode 100644
index 00000000000..efe238f7410
--- /dev/null
+++ b/nano/styles/_interface.less
@@ -0,0 +1,90 @@
+@import "_config";
+@import "_util";
+
+
+article.display {
+ display: flex;
+ flex-flow: column nowrap;
+ width: auto;
+ padding: 4px;
+ margin: 6px 2px;
+
+ border: 2px solid @border;
+ box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.5);
+
+ background-color: rgba(0, 0, 0, 0.4); // Transparent background.
+
+ header {
+ padding-left: 4px;
+ margin-bottom: 6px;
+
+ border-bottom: 2px solid @rule;
+ }
+
+ section {
+ width: 100%;
+ padding: 2px 0;
+ }
+
+ section.text {
+ &:extend(section);
+ padding: 5px 0;
+ }
+
+ section.button {
+ &:extend(section);
+ padding-bottom: 0;
+ }
+
+ .cell {
+ display: inline-block;
+ margin: 0;
+ }
+
+ .label {
+ .cell;
+ width: 33%;
+
+ color: @label;
+ }
+
+ .content {
+ .cell;
+ width: 66%;
+ }
+
+ .line {
+ .cell;
+ width: 100%;
+ }
+
+ table {
+ border-collapse: collapse;
+ }
+
+ th {
+ padding: 2px 12px 4px 0;
+ text-align: left;
+ }
+
+ td {
+ &:extend(th);
+ padding: 2px 2px 0 0;
+ }
+}
+
+article.notice {
+ &:extend(article.display all);
+ margin: 8px 2px;
+
+ border: none;
+ box-shadow: none;
+
+ .label, span {
+ color: @textinverse;
+ font-weight: bolder;
+ font-style: italic;
+ }
+
+ .noticeStripes;
+}
diff --git a/nano/styles/link.less b/nano/styles/_link.less
similarity index 84%
rename from nano/styles/link.less
rename to nano/styles/_link.less
index 8cebbe2b74a..834abf468b7 100644
--- a/nano/styles/link.less
+++ b/nano/styles/_link.less
@@ -1,52 +1,53 @@
-@import "config";
-@import "util";
-
-
-.active(@color) {
- background-color: @color;
- &:hover {
- background-color: lighten(@color, @hover);
- }
-}
-
-
-// Basic Link (Button) Element
-.link {
- height: 16px;
- margin: 2px;
- padding: 0 4px 4px 4px;
- border: 1px solid @link-border;
- display: inline-block;
- box-sizing: content-box;
- white-space: nowrap;
-
- .fontReset; // Reset font settings.
- cursor: default; // This is a 'button,' not a link.
-
- // Tweak spacing to fit icons.
- .iconed { padding-left: 3px; }
- i { margin-right: 3px; }
- // Swap icons when state goes to pending.
- i.main { display: inline-block; }
- i.pending { display: none; }
- &.pending {
- i.main { display: none; }
- i.pending { display: inline-block; }
- }
-
- // Link colors:
- background-color: @normal;
- &.active {
- .active(@normal);
- &.selected { .active(@selected); }
- &.caution { .active(@caution); }
- &.danger { .active(@danger); }
- }
- &.inactive {
- background-color: @disabled;
- &.selected { background-color: @selected; }
- &.caution { background-color: @caution; }
- &.danger { background-color: @danger; }
- }
- &.disabled { background-color: @disabled; }
-}
+@import "_config";
+@import "_util";
+
+
+.active(@color) {
+ background-color: @color;
+ &:hover {
+ background-color: lighten(@color, @hover);
+ }
+}
+
+
+// Basic Link (Button) Element
+.link {
+ display: inline-block;
+ box-sizing: border-box;
+ height: 22px;
+ margin: 1px;
+ padding: 2px 3px;
+ white-space: nowrap;
+
+ border: 1px solid @border;
+
+ cursor: default; // This is a 'button,' not a link.
+ .fontReset; // Reset font settings.
+
+ // Tweak spacing to fit icons.
+ .iconed { padding-left: 3px; }
+ i { margin-right: 3px; }
+ // Swap icons when state goes to pending.
+ i.main { display: inline-block; }
+ i.pending { display: none; }
+ &.pending {
+ i.main { display: none; }
+ i.pending { display: inline-block; }
+ }
+
+ // Link colors:
+ background-color: @normal;
+ &.active {
+ .active(@normal);
+ &.selected { .active(@selected); }
+ &.caution { .active(@caution); }
+ &.danger { .active(@danger); }
+ }
+ &.inactive {
+ background-color: @disabled;
+ &.selected { background-color: @selected; }
+ &.caution { background-color: @caution; }
+ &.danger { background-color: @danger; }
+ }
+ &.disabled { background-color: @disabled; }
+}
diff --git a/nano/styles/_nanotrasen.less b/nano/styles/_nanotrasen.less
deleted file mode 100644
index c8b5560b660..00000000000
--- a/nano/styles/_nanotrasen.less
+++ /dev/null
@@ -1,50 +0,0 @@
-@import "config";
-@import "common";
-@import "util";
-@import "link";
-@import "machines";
-@import "bar";
-
-body {
- background: @background url(background_nanotrasen.png) 50% 0 repeat-x;
-}
-
-#title {
- position: relative;
- height: 30px;
-}
-
-#statusicon {
- position: absolute;
- top: 4px;
- left: 12px;
-}
-
-#titletext {
- position: absolute;
- top: 6px;
- left: 44px;
- width: 66%;
- overflow: hidden;
- color: #E9C183;
- font-size: 16px;
-}
-
-#titlelogo {
- position: absolute;
- top: 4px;
- right: 12px;
-
- width: 42px;
- height: 24px;
- background: url(logo_nanotrasen.png) 50% 50% no-repeat;
-}
-
-#content {
- padding: 8px;
- &:extend(.clearBoth);
-}
-
-#loading {
- &:extend(.notice);
-}
diff --git a/nano/styles/_status.less b/nano/styles/_status.less
new file mode 100644
index 00000000000..d5b28aec042
--- /dev/null
+++ b/nano/styles/_status.less
@@ -0,0 +1,12 @@
+@import "_config";
+@import "_util";
+
+
+.statusicon {
+ width: 24px;
+ height: 24px;
+ background-image: url('statusicon.png');
+ &.good { background-position: 0 0; }
+ &.average { background-position: 0 -24px; }
+ &.bad { background-position: 0 -48px; }
+}
diff --git a/nano/styles/util.less b/nano/styles/_util.less
similarity index 67%
rename from nano/styles/util.less
rename to nano/styles/_util.less
index 24c3e011c6b..c350db6b1da 100644
--- a/nano/styles/util.less
+++ b/nano/styles/_util.less
@@ -1,45 +1,57 @@
-@import "config";
-
-
-// Colored Elements
-.color(@color) { // Explort a given color as a class.
- &.@{color} {
- color: @@color;
- }
-}
-
-.color(normal);
-.color(good);
-.color(average);
-.color(bad);
-.color(label);
-.color(highlight);
-.color(dark);
-
-// Styled Elements
-.bold { font-weight: bold; }
-.italic { font-style: italic; }
-.fontReset {
- color: @text;
- font-size: @font-size;
- font-weight: normal;
- font-style: normal;
- text-decoration: none;
-}
-
-// General Helpers
-.hidden { display: none; }
-
-.clearBoth { clear: both; }
-.clearLeft { clear: left; }
-.clearRight { clear: right; }
-
-.floatNone { float: none; }
-.floatLeft { float: left; }
-.floatRight { float: right; }
-
-.alignTop { vertical-align: top; }
-.alignBottom { vertical-align: bottom; }
-.alignLeft { text-align: left; }
-.alignCenter { text-align: center; }
-.alignRight { text-align: right; }
+@import "_config";
+
+
+// Colors
+.color(@color) { // Explort a given color as a class.
+ &.@{color} {
+ color: @@color;
+ }
+}
+
+.color(normal);
+.color(good);
+.color(average);
+.color(bad);
+.color(label);
+.color(highlight);
+.color(dark);
+
+// Text Styles
+.bold { font-weight: bold; }
+.italic { font-style: italic; }
+.fontReset {
+ color: @text;
+ font-size: @fontsize;
+ font-weight: normal;
+ font-style: normal;
+ text-decoration: none;
+}
+
+// Fancy "Notice Me" Stripes
+.noticeStripes {
+ background-color: @notice1; // Fallback for old browers.
+ background-image: repeating-linear-gradient(
+ 45deg,
+ @notice1,
+ @notice1 10px,
+ @notice2 10px,
+ @notice2 20px
+ );
+}
+
+// General Helpers
+.hidden { display: none; }
+
+.clearBoth { clear: both; }
+.clearLeft { clear: left; }
+.clearRight { clear: right; }
+
+.floatNone { float: none; }
+.floatLeft { float: left; }
+.floatRight { float: right; }
+
+.alignTop { vertical-align: top; }
+.alignBottom { vertical-align: bottom; }
+.alignLeft { text-align: left; }
+.alignCenter { text-align: center; }
+.alignRight { text-align: right; }
diff --git a/nano/images/background.png b/nano/styles/background.png
similarity index 100%
rename from nano/images/background.png
rename to nano/styles/background.png
diff --git a/nano/images/background_nanotrasen.png b/nano/styles/background_nanotrasen.png
similarity index 100%
rename from nano/images/background_nanotrasen.png
rename to nano/styles/background_nanotrasen.png
diff --git a/nano/images/background_syndicate.png b/nano/styles/background_syndicate.png
similarity index 100%
rename from nano/images/background_syndicate.png
rename to nano/styles/background_syndicate.png
diff --git a/nano/styles/bar.less b/nano/styles/bar.less
deleted file mode 100644
index aa5c755fc34..00000000000
--- a/nano/styles/bar.less
+++ /dev/null
@@ -1,43 +0,0 @@
-@import "config";
-@import "util";
-
-
-.bar {
- position: relative;
- width: 236px;
- height: 16px;
- border: 1px solid #666666;
- float: left;
- margin: 0 5px 0 0;
- overflow: hidden;
- background: black;
- box-sizing: border-box;
- .barText {
- position: absolute;
- top: -2px;
- left: 5px;
- width: 100%;
- height: 100%;
- color: white;
- font-weight: normal;
- }
- .barFill {
- width: 0;
- height: 100%;
- background: #40628a;
- overflow: hidden;
- float: left;
- &.good {
- background: #4f7529;
- }
- &.average {
- background: #cd6500;
- }
- &.bad {
- background: #ea0000;
- }
- &.highlight {
- background: #8BA5C4;
- }
- }
-}
diff --git a/nano/styles/common.less b/nano/styles/common.less
deleted file mode 100644
index 4921953ed92..00000000000
--- a/nano/styles/common.less
+++ /dev/null
@@ -1,70 +0,0 @@
-@import "config";
-@import "util";
-
-
-body {
- padding: 0;
- margin: 0;
-
- font-family: @font;
- font-size: @font-size;
- line-height: 170%;
- color: @text;
-
- background: @background;
-}
-
-h1 {
- font-size: @font-size + 6px;
- margin: 0;
- padding: 6px 0 6px 0;
- clear: both;
-}
-h2 {
- font-size: @font-size + 4px;
- margin: 0;
- padding: 6px 0 6px 0;
- clear: both;}
-h3 {
- font-size: @font-size + 2px;
- margin: 0;
- padding: 6px 0 6px 0;
- clear: both;
-}
-
-hr {
- background-color: @normal;
- height: 1px;
- border: none;
-}
-
-ul {
- padding: 4px 0 0 10px;
- margin: 0;
- list-style-type: none;
-
- li {
- padding: 0 0 2px 0;
- }
-}
-
-noscript {
- margin: 33% auto;
- width: 50%;
- height: 33%;
-
- background: #ffffff;
- border: 2px solid #ff0000;
- z-index: 9999;
- padding: 0 10px;
- text-align: center;
-}
-
-#statusicon {
- width: 24px;
- height: 24px;
- background: url(statusicon.png) no-repeat;
- &.good { background-position: 0 0; }
- &.average { background-position: 0 -24px; }
- &.bad { background-position: 0 -48px; }
-}
diff --git a/nano/styles/generic.less b/nano/styles/generic.less
new file mode 100644
index 00000000000..b1d5b0a7bb0
--- /dev/null
+++ b/nano/styles/generic.less
@@ -0,0 +1,11 @@
+@import "_config";
+@import "_util";
+@import "_document";
+@import "_common";
+@import "_link";
+@import "_bar";
+
+
+body {
+ background: @background url('background.png') 50% 0 repeat-x;
+}
diff --git a/nano/compiled/logo_nanotrasen.png b/nano/styles/logo_nanotrasen.png
similarity index 100%
rename from nano/compiled/logo_nanotrasen.png
rename to nano/styles/logo_nanotrasen.png
diff --git a/nano/images/logo_syndicate.png b/nano/styles/logo_syndicate.png
similarity index 100%
rename from nano/images/logo_syndicate.png
rename to nano/styles/logo_syndicate.png
diff --git a/nano/styles/machines.less b/nano/styles/machines.less
deleted file mode 100644
index 2df0b1d1bd0..00000000000
--- a/nano/styles/machines.less
+++ /dev/null
@@ -1,151 +0,0 @@
-@import "config";
-@import "util";
-
-
-.notice {
- padding: 2px 4px;
- margin: 4px 0;
-
- color: @text-inverse;
- background: url(background_notice.jpg) 50% 50%;
-
- &:extend(.bold);
- &:extend(.italic);
-}
-
-.noticePlaceholder {
- &:extend(.notice);
- color: @text;
- background: none;
-}
-
-.notice img {
- position: absolute;
- top: 0;
- left: 0;
- width: 16px;
- height: 16px;
-}
-
-div.notice {
- clear: both;
-}
-
-
-
-.itemGroup {
- border: 1px solid #e9c183;
- background: #2c2c2c;
- padding: 4px;
- clear: both;
-}
-
-.item {
- display: inline-block;
- width: 100%;
- clear: both;
-}
-
-.itemContentNarrow, .itemContent {
- float: left;
-}
-
-.itemContentNarrow {
- width: 30%;
-}
-
-.itemContent {
- width: 69%;
-}
-
-.itemLabelNarrow, .itemLabel, .itemLabelWide, .itemLabelWider, .itemLabelWidest {
- float: left;
- color: #e9c183;
-}
-
-.itemLabelNarrow {
- width: 20%;
-}
-
-.itemLabel {
- width: 30%;
-}
-
-.itemLabelWide {
- width: 45%;
-}
-
-.itemLabelWider {
- width: 69%;
-}
-
-.itemLabelWidest {
- width: 100%;
-}
-
-.itemContentWide {
- float: left;
- width: 79%;
-}
-
-.itemContentSmall {
- float: left;
- width: 33%;
-}
-
-.itemContentMedium {
- float: left;
- width: 55%;
-}
-
-.statusDisplay {
- display: block;
- position: relative;
- background: #000000;
- color: #ffffff;
- border: 1px solid #40628a;
- padding: 4px;
- margin: 2px;
-}
-
-.statusDisplay .itemLabelNarrow, .statusDisplay .itemLabel, .statusDisplay .itemLabelWide, .statusDisplay .itemLabelWider, .statusDisplay .itemLabelWidest {
- color: #98B0C3;
-}
-
-.block {
- padding: 8px;
- margin: 10px 4px 4px 4px;
- border: 1px solid #40628a;
- background-color: #202020;
-}
-
-.line {
- width: 100%;
- clear: both;
-}
-
-.fixedLeft {
- width: 110px;
- float: left;
-}
-
-.fixedLeftWide {
- width: 165px;
- float: left;
-}
-
-.fixedLeftWider {
- width: 220px;
- float: left;
-}
-
-.fixedLeftWidest {
- width: 250px;
- float: left;
-}
-
-.fixedLeftWiderRed {
- width: 220px;
- float: left;
- background: #ee0000;
-}
diff --git a/nano/styles/nanotrasen.less b/nano/styles/nanotrasen.less
new file mode 100644
index 00000000000..fb151669c2d
--- /dev/null
+++ b/nano/styles/nanotrasen.less
@@ -0,0 +1,45 @@
+@import "_config";
+@import "_util";
+@import "_document";
+@import "_common";
+@import "_interface";
+@import "_link";
+@import "_bar";
+@import "_status";
+
+
+body {
+ background: @background url('background_nanotrasen.png') 50% 0 repeat-x;
+}
+
+header[role="titlebar"] {
+ position: relative;
+ height: 30px;
+
+ .statusicon {
+ position: absolute;
+ top: 4px;
+ left: 12px;
+ }
+
+ .title {
+ position: absolute;
+ top: 6px;
+ left: 44px;
+ height: 24px;
+ width: 66%;
+
+ color: @title;
+ font-size: 16px;
+ }
+
+ .logo {
+ position: absolute;
+ top: 4px;
+ right: 12px;
+
+ width: 42px;
+ height: 24px;
+ background: url('logo_nanotrasen.png') 50% 50% no-repeat;
+ }
+}
diff --git a/nano/compiled/statusicon.png b/nano/styles/statusicon.png
similarity index 100%
rename from nano/compiled/statusicon.png
rename to nano/styles/statusicon.png
diff --git a/nano/templates/_generic.dot b/nano/templates/_generic.dot
index d6395af9793..197930a4e26 100644
--- a/nano/templates/_generic.dot
+++ b/nano/templates/_generic.dot
@@ -1,3 +1,3 @@
-
\ No newline at end of file
+
diff --git a/nano/templates/_nanotrasen.dot b/nano/templates/_nanotrasen.dot
index 41d084b2d6e..8d8d24d44d5 100644
--- a/nano/templates/_nanotrasen.dot
+++ b/nano/templates/_nanotrasen.dot
@@ -1,9 +1,9 @@
-
-
-
{{=config.title}}
-
-
-
-
+
+
+ {{=config.title}}
+
+
+
+
diff --git a/nano/templates/air_alarm.dot b/nano/templates/air_alarm.dot
index 5f590f08e05..7a10020fc97 100644
--- a/nano/templates/air_alarm.dot
+++ b/nano/templates/air_alarm.dot
@@ -1,248 +1,255 @@
-
- {{? data.siliconUser}}
-
- Interface Lock:
-
-
- {{=helper.link('Engaged', 'locked', {'toggleaccess': 1}, data.locked ? 'selected' : null)}}
- {{=helper.link('Disengaged', 'unlocked', {'toggleaccess': 1}, data.locked ? null : 'selected')}}
-
-
- {{??}}
- {{? data.locked}}
- Swipe an ID card to unlock this interface.
- {{??}}
- Swipe an ID card to lock this interface.
- {{?}}
- {{?}}
-
-
Air Status
-
- {{? data.environment_data}}
- {{~ data.environment_data:info:i}}
-
-
- {{=info.name}}:
-
-
- {{? info.danger_level == 2}}
-
- {{?? info.danger_level == 1}}
-
- {{??}}
-
- {{?}}
- {{=helper.fixed(info.value, 2)}}{{=info.unit}}
-
-
- {{~}}
-
-
- Local Status:
-
-
- {{? data.danger_level == 2}}
- Danger (Internals Required)
- {{?? data.danger_level == 1}}
- Caution
- {{??}}
- Optimal
- {{?}}
-
-
-
-
- Area Status:
-
-
- {{? data.atmos_alarm}}
- Atmosphere Alarm
- {{?? data.fire_alarm}}
- Fire Alarm
- {{??}}
- Nominal
- {{?}}
-
-
- {{??}}
-
Warning: Cannot obtain air sample for analysis.
- {{?}}
- {{? data.dangerous}}
-
-
Warning: Safety measures offline. Device may exhibit abnormal behavior.
- {{?}}
-
-{{? (!data.locked || data.siliconUser)}}
- {{? data.screen != 1}}
-
{{=helper.link('Back', 'arrow-left', {'screen': 1})}}
- {{?}}
- {{? data.screen == 1}}
-
Air Controls
-
-
- {{? !data.atmos_alarm}}
- {{=helper.link('Area Atmospheric Alarm', 'hand-stop-o', {'atmos_alarm': 1})}}
- {{??}}
- {{=helper.link('Area Atmospheric Alarm', 'close', {'atmos_reset': 1}, null, 'caution')}}
- {{?}}
-
-
- {{? data.mode != 3}}
- {{=helper.link('Panic Siphon', 'exclamation', {'mode': 3})}}
- {{??}}
- {{=helper.link('Panic Siphon', 'close', {'mode': 1}, null, 'danger')}}
- {{?}}
-
-
-
- {{=helper.link('Vent Controls', 'sign-out', {'screen': 2})}}
-
-
- {{=helper.link('Scrubber Controls', 'filter', {'screen': 3})}}
-
-
-
- {{=helper.link('Set Environmental Mode', 'cog', {'screen': 4})}}
-
-
- {{=helper.link('Set Alarm Threshold', 'bar-chart', {'screen': 5})}}
-
-
- {{?? data.screen == 2}}
-
Vent Controls
- {{~ data.vents:vent:i}}
-
{{=vent.long_name}}
-
-
-
- Power:
-
-
- {{? vent.power}}
- {{=helper.link('On', 'power-off', {'id_tag': vent.id_tag, 'command': 'power', 'val': 0}, null, null)}}
- {{??}}
- {{=helper.link('Off', 'close', {'id_tag': vent.id_tag, 'command': 'power', 'val': 1}, null, 'danger')}}
- {{?}}
-
-
-
-
- Mode:
-
-
- {{? vent.direction == "sipho"}}
- Siphoning
- {{??}}
- Pressurizing
- {{?}}
-
-
-
-
- Pressure Checks:
-
-
- {{=helper.link('Internal', 'sign-in', {'id_tag': vent.id_tag, 'command': 'incheck', 'val': vent.checks}, null, vent.incheck ? 'selected' : null)}}
- {{=helper.link('External', 'sign-out', {'id_tag': vent.id_tag, 'command': 'excheck', 'val': vent.checks}, null, vent.excheck ? 'selected' : null)}}
-
-
-
-
- Set Pressure:
-
-
- {{=helper.link(helper.fixed(vent.external), 'pencil', {'id_tag': vent.id_tag, 'command': 'set_external_pressure'})}}
- {{=helper.link('Reset', 'refresh', { 'id_tag': vent.id_tag, 'command': 'reset_external_pressure'}, vent.default ? 'disabled' : null)}}
-
-
-
- {{~}}
- {{? !data.vents.length}}
- No vents connected.
- {{?}}
- {{?? data.screen == 3}}
-
Scrubber Controls
- {{~ data.scrubbers:scrubber:i}}
-
{{=scrubber.long_name}}
-
-
-
- Power:
-
-
- {{? scrubber.power}}
- {{=helper.link('On', 'power-off', {'id_tag': scrubber.id_tag, 'command': 'power', 'val': 0}, null, null)}}
- {{??}}
- {{=helper.link('Off', 'close', {'id_tag': scrubber.id_tag, 'command': 'power', 'val': 1}, null, 'danger')}}
- {{?}}
-
-
-
-
- Mode:
-
-
- {{? scrubber.scrubbing}}
- {{=helper.link('Scrubbing', 'filter', {'id_tag': scrubber.id_tag, 'command': 'scrubbing', 'val': 0}, null, null)}}
- {{??}}
- {{=helper.link('Siphoning', 'sign-in', {'id_tag': scrubber.id_tag, 'command': 'scrubbing', 'val': 1}, null, 'danger')}}
- {{?}}
-
-
-
-
- Range:
-
-
- {{? scrubber.widenet}}
- {{=helper.link('Extended', 'expand', {'id_tag': scrubber.id_tag, 'command': 'widenet', 'val': 0}, null, 'caution')}}
- {{??}}
- {{=helper.link('Normal', 'compress', {'id_tag': scrubber.id_tag, 'command': 'widenet', 'val': 1}, null, null)}}
- {{?}}
-
-
-
-
- Filters:
-
-
- {{=helper.link("CO2", scrubber.filter_co2 ? 'check-square-o' : 'square-o', {'id_tag': scrubber.id_tag, 'command': "co2_scrub", 'val': scrubber.filter_co2 ? 0 : 1}, null, scrubber.filter_co2 ? 'selected' : null)}}
- {{=helper.link("N2O", scrubber.filter_n2o ? 'check-square-o' : 'square-o', {'id_tag': scrubber.id_tag, 'command': "n2o_scrub", 'val': scrubber.filter_n2o ? 0 : 1}, null, scrubber.filter_n2o ? 'selected' : null)}}
- {{=helper.link("Plasma", scrubber.filter_toxins ? 'check-square-o' : 'square-o', {'id_tag': scrubber.id_tag, 'command': "tox_scrub", 'val': scrubber.filter_toxins ? 0 : 1}, null, scrubber.filter_toxins ? 'selected' : null)}}
-
-
-
- {{~}}
- {{? !data.scrubbers.length}}
- No scrubbers connected.
- {{?}}
- {{?? data.screen == 4}}
-
Environmental Modes
-
- {{~ data.modes:mode:i}}
-
- {{=helper.link(mode.name, mode.selected ? 'check-square-o' : 'square-o', {'mode': mode.mode}, null, mode.selected ? (mode.danger ? 'danger' : 'selected') : null)}}
-
- {{~}}
-
- {{?? data.screen == 5}}
-
Alarm Thresholds
-
-
-
- | min2 | min1 | max1 | max2 |
-
- {{~ data.thresholds:threshold:i}}
-
- | {{=threshold.name}} |
- {{~ threshold.settings:setting:j}}
-
- {{=helper.link(setting.selected >= 0 ? helper.round(setting.selected*100)/100 : "Off", null, {'command': 'set_threshold', 'env': setting.env, 'var': setting.val})}}
- |
- {{~}}
-
- {{~}}
-
-
- {{?}}
-{{?}}
+
+ {{? data.siliconUser}}
+
+
+ Interface Lock:
+
+
+ {{=helper.link('Engaged', 'lock', {'toggleaccess': 1}, data.locked ? 'selected' : null)}}
+ {{=helper.link('Disengaged', 'unlock', {'toggleaccess': 1}, data.locked ? null : 'selected')}}
+
+
+ {{??}}
+ {{? data.locked}}
+ Swipe an ID card to unlock this interface.
+ {{??}}
+ Swipe an ID card to lock this interface.
+ {{?}}
+ {{?}}
+
+
+
+ {{? data.environment_data}}
+ {{~ data.environment_data:info:i}}
+
+
+ {{=info.name}}:
+
+
+ {{? info.danger_level == 2}}
+
+ {{?? info.danger_level == 1}}
+
+ {{??}}
+
+ {{?}}
+ {{=helper.fixed(info.value, 2)}}{{=info.unit}}
+
+
+ {{~}}
+
+
+ Local Status:
+
+
+ {{? data.danger_level == 2}}
+ Danger (Internals Required)
+ {{?? data.danger_level == 1}}
+ Caution
+ {{??}}
+ Optimal
+ {{?}}
+
+
+
+
+ Area Status:
+
+
+ {{? data.atmos_alarm}}
+ Atmosphere Alarm
+ {{?? data.fire_alarm}}
+ Fire Alarm
+ {{??}}
+ Nominal
+ {{?}}
+
+
+ {{??}}
+ Warning: Cannot obtain air sample for analysis.
+ {{?}}
+ {{? data.dangerous}}
+
+ Warning: Safety measures offline. Device may exhibit abnormal behavior.
+ {{?}}
+
+{{? (!data.locked || data.siliconUser)}}
+ {{? data.screen != 1}}
+ {{=helper.link('Back', 'arrow-left', {'screen': 1})}}
+ {{?}}
+ {{? data.screen == 1}}
+
+
+
+
+
+
+
+
+
+
+
+ {{?? data.screen == 2}}
+ {{~ data.vents:vent:i}}
+
+
+
+
+ Power:
+
+
+ {{? vent.power}}
+ {{=helper.link('On', 'power-off', {'id_tag': vent.id_tag, 'command': 'power', 'val': 0}, null, null)}}
+ {{??}}
+ {{=helper.link('Off', 'close', {'id_tag': vent.id_tag, 'command': 'power', 'val': 1}, null, 'danger')}}
+ {{?}}
+
+
+
+
+ Mode:
+
+
+ {{? vent.direction == "release"}}
+ Pressurizing
+ {{??}}
+ Siphoning
+ {{?}}
+
+
+
+
+ Pressure Checks:
+
+
+ {{=helper.link('Internal', 'sign-in', {'id_tag': vent.id_tag, 'command': 'incheck', 'val': vent.checks}, null, vent.incheck ? 'selected' : null)}}
+ {{=helper.link('External', 'sign-out', {'id_tag': vent.id_tag, 'command': 'excheck', 'val': vent.checks}, null, vent.excheck ? 'selected' : null)}}
+
+
+
+
+ Set Pressure:
+
+
+ {{=helper.link(helper.fixed(vent.external), 'pencil', {'id_tag': vent.id_tag, 'command': 'set_external_pressure'})}}
+ {{=helper.link('Reset', 'refresh', { 'id_tag': vent.id_tag, 'command': 'reset_external_pressure'}, vent.extdefault ? 'disabled' : null)}}
+
+
+
+ {{~}}
+ {{? !data.vents.length}}
+ No vents connected.
+ {{?}}
+ {{?? data.screen == 3}}
+ {{~ data.scrubbers:scrubber:i}}
+
+
+
+
+ Power:
+
+
+ {{? scrubber.power}}
+ {{=helper.link('On', 'power-off', {'id_tag': scrubber.id_tag, 'command': 'power', 'val': 0}, null, null)}}
+ {{??}}
+ {{=helper.link('Off', 'close', {'id_tag': scrubber.id_tag, 'command': 'power', 'val': 1}, null, 'danger')}}
+ {{?}}
+
+
+
+
+ Mode:
+
+
+ {{? scrubber.scrubbing}}
+ {{=helper.link('Scrubbing', 'filter', {'id_tag': scrubber.id_tag, 'command': 'scrubbing', 'val': 0}, null, null)}}
+ {{??}}
+ {{=helper.link('Siphoning', 'sign-in', {'id_tag': scrubber.id_tag, 'command': 'scrubbing', 'val': 1}, null, 'danger')}}
+ {{?}}
+
+
+
+
+ Range:
+
+
+ {{? scrubber.widenet}}
+ {{=helper.link('Extended', 'expand', {'id_tag': scrubber.id_tag, 'command': 'widenet', 'val': 0}, null, 'caution')}}
+ {{??}}
+ {{=helper.link('Normal', 'compress', {'id_tag': scrubber.id_tag, 'command': 'widenet', 'val': 1}, null, null)}}
+ {{?}}
+
+
+
+
+ Filters:
+
+
+ {{=helper.link("CO2", scrubber.filter_co2 ? 'check-square-o' : 'square-o', {'id_tag': scrubber.id_tag, 'command': "co2_scrub", 'val': scrubber.filter_co2 ? 0 : 1}, null, scrubber.filter_co2 ? 'selected' : null)}}
+ {{=helper.link("N2O", scrubber.filter_n2o ? 'check-square-o' : 'square-o', {'id_tag': scrubber.id_tag, 'command': "n2o_scrub", 'val': scrubber.filter_n2o ? 0 : 1}, null, scrubber.filter_n2o ? 'selected' : null)}}
+ {{=helper.link("Plasma", scrubber.filter_toxins ? 'check-square-o' : 'square-o', {'id_tag': scrubber.id_tag, 'command': "tox_scrub", 'val': scrubber.filter_toxins ? 0 : 1}, null, scrubber.filter_toxins ? 'selected' : null)}}
+
+
+
+ {{~}}
+ {{? !data.scrubbers.length}}
+ No scrubbers connected.
+ {{?}}
+ {{?? data.screen == 4}}
+
+
+ {{~ data.modes:mode:i}}
+
+ {{~}}
+
+ {{?? data.screen == 5}}
+
+
+
+
+
+ |
+ min2 |
+ min1 |
+ max1 |
+ max2 |
+
+
+
+ {{~ data.thresholds:threshold:i}}
+
+ | {{=threshold.name}} |
+ {{~ threshold.settings:setting:j}}
+
+ {{=helper.link(setting.selected >= 0 ? helper.round(setting.selected*100)/100 : "Off", null, {'command': 'set_threshold', 'env': setting.env, 'var': setting.val})}}
+ |
+ {{~}}
+
+ {{~}}
+
+
+
+ {{?}}
+{{?}}
diff --git a/nano/templates/apc.dot b/nano/templates/apc.dot
index d6c46b6d5ab..2e17a6f046b 100644
--- a/nano/templates/apc.dot
+++ b/nano/templates/apc.dot
@@ -1,174 +1,171 @@
-
- {{? data.siliconUser}}
-
- Interface Lock:
-
-
- {{=helper.link('Engaged', 'lock', {'toggleaccess' : 1}, data.locked ? 'selected' : null)}}
- {{=helper.link('Disengaged', 'unlock', {'toggleaccess' : 1}, data.malfStatus >= 2 ? 'linkOff' : (data.locked ? null : 'selected'))}}
-
-
- {{??}}
- {{? data.locked}}
- Swipe an ID card to unlock this interface.
- {{??}}
- Swipe an ID card to lock this interface.
- {{?}}
- {{?}}
-
-Power Status
-
-
-
- Main Breaker:
-
-
- {{? data.locked && !data.siliconUser}}
- {{? data.isOperating}}
- On
- {{??}}
- Off
- {{?}}
- {{??}}
- {{=helper.link('On', 'power-off', {'breaker' : 1}, data.isOperating ? 'selected' : null)}}
- {{=helper.link('Off', 'close', {'breaker' : 1}, data.isOperating ? null : 'selected')}}
- {{?}}
-
-
-
-
- External Power:
-
-
- {{? data.externalPower == 2}}
- Good
- {{?? data.externalPower == 1}}
- Low
- {{??}}
- None
- {{?}}
-
-
-
-
- Power Cell:
-
- {{? data.powerCellStatus != null}}
- {{=helper.bar(data.powerCellStatus, 0, 100, data.powerCellStatus >= 50 ? 'good' : data.powerCellStatus >= 25 ? 'average' : 'bad')}}
-
- {{=helper.round(data.powerCellStatus*10)/10}}%
-
- {{??}}
-
- Power cell removed.
-
- {{?}}
-
- {{? data.powerCellStatus != null}}
-
-
- Charge Mode:
-
-
- {{? data.locked && !data.siliconUser}}
- {{? data.chargeMode}}
- Auto
- {{??}}
- Off
- {{?}}
- {{??}}
- {{=helper.link('Auto', 'refresh', {'cmode' : 1}, data.chargeMode ? 'selected' : null)}}
- {{=helper.link('Off', 'close', {'cmode' : 1}, data.chargeMode ? null : 'selected')}}
- {{?}}
-
- {{? data.chargingStatus > 1}}
- [Fully Charged]
- {{?? data.chargingStatus == 1}}
- [Charging]
- {{??}}
- [Not Charging]
- {{?}}
-
-
- {{?}}
-
-Power Channels
-
- {{~ data.powerChannels :channel:i}}
-
-
- {{=channel.title}}:
-
-
- {{=channel.powerLoad}} W
-
-
- {{? channel.status <= 1}}
- Off
- {{?? channel.status >= 2}}
- On
- {{?}}
-
- {{? channel.status == 1 || channel.status == 3}}
- [Auto]
- {{??}}
- [Manual]
- {{?}}
-
- {{? !data.locked || data.siliconUser}}
-
- {{=helper.link('Auto', 'refresh', channel.topicParams.auto, (channel.status == 1 || channel.status == 3) ? 'selected' : null)}}
- {{=helper.link('On', 'power-off', channel.topicParams.on, (channel.status == 2) ? 'selected' : null)}}
- {{=helper.link('Off', 'close', channel.topicParams.off, (channel.status == 0) ? 'selected' : null)}}
-
- {{?}}
-
- {{~}}
-
-
- Total Load:
-
-
- {{=data.totalLoad}} W
-
-
-
-{{? data.siliconUser}}
-
- System Overrides
-
-
- {{=helper.link('Overload Lighting Circuit', 'lightbulb', {'overload' : 1})}}
-
-
- {{? data.malfStatus == 1}}
- {{=helper.link('Override Programming', 'script', {'malfhack' : 1})}}
- {{?? data.malfStatus == 2}}
- {{=helper.link('Shunt Core Processes', 'arrowreturn-1-s', {'occupyapc' : 1})}}
- {{?? data.malfStatus == 3}}
- {{=helper.link('Return to Main Core', 'arrowreturn-1-w', {'deoccupyapc' : 1})}}
- {{?? data.malfStatus == 4}}
- {{=helper.link('Shunt Core Processes', 'arrowreturn-1-s', {'occupyapc' : 1}, 'linkOff')}}
- {{?}}
-
-
-{{?}}
-
-
-
- Cover Lock:
-
-
- {{? data.locked && !data.siliconUser}}
- {{? data.coverLocked}}
- Engaged
- {{??}}
- Disengaged
- {{?}}
- {{??}}
- {{=helper.link('Engaged', 'lock', {'lock' : 1}, data.coverLocked ? 'selected' : null)}}
- {{=helper.link('Disengaged', 'unlock', {'lock' : 1}, data.coverLocked ? null : 'selected')}}
- {{?}}
-
-
-
+
+ {{? data.siliconUser}}
+
+
+ Interface Lock:
+
+
+ {{=helper.link('Engaged', 'lock', {'toggleaccess': 1}, data.locked ? 'selected' : null)}}
+ {{=helper.link('Disengaged', 'unlock', {'toggleaccess' : 1}, data.malfStatus >= 2 ? 'linkOff' : (data.locked ? null : 'selected'))}}
+
+
+ {{??}}
+ {{? data.locked}}
+ Swipe an ID card to unlock this interface.
+ {{??}}
+ Swipe an ID card to lock this interface.
+ {{?}}
+ {{?}}
+
+
+
+
+
+ Main Breaker:
+
+
+ {{? data.locked && !data.siliconUser}}
+ {{? data.isOperating}}
+ On
+ {{??}}
+ Off
+ {{?}}
+ {{??}}
+ {{=helper.link('On', 'power-off', {'breaker' : 1}, data.isOperating ? 'selected' : null)}}
+ {{=helper.link('Off', 'close', {'breaker' : 1}, data.isOperating ? null : 'selected')}}
+ {{?}}
+
+
+
+
+ External Power:
+
+
+ {{? data.externalPower == 2}}
+ Good
+ {{?? data.externalPower == 1}}
+ Low
+ {{??}}
+ None
+ {{?}}
+
+
+
+
+ Power Cell:
+
+
+ {{? data.powerCellStatus != null}}
+ {{=helper.bar(data.powerCellStatus, 0, 100, data.powerCellStatus >= 50 ? 'good' : data.powerCellStatus >= 25 ? 'average' : 'bad', helper.fixed(data.powerCellStatus) + "%")}}
+ {{??}}
+ Power cell removed.
+ {{?}}
+
+
+ {{? data.powerCellStatus != null}}
+
+
+ Charge Mode:
+
+
+ {{? data.locked && !data.siliconUser}}
+ {{? data.chargeMode}}
+ Auto
+ {{??}}
+ Off
+ {{?}}
+ {{??}}
+ {{=helper.link('Auto', 'refresh', {'cmode' : 1}, data.chargeMode ? 'selected' : null)}}
+ {{=helper.link('Off', 'close', {'cmode' : 1}, data.chargeMode ? null : 'selected')}}
+ {{?}}
+
+ {{? data.chargingStatus > 1}}
+ [Fully Charged]
+ {{?? data.chargingStatus == 1}}
+ [Charging]
+ {{??}}
+ [Not Charging]
+ {{?}}
+
+
+ {{?}}
+
+
+
+ {{~ data.powerChannels :channel:i}}
+
+
+ {{=channel.title}}:
+
+
+ {{=channel.powerLoad}} W
+
+
+ {{? channel.status <= 1}}
+ Off
+ {{?? channel.status >= 2}}
+ On
+ {{?}}
+
+ {{? channel.status == 1 || channel.status == 3}}
+ [Auto]
+ {{??}}
+ [Manual]
+ {{?}}
+
+ {{? !data.locked || data.siliconUser}}
+
+ {{=helper.link('Auto', 'refresh', channel.topicParams.auto, (channel.status == 1 || channel.status == 3) ? 'selected' : null)}}
+ {{=helper.link('On', 'power-off', channel.topicParams.on, (channel.status == 2) ? 'selected' : null)}}
+ {{=helper.link('Off', 'close', channel.topicParams.off, (channel.status == 0) ? 'selected' : null)}}
+
+ {{?}}
+
+ {{~}}
+
+
+ Total Load:
+
+
+ {{=data.totalLoad}} W
+
+
+
+{{? data.siliconUser}}
+
+
+
+ {{=helper.link('Overload Lighting Circuit', 'lightbulb-o', {'overload' : 1})}}
+
+
+ {{? data.malfStatus == 1}}
+ {{=helper.link('Override Programming', 'terminal', {'malfhack' : 1})}}
+ {{?? data.malfStatus == 2}}
+ {{=helper.link('Shunt Core Processes', 'caret-square-o-down', {'occupyapc' : 1})}}
+ {{?? data.malfStatus == 3}}
+ {{=helper.link('Return to Main Core', 'carat-square-o-left', {'deoccupyapc' : 1})}}
+ {{?? data.malfStatus == 4}}
+ {{=helper.link('Shunt Core Processes', 'caret-square-o-down', {'occupyapc' : 1}, 'linkOff')}}
+ {{?}}
+
+
+{{?}}
+
+
+
+ Cover Lock:
+
+
+ {{? data.locked && !data.siliconUser}}
+ {{? data.coverLocked}}
+ Engaged
+ {{??}}
+ Disengaged
+ {{?}}
+ {{??}}
+ {{=helper.link('Engaged', 'lock', {'lock' : 1}, data.coverLocked ? 'selected' : null)}}
+ {{=helper.link('Disengaged', 'unlock', {'lock' : 1}, data.coverLocked ? null : 'selected')}}
+ {{?}}
+
+
+