From 5678dfcbd18e6d2f5f049002c141dde0f8145f49 Mon Sep 17 00:00:00 2001 From: Bjorn Neergaard Date: Sat, 12 Dec 2015 09:57:24 -0600 Subject: [PATCH] Prefix everything with 'nanoui' to avoid conflicts --- .../components/binary_devices/passive_gate.dm | 2 +- .../components/binary_devices/pump.dm | 2 +- .../components/binary_devices/volume_pump.dm | 2 +- .../components/trinary_devices/filter.dm | 2 +- .../components/trinary_devices/mixer.dm | 2 +- code/game/machinery/alarm.dm | 2 +- code/game/machinery/atmoalter/canister.dm | 2 +- code/game/machinery/spaceheater.dm | 9 +- .../game/objects/items/weapons/tanks/tanks.dm | 2 +- code/modules/client/asset_cache.dm | 15 +- .../{nanotrasen.css => hi-nanotrasen.css} | 0 .../html_interface/nanotrasen/nanotrasen.dm | 4 +- code/modules/nano/nanoui.dm | 12 +- code/modules/power/smes.dm | 2 +- code/modules/power/solar.dm | 2 +- .../chemistry/machinery/chem_dispenser.dm | 712 +++++++++--------- nano/Gulpfile.coffee | 187 +++-- nano/README.md | 37 + nano/assets/common.css | 1 - nano/assets/fontawesome-webfont.woff | Bin 83588 -> 0 bytes nano/assets/generic.css | 1 - nano/assets/nanotrasen.css | 1 - nano/assets/nanoui.common.css | 1 + nano/assets/nanoui.generic.css | 1 + nano/assets/{lib.css => nanoui.lib.css} | 0 nano/assets/{lib.js => nanoui.lib.js} | 0 nano/assets/{app.js => nanoui.main.js} | 0 nano/assets/nanoui.nanotrasen.css | 1 + nano/assets/nanoui.templates.js | 1 + nano/assets/templates.js | 1 - nano/images/nanotrasen.svg | 9 +- nano/package.json | 12 +- nano/reload.bat | 9 +- nano/styles/_interface.less | 17 +- nano/styles/_link.less | 4 + nano/styles/nanotrasen.less | 28 +- nano/templates/_nanotrasen.dot | 4 +- nano/templates/air_alarm.dot | 90 +-- nano/templates/apc.dot | 52 +- nano/templates/atmos_filter.dot | 58 +- nano/templates/atmos_mixer.dot | 78 +- nano/templates/atmos_pump.dot | 56 +- nano/templates/canister.dot | 149 ++-- nano/templates/chem_dispenser.dot | 119 ++- nano/templates/chem_heater.dot | 48 +- nano/templates/cryo.dot | 187 ++--- nano/templates/smes.dot | 189 +++-- nano/templates/solar_control.dot | 165 ++-- nano/templates/space_heater.dot | 155 ++-- nano/templates/tanks.dot | 74 +- 50 files changed, 1216 insertions(+), 1291 deletions(-) rename code/modules/html_interface/nanotrasen/{nanotrasen.css => hi-nanotrasen.css} (100%) delete mode 100644 nano/assets/common.css delete mode 100644 nano/assets/fontawesome-webfont.woff delete mode 100644 nano/assets/generic.css delete mode 100644 nano/assets/nanotrasen.css create mode 100644 nano/assets/nanoui.common.css create mode 100644 nano/assets/nanoui.generic.css rename nano/assets/{lib.css => nanoui.lib.css} (100%) rename nano/assets/{lib.js => nanoui.lib.js} (100%) rename nano/assets/{app.js => nanoui.main.js} (100%) create mode 100644 nano/assets/nanoui.nanotrasen.css create mode 100644 nano/assets/nanoui.templates.js delete mode 100644 nano/assets/templates.js diff --git a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm index 1e155b5a554..92b9a37ceea 100644 --- a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm +++ b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm @@ -100,7 +100,7 @@ Passive gate is similar to the regular pump except: /obj/machinery/atmospherics/components/binary/passive_gate/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 0) ui = SSnano.try_update_ui(user, src, ui_key, ui, force_open = force_open) if (!ui) - ui = new(user, src, ui_key, "atmos_pump", name, 400, 100) + ui = new(user, src, ui_key, "atmos_pump", name, 400, 115) ui.open() /obj/machinery/atmospherics/components/binary/passive_gate/get_ui_data() diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/ATMOSPHERICS/components/binary_devices/pump.dm index a2a31e3c7d2..9ef04a3774a 100644 --- a/code/ATMOSPHERICS/components/binary_devices/pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm @@ -108,7 +108,7 @@ Thus, the two variables affect pump operation are set in New(): /obj/machinery/atmospherics/components/binary/pump/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 0) ui = SSnano.try_update_ui(user, src, ui_key, ui, force_open = force_open) if (!ui) - ui = new(user, src, ui_key, "atmos_pump", name, 400, 100) + ui = new(user, src, ui_key, "atmos_pump", name, 400, 115) ui.open() /obj/machinery/atmospherics/components/binary/pump/get_ui_data() diff --git a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm index 0730b014472..98afbc7778c 100644 --- a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm @@ -105,7 +105,7 @@ Thus, the two variables affect pump operation are set in New(): /obj/machinery/atmospherics/components/binary/volume_pump/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 0) ui = SSnano.try_update_ui(user, src, ui_key, ui, force_open = force_open) if (!ui) - ui = new(user, src, ui_key, "atmos_pump", name, 400, 100) + ui = new(user, src, ui_key, "atmos_pump", name, 400, 115) ui.open() /obj/machinery/atmospherics/components/binary/volume_pump/get_ui_data() diff --git a/code/ATMOSPHERICS/components/trinary_devices/filter.dm b/code/ATMOSPHERICS/components/trinary_devices/filter.dm index 94fe581e844..c6f36d17a05 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/filter.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/filter.dm @@ -172,7 +172,7 @@ Filter types: /obj/machinery/atmospherics/components/trinary/filter/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 0) ui = SSnano.try_update_ui(user, src, ui_key, ui, force_open = force_open) if (!ui) - ui = new(user, src, ui_key, "atmos_filter", name, 400, 120) + ui = new(user, src, ui_key, "atmos_filter", name, 450, 135) ui.open() /obj/machinery/atmospherics/components/trinary/filter/get_ui_data() diff --git a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm index 6e6bd0beb42..fa883568853 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm @@ -135,7 +135,7 @@ /obj/machinery/atmospherics/components/trinary/mixer/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 0) ui = SSnano.try_update_ui(user, src, ui_key, ui, force_open = force_open) if (!ui) - ui = new(user, src, ui_key, "atmos_mixer", name, 400, 145) + ui = new(user, src, ui_key, "atmos_mixer", name, 450, 18) ui.open() /obj/machinery/atmospherics/components/trinary/mixer/get_ui_data() diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index c53b22f078a..b7da53bef1c 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -190,7 +190,7 @@ /obj/machinery/alarm/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 0) ui = SSnano.try_update_ui(user, src, ui_key, ui, force_open = force_open) if (!ui) - ui = new(user, src, ui_key, "air_alarm", name, 480, 625) + ui = new(user, src, ui_key, "air_alarm", name, 480, 660) ui.open() /obj/machinery/alarm/get_ui_data(mob/user) diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index 63b8ae8999d..bb0bca64961 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -277,7 +277,7 @@ update_flag /obj/machinery/portable_atmospherics/canister/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 0) ui = SSnano.try_update_ui(user, src, ui_key, ui, force_open = force_open) if (!ui) - ui = new(user, src, ui_key, "canister", name, 470, 400, state = physical_state) + ui = new(user, src, ui_key, "canister", name, 470, 470, state = physical_state) ui.open() /obj/machinery/portable_atmospherics/canister/get_ui_data() diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 9b55a6e3a66..ddeda6750b0 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -159,7 +159,7 @@ /obj/machinery/space_heater/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 0) ui = SSnano.try_update_ui(user, src, ui_key, ui, force_open = force_open) if (!ui) - ui = new(user, src, ui_key, "space_heater", name, 490, 350, state = physical_state) + ui = new(user, src, ui_key, "space_heater", name, 490, 340, state = physical_state) ui.open() /obj/machinery/space_heater/Topic(href, href_list) @@ -173,11 +173,9 @@ mode = HEATER_MODE_STANDBY usr.visible_message("[usr] switches [on ? "on" : "off"] \the [src].", "You switch [on ? "on" : "off"] \the [src].") update_icon() - SSnano.update_uis(src) else if(href_list["mode"]) setMode = href_list["mode"] - SSnano.update_uis(src) else if(href_list["temp"] && panel_open) var/value @@ -192,7 +190,6 @@ var/minTemp = max(settableTemperatureMedian - settableTemperatureRange, TCMB) var/maxTemp = settableTemperatureMedian + settableTemperatureRange targetTemperature = dd_range(minTemp, maxTemp, round(value, 1)) - SSnano.update_uis(src) else if(href_list["cellremove"] && panel_open) if(cell) @@ -204,7 +201,6 @@ cell.add_fingerprint(usr) usr.visible_message("\The [usr] removes \the [cell] from \the [src].", "You remove \the [cell] from \the [src].") cell = null - SSnano.update_uis(src) else if(href_list["cellinstall"] && panel_open) if(!cell) @@ -217,7 +213,8 @@ C.add_fingerprint(usr) usr.visible_message("\The [usr] inserts \a [C] into \the [src].", "You insert \the [C] into \the [src].") - SSnano.update_uis(src) + + SSnano.update_uis(src) /obj/machinery/space_heater/process() if(!on || (stat & BROKEN)) diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index 3d2c97b2880..ff63089e192 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -122,7 +122,7 @@ /obj/item/weapon/tank/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, force_open = 0) ui = SSnano.try_update_ui(user, src, ui_key, ui, force_open = force_open) if (!ui) - ui = new(user, src, ui_key, "tanks", name, 525, 175, state = inventory_state) + ui = new(user, src, ui_key, "tanks", name, 525, 205, state = inventory_state) ui.open() /obj/item/weapon/tank/get_ui_data() diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm index 39cb0f0e94b..e93b8598ea8 100644 --- a/code/modules/client/asset_cache.dm +++ b/code/modules/client/asset_cache.dm @@ -221,15 +221,14 @@ You can set verify to TRUE if you want send() to sleep until the client has the /datum/asset/simple/nanoui assets = list( - "lib.js" = 'nano/assets/lib.js', - "app.js" = 'nano/assets/app.js', - "templates.js" = 'nano/assets/templates.js', - "lib.css" = 'nano/assets/lib.css', - "common.css" = 'nano/assets/common.css', - "generic.css" = 'nano/assets/generic.css', - "nanotrasen.css" = 'nano/assets/nanotrasen.css', + "nanoui.lib.js" = 'nano/assets/nanoui.lib.js', + "nanoui.main.js" = 'nano/assets/nanoui.main.js', + "nanoui.templates.js" = 'nano/assets/nanoui.templates.js', + "nanoui.lib.css" = 'nano/assets/nanoui.lib.css', + "nanoui.common.css" = 'nano/assets/nanoui.common.css', + "nanoui.generic.css" = 'nano/assets/nanoui.generic.css', + "nanoui.nanotrasen.css" = 'nano/assets/nanoui.nanotrasen.css', "fontawesome-webfont.eot" = 'nano/assets/fontawesome-webfont.eot', - "fontawesome-webfont.woff" = 'nano/assets/fontawesome-webfont.woff', "fontawesome-webfont.woff2" = 'nano/assets/fontawesome-webfont.woff2' ) diff --git a/code/modules/html_interface/nanotrasen/nanotrasen.css b/code/modules/html_interface/nanotrasen/hi-nanotrasen.css similarity index 100% rename from code/modules/html_interface/nanotrasen/nanotrasen.css rename to code/modules/html_interface/nanotrasen/hi-nanotrasen.css diff --git a/code/modules/html_interface/nanotrasen/nanotrasen.dm b/code/modules/html_interface/nanotrasen/nanotrasen.dm index 5ae9407093f..0ac9a67a46a 100644 --- a/code/modules/html_interface/nanotrasen/nanotrasen.dm +++ b/code/modules/html_interface/nanotrasen/nanotrasen.dm @@ -18,7 +18,7 @@ The client is optional and may be a /mob, /client or /html_interface_client obje . = ..() // Add appropriate CSS and set the default layout. - src.head = src.head + "" + src.head = src.head + "" src.updateLayout("") /datum/html_interface/nanotrasen/updateLayout(layout) @@ -32,7 +32,7 @@ The client is optional and may be a /mob, /client or /html_interface_client obje /datum/html_interface/nanotrasen/registerResources(var/list/resources = list()) resources["uiBg.png"] = 'uiBg.png' resources["uiBgcenter.png"] = 'uiBgcenter.png' - resources["nanotrasen.css"] = 'nanotrasen.css' + resources["hi-nanotrasen.css"] = 'hi-nanotrasen.css' ..(resources) /datum/html_interface/nanotrasen/createWindow(datum/html_interface_client/hclient) diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm index 7d7077321e4..432c56b9936 100644 --- a/code/modules/nano/nanoui.dm +++ b/code/modules/nano/nanoui.dm @@ -253,14 +253,14 @@ /datum/nanoui/proc/get_html() // Generate - - + + + "} var/stylesheet_html = {" - - - + + + "} // Generate data JSON. diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index 3aede467ab4..9224829036b 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -327,7 +327,7 @@ /obj/machinery/power/smes/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 0) ui = SSnano.try_update_ui(user, src, ui_key, ui, force_open = force_open) if (!ui) - ui = new(user, src, ui_key, "smes", name, 500, 400) + ui = new(user, src, ui_key, "smes", name, 500, 455) ui.open() /obj/machinery/power/smes/get_ui_data() diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 3b6da37e45b..e06e6aab043 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -372,7 +372,7 @@ /obj/machinery/power/solar_control/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 0) ui = SSnano.try_update_ui(user, src, ui_key, ui, force_open = force_open) if (!ui) - ui = new(user, src, ui_key, "solar_control", name, 490, 395) + ui = new(user, src, ui_key, "solar_control", name, 515, 425) ui.open() /obj/machinery/power/solar_control/get_ui_data() diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index d7fdbdb7130..7612054e9dd 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -1,356 +1,356 @@ -/obj/machinery/chem_dispenser - name = "chem dispenser" - desc = "Creates and dispenses chemicals." - density = 1 - anchored = 1 - icon = 'icons/obj/chemical.dmi' - icon_state = "dispenser" - use_power = 1 - idle_power_usage = 40 - var/energy = 100 - var/max_energy = 100 - var/amount = 30 - var/recharged = 0 - var/recharge_delay = 5 - var/image/icon_beaker = null - var/obj/item/weapon/reagent_containers/beaker = null - var/list/dispensable_reagents = list( - "hydrogen", - "lithium", - "carbon", - "nitrogen", - "oxygen", - "fluorine", - "sodium", - "aluminium", - "silicon", - "phosphorus", - "sulfur", - "chlorine", - "potassium", - "iron", - "copper", - "mercury", - "radium", - "water", - "ethanol", - "sugar", - "sacid", - "welding_fuel", - "silver", - "iodine", - "bromine", - "stable_plasma" - ) - -/obj/machinery/chem_dispenser/New() - ..() - recharge() - dispensable_reagents = sortList(dispensable_reagents) - -/obj/machinery/chem_dispenser/power_change() - if(powered()) - stat &= ~NOPOWER - else - spawn(rand(0, 15)) - stat |= NOPOWER - -/obj/machinery/chem_dispenser/process() - - if(recharged < 0) - recharge() - recharged = recharge_delay - else - recharged -= 1 - -/obj/machinery/chem_dispenser/proc/recharge() - if(stat & (BROKEN|NOPOWER)) return - var/addenergy = 1 - var/oldenergy = energy - energy = min(energy + addenergy, max_energy) - if(energy != oldenergy) - use_power(2500) - -/obj/machinery/chem_dispenser/ex_act(severity, target) - if(severity < 3) - ..() - -/obj/machinery/chem_dispenser/blob_act() - if(prob(50)) - qdel(src) - -/obj/machinery/chem_dispenser/interact(mob/user) - if(stat & BROKEN) - return - ui_interact(user) - -/obj/machinery/chem_dispenser/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 0) - ui = SSnano.try_update_ui(user, src, ui_key, ui, force_open = force_open) - if (!ui) - ui = new(user, src, ui_key, "chem_dispenser", name, 500, 650) - ui.open() - -/obj/machinery/chem_dispenser/get_ui_data() - var/data = list() - data["amount"] = amount - data["energy"] = energy - data["maxEnergy"] = max_energy - data["isBeakerLoaded"] = beaker ? 1 : 0 - - var beakerContents[0] - var beakerCurrentVolume = 0 - if(beaker && beaker.reagents && beaker.reagents.reagent_list.len) - for(var/datum/reagent/R in beaker.reagents.reagent_list) - beakerContents.Add(list(list("name" = R.name, "volume" = R.volume))) // list in a list because Byond merges the first list... - beakerCurrentVolume += R.volume - data["beakerContents"] = beakerContents - - if (beaker) - data["beakerCurrentVolume"] = beakerCurrentVolume - data["beakerMaxVolume"] = beaker.volume - data["beakerTransferAmounts"] = beaker.possible_transfer_amounts - else - data["beakerCurrentVolume"] = null - data["beakerMaxVolume"] = null - data["beakerTransferAmounts"] = null - - var chemicals[0] - for(var/re in dispensable_reagents) - var/datum/reagent/temp = chemical_reagents_list[re] - if(temp) - chemicals.Add(list(list("title" = temp.name, "id" = temp.id, "commands" = list("dispense" = temp.id)))) // list in a list because Byond merges the first list... - data["chemicals"] = chemicals - return data - -/obj/machinery/chem_dispenser/Topic(href, href_list) - if(..()) - return - - if(href_list["amount"]) - amount = round(text2num(href_list["amount"]), 5) // round to nearest 5 - if (amount < 0) // Since the user can actually type the commands himself, some sanity checking - amount = 0 - if (amount > 100) - amount = 100 - - if(href_list["dispense"]) - if(beaker && dispensable_reagents.Find(href_list["dispense"])) - var/datum/reagents/R = beaker.reagents - var/space = R.maximum_volume - R.total_volume - - R.add_reagent(href_list["dispense"], min(amount, energy * 10, space)) - energy = max(energy - min(amount, energy * 10, space) / 10, 0) - - if(href_list["remove"]) - if(beaker) - var/amount = text2num(href_list["remove"]) - if(isnum(amount) && (amount > 0) && (amount in beaker.possible_transfer_amounts)) - beaker.reagents.remove_all(amount) - - if(href_list["ejectBeaker"]) - if(beaker) - beaker.loc = loc - beaker = null - overlays.Cut() - - add_fingerprint(usr) - -/obj/machinery/chem_dispenser/attackby(obj/item/I, mob/user, params) - if(default_unfasten_wrench(user, I)) - return - - if(isrobot(user)) - return - - var/obj/item/weapon/reagent_containers/B = I // Get a beaker from it? - if(!istype(B)) - return // Not a beaker? - - if(beaker) - user << "A beaker is already loaded into the machine!" - return - - if(!user.drop_item()) // Can't let go? - return - - beaker = B - beaker.loc = src - user << "You add the beaker to the machine." - - if(!icon_beaker) - icon_beaker = image('icons/obj/chemical.dmi', src, "disp_beaker") //randomize beaker overlay position. - icon_beaker.pixel_x = rand(-10,5) - overlays += icon_beaker - -/obj/machinery/chem_dispenser/attack_hand(mob/user) - if (!user) - return - interact(user) - - -/obj/machinery/chem_dispenser/constructable - name = "portable chem dispenser" - icon = 'icons/obj/chemical.dmi' - icon_state = "minidispenser" - energy = 10 - max_energy = 10 - amount = 5 - recharge_delay = 30 - dispensable_reagents = list() - var/list/dispensable_reagent_tiers = list( - list( - "hydrogen", - "oxygen", - "silicon", - "phosphorus", - "sulfur", - "carbon", - "nitrogen", - "water" - ), - list( - "lithium", - "sugar", - "sacid", - "copper", - "mercury", - "sodium", - "iodine", - "bromine" - ), - list( - "ethanol", - "chlorine", - "potassium", - "aluminium", - "radium", - "fluorine", - "iron", - "welding_fuel", - "silver", - "stable_plasma" - ), - list( - "oil", - "ash", - "acetone", - "saltpetre", - "ammonia", - "diethylamine" - ) - ) - -/obj/machinery/chem_dispenser/constructable/New() - ..() - component_parts = list() - component_parts += new /obj/item/weapon/circuitboard/chem_dispenser(null) - component_parts += new /obj/item/weapon/stock_parts/matter_bin(null) - component_parts += new /obj/item/weapon/stock_parts/matter_bin(null) - component_parts += new /obj/item/weapon/stock_parts/manipulator(null) - component_parts += new /obj/item/weapon/stock_parts/capacitor(null) - component_parts += new /obj/item/weapon/stock_parts/console_screen(null) - component_parts += new /obj/item/weapon/stock_parts/cell/high(null) - RefreshParts() - -/obj/machinery/chem_dispenser/constructable/RefreshParts() - var/time = 0 - var/temp_energy = 0 - var/i - for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts) - temp_energy += M.rating - temp_energy-- - max_energy = temp_energy * 5 //max energy = (bin1.rating + bin2.rating - 1) * 5, 5 on lowest 25 on highest - for(var/obj/item/weapon/stock_parts/capacitor/C in component_parts) - time += C.rating - for(var/obj/item/weapon/stock_parts/cell/P in component_parts) - time += round(P.maxcharge, 10000) / 10000 - recharge_delay /= time/2 //delay between recharges, double the usual time on lowest 50% less than usual on highest - for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) - for(i=1, i<=M.rating, i++) - dispensable_reagents |= dispensable_reagent_tiers[i] - dispensable_reagents = sortList(dispensable_reagents) - -/obj/machinery/chem_dispenser/constructable/attackby(var/obj/item/I, var/mob/user, params) - ..() - if(default_deconstruction_screwdriver(user, "minidispenser-o", "minidispenser", I)) - return - - if(exchange_parts(user, I)) - return - - if(panel_open) - if(istype(I, /obj/item/weapon/crowbar)) - if(beaker) - beaker.loc = loc - beaker = null - default_deconstruction_crowbar(I) - return 1 - -/obj/machinery/chem_dispenser/drinks - name = "soda dispenser" - anchored = 1 - icon = 'icons/obj/chemical.dmi' - icon_state = "soda_dispenser" - amount = 10 - dispensable_reagents = list( - "water", - "ice", - "coffee", - "cream", - "tea", - "icetea", - "cola", - "spacemountainwind", - "dr_gibb", - "space_up", - "tonic", - "sodawater", - "lemon_lime", - "sugar", - "orangejuice", - "limejuice", - "tomatojuice" - ) - -/obj/machinery/chem_dispenser/drinks/attackby(obj/item/I, mob/user) - if(default_unfasten_wrench(user, I)) - return - - if (istype(I, /obj/item/weapon/reagent_containers/glass) || \ - istype(I, /obj/item/weapon/reagent_containers/food/drinks/drinkingglass) || \ - istype(I, /obj/item/weapon/reagent_containers/food/drinks/shaker)) - - if (beaker) - return 1 - else - if(!user.drop_item()) - return 1 - src.beaker = I - beaker.loc = src - update_icon() - return - -/obj/machinery/chem_dispenser/drinks/beer - name = "booze dispenser" - anchored = 1 - icon = 'icons/obj/chemical.dmi' - icon_state = "booze_dispenser" - dispensable_reagents = list( - "lemon_lime", - "sugar", - "orangejuice", - "limejuice", - "sodawater", - "tonic", - "beer", - "kahlua", - "whiskey", - "wine", - "vodka", - "gin", - "rum", - "tequila", - "vermouth", - "cognac", - "ale" - ) +/obj/machinery/chem_dispenser + name = "chem dispenser" + desc = "Creates and dispenses chemicals." + density = 1 + anchored = 1 + icon = 'icons/obj/chemical.dmi' + icon_state = "dispenser" + use_power = 1 + idle_power_usage = 40 + var/energy = 100 + var/max_energy = 100 + var/amount = 30 + var/recharged = 0 + var/recharge_delay = 5 + var/image/icon_beaker = null + var/obj/item/weapon/reagent_containers/beaker = null + var/list/dispensable_reagents = list( + "hydrogen", + "lithium", + "carbon", + "nitrogen", + "oxygen", + "fluorine", + "sodium", + "aluminium", + "silicon", + "phosphorus", + "sulfur", + "chlorine", + "potassium", + "iron", + "copper", + "mercury", + "radium", + "water", + "ethanol", + "sugar", + "sacid", + "welding_fuel", + "silver", + "iodine", + "bromine", + "stable_plasma" + ) + +/obj/machinery/chem_dispenser/New() + ..() + recharge() + dispensable_reagents = sortList(dispensable_reagents) + +/obj/machinery/chem_dispenser/power_change() + if(powered()) + stat &= ~NOPOWER + else + spawn(rand(0, 15)) + stat |= NOPOWER + +/obj/machinery/chem_dispenser/process() + + if(recharged < 0) + recharge() + recharged = recharge_delay + else + recharged -= 1 + +/obj/machinery/chem_dispenser/proc/recharge() + if(stat & (BROKEN|NOPOWER)) return + var/addenergy = 1 + var/oldenergy = energy + energy = min(energy + addenergy, max_energy) + if(energy != oldenergy) + use_power(2500) + +/obj/machinery/chem_dispenser/ex_act(severity, target) + if(severity < 3) + ..() + +/obj/machinery/chem_dispenser/blob_act() + if(prob(50)) + qdel(src) + +/obj/machinery/chem_dispenser/interact(mob/user) + if(stat & BROKEN) + return + ui_interact(user) + +/obj/machinery/chem_dispenser/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 0) + ui = SSnano.try_update_ui(user, src, ui_key, ui, force_open = force_open) + if (!ui) + ui = new(user, src, ui_key, "chem_dispenser", name, 530, 700) + ui.open() + +/obj/machinery/chem_dispenser/get_ui_data() + var/data = list() + data["amount"] = amount + data["energy"] = energy + data["maxEnergy"] = max_energy + data["isBeakerLoaded"] = beaker ? 1 : 0 + + var beakerContents[0] + var beakerCurrentVolume = 0 + if(beaker && beaker.reagents && beaker.reagents.reagent_list.len) + for(var/datum/reagent/R in beaker.reagents.reagent_list) + beakerContents.Add(list(list("name" = R.name, "volume" = R.volume))) // list in a list because Byond merges the first list... + beakerCurrentVolume += R.volume + data["beakerContents"] = beakerContents + + if (beaker) + data["beakerCurrentVolume"] = beakerCurrentVolume + data["beakerMaxVolume"] = beaker.volume + data["beakerTransferAmounts"] = beaker.possible_transfer_amounts + else + data["beakerCurrentVolume"] = null + data["beakerMaxVolume"] = null + data["beakerTransferAmounts"] = null + + var chemicals[0] + for(var/re in dispensable_reagents) + var/datum/reagent/temp = chemical_reagents_list[re] + if(temp) + chemicals.Add(list(list("title" = temp.name, "id" = temp.id, "commands" = list("dispense" = temp.id)))) // list in a list because Byond merges the first list... + data["chemicals"] = chemicals + return data + +/obj/machinery/chem_dispenser/Topic(href, href_list) + if(..()) + return + + if(href_list["amount"]) + amount = round(text2num(href_list["amount"]), 5) // round to nearest 5 + if (amount < 0) // Since the user can actually type the commands himself, some sanity checking + amount = 0 + if (amount > 100) + amount = 100 + + if(href_list["dispense"]) + if(beaker && dispensable_reagents.Find(href_list["dispense"])) + var/datum/reagents/R = beaker.reagents + var/space = R.maximum_volume - R.total_volume + + R.add_reagent(href_list["dispense"], min(amount, energy * 10, space)) + energy = max(energy - min(amount, energy * 10, space) / 10, 0) + + if(href_list["remove"]) + if(beaker) + var/amount = text2num(href_list["remove"]) + if(isnum(amount) && (amount > 0) && (amount in beaker.possible_transfer_amounts)) + beaker.reagents.remove_all(amount) + + if(href_list["ejectBeaker"]) + if(beaker) + beaker.loc = loc + beaker = null + overlays.Cut() + + add_fingerprint(usr) + +/obj/machinery/chem_dispenser/attackby(obj/item/I, mob/user, params) + if(default_unfasten_wrench(user, I)) + return + + if(isrobot(user)) + return + + var/obj/item/weapon/reagent_containers/B = I // Get a beaker from it? + if(!istype(B)) + return // Not a beaker? + + if(beaker) + user << "A beaker is already loaded into the machine!" + return + + if(!user.drop_item()) // Can't let go? + return + + beaker = B + beaker.loc = src + user << "You add the beaker to the machine." + + if(!icon_beaker) + icon_beaker = image('icons/obj/chemical.dmi', src, "disp_beaker") //randomize beaker overlay position. + icon_beaker.pixel_x = rand(-10,5) + overlays += icon_beaker + +/obj/machinery/chem_dispenser/attack_hand(mob/user) + if (!user) + return + interact(user) + + +/obj/machinery/chem_dispenser/constructable + name = "portable chem dispenser" + icon = 'icons/obj/chemical.dmi' + icon_state = "minidispenser" + energy = 10 + max_energy = 10 + amount = 5 + recharge_delay = 30 + dispensable_reagents = list() + var/list/dispensable_reagent_tiers = list( + list( + "hydrogen", + "oxygen", + "silicon", + "phosphorus", + "sulfur", + "carbon", + "nitrogen", + "water" + ), + list( + "lithium", + "sugar", + "sacid", + "copper", + "mercury", + "sodium", + "iodine", + "bromine" + ), + list( + "ethanol", + "chlorine", + "potassium", + "aluminium", + "radium", + "fluorine", + "iron", + "welding_fuel", + "silver", + "stable_plasma" + ), + list( + "oil", + "ash", + "acetone", + "saltpetre", + "ammonia", + "diethylamine" + ) + ) + +/obj/machinery/chem_dispenser/constructable/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/chem_dispenser(null) + component_parts += new /obj/item/weapon/stock_parts/matter_bin(null) + component_parts += new /obj/item/weapon/stock_parts/matter_bin(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator(null) + component_parts += new /obj/item/weapon/stock_parts/capacitor(null) + component_parts += new /obj/item/weapon/stock_parts/console_screen(null) + component_parts += new /obj/item/weapon/stock_parts/cell/high(null) + RefreshParts() + +/obj/machinery/chem_dispenser/constructable/RefreshParts() + var/time = 0 + var/temp_energy = 0 + var/i + for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts) + temp_energy += M.rating + temp_energy-- + max_energy = temp_energy * 5 //max energy = (bin1.rating + bin2.rating - 1) * 5, 5 on lowest 25 on highest + for(var/obj/item/weapon/stock_parts/capacitor/C in component_parts) + time += C.rating + for(var/obj/item/weapon/stock_parts/cell/P in component_parts) + time += round(P.maxcharge, 10000) / 10000 + recharge_delay /= time/2 //delay between recharges, double the usual time on lowest 50% less than usual on highest + for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) + for(i=1, i<=M.rating, i++) + dispensable_reagents |= dispensable_reagent_tiers[i] + dispensable_reagents = sortList(dispensable_reagents) + +/obj/machinery/chem_dispenser/constructable/attackby(var/obj/item/I, var/mob/user, params) + ..() + if(default_deconstruction_screwdriver(user, "minidispenser-o", "minidispenser", I)) + return + + if(exchange_parts(user, I)) + return + + if(panel_open) + if(istype(I, /obj/item/weapon/crowbar)) + if(beaker) + beaker.loc = loc + beaker = null + default_deconstruction_crowbar(I) + return 1 + +/obj/machinery/chem_dispenser/drinks + name = "soda dispenser" + anchored = 1 + icon = 'icons/obj/chemical.dmi' + icon_state = "soda_dispenser" + amount = 10 + dispensable_reagents = list( + "water", + "ice", + "coffee", + "cream", + "tea", + "icetea", + "cola", + "spacemountainwind", + "dr_gibb", + "space_up", + "tonic", + "sodawater", + "lemon_lime", + "sugar", + "orangejuice", + "limejuice", + "tomatojuice" + ) + +/obj/machinery/chem_dispenser/drinks/attackby(obj/item/I, mob/user) + if(default_unfasten_wrench(user, I)) + return + + if (istype(I, /obj/item/weapon/reagent_containers/glass) || \ + istype(I, /obj/item/weapon/reagent_containers/food/drinks/drinkingglass) || \ + istype(I, /obj/item/weapon/reagent_containers/food/drinks/shaker)) + + if (beaker) + return 1 + else + if(!user.drop_item()) + return 1 + src.beaker = I + beaker.loc = src + update_icon() + return + +/obj/machinery/chem_dispenser/drinks/beer + name = "booze dispenser" + anchored = 1 + icon = 'icons/obj/chemical.dmi' + icon_state = "booze_dispenser" + dispensable_reagents = list( + "lemon_lime", + "sugar", + "orangejuice", + "limejuice", + "sodawater", + "tonic", + "beer", + "kahlua", + "whiskey", + "wine", + "vodka", + "gin", + "rum", + "tequila", + "vermouth", + "cognac", + "ale" + ) diff --git a/nano/Gulpfile.coffee b/nano/Gulpfile.coffee index 22e02b2c1c2..f99fc439c89 100644 --- a/nano/Gulpfile.coffee +++ b/nano/Gulpfile.coffee @@ -1,13 +1,26 @@ ### Settings ### -min = require("gulp-util").env.min +util = require("gulp-util") +s = + min: util.env.min + colorblind: util.env.colorblind # Project Paths -paths = - images: "images/" - scripts: "scripts/*.coffee" - styles: "styles/*.less" - templates: "templates/*.dot" - build: "assets" +input = + fonts: "**/*.{eot,woff2}" + images: "images" + scripts: "scripts" + styles: "styles" + templates: "templates" + +output = + dir: "assets" + scripts: + lib: "nanoui.lib.js" + main: "nanoui.main.js" + styles: + lib: "nanoui.lib.css" + prefix: "nanoui." + templates: "nanoui.templates.js" # doT Settings dotOpts = @@ -23,116 +36,92 @@ dotOpts = append: true, selfcontained: true -# LESS Settings -lessOpts = - paths: [paths.images] +### Pacakages ### +bower = require "main-bower-files" +child_process = require "child_process" +del = require "del" +gulp = require "gulp" +merge = require "merge-stream" -# Autoprefixer Settings -autoOpts = - browsers: [ - "last 2 versions", - "> 5%", - "ie >= 8" - ] +### Plugins ### +g = require("gulp-load-plugins")({replaceString: /^gulp(-|\.)|-/g}) +p = + autoprefixer: require "autoprefixer" + colorblind: require "postcss-colorblind" + fontweights: require "postcss-font-weights" + gradient: require "postcss-filter-gradient" + opacity: require "postcss-opacity" + plsfilters: require "pleeease-filters" + rgba: require "postcss-color-rgba-fallback" -# CSSNano Settings -nanoOpts = - discardComments: - removeAll: true - -# Filter Settings -filterOpts = - oldIE: true - - -### Gulp ### -gulp = require "gulp" -gulpif = require "gulp-if" -jsbeautify = require "gulp-jsbeautifier" -bower = require "main-bower-files" -coffee = require "gulp-coffee" -concat = require "gulp-concat" -csscomb = require "gulp-csscomb" -cssnano = require "gulp-cssnano" -del = require "del" -dot = require "gulp-dot-precompiler" -header = require "gulp-header" -filter = require "gulp-filter" -gutil = require "gulp-util" -less = require "gulp-less" -merge = require "merge-stream" -postcss = require "gulp-postcss" -replace = require "gulp-replace" -uglify = require "gulp-uglify" - -### PostCSS ### - -autoprefixer = require "autoprefixer" -clearfix = require "postcss-clearfix" -filters = require "pleeease-filters" -gradient = require "postcss-filter-gradient" -opacity = require "postcss-opacity" -pseudo = require "postcss-pseudoelements" -rgba = require "postcss-color-rgba-fallback" +### Helpers ### +glob = (path) -> + "#{path}/*" ### Tasks ### gulp.task "default", ["fonts", "scripts", "styles", "templates"] gulp.task "clean", -> - del "#{paths.build}/*" + del glob output.dir gulp.task "watch", -> - gulp.watch paths.scripts, ["scripts"] - gulp.watch paths.styles, ["styles"] - gulp.watch paths.templates, ["templates"] + gulp.watch [glob input.images], ["reload"] + gulp.watch [glob input.scripts], ["reload"] + gulp.watch [glob input.styles], ["reload"] + gulp.watch [glob input.templates], ["reload"] -gulp.task "fonts", -> - gulp.src bower "**/*.{eot,woff{,2}}" - .pipe gulp.dest paths.build +gulp.task "reload", ["default"], -> + child_process.exec "reload.bat", (err, stdout, stderr) -> + return console.log err if err -gulp.task "scripts", -> +gulp.task "fonts", ["clean"], -> + gulp.src bower input.fonts + .pipe gulp.dest output.dir + +gulp.task "scripts", ["clean"], -> lib = gulp.src bower "**/*.js" - .pipe concat("lib.js") - .pipe gulpif(min, uglify(), jsbeautify()) - .pipe gulp.dest paths.build + .pipe g.concat(output.scripts.lib) + .pipe g.if(s.min, g.uglify(), g.jsbeautifier()) + .pipe gulp.dest output.dir - nanoui = gulp.src paths.scripts - .pipe coffee() - .pipe concat("app.js") - .pipe gulpif(min, uglify(), jsbeautify()) - .pipe gulp.dest paths.build + main = gulp.src glob input.scripts + .pipe g.coffee() + .pipe g.concat(output.scripts.main) + .pipe g.if(s.min, g.uglify(), g.jsbeautifier()) + .pipe gulp.dest output.dir - merge lib, nanoui + merge lib, main -gulp.task "styles", -> +gulp.task "styles", ["clean"], -> lib = gulp.src bower "**/*.css" - .pipe replace("../fonts/", "") - .pipe concat("lib.css") - .pipe gulpif(min, cssnano(nanoOpts), csscomb()) - .pipe gulp.dest paths.build + .pipe g.replace("../fonts/", "") + .pipe g.concat(output.styles.lib) + .pipe g.if(s.min, g.cssnano({discardComments: {removeAll: true}}), g.csscomb()) + .pipe gulp.dest output.dir - nanoui = gulp.src paths.styles - .pipe filter(["*.less", "!_*.less"]) - .pipe less(lessOpts) - .pipe postcss([ - autoprefixer(autoOpts), - filters(filterOpts) - pseudo, - rgba, - gradient, - opacity, - clearfix + main = gulp.src glob input.styles + .pipe g.filter(["*.less", "!_*.less"]) + .pipe g.less({paths: [input.images]}) + .pipe g.postcss([ + p.autoprefixer({browsers: ["last 2 versions", "ie >= 8"]}), + p.plsfilters({oldIE: true}), + p.rgba({oldie: true}), + p.opacity, + p.gradient, + p.fontweights ]) - .pipe gulpif(min, cssnano(nanoOpts), csscomb()) - .pipe gulp.dest paths.build + .pipe g.if(s.colorblind, g.postcss([p.colorblind])) + .pipe g.if(s.min, g.cssnano({discardComments: {removeAll: true}}), g.csscomb()) + .pipe g.rename({prefix: output.styles.prefix}) + .pipe gulp.dest output.dir - merge lib, nanoui + merge lib, main -gulp.task "templates", -> - gulp.src paths.templates - .pipe dot({dictionary: "TMPL", templateSettings: dotOpts}) - .pipe concat("templates.js") - .pipe header("window.TMPL = {};\n") - .pipe gulpif(min, uglify(), jsbeautify()) - .pipe gulp.dest paths.build +gulp.task "templates", ["clean"], -> + gulp.src glob input.templates + .pipe g.dotprecompiler({dictionary: "TMPL", templateSettings: dotOpts}) + .pipe g.concat(output.templates) + .pipe g.header("window.TMPL = {};\n") + .pipe g.if(s.min, g.uglify(), g.jsbeautifier()) + .pipe gulp.dest output.dir diff --git a/nano/README.md b/nano/README.md index eb1d71254aa..61490ced92c 100644 --- a/nano/README.md +++ b/nano/README.md @@ -12,6 +12,8 @@ - [Bar](#bar) - [doT](#dot) - [Styling](#styling) + - [Contributing](#contributing) + # NanoUI @@ -338,3 +340,38 @@ Here's an example of UI styling from Air Alarms: {{?}} + +## Contributing + +There are a few gotchas when it comes to writing for NanoUI. In order to +simplify server code and make the UI more responsive, we precompile all +templates to Javascript. In addition, Coffeescript and LESS are used to make +development easier, and also need to be precompiled. Precompiling CSS also +allows us to add fallbacks for old versions of Internet Explorer. + +To compile NanoUI (which you will need to do after adding or updating a +template), first install [Node.js](https://nodejs.org). + +Next, you will need to install packages used by NanoUI: + + cd nanoui/ + npm install -g gulp bower + npm install + bower install + +Finally, to compile NanoUI, run Gulp: + + gulp + +Every time you make an update, you will need to recompile. Before comitting, +make sure you minimize the files with Gulp: + + gulp --min + +If you would like to view your changes without restarting, run Gulp reload: + + gulp reload + +Finally, if you want to auto-compile and reload on save, run Gulp watch: + + gulp watch diff --git a/nano/assets/common.css b/nano/assets/common.css deleted file mode 100644 index ad59ec64ad8..00000000000 --- a/nano/assets/common.css +++ /dev/null @@ -1 +0,0 @@ -body,html{height:100%}body{font-family:Verdana,Geneva,sans-serif;font-size:12px;color:#fff}h1,h2,h3{font-size:18px;margin:0;padding:6px 0}h2{font-size:16px}h3{font-size:14px}hr{background-color:#40628a;border:none}.normal{color:#40628a}.good{color:#537d29}.average{color:#be6209}.bad{color:#b00e0e}.highlight,.label{color:#8ba5c4}.dark{color:#272727}.bold{font-weight:700}.italic{font-style:italic}.fontReset{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}.noticeStripes{background-color:#bb9b68;background-image:-webkit-repeating-linear-gradient(45deg,#bb9b68,#bb9b68 10px,#b1905d 0,#b1905d 20px);background-image:repeating-linear-gradient(45deg,#bb9b68,#bb9b68 10px,#b1905d 0,#b1905d 20px)}.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}article.display,article.notice{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column;width:auto;padding:4px;margin:6px 2px;background-color:#000;background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5)}article.display header,article.notice header{padding-left:4px;margin-bottom:6px;border-bottom:2px solid #40628a}article.display section,article.notice section{width:100%;padding:2px 0}article.display section.text,article.notice section.text{padding:5px 0}article.display section.button,article.notice section.button{padding-bottom:0}article.display .cell,article.notice .cell{display:inline-block;margin:0}article.display .label,article.notice .label{display:inline-block;margin:0;width:33%;color:#8ba5c4}article.display .content,article.notice .content{display:inline-block;margin:0;width:66%}article.display .line,article.notice .line{display:inline-block;margin:0;width:100%}article.display table,article.notice table{width:auto;border-collapse:collapse}article.display table.grow,article.notice table.grow{width:100%}article.display th,article.notice th{vertical-align:top;padding:4px 16px 4px 0;text-align:left;color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none;color:#8ba5c4}article.display td,article.notice td{padding:2px 2px 0 0}article.notice{margin:8px 2px;box-shadow:none;background-color:#bb9b68;background-image:-webkit-repeating-linear-gradient(45deg,#bb9b68,#bb9b68 10px,#b1905d 0,#b1905d 20px);background-image:repeating-linear-gradient(45deg,#bb9b68,#bb9b68 10px,#b1905d 0,#b1905d 20px)}article.notice .label,article.notice span{color:#000;font-weight:700;font-style:italic}.link{display:inline-block;box-sizing:border-box;height:22px;margin:1px;padding:2px 3px;white-space:nowrap;border:1px solid #272727;cursor:default;color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none;background-color:#40628a}.link .iconed{padding-left:3px}.link i{margin-right:3px}.link i.main{display:inline-block}.link.pending i.main,.link i.pending{display:none}.link.pending i.pending{display:inline-block}.link.active{background-color:#40628a}.link.active:hover{background-color:#486e9b}.link.active.selected{background-color:#2f943c}.link.active.selected:hover{background-color:#35a744}.link.active.caution{background-color:#9a9d00}.link.active.caution:hover{background-color:#b3b700}.link.active.danger{background-color:#9d0808}.link.active.danger:hover{background-color:#b50909}.link.inactive{background-color:#999}.link.inactive.selected{background-color:#2f943c}.link.inactive.caution{background-color:#9a9d00}.link.inactive.danger{background-color:#9d0808}.link.disabled{background-color:#999}.bar{display:inline-block;position:relative;top:4px;vertical-align:top;box-sizing:border-box;width:100%;height:20px;margin:1px;padding:1px;border:1px solid #40628a;background:#272727}.bar .barText{position:absolute;top:1px;right:3px;color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}.bar .barFill{display:block;height:100%;overflow:hidden;background:#40628a}.bar .barFill.good{background:#537d29}.bar .barFill.average{background:#be6209}.bar .barFill.bad{background:#b00e0e}.bar .barFill.highlight{background:#8ba5c4}.content{margin:3px}.loading{background-color:#bb9b68;background-image:-webkit-repeating-linear-gradient(45deg,#bb9b68,#bb9b68 10px,#b1905d 0,#b1905d 20px);background-image:repeating-linear-gradient(45deg,#bb9b68,#bb9b68 10px,#b1905d 0,#b1905d 20px)} \ No newline at end of file diff --git a/nano/assets/fontawesome-webfont.woff b/nano/assets/fontawesome-webfont.woff deleted file mode 100644 index dc35ce3c2cf688c89b0bd0d4a82bc4be82b14c40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83588 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�>=olG4!T4BYNCc4f{&*Kgc`m= zjJH3zZE>o>GG*ti+od(?8;3_~`^-y6Vc-7QLko9Ku^3YMaD_M01hvF8H1d51bH-Qg z&rU;(FDDJ`vnPQcsLkm2u>^3J_mzRA+|DUF$&Oh_oso^^4x1UwgG}Y9+56ML6H|6_ zrJeYDbf4FaXVJmTWa49(C+jOw%o22n>f)U!(|lA_N#G?c;Xg$PBeEGoyNtk7d|nb& z23S`NlA1R~aYuq=Ym%jRMLT~X>RX}|_^4SV5%lm}!HJ{gma-}ywawnYfA+$h!DIK& z_U6JRcmVI8I|@BA?$$#`ZRr(Ws}a-{l!Finp^uaG*;;LRp-~SSZRuY{mL-_|)wwRH zj?fh;w0!MdFt@G>)Mp3q67-#I>7?CDiu!xq=&kV10zYqC+TShTe}2C%d1LMD{kp&J zpB%V zqHt{!`YiHsZPSCx!M$0Lx~Y4leVb|}&Eq4ldP41et!`GUllxNHPEJYmPdnS8;|$)12a(P+_;ag~KXu(rZ+JCF0=`-mWjRgwiZr zJ%f{tVMLj&xI(TTW3vp9@hJkAu+F$3ehfIM5tFE_&RJNu=q;C!u_O=$j3Y+5gqD#3 z%;x8pv-_<}WTl?G5XTM*p)+aOMb*WiEiDT^?I@B?m2$!owj$46CYxg2#D?w1eAhOOnCIO0~Db=Rz}~Q?1Uc$ahEX zgAcj$uZDeKjk~FA)?S6erp*>0<4hQTvwZa88N<;CFmCvaxg+J<#@mvR)0~Sb;DYLj zu{~eXwmynPGKC^?U7y;OicY|t{?CFb8J(8+D*AP7RD~%Oh*+xx(AO-a zNi-CUkaj>znwpIwSc=m}ksD971{2Yb55}etv0H;^i?bB{#Urk*19Wkv0c82bOZ(*Q zw2U-uZ-`8tz5nmJ{j+N~ChIV?f^buL8 zt*`XT^z8E2F=eU_omN+5_^Y|(oc@ZDhMl@WS^nYDoB`*~c?Xnv(ZvGC+G;<$(o%l( z#DsC^kx_H^V}1!P$@R|OKX!1=LPCsD8($Snw;erHUI6NhR&T{ttu|Yqj6NpebQ@^Y z8w<<940A$cS^ovzuc3v|-bfg#UAfh*e+y)T`l`CI=q$ccl_0zcre0~ z9K$419@2Du&7DFsZ!ilq)}tW!UTOG5o$q+ueuD@cYM`6a1`!+P27?N{uUBnV8PK0p z2ECe1R2ew+5FnGQwkY+$`;yeO!YF$&7wDB+RdU%-e7?mfyDXQpD()khai>bpwk%cY z+t1U7bM&gEYP~_;UanHebxK%+MjH&^;m8w8om{SFPbqbV$d!a7!6}1MgD$4SAg-%r zOcv8iv_tTSZX5!ZXk9$4vpeLCs7xl9VULXxCT^32Y?^TTK8_Kq@2MD6bVe$Z8tyPk zUpb^#i+a%RaM{SoBda92=sf!VwWUj616q&+v^4a=b#@}yz6}mN`pe);XuD3W)q#2F z9+D4%!%0ZJbNaYF>2fx(^fmN-kNi+|kBo3AzTUZ*)=+O$pfDK7BSwCBlHxmIj#7!c zq;kw55_d3UxH$g3WY;uJk3A$f{=iJNB3Gil{l$9SE~DsqB z04j$X4V*SL(Rgat?vo^yn*FU*T)}mk9hk234aqnPb+ic0yq)TlFfz^}cw`_bV?9BO z3<&r?Y$1d$(g=?{&^QR$LCY!h2|NOiL>lomXhHTrgK?2fU7Y zp??4ijs+IdP{Q zPsimnFv(FbnEjc0+(X0Ny#mB`R{5xUS%5nErM^;VDnj+sqamNDX0HYmhz$^ku0k6$ z6_vr5Ca=Mvrt0ZLB1lv^@ba9(7ehZ)n{iO*+U{9+WFh|J z)-S9bwrJsz_Wnl~FFAVemq)n`N0%%FeHfwl&?&U^{DHBf z_nn2q(GO??aj5{-a$sFfnQZ<+bmh?IuWIw^6eI1mUvEByt{j{%E6V}%_JKP;YXLXI zB=Pk@NZuZpK;F4<#vidUOgx~42V0Hk+5e>;w!y08iNndu!2caYLW1JM_zppE!o zGIlBF02?44!v#xJ`5mu7qsrw$qIKkDMLi@NhiNHMEV2Q%588%)26C_h$kG01H*S1( zBgj#4s*GIE;?q??VY4YyN2T^VjebfUg@dU;G3f0@p4<$aM4p}>a`48AK}{uN?{m2w zq5O2X6v$tA5$E*ti!Xpf8^@2^xN+S0$o)yV>6wniD$^jEi^^uJJdJ*|;lL=8pQ$R* zk(r*GWVEUER!;4-nth3hR=wI5ha)C10j7*Rdbs zM6MlEjZRinlG1m~wlC1B#~w$gzT7r01W)BT!CqJY0=)iz3BBa>7W7XC`y70DY~RS$ z$5Hc_Tep4*LXSfsG_LKUg8(fS^mm}QK)}(zz?X*BIHEf0cVHSYgY-Eb5K|ks-^~zA z=pwh@VNyejnXwQhb%=YLpErpbTvWX-P~|312uh<@q| z{B`KqDAU*_IRFmy3@_4J!Hv18AD9jAr?`(o(5IitG1or7JfU(T2wm7?C|l&Xp!z}p zFYwt{y6*j^U-!7&3qQxNIc3;;OA8s92hJc@Tq3t@6EXYcl1Q%k|2ED!kH-yar& zJm~cf_3oR|Tnb%as7)P}FQpuY%-LX$YSmB-n)bB9D5&Bb;s?T^CSS zZbTQ6I>#u-15?!Uh@Y{$%?9jKjzp_Ftq^BBLAG?u_K7SyDy-PFV*n5dGjHt*Qn%aO?TP*;VdgPv!KhysZui7>Q6UmSS5Mwpnhi`0cNdIVo)lZ4%%=! zzCtyxSf&b9f4o5nNflIs{z6~AF1|o;{V(xRAUe02nKXiq1IX^0%Z)!*AYBH`T#$9+ znMCU{>mjBXE)am8bb?QU2@8AU_ka9qMZ|gp{pdsAgu(pCM_~9MU_SWed34_!lHd1Y zr=Gp_OY|ey*Pxh&id#>dXgwie;HoX(d1UwR1`pi*2$~z2b?e>~RO+}2)?EgQ;C^%x zeH5wRtcD9Vg7RgO6XYQ>t{~}O{F`(~!OnQx&sQ=tv`T=*$P$(9uvc6ps*eE1c`$kGNibUQr zrdYFGZ}Qb<`X*GlN=syT`DD(t_IdEe!6%OFo0F6+?Uy@xYLe!*n*b&$92|MiMf7zC z19Goy1S3FykUbv#Ma}AlFM_#$=p)69AK-^O1xvpCrGD8%ijxGH&jYz$=}^$Cr0m4u ziqh=Vs_Fi*Z$IjG*AILMj9D-Q%|WlN>tHS)pV9-zKZsiZj~tGwxDxeGJU<1g;fI?L zJOV%48-F)ogcM34p!XL+5A_zP=Pw+4;s?x+&Cb4%-Y#He%k{ z3lDyN-?zECac=+1>g6L<2-~wECXVY}eo}oW}bDA-zuF_pgiMXQ~ zu>-mp(M~rbKx4#CHZ3KgiV48Z(uD0~Pm?{mI|f*u==FK%cAMy)8jmWM`{vgM6sLRDY=YjvL7%N;BKkhRvXc7> z6ya0;6X&%k8yd5Q1XtJCvr5yPCb`}?vQO@i5}#8C&R6o`(8%Ito9Em$@dktJyRi?? ztjy;V$b+q4ItzM}l~TU>2^mUI|7`S1e}UNTG_;XeNFq&Bx-?MJ=vG zRdyVi3S#ibqAw<06unKn#A`^>TG7vFB$jVcoETCD)@+vz~WHCnj);L&4u z>|L<1EKA81`FNmDE}T9&ylL01o5PbNa*fiIj!YHhrevK)E-S0xUU*4{nm-re0RkgU<-)t*Z^bJw7OGv^Ep z&EM4c#Fna^JKi|G!=C`9a);TJYSOXuY_|3bAY+Yp-l~=F*ACD1rpgowt4b!!o)+G_ zd3}-|lRnjk2k*V(CWT~CX(&|Q)US37)G6F4U|YE@QY zY*ulBJTFnDnG0msb%S?GX-sG_67_xyxEtT;SmIXjE zyU@D^ZAx;v)v7;d3^f=OYWMPOyEe`&D{i=P#f~Y3rnJ!#Q=g(fdh|ign6)RSPrYYS z-^57cfQqUSHg)fr^ZNFYNKy>i;P8G0Wn-6)&y;CoJm8iVJU%MpJ?)%=`b@RlkbA%^ z$XG}e%E>=<8_nJk0r`r7@_?5YbU z^;tHzuAs1L{IImh;Zb=x=ETXl#rHsC-b5x|{_DhakZ5VmiL(ifp(}UU=5~f$QA|sJ z6yuWbaV_eY{))AF)L4tU(T+Or#)Oa%OYzhZ?|>;T%!OOSEOQMYi>M93)D(5;urw0# z+Za8Hw&Im@-g;#|{65UmGHr_u~_`0ozW5AJE8hzwFj%mK8&SH4z^&6_Dd!O)N&V}{~R~N*Y zn^NUY-$PM5bc@;ef7TA8iIw?_FN!wiFTEsMoyV?Ud{NeJ|L>aS_UmWYd5v2BckN}w z>!=K-m|(@qM9`#YD@CpK|F0T|w;)Dtm7^B1=$C<5m$t_Lu32Co#K>g8E;b0xjb?1w`#bMcpv0|2Ws%mv%5*UKw-j)DEZH>^*wM1I@pNx*yu+c7bFbc)b zKl2KsgD01OUaAhZ$-m@&R<+45aX+_4xSubz$>U|iI$SD$Y`zhIMAR3=<#AjmCbk() zh7~C`WK;$nvI|mt0xbgfRkzEw2c#0n=nX2V1mTkeGwZD(qZD@@1D@NBQa}PdW7rNx zZfM0!Ity@s$2@y%zs4?*VNPspEKKpWo>gLJQNzP=_p>|pG^ZR+mL~eZ)cpiS3>GGG>S#B>ybnRgu6g!i>6Fgi}37#9~#|dAa9?-gh zv9m%%PVILG+{Cp6AEdsih;tYlxNgn9Ml;b}@7}s$bW(!%j@8*E{Y&2gQ{H_S3?~&H zQ2jb;E$GW@5;&Fza;Sttz9}=ornu{=E>Q=3>e_mTw|{d})7yg!8^;bWpX-)Lw|@il z-=OV};>M6Z)=w?PbcWM%8q5|-{gz_ypo|-UWdDY5k58L+{9F1RWgNr*3->??BWF~E zO6%|+NCfmu%y<$059tpNxEp{caspjsmq$*34DK)q!(r$WiKTMGx{hYaBYcR`Aqild zX{?)t#CvO5)aq3)u5W??9I5Bcl1Jp|W%NH^+%h?*VbDnZyden>c<&rJafv0z9PI0x zF-@vkRT5eO>f6}XZ_p$(90*511(4KCHr<|avsAWzJNk6g)!+SYuG8Hzt zLXmy@goX*Xo7aqPC@pJ%PxP9Y=q)^it{gZ3q=)kI5-0VlTUvgH9LiK$cDO4S=Q6r% zFv^hKUb+@N?UGL<4`nRb zf+AWD4jYR*v`(VLY##w63aWwN2za?Xyn5;nv?FhO8GyZi0rMBkY&!&IJ@Cgry;(I5 zeT(kd`O;62{rr#leY9}3)Lu5MuF`DYdiC{#@Qby7d3)ceKfeA#$BPS&*4eH7d}wQM zFbq_I#^3({MojLral(+bLyD~$0Qg}WZjbdQM&i!WGd;LL>Dej9l&!u zAVY4}z&|Z?NI^_K%ma zV{Tgnm@PJ* z^6@cHH*w|YO!M-@JC}nh_=w(}h?FW=Cg}~L1c%JHq(c!EXyW!!ipzwWrBa!oZNJau z)#_3$sdil>=FBONkMPp5(cUY^o9xjWEXg^!3Fr><%?(6Jr{QMv%!J&WWQ#%XN%rRS zvd=M1E+Z8!n{1k+v*UbpTCa;6W7onDrEY06&&l=SUUOXOW%hJ!V=QyMy3v>vaMyS; z{UudtBj)ZuzklwCw5k$+rl-aoNHUfT#4SItM4N6eOLxub71kRS-E{#3JaQeB2cgO? zjF#B__-Lqy63g0Q#gRxcfX{41!=8+6fLpJpol@2`6sXX@0QYQr7^uLk>ui<~x^W4A z7Z2usdoe?pNz~`CM-szpBKuaNY}#xgB;F%#=~IojE^i&8Z#WyUh;HA>V_J`!iloxD zol!*0L}z`;yh^{I6*3c)%G6}JWz~DDw|o|uTWihT*ypg8Tms#(9<<)zvJInLyp~F&wFb|6OwB?fCz zx;NRVX>hqJr)0_9m1{@W+&I1}Kg}SAsvFj=yJ5__btg5CEgKvfn$>UAh&rFzkk{9j z?#%1$QK#i4*&vu+XU)xV7v`p^gy5J(H%%D2YvZJnqPp3$eBP?;6uDgQ4vY?H4FHr4 zbtSk1`MpyTO9G+bfIyWm-u6zkS-)ntz}4eA-tjhU)~h?{N)zBC=zbOM>0`SQ(vjRH z1d4`1M-NZhTpZqvg-U6N1%0OlJYz2dS}$I(1FhK=?;|ZU!C{cmx_fsk zx`>b9J5q+`u0qiR-?QLtkM3^md}?U7qQ`~1@vFp>;WaJU&1HEgJ_peJYi)H+`>;LQ z=NDTi7;m5XTdgs_t3Llh6ZF)FaxtY0<1$bqW(ubcFvCtYw?)PG&U2xe2!liqc(jeg zaKLVseB@*ehLo$}6oY|vO2&`6I${)?o(LGaNFoO&F&%BhlOCqg_(G)j-Bl?;k6ekQ2hygrlr&@mJaf^ zG2TJa#Ts%ArdgfP4l|3$(Uk~}5Jwk9ZV-;18|~0pl!@;-t$d=ZZSD9?(+oSt+%M{= z-#=!DVcMqgivGFx6PPa?k=vgoEf|^Y?bF8#_v2uD3(T~FBUUGuX+@2RX(1dY&;7UtE2cuN0TN2Q- zczV-<;@BA39Y}MX<`}S@G=g?VDi1ItegAi&S&vd{)gcdw>>gQ7rEeOQ|;Lm&au{-wdZJz|r zfkOQMT;wjMV>~*EPT~hZ6CSH?yt$^JV9lGL1drDeF)WVFj1Gpq*jX;d74+zW9s`jK z5JgFRf+HTm|LkCDB?Ko{qNrC{k?bP>K0 z`CPQ6iRyL{`Aa5Kz%ZSXqE3mCgrfHuh_s8!3yHLg5N9rWhi7VL*3`_5)X)=G^Qnl; zw_erOVzA>LsN(GO9BGW+d55H{VQKOjlo|u_Yc}dzaVNJL^*lbk5RGP-{|E6tnE`m( zV_;-pU|?Znn~>EK5YKP(m4Ta`0R%3U+O34q|NsAI;ACV2aXA>6KokHq&kFwl004N} zV_;-pU}N}qmw|zk;Xe>?GBN-~kO5O20F%B3a{zeSja18O6+sZ~d35)T@y3fGq6Q&K z#3;$e7rK#I#HAZC3j?BvxDh4bLd>f1GyD(1r5`2YE}ojHnyIc#hy#b}sjjX*_3A3Q zLx->2cdqy~Ai8-}Kqw|zLKX>d100>d2f05;+SBKY-@SYl=)BsaHNlfE<$J(a=s$@~ zkTY(uhwf_Nf1JH5HglkJ_29cByNdtEyC*-SJLiR`vZ>Ym@hmWx+D%f&8*|-}*WA^9 zC|vGPVmD@8mY3Ppm7*t+{%0 zUe3$xi>^pnz8{Jn_f~|n=1bM?e)SEqa2%j_*)p9oJzqrsHG%rowi8W>&^oC7Z^)$1?lvVE-}Lo@QHl zAL1W(+s+g7l()H$tJP;Fxojr=rqrYT|F@BFOE@$CO<+ykvB!KKV|`KCY0giue>u#( zc{#2C@38-pdEa3_E##M$xm&<)mEhC7|Heqkuc|}82FI1g#NU{8W7k|?{$C5qC--HYe_r`&3)yB3p7Z>}!j{gtvyDj>Y-#^|+ zcb0hCox*KUk_P|)U@|f?GjfE4q-ci7nHiapXUxb9%?O_SCg zYG8Tb;G)Du%tfl8)F91b_~OjPYA78lfsQP}EolwL2G@Lphxx%+urF=L7E`j?( z;zKG!3?Xg=62U>(meH3PkvJp+*@7HG0-@+oVkkdUA3BPHqf$_Xs7}=Q^3>(xZQQ|1;%Gi}-7!k%8jftj4 z3!`1w6l^}W4eN}7$E3xmW9+yToF*0$TfGXlO1sJu7aJ#uv#pL?U9;K|pSA|ErV{Uu z7vkITz*_EF{o1Dqw1kF);dP1Y6ze7usfqpTY3n_N+70Lp{0-en{z*9-IU75OP+}6X zmN@-wWePNfm{PupwyB4NB8f>Vl52DJ=Gj!)mZUUzT6vmlD{ZTh986}CyU13uCp|bl zKAn@^l&()7&cJ1qWb|!gZ*yd(WLmZdZLg;IQJ56Rj<_8)J1kTNbs!6zMadFpjb^jI z^X^RCX`o?gLYkU3xr?|;>;F+NoY zeUm&APr%dhCJOKcB?YYo1BIkQVWE9LdOv6XP?3KTv#7qvS_~;B6qgm7_)tEFuj0E8 z5Dth00RoO-^kDMA=7T^RVWslJh{N(Scv<5S-?4(12l9WjXPT@{TrT)@7spqu*^mu(jy{z7J269H(fNKypn9qXF zW}el_W`F8!6#QJ;B#?vUBzc$Ic@BL}sqj;jC~W5`=K&>EX}AErAi1D#_WVL?!M12F zVlT=rx>|XyzF&DNkSa&jc?o|>e#xTd{l?QEG+mnU%k<0cw(_=)HqRB#6?uC`yR_YV zm2g$8P0-4($*uvqC|$2^@^@tis6%)?;d+Z6uQzlu{viAb=|*?^Zm@6IdsscDo2;Aa zo8!I4Ugs_7t&Ce{1Jj^2jNLB34H&t1D0ggq@qN0!(SBloQNQsn`flrh^IqgV#UOmJ zanSXb)l_*OeP3w?n`vg%gTM#Ep|GKjhdB=?hUvq-k1&tekLthbv&337mf6Sr$AA@U zWm*+h;0fUg(^hITJrh40vLozlyTm%Z$^ke4?VW$5R_*0V?;}v*K zpFy9=pVhuh-{2Sc7t)ue|MD-B4qk@<004N}V_;-pU}|TQWKd@S0VW`31VRP|2QZ%j z02b5%5de7FjZr;I13?gdcZr%P1O*9Vb%j`1B)Ry31e;)porr>hg>XqOA0)YpcQImX zX=!ccFA#r)#?C^p@rPLXc5jnhVunmhg@kw0IK01$Tfoqc zU%OIon{O6h`;xE1J|-*RjT?!vdj8YXsmZgNfjqfHi@3S5~dxXNS36I^m8EqcU{ zbbbI=6OB6n004N}eOCpT8%NUJsur!ZyM{0`)2^f*t-?+mhnZ0sNiAutk!C!w;A6~P zIJq1%Gcz-Dj+q&9%v5h?WUs&f`+k4x?&_X?4fS4EwWfIL|NY0eNkLOQrHH5Qp1Nb| z_Nlw3?wz`i6y+#S1u9aBrm0L7nxR>mqjghvPTfCs53Q#Sw2^kB-DwZnllG#$X&>5` z_M`pj06LHkqJ!xWI+PBh!|4b*l8&OI=@>eej-%u01UivUqIp`ND%Ge?nk;J2A~oq` zI)zT9)97?MgU+N)bQYaWo9P_dLg&(XbUs}`7t%#^FVTC*4JN(>-)A-ADJ+Q|JMD zDm{&!PS2oc(zEE<^c;FFJ&&GGFQ6CFi|EDl5_&1Uj9yN!pjXnX=+*QZdM&+uf5&9^7j6P1Epik1L=+pEW z`Ye5pK2KkuFVchbCHgXbg}zE(qp#C9=$rH{`Zj%szDwVu@6!+Hhx8-*G5v&oNv%nH;ElW+@6LPhp1jx8p}aTm!~61nygwhn2l7FDFdxE)@?m^9 zAHhfRQG7HX!^iS*d_14PC-O-=&kJ1T8rNB~#SLEMCZEiw@Tq(npU!9SnY@Y5;#2{BV8*KawBCkLJhlWBGCX zczyyuk#FNC@ss&>zJu@NyZCOthwtV4_lw z{6c;aznEXbFXfl<%lQ@jN`4i;nqR}O<=64+`3?L=eiOf$-@gE!T;oc@xS>${9h%ZL9tRQr}CdQhTd?)V^vzwZA$*9jFdc2dhKWq3SSoxH>`|sg6=dt7Fu$>Ns`0IzgSN zPEzw~K~+^v)sIQYAx=G!vZc#0DtFl#FbyQaw)l+>nP>$NF zhRRhVHCCST)ixEVP(>=9dY~AOo%#7q^Qf!y^OJfZtE*XE%j$Yo>#Vl2x{=k3S>4R) zO=(@-lGZw{^_H{qeb)}d{3s5cP9ZdQ&>57>c*(e)Z}J0aN4YSvgEESi8Trv_E)GqQ z>pAYI6b)Lg9rO)HgCcAvjMy6%0yFZKOmVyCjatsQl+<1vDX-Tngie2KyQ<^$^HE@j zgWSLynUc(ATDBYIB4=cBfoFGTy592G6$9O+Nuv<^sPfLZ?X6UN*IsRPoS@?xS<^Rm zR18cnFyWwttt1n=UT2u=xpu!Shw1tQZ*0QylIO-F(~|vEG7}3-XLjrtwgnxpYl>|< zsa0h6bMimTwLNcGLNT&~Vcrj%aa8EoBNN!Uo;Qxrx&7@|>j3X0N(nf&cv#Gr`4kM?xn!{Nt&bTY%Qe0*yW9NEy$G~f? zC8uk=qVIH~I4}j@j60579@%~ido@A9?qWjmuQi5?0EtDXOiKQMlw^@$eXRE6V1pvOM#c3e0I`E zjxg=JaoB<|$|Gl-nUz#TiCy%DNj9SKaytcuWtjcFJi*9*;zcxCL2`^oUU_;YMZ9oseIt{oHtd))O##f~=` z3CD$z-5;B%Jn>iT@9-n`CvuOLjfrOE=)R9BJ91%XdZI!Tq>ELu2DY#++xU_RB1cx- zkhKS1;A|K9+U~R{zSS9El4#k9M3<@KAu`B5Y0adHZ^`0;r-o)VC$~8)Wm^tsqd`1s zhq6~VZe7;GcF~?r0?EL3dzB=*q%oz4c_l>5y3Tkg;!Isx^y6?K$C{PfV*&{qEqqQw zh%+w8;{IT@(syKqcB+FkI$)W+D>@M8;=WfBiKh$AO)hWREGGlf#j*pJCTA_AGZ*49 zVn{_KCYJ^d?y4XR)u1bvLewD68|T`_bt@gXwI_~^OnD$QX6jB%sI8b-v7h$9AsbRf zwstCV<1RhP1nYL`iv3+dm_}l_*EWUaK<@k?AKBqBEJ#F^!%VjW$MiaOXv$D-dQbBG zz>EDHe3=)G#N9&M*b*UBCys@Nt+6y+EWUMS4#XOD@kOvn5GoqP3jt+Y`a` zMgLt%No`L!u4Hn?$eD?>lZ+xUJ`%k~Mq+D8v>gcdwnRjUd1V)yXo)P^C5a2dbKlG* zE^bXS*i70?m0Cn9ZH>AW!A1iw6z7{#7&{RdD?wCPvCxr3WsGDPPogq1Ws**Cgm&z> za)N$Iz&`TMv^|p5?QzExMy5M-qDl{2l2x`E*}9QDFi68xZ@yM`S&%N><`z(9!lK(V! zqj+lY^0ZT%=akt@JG>+U63oPEQVmIwg>Tb(D63Zs@o-`=G z+gCB2Re@72bCbur{B_EKIZ^^kPAfL`t}wd3%52tD)0spy&47*($S2%%vwRidv+0G2l%L^T!N@gXa`J zt|{3iv|v+?u%Dc+botAZOjmB{v8>qoR>gsL(Ztooa}Cyry37_bI-MDE)V%p^?^HW%Mek)o#@n%rtn~*LK@x{`ojx@g7UMt!j`?QC7>(%&B z$2(z%6C$@R=9_mit?KyP*!f2mnzcOSf3xk*iLkY|?(A4>KB?eVpR(|~pY^*7*4*?g z7iuep%c$p7n=YKwG2OjP_ILJv zr|{R;w_MiVr*l3g-%{t4DX-1)+0(lP*Pk$(YgXiK5%X1bWo4m2UU#cuC0|F#9w+}p zo3e{ECLB;c9-hdPrMtRA-u&F8z_&ZjdmsL@sqogkKLrw}=ksKQJfF0AyIQ+@d~JV; z_vAURmszsUU$b+a_}ZTh`;N|3t?W9z+T`ZsFFNPWFPo|RGNbavszoanGK6Z-E39SJ;) zNkd9QERbP~K|fQxI71Xe#=<_Q#SBS|9jppsoA%DNoqzQ}Xya<8aMpEPF`_%P3PK;O zidfk;HOt{j!wSa0)7!RN&Mx@u6sE4sur}2@?^ z8#Wv}By~Bf!NfsIfp-F%2lJARq1+r0sD1m@v?tOIVa|WvB(^#yUwRlKiEL5%B-7aSVOdGDE4Tz?STjD?ZQn8?U@X)9|BYs-XttGS%G6k19) zHZZ)DTJoArfLFm`7aNe7Jz
';n+=e.oneAccess?""+a.link("One Required","unlock",{access:"one"}):""+a.link("All Required","lock",{access:"one"}),n+=""+a.link("Reset","refresh",{access:"clear"})+'
';var l=e.regions;if(l)for(var t,c=-1,i=l.length-1;i>c;)t=l[c+=1],n+='";n+="";var o=e.regions;if(o)for(var t,c=-1,r=o.length-1;r>c;){t=o[c+=1],n+=""}return n+="
'+t.name+"
";var d=t.accesses;if(d)for(var p,u=-1,v=d.length-1;v>u;)p=d[u+=1],n+=""+a.link(p.name,p.req?"check-square-o":"square-o",{access:p.id},null,p.req?"selected":null)+"
";n+="
"},TMPL.air_alarm=function(e,s,a){var n='
';if(n+=e.siliconUser?'
Interface Lock:
'+a.link("Engaged","lock",{toggleaccess:1},e.locked?"selected":null)+a.link("Disengaged","unlock",{toggleaccess:1},e.locked?null:"selected")+"
":e.locked?"Swipe an ID card to unlock this interface.":"Swipe an ID card to lock this interface.",n+='

Air Status

',e.environment_data){var l=e.environment_data;if(l)for(var t,c=-1,i=l.length-1;i>c;)t=l[c+=1],n+='
'+t.name+':
',n+=2==t.danger_level?'':1==t.danger_level?'':'',n+=""+a.fixed(t.value,2)+t.unit+"
";n+='
Local Status:
',n+=2==e.danger_level?'Danger (Internals Required)':1==e.danger_level?'Caution':'Optimal',n+='
Area Status:
',n+=e.atmos_alarm?'Atmosphere Alarm':e.fire_alarm?'Fire Alarm':'Nominal',n+="
"}else n+='
Warning: Cannot obtain air sample for analysis.
';if(e.dangerous&&(n+='
Warning: Safety measures offline. Device may exhibit abnormal behavior.
'),n+="
",!e.locked||e.siliconUser)if(1!=e.screen&&(n+=""+a.link("Back","arrow-left",{screen:1})),1==e.screen)n+='

Air Controls

',n+=e.atmos_alarm?""+a.link("Area Atmospheric Alarm","close",{atmos_reset:1},null,"caution"):""+a.link("Area Atmospheric Alarm","hand-stop-o",{atmos_alarm:1}),n+='
',n+=3!=e.mode?""+a.link("Panic Siphon","exclamation",{mode:3}):""+a.link("Panic Siphon","close",{mode:1},null,"danger"),n+='
'+a.link("Vent Controls","sign-out",{screen:2})+'
'+a.link("Scrubber Controls","filter",{screen:3})+'
'+a.link("Set Environmental Mode","cog",{screen:4})+'
'+a.link("Set Alarm Threshold","bar-chart",{screen:5})+"
";else if(2==e.screen){var o=e.vents;if(o)for(var r,c=-1,d=o.length-1;d>c;)r=o[c+=1],n+='

'+r.long_name+'

Power:
',n+=r.power?""+a.link("On","power-off",{id_tag:r.id_tag,command:"power",val:0},null,null):""+a.link("Off","close",{id_tag:r.id_tag,command:"power",val:1},null,"danger"),n+='
Mode:
',n+="release"==r.direction?'Pressurizing':'Siphoning',n+='
Pressure Checks:
'+a.link("Internal","sign-in",{id_tag:r.id_tag,command:"incheck",val:r.checks},null,r.incheck?"selected":null)+a.link("External","sign-out",{id_tag:r.id_tag,command:"excheck",val:r.checks},null,r.excheck?"selected":null)+'
Set Pressure:
'+a.link(a.fixed(r.external),"pencil",{id_tag:r.id_tag,command:"set_external_pressure"})+a.link("Reset","refresh",{id_tag:r.id_tag,command:"reset_external_pressure"},r.extdefault?"disabled":null)+"
";e.vents.length||(n+='No vents connected.')}else if(3==e.screen){var p=e.scrubbers;if(p)for(var u,c=-1,v=p.length-1;v>c;)u=p[c+=1],n+='

'+u.long_name+'

Power:
',n+=u.power?""+a.link("On","power-off",{id_tag:u.id_tag,command:"power",val:0},null,null):""+a.link("Off","close",{id_tag:u.id_tag,command:"power",val:1},null,"danger"),n+='
Mode:
',n+=u.scrubbing?""+a.link("Scrubbing","filter",{id_tag:u.id_tag,command:"scrubbing",val:0},null,null):""+a.link("Siphoning","sign-in",{id_tag:u.id_tag,command:"scrubbing",val:1},null,"danger"),n+='
Range:
',n+=u.widenet?""+a.link("Extended","expand",{id_tag:u.id_tag,command:"widenet",val:0},null,"caution"):""+a.link("Normal","compress",{id_tag:u.id_tag,command:"widenet",val:1},null,null),n+='
Filters:
'+a.link("CO2",u.filter_co2?"check-square-o":"square-o",{id_tag:u.id_tag,command:"co2_scrub",val:u.filter_co2?0:1},null,u.filter_co2?"selected":null)+a.link("N2O",u.filter_n2o?"check-square-o":"square-o",{id_tag:u.id_tag,command:"n2o_scrub",val:u.filter_n2o?0:1},null,u.filter_n2o?"selected":null)+a.link("Plasma",u.filter_toxins?"check-square-o":"square-o",{id_tag:u.id_tag,command:"tox_scrub",val:u.filter_toxins?0:1},null,u.filter_toxins?"selected":null)+"
";e.scrubbers.length||(n+='No scrubbers connected.')}else if(4==e.screen){n+='

Environmental Modes

';var k=e.modes;if(k)for(var h,c=-1,b=k.length-1;b>c;)h=k[c+=1],n+='
'+a.link(h.name,h.selected?"check-square-o":"square-o",{mode:h.mode},null,h.selected?h.danger?"danger":"selected":null)+"
";n+=""}else if(5==e.screen){n+='

Alarm Thresholds

';var g=e.thresholds;if(g)for(var f,c=-1,m=g.length-1;m>c;){f=g[c+=1],n+="";var _=f.settings;if(_)for(var w,P=-1,y=_.length-1;y>P;)w=_[P+=1],n+="";n+=""}n+="
min2min1max1max2
"+f.name+""+a.link(w.selected>=0?a.round(100*w.selected)/100:"Off",null,{command:"set_threshold",env:w.env,"var":w.val})+"
"}return n},TMPL.apc=function(e,s,a){var n='
';n+=e.siliconUser?'
Interface Lock:
'+a.link("Engaged","lock",{toggleaccess:1},e.locked?"selected":null)+a.link("Disengaged","unlock",{toggleaccess:1},e.malfStatus>=2?"linkOff":e.locked?null:"selected")+"
":e.locked?"Swipe an ID card to unlock this interface.":"Swipe an ID card to lock this interface.",n+='

Power Status

Main Breaker:
',n+=e.locked&&!e.siliconUser?e.isOperating?'On':'Off':""+a.link("On","power-off",{breaker:1},e.isOperating?"selected":null)+a.link("Off","close",{breaker:1},e.isOperating?null:"selected"),n+='
External Power:
',n+=2==e.externalPower?'Good':1==e.externalPower?'Low':'None',n+='
Power Cell:
',n+=null!=e.powerCellStatus?""+a.bar(e.powerCellStatus,0,100,e.powerCellStatus>=50?"good":e.powerCellStatus>=25?"average":"bad",a.fixed(e.powerCellStatus)+"%"):'Power cell removed.',n+="
",null!=e.powerCellStatus&&(n+='
Charge Mode:
',n+=e.locked&&!e.siliconUser?e.chargeMode?'Auto':'Off':""+a.link("Auto","refresh",{cmode:1},e.chargeMode?"selected":null)+a.link("Off","close",{cmode:1},e.chargeMode?null:"selected"),n+=" ",n+=e.chargingStatus>1?'[Fully Charged]':1==e.chargingStatus?'[Charging]':'[Not Charging]',n+="
"),n+='

Power Channels

';var l=e.powerChannels;if(l)for(var t,c=-1,i=l.length-1;i>c;)t=l[c+=1],n+="";return n+='
"+t.title+":"+t.powerLoad+" W",t.status<=1?n+='Off':t.status>=2&&(n+='On'),n+="",n+=1==t.status||3==t.status?"[Auto]":"[Manual]",n+='',(!e.locked||e.siliconUser)&&(n+=""+a.link("Auto","refresh",t.topicParams.auto,1==t.status||3==t.status?"selected":null)+a.link("On","power-off",t.topicParams.on,2==t.status?"selected":null)+a.link("Off","close",t.topicParams.off,0==t.status?"selected":null)),n+="
Total Load:'+e.totalLoad+" W
",e.siliconUser&&(n+='

System Overrides

'+a.link("Overload Lighting Circuit","lightbulb-o",{overload:1})+"
",1==e.malfStatus?n+=""+a.link("Override Programming","terminal",{malfhack:1}):2==e.malfStatus?n+=""+a.link("Shunt Core Processes","caret-square-o-down",{occupyapc:1}):3==e.malfStatus?n+=""+a.link("Return to Main Core","carat-square-o-left",{deoccupyapc:1}):4==e.malfStatus&&(n+=""+a.link("Shunt Core Processes","caret-square-o-down",{occupyapc:1},"linkOff")),n+="
"),n+='
Cover Lock:
',n+=e.locked&&!e.siliconUser?e.coverLocked?"Engaged":"Disengaged":""+a.link("Engaged","lock",{lock:1},e.coverLocked?"selected":null)+a.link("Disengaged","unlock",{lock:1},e.coverLocked?null:"selected"),n+="
"},TMPL.atmos_filter=function(e,s,a){var n='
Power:
'+a.link(e.on?"On":"Off",e.on?"power":"close",{power:1})+'
Output Pressure:
'+a.link("Set","pencil",{set_press:"set"})+a.link("Max","plus",{set_press:"max"},e.set_pressure==e.max_pressure?"disabled":null)+''+e.set_pressure+' kPa
Filter:
'+a.link("Plasma",null,{filterset:0},0==e.filter_type?"selected":null)+a.link("O2",null,{filterset:1},1==e.filter_type?"selected":null)+a.link("N2",null,{filterset:2},2==e.filter_type?"selected":null)+a.link("CO2",null,{filterset:3},3==e.filter_type?"selected":null)+a.link("N2O",null,{filterset:4},4==e.filter_type?"selected":null)+a.link("Nothing",null,{filterset:-1},-1==e.filter_type?"selected":null)+"
";return n},TMPL.atmos_mixer=function(e,s,a){var n='
Power:
'+a.link(e.on?"On":"Off",e.on?"power":"close",{power:1})+'
Output Pressure:
'+a.link("Set","pencil",{set_press:"set"})+a.link("Max","plus",{set_press:"max"},e.set_pressure==e.max_pressure?"disabled":null)+''+e.set_pressure+' kPa
Node 1:
'+a.link("","fast-backward",{node1_c:"-0.1"},null)+a.link("","backward",{node1_c:"-0.01"},null)+a.link("","forward",{node1_c:"0.01"},null)+a.link("","fast-forward",{node1_c:"0.1"},null)+''+e.node1_concentration+'%
Node 2:
'+a.link("","fast-backward",{node2_c:"-0.1"},null)+a.link("","backward",{node2_c:"-0.01"},null)+a.link("","forward",{node2_c:"0.01"},null)+a.link("","fast-forward",{node2_c:"0.1"},null)+''+e.node2_concentration+"%
";return n},TMPL.atmos_pump=function(e,s,a){var n='
Power:
'+a.link(e.on?"On":"Off",e.on?"power":"close",{power:1})+"
";return n+=e.max_rate?'
Transfer Rate:
'+a.link("Set","pencil",{set_transfer_rate:"set"})+a.link("Max","plus",{set_transfer_rate:"max"},e.transfer_rate==e.max_rate?"disabled":null)+e.transfer_rate+" L/s
":'
Output Pressure:
'+a.link("Set","pencil",{set_press:"set"})+a.link("Max","plus",{set_press:"max"},e.set_pressure==e.max_pressure?"disabled":null)+e.set_pressure+" kPa
",n+="
"},TMPL.canister=function(e,s,a){var n='
';return n+=e.hasHoldingTank?"The regulator is connected to a tank.":"The regulator is not connected to a tank.",n+='

Canister

'+a.link("Relabel","pencil",{relabel:1},e.canLabel?null:"disabled")+'
Pressure:
'+e.tankPressure+' kPa
Port:
',n+=e.portConnected?'Connected':'Disconnected',n+='

Valve

Release Pressure:
'+a.bar(e.releasePressure,e.minReleasePressure,e.maxReleasePressure,null,e.releasePressure+" kPa")+'
Pressure Regulator:
'+a.link("Reset","refresh",{release_p:"reset"},e.releasePressure!=e.defaultReleasePressure?null:"disabled")+a.link("Min","minus",{release_p:"min"},e.releasePressure>e.minReleasePressure?null:"disabled")+a.link("Set","pencil",{release_p:"custom"},null)+a.link("Max","plus",{release_p:"max"},e.releasePressure
Valve:
'+a.link("Open","unlock",{toggle:1},e.valveOpen?"selected":null)+a.link("Close","lock",{toggle:1},e.valveOpen?null:"selected")+'

Holding Tank

',n+=e.hasHoldingTank?"
"+a.link("Eject","eject",{remove_tank:1})+'
Label:
'+e.holdingTank.name+'
Tank Pressure:
'+e.holdingTank.tankPressure+" kPa
":'
No Holding Tank
',n+="
"},TMPL.chem_dispenser=function(e,s,a){var n='

Status

Energy:
'+a.bar(e.energy,0,e.maxEnergy,null,e.energy+" Units")+'
Amount:
',l=e.beakerTransferAmounts;if(l)for(var t,c=-1,i=l.length-1;i>c;)t=l[c+=1],n+=""+a.link(t,"plus",{amount:t},e.amount==t?"selected":null);n+='

Dispense

';var o=e.chemicals;if(o)for(var r,c=-1,d=o.length-1;d>c;)r=o[c+=1],n+=""+a.link(r.title,"tint",r.commands,null,"gridable");n+='

Beaker

'+a.link("Eject","eject",{ejectBeaker:1},e.isBeakerLoaded?null:"disabled")+'
';var p=e.beakerTransferAmounts;if(p)for(var t,c=-1,u=p.length-1;u>c;)t=p[c+=1],n+=""+a.link(t,"minus",{remove:t});if(n+='
Contents:
',e.isBeakerLoaded)if(e.beakerContents.length){n+=""+e.beakerCurrentVolume+"/"+e.beakerMaxVolume+" Units
";var v=e.beakerContents;if(v)for(var k,c=-1,h=v.length-1;h>c;)k=v[c+=1],n+=''+k.volume+" units of "+k.name+"
"}else n+='Beaker Empty';else n+='No Beaker Loaded';return n+="
"},TMPL.chem_heater=function(e,s,a){var n='

Status

Power:
'+a.link(e.isActive?"On":"Off",e.isActive?"power":"close",{toggle_on:1},e.isBeakerLoaded?null:"disabled")+'
Target:
'+a.link(e.targetTemp+"K","pencil",{adjust_temperature:"input"})+'

Beaker

'+a.link("Eject","eject",{eject_beaker:1},e.isBeakerLoaded?null:"disabled")+'
Contents:
';if(e.isBeakerLoaded)if(n+="Temperature: "+e.currentTemp+"K
",e.beakerContents.length){var l=e.beakerContents;if(l)for(var t,c=-1,i=l.length-1;i>c;)t=l[c+=1],n+=''+t.volume+" units of "+t.name+"
"}else n+='Beaker Empty';else n+='No Beaker Loaded';return n+="
"},TMPL.cryo=function(e,s,a){var n='

Occupant

Occupant:
';if(n+=e.hasOccupant?""+e.occupant.name+"":'No Occupant',n+="
",e.hasOccupant&&(n+='
State:
',n+=0==e.occupant.stat?'Conscious':1==e.occupant.stat?'Unconscious':'Dead',n+='
Temperature:
'+a.round(e.occupant.bodyTemperature)+" K
"),e.occupant.stat<2&&(n+='
Health:
'+a.bar(e.occupant.health,e.occupant.minHealth,e.occupant.Maxhealth,e.occupant.health>=0?"good":"average",a.round(e.occupant.health))+'
Brute:
'+a.bar(e.occupant.bruteLoss,0,e.occupant.maxHealth,"bad",a.round(e.occupant.bruteLoss))+'
Respiratory:
'+a.bar(e.occupant.oxyLoss,0,e.occupant.maxHealth,"bad",a.round(e.occupant.oxyLoss))+'
Toxin:
'+a.bar(e.occupant.toxLoss,0,e.occupant.maxHealth,"bad",a.round(e.occupant.toxLoss))+'
Burn:
'+a.bar(e.occupant.fireLoss,0,e.occupant.maxHealth,"bad",a.round(e.occupant.fireLoss))+"
"),n+='

Cell

Power:
'+a.link("On","power-off",{switchOn:1},e.isOperating?"selected":null)+a.link("Off","close",{switchOff:1},e.isOperating?null:"selected")+'
Temperature:
'+e.cellTemperature+' K
Door:
'+a.link("Open","unlock",{openCell:1},e.isOpen?"disabled":null)+a.link("Close","lock",{closeCell:1},e.isOpen?null:"disabled")+'
Eject:
'+a.link("Auto","sign-out",{autoEject:1},e.autoEject?"selected":null)+a.link("Manual","sign-in",{autoEject:0},e.autoEject?null:"selected")+'

Beaker

'+a.link("Eject","eject",{ejectBeaker:1},e.isBeakerLoaded?null:"disabled")+'
Contents:
',e.isBeakerLoaded)if(e.beakerContents.length){var l=e.beakerContents;if(l)for(var t,c=-1,i=l.length-1;i>c;)t=l[c+=1],n+=''+t.volume+" units of "+t.name+"
"}else n+='Beaker Empty';else n+='No Beaker Loaded';return n+="
"},TMPL.smes=function(e,s,a){var n='

Storage

Stored Energy:
'+a.bar(e.capacityPercent,0,100,e.capacityPercent>=50?"good":e.capacityPercent>=15?"average":"bad",a.round(e.capacityPercent)+"%")+'

Input

Charge Mode:
'+a.link("Auto","refresh",{input_attempt:1},e.inputAttempt?"selected":null)+a.link("Off","close",{input_attempt:0},e.inputAttempt?null:"selected")+" ";return n+=e.capacityPercent>=99?"[Fully Charged]":e.inputting?"[Charging]":"[Not Charging]",n+='
Input Setting:
'+a.bar(e.inputLevel,0,e.inputLevelMax,null,e.inputLevel+" W")+'
Adjust Input:
'+a.link("","fast-backward",{set_input_level:"0"},e.inputLevel?null:"selected")+a.link("","backward",{set_input_level:"minus"},e.inputLevel?null:"disabled")+a.link("Set","pencil",{set_input_level:"custom"},null)+a.link("","forward",{set_input_level:"plus"},e.inputLevel==e.inputLevelMax?"disabled":null)+a.link("","fast-forward",{set_input_level:"max"},e.inputLevel==e.inputLevelMax?"selected":null)+'
Available:
'+e.inputAvailable+' W

Output

Charge Mode:
'+a.link("On","power-off",{output_attempt:1},e.outputAttempt?"selected":null)+a.link("Off","close",{output_attempt:0},e.outputAttempt?null:"selected")+" ",n+=e.outputting?'[Sending]':e.charge>0?'[Not Sending]':'[No Charge]',n+='
Output Setting:
'+a.bar(e.outputLevel,0,e.outputLevelMax,null,e.outputLevel+" W")+'
Adjust Output:
'+a.link("","fast-backward",{set_output_level:"0"},e.outputLevel?null:"selected")+a.link("","backward",{set_output_level:"minus"},e.outputLevel?null:"disabled")+a.link("Set","pencil",{set_output_level:"custom"},null)+a.link("","forward",{set_output_level:"plus"},e.outputLevel==e.outputLevelMax?"disabled":null)+a.link("","fast-forward",{set_output_level:"max"},e.outputLevel==e.outputLevelMax?"selected":null)+'
Outputting:
'+e.outputUsed+" W
"},TMPL.solar_control=function(e,s,a){var n='

Status

Generated Power:
'+e.generated+' W
Orientation:
'+e.angle+"° ("+e.direction+')
Adjust:
'+a.link("15°","step-backward",{rate_control:"1",cdir:"-15"})+a.link("1°","backward",{rate_control:"1",cdir:"-1"})+a.link("1°","forward",{rate_control:"1",cdir:"1"})+a.link("15°","step-forward",{rate_control:"1",cdir:"15"})+'

Tracking

Tracker Mode:
'+a.link("Off","close",{track:"0"},0==e.tracking_state?"selected":"")+a.link("Timed","clock-o",{track:"1"},1==e.tracking_state?"selected":"");return n+=e.connected_tracker?""+a.link("Auto","refresh",{track:"2"},2==e.tracking_state?"selected":""):""+a.link("Auto","refresh",null,"disabled"),n+='
Tracking Rate:
'+e.tracking_rate+" deg/h ("+e.rotating_way+')
Adjust:
'+a.link("180°","fast-backward",{rate_control:"1",tdir:"-180"})+a.link("30°","step-backward",{rate_control:"1",tdir:"-30"})+a.link("1°","backward",{rate_control:"1",tdir:"-1"})+a.link("1°","forward",{rate_control:"1",tdir:"1"})+a.link("30°","step-forward",{rate_control:"1",tdir:"30"})+a.link("180°","fast-forward",{rate_control:"1",tdir:"180"})+'

Devices

Search:
'+a.link("Refresh","refresh",{search_connected:"1"})+'
Solar Tracker:
',n+=e.connected_tracker?'Found':'Not Found',n+='
Solars Panels:
'+e.connected_panels+" Connected
"},TMPL.space_heater=function(e,s,a){var n='

Status

Power:
'+a.link("On","power-off",{power:1},e.on?"selected":null)+a.link("Off","close",{power:0},e.on?null:"selected")+'
Stored Energy:
';return n+=e.hasPowercell?""+a.bar(e.powerLevel,0,100,"good",e.powerLevel+"%"):'No power cell loaded.',n+="
",e.open&&(n+='
Cell:
',n+=e.hasPowercell?""+a.link("Eject","eject",{cellremove:1}):""+a.link("Install","eject",{cellinstall:1}),n+="
"),n+='

Thermostat

Current Temp:
'+e.currentTemp+'°C
Target Temp:
'+e.targetTemp+"°C
",e.open&&(n+='
Adjustment:
'+a.link("","fast-backward",{temp:-20},e.targetTemp>e.minTemp?null:"disabled")+a.link("","backward",{temp:-5},e.targetTemp>e.minTemp?null:"disabled")+a.link("Set","pencil",{temp:"custom"},null)+a.link("","forward",{temp:5},e.targetTemp
"),n+='
Operational Mode:
',n+=e.open?""+a.link("Heat","long-arrow-up",{mode:"heat"},"heat"!=e.mode?null:"selected")+a.link("Cool","long-arrow-down",{mode:"cool"},"cool"!=e.mode?null:"selected")+a.link("Auto","arrows-v",{mode:"auto"},"heat"==e.mode||"cool"==e.mode?null:"selected"):"heat"==e.mode?'Heat':"cool"==e.mode?'Cool':'Auto',n+="
"},TMPL.tanks=function(e,s,a){var n='
';return n+=e.hasHoldingTank?"The regulator is connected to a mask.":"The regulator is not connected to a mask.",n+='
Tank Pressure:
'+a.bar(e.tankPressure,0,1013,e.tankPressure>200?"good":e.tankPressure>100?"average":"bad",e.tankPressure+" kPa")+'
Release Pressure:
'+a.bar(e.releasePressure,e.minReleasePressure,e.maxReleasePressure,null,e.releasePressure+" kPa")+'
Pressure Regulator:
'+a.link("Reset","refresh",{dist_p:"reset"},e.releasePressure!=e.defaultReleasePressure?null:"disabled")+a.link("Min","minus",{dist_p:"min"},e.releasePressure>e.minReleasePressure?null:"disabled")+a.link("Set","pencil",{dist_p:"custom"},null)+a.link("Max","plus",{dist_p:"max"},e.releasePressure
Valve:
'+a.link("Open","unlock",{stat:1},e.maskConnected?e.valveOpen?"selected":null:"disabled")+a.link("Close","lock",{stat:1},e.valveOpen?null:"selected")+"
"},TMPL._generic=function(e,s,a){var n="
Initiating...
";return n},TMPL._nanotrasen=function(e,s,a){var n="
"+s.title+"
Initiating...
";return n}; \ No newline at end of file diff --git a/nano/assets/templates.js b/nano/assets/templates.js deleted file mode 100644 index f6d6059afb9..00000000000 --- a/nano/assets/templates.js +++ /dev/null @@ -1 +0,0 @@ -window.TMPL={},TMPL.airlock_electronics=function(e,s,a){var l='
';l+=e.oneAccess?""+a.link("One Required","unlock",{access:"one"}):""+a.link("All Required","lock",{access:"one"}),l+=""+a.link("Reset","refresh",{access:"clear"})+'
';var t=e.regions;if(t)for(var i,n=-1,d=t.length-1;d>n;)i=t[n+=1],l+='";l+="";var c=e.regions;if(c)for(var i,n=-1,r=c.length-1;r>n;){i=c[n+=1],l+=""}return l+="
'+i.name+"
";var o=i.accesses;if(o)for(var v,u=-1,p=o.length-1;p>u;)v=o[u+=1],l+=""+a.link(v.name,v.req?"check-square-o":"square-o",{access:v.id},null,v.req?"selected":null)+"
";l+="
"},TMPL.air_alarm=function(e,s,a){var l='
';if(l+=e.siliconUser?'
Interface Lock:
'+a.link("Engaged","lock",{toggleaccess:1},e.locked?"selected":null)+a.link("Disengaged","unlock",{toggleaccess:1},e.locked?null:"selected")+"
":e.locked?"Swipe an ID card to unlock this interface.":"Swipe an ID card to lock this interface.",l+='

Air Status

',e.environment_data){var t=e.environment_data;if(t)for(var i,n=-1,d=t.length-1;d>n;)i=t[n+=1],l+='
'+i.name+':
',l+=2==i.danger_level?"":1==i.danger_level?"":"",l+=""+a.fixed(i.value,2)+i.unit+"
";l+='
Local Status:
',l+=2==e.danger_level?"Danger (Internals Required)":1==e.danger_level?"Caution":"Optimal",l+='
Area Status:
',l+=e.atmos_alarm?"Atmosphere Alarm":e.fire_alarm?"Fire Alarm":"Nominal",l+="
"}else l+="
Warning: Cannot obtain air sample for analysis.
";if(e.dangerous&&(l+="
Warning: Safety measures offline. Device may exhibit abnormal behavior.
"),l+="
",!e.locked||e.siliconUser)if(1!=e.screen&&(l+=""+a.link("Back","arrow-left",{screen:1})),1==e.screen)l+='

Air Controls

',l+=e.atmos_alarm?""+a.link("Area Atmospheric Alarm","close",{atmos_reset:1},null,"caution"):""+a.link("Area Atmospheric Alarm","hand-stop-o",{atmos_alarm:1}),l+='
',l+=3!=e.mode?""+a.link("Panic Siphon","exclamation",{mode:3}):""+a.link("Panic Siphon","close",{mode:1},null,"danger"),l+='
'+a.link("Vent Controls","sign-out",{screen:2})+'
'+a.link("Scrubber Controls","filter",{screen:3})+'
'+a.link("Set Environmental Mode","cog",{screen:4})+'
'+a.link("Set Alarm Threshold","bar-chart",{screen:5})+"
";else if(2==e.screen){var c=e.vents;if(c)for(var r,n=-1,o=c.length-1;o>n;)r=c[n+=1],l+='

'+r.long_name+'

Power:
',l+=r.power?""+a.link("On","power-off",{id_tag:r.id_tag,command:"power",val:0},null,null):""+a.link("Off","close",{id_tag:r.id_tag,command:"power",val:1},null,"danger"),l+='
Mode:
',l+="release"==r.direction?'Pressurizing':'Siphoning',l+='
Pressure Checks:
'+a.link("Internal","sign-in",{id_tag:r.id_tag,command:"incheck",val:r.checks},null,r.incheck?"selected":null)+a.link("External","sign-out",{id_tag:r.id_tag,command:"excheck",val:r.checks},null,r.excheck?"selected":null)+'
Set Pressure:
'+a.link(a.fixed(r.external),"pencil",{id_tag:r.id_tag,command:"set_external_pressure"})+a.link("Reset","refresh",{id_tag:r.id_tag,command:"reset_external_pressure"},r.extdefault?"disabled":null)+"
";e.vents.length||(l+="No vents connected.")}else if(3==e.screen){var v=e.scrubbers;if(v)for(var u,n=-1,p=v.length-1;p>n;)u=v[n+=1],l+='

'+u.long_name+'

Power:
',l+=u.power?""+a.link("On","power-off",{id_tag:u.id_tag,command:"power",val:0},null,null):""+a.link("Off","close",{id_tag:u.id_tag,command:"power",val:1},null,"danger"),l+='
Mode:
',l+=u.scrubbing?""+a.link("Scrubbing","filter",{id_tag:u.id_tag,command:"scrubbing",val:0},null,null):""+a.link("Siphoning","sign-in",{id_tag:u.id_tag,command:"scrubbing",val:1},null,"danger"),l+='
Range:
',l+=u.widenet?""+a.link("Extended","expand",{id_tag:u.id_tag,command:"widenet",val:0},null,"caution"):""+a.link("Normal","compress",{id_tag:u.id_tag,command:"widenet",val:1},null,null),l+='
Filters:
'+a.link("CO2",u.filter_co2?"check-square-o":"square-o",{id_tag:u.id_tag,command:"co2_scrub",val:u.filter_co2?0:1},null,u.filter_co2?"selected":null)+a.link("N2O",u.filter_n2o?"check-square-o":"square-o",{id_tag:u.id_tag,command:"n2o_scrub",val:u.filter_n2o?0:1},null,u.filter_n2o?"selected":null)+a.link("Plasma",u.filter_toxins?"check-square-o":"square-o",{id_tag:u.id_tag,command:"tox_scrub",val:u.filter_toxins?0:1},null,u.filter_toxins?"selected":null)+"
";e.scrubbers.length||(l+="No scrubbers connected.")}else if(4==e.screen){l+='

Environmental Modes

';var m=e.modes;if(m)for(var k,n=-1,g=m.length-1;g>n;)k=m[n+=1],l+='
'+a.link(k.name,k.selected?"check-square-o":"square-o",{mode:k.mode},null,k.selected?k.danger?"danger":"selected":null)+"
";l+=""}else if(5==e.screen){l+="

Alarm Thresholds

";var b=e.thresholds;if(b)for(var h,n=-1,f=b.length-1;f>n;){h=b[n+=1],l+="";var _=h.settings;if(_)for(var L,C=-1,P=_.length-1;P>C;)L=_[C+=1],l+="";l+=""}l+="
min2min1max1max2
"+h.name+""+a.link(L.selected>=0?a.round(100*L.selected)/100:"Off",null,{command:"set_threshold",env:L.env,"var":L.val})+"
"}return l},TMPL.apc=function(e,s,a){var l='
';l+=e.siliconUser?'
Interface Lock:
'+a.link("Engaged","lock",{toggleaccess:1},e.locked?"selected":null)+a.link("Disengaged","unlock",{toggleaccess:1},e.malfStatus>=2?"linkOff":e.locked?null:"selected")+"
":e.locked?"Swipe an ID card to unlock this interface.":"Swipe an ID card to lock this interface.",l+='

Power Status

Main Breaker:
',l+=e.locked&&!e.siliconUser?e.isOperating?"On":"Off":""+a.link("On","power-off",{breaker:1},e.isOperating?"selected":null)+a.link("Off","close",{breaker:1},e.isOperating?null:"selected"),l+='
External Power:
',l+=2==e.externalPower?"Good":1==e.externalPower?"Low":"None",l+='
Power Cell:
',l+=null!=e.powerCellStatus?""+a.bar(e.powerCellStatus,0,100,e.powerCellStatus>=50?"good":e.powerCellStatus>=25?"average":"bad",a.fixed(e.powerCellStatus)+"%"):"Power cell removed.",l+="
",null!=e.powerCellStatus&&(l+='
Charge Mode:
',l+=e.locked&&!e.siliconUser?e.chargeMode?"Auto":"Off":""+a.link("Auto","refresh",{cmode:1},e.chargeMode?"selected":null)+a.link("Off","close",{cmode:1},e.chargeMode?null:"selected"),l+=" ",l+=e.chargingStatus>1?"[Fully Charged]":1==e.chargingStatus?"[Charging]":"[Not Charging]",l+="
"),l+='

Power Channels

';var t=e.powerChannels;if(t)for(var i,n=-1,d=t.length-1;d>n;)i=t[n+=1],l+="";return l+='
"+i.title+":"+i.powerLoad+" W",i.status<=1?l+="Off":i.status>=2&&(l+="On"),l+="",l+=1==i.status||3==i.status?"[Auto]":"[Manual]",l+='',(!e.locked||e.siliconUser)&&(l+=""+a.link("Auto","refresh",i.topicParams.auto,1==i.status||3==i.status?"selected":null)+a.link("On","power-off",i.topicParams.on,2==i.status?"selected":null)+a.link("Off","close",i.topicParams.off,0==i.status?"selected":null)),l+="
Total Load:'+e.totalLoad+" W
",e.siliconUser&&(l+='

System Overrides

'+a.link("Overload Lighting Circuit","lightbulb-o",{overload:1})+"
",1==e.malfStatus?l+=""+a.link("Override Programming","terminal",{malfhack:1}):2==e.malfStatus?l+=""+a.link("Shunt Core Processes","caret-square-o-down",{occupyapc:1}):3==e.malfStatus?l+=""+a.link("Return to Main Core","carat-square-o-left",{deoccupyapc:1}):4==e.malfStatus&&(l+=""+a.link("Shunt Core Processes","caret-square-o-down",{occupyapc:1},"linkOff")),l+="
"),l+='
Cover Lock:
',l+=e.locked&&!e.siliconUser?e.coverLocked?"Engaged":"Disengaged":""+a.link("Engaged","lock",{lock:1},e.coverLocked?"selected":null)+a.link("Disengaged","unlock",{lock:1},e.coverLocked?null:"selected"),l+="
"},TMPL.atmos_filter=function(e,s,a){var l='
Power:
'+a.link(e.on?"On":"Off",e.on?"power":"close",{power:1})+'
Output Pressure:
'+a.link("Set","pencil",{set_press:"set"})+a.link("Max","plus",{set_press:"max"},e.set_pressure==e.max_pressure?"disabled":null)+e.set_pressure+' kPa
Filter:
'+a.link("Plasma",null,{filterset:0},0==e.filter_type?"selected":null)+a.link("O2",null,{filterset:1},1==e.filter_type?"selected":null)+a.link("N2",null,{filterset:2},2==e.filter_type?"selected":null)+a.link("CO2",null,{filterset:3},3==e.filter_type?"selected":null)+a.link("N2O",null,{filterset:4},4==e.filter_type?"selected":null)+a.link("Nothing",null,{filterset:-1},-1==e.filter_type?"selected":null)+"
";return l},TMPL.atmos_mixer=function(e,s,a){var l='
Power:
'+a.link(e.on?"On":"Off",e.on?"power":"close",{power:1})+'
Output Pressure:
'+a.link("Set","pencil",{set_press:"set"})+a.link("Max","plus",{set_press:"max"},e.set_pressure==e.max_pressure?"disabled":null)+e.set_pressure+' kPa
Node 1:
'+a.link("","seek-start",{node1_c:"-0.1"},null)+a.link("","triangle-1-w",{node1_c:"-0.01"},null)+a.link("","triangle-1-e",{node1_c:"0.01"},null)+a.link("","seek-end",{node1_c:"0.1"},null)+e.node1_concentration+'%
Node 2:
'+a.link("","seek-start",{node2_c:"-0.1"},null)+a.link("","triangle-1-w",{node2_c:"-0.01"},null)+a.link("","triangle-1-e",{node2_c:"0.01"},null)+a.link("","seek-end",{node2_c:"0.1"},null)+e.node2_concentration+"%
";return l},TMPL.atmos_pump=function(e,s,a){var l='
Power:
'+a.link(e.on?"On":"Off",e.on?"power":"close",{power:1})+"
";return l+=e.max_rate?'
Transfer Rate:
'+a.link("Set","pencil",{set_transfer_rate:"set"})+a.link("Max","plus",{set_transfer_rate:"max"},e.transfer_rate==e.max_rate?"disabled":null)+e.transfer_rate+" L/s
":'
Output Pressure:
'+a.link("Set","pencil",{set_press:"set"})+a.link("Max","plus",{set_press:"max"},e.set_pressure==e.max_pressure?"disabled":null)+e.set_pressure+" kPa
"},TMPL.canister=function(e,s,a){var l="";return l+=e.hasHoldingTank?'
The regulator is connected to a tank.
':'
The regulator is not connected to a tank.
',l+='

Canister

'+a.link("Relabel","pencil",{relabel:1},e.canLabel?null:"disabled")+'
Pressure:
'+e.tankPressure+' kPa
Port:
',l+=e.portConnected?'Connected':'Disconnected',l+='

Valve

Release Pressure:
'+a.bar(e.releasePressure,e.minReleasePressure,e.maxReleasePressure)+e.releasePressure+' kPa
Pressure Regulator:
'+a.link("Reset","refresh",{release_p:"reset"},e.releasePressure!=e.defaultReleasePressure?null:"disabled")+a.link("Min","minus",{release_p:"min"},e.releasePressure>e.minReleasePressure?null:"disabled")+a.link("Set","pencil",{release_p:"custom"},null)+a.link("Max","plus",{release_p:"max"},e.releasePressure'+a.link("Open","unlock",{toggle:1},e.valveOpen?"selected":null)+a.link("Close","lock",{toggle:1},e.valveOpen?null:"selected")+"

Holding Tank

",l+=e.hasHoldingTank?""+a.link("Eject","eject",{remove_tank:1})+'
Label:
'+e.holdingTank.name+'
Tank Pressure:
'+e.holdingTank.tankPressure+" kPa
":'
No Holding Tank
'},TMPL.chem_dispenser=function(e,s,a){var l='

Status

Energy:
'+a.bar(e.energy,0,e.maxEnergy,"good")+e.energy+' Units
Amount:
',t=e.beakerTransferAmounts;if(t)for(var i,n=-1,d=t.length-1;d>n;)i=t[n+=1],l+=""+a.link(i,"plus",{amount:i},e.amount==i?"selected":null);l+='

Dispense

';var c=e.chemicals;if(c)for(var r,n=-1,o=c.length-1;o>n;)r=c[n+=1],l+=""+a.link(r.title,"tint",r.commands,null,"link fixedLeft");l+='

Beaker

'+a.link("Eject","eject",{ejectBeaker:1},e.isBeakerLoaded?null:"disabled")+'
';var v=e.beakerTransferAmounts;if(v)for(var i,n=-1,u=v.length-1;u>n;)i=v[n+=1],l+=""+a.link(i,"minus",{remove:i});if(l+='
Contents:
',e.isBeakerLoaded)if(l+="Volume: "+e.beakerCurrentVolume+"/"+e.beakerMaxVolume+" Units
",e.beakerContents.length){var p=e.beakerContents;if(p)for(var m,n=-1,k=p.length-1;k>n;)m=p[n+=1],l+=''+m.volume+" units of "+m.name+"
"}else l+='Beaker Empty';else l+='No Beaker Loaded';return l+="
"},TMPL.chem_heater=function(e,s,a){var l='

Status

Power:
'+a.link(e.isActive?"On":"Off",e.isActive?"power":"close",{toggle_on:1},e.isBeakerLoaded?null:"disabled")+'
Target:
'+a.link(e.targetTemp+"K","pencil",{adjust_temperature:"input"})+'

Beaker

'+a.link("Eject","eject",{eject_beaker:1},e.isBeakerLoaded?null:"disabled")+'
Contents:
';if(e.isBeakerLoaded)if(l+="Temperature: "+e.currentTemp+"K
",e.beakerContents.length){var t=e.beakerContents;if(t)for(var i,n=-1,d=t.length-1;d>n;)i=t[n+=1],l+=''+i.volume+" units of "+i.name+"
"}else l+='Beaker Empty';else l+='No Beaker Loaded';return l+="
"},TMPL.cryo=function(e,s,a){var l='

Occupant

Occupant:
';if(l+=e.hasOccupant?""+e.occupant.name:'No Occupant',l+="
",e.hasOccupant&&(l+='
State:
',l+=0==e.occupant.stat?'Conscious':1==e.occupant.stat?'Unconscious':'Dead',l+='
Temperature:
'+a.round(e.occupant.bodyTemperature)+" K
"),e.occupant.stat<2&&(l+='
Health:
',l+=e.occupant.health>=0?""+a.bar(e.occupant.health,0,e.occupant.maxHealth,"good"):""+a.bar(e.occupant.health,0,e.occupant.minHealth,"average"),l+=""+a.round(e.occupant.health)+'
Brute:
'+a.bar(e.occupant.bruteLoss,0,e.occupant.maxHealth,"bad")+a.round(e.occupant.bruteLoss)+'
Respiratory:
'+a.bar(e.occupant.oxyLoss,0,e.occupant.maxHealth,"bad")+a.round(e.occupant.oxyLoss)+'
Toxin:
'+a.bar(e.occupant.toxLoss,0,e.occupant.maxHealth,"bad")+a.round(e.occupant.toxLoss)+'
Burn:
'+a.bar(e.occupant.fireLoss,0,e.occupant.maxHealth,"bad")+a.round(e.occupant.fireLoss)+"
"),l+='

Cell

Power:
'+a.link("On","power",{switchOn:1},e.isOperating?"selected":null)+a.link("Off","close",{switchOff:1},e.isOperating?null:"selected")+'
Temperature:
'+e.cellTemperature+' K
Door:
'+a.link("Open","unlocked",{openCell:1},e.isOpen?"disabled":null)+a.link("Close","locked",{closeCell:1},e.isOpen?null:"disabled")+'
Eject:
'+a.link("Auto","eject",{autoEject:1},e.autoEject?"selected":null)+a.link("Manual","pin-s",{autoEject:0},e.autoEject?null:"selected")+'

Beaker

'+a.link("Eject","eject",{ejectBeaker:1},e.isBeakerLoaded?null:"disabled")+'
Contents:
',e.isBeakerLoaded)if(e.beakerContents.length){var t=e.beakerContents;if(t)for(var i,n=-1,d=t.length-1;d>n;)i=t[n+=1],l+=''+i.volume+" units of "+i.name+"
"}else l+='Beaker Empty';else l+='No Beaker Loaded';return l+="
"},TMPL.smes=function(e,s,a){var l='

Storage

Stored Energy:
'+a.bar(e.capacityPercent,0,100,e.capacityPercent>=50?"good":e.capacityPercent>=15?"average":"bad")+'
'+a.round(e.capacityPercent)+'%

Input

Charge Mode:
'+a.link("Auto","refresh",{input_attempt:1},e.inputAttempt?"selected":null)+a.link("Off","close",{input_attempt:0},e.inputAttempt?null:"selected")+" ";return l+=e.capacityPercent>=99?"[Fully Charged]":e.inputting?"[Charging]":"[Not Charging]",l+='
Input Setting:
'+a.bar(e.inputLevel,0,e.inputLevelMax)+" "+e.inputLevel+' W
'+a.link("","fast-backward",{set_input_level:"0"},e.inputLevel?null:"selected")+a.link("","backward",{set_input_level:"minus"},e.inputLevel?null:"disabled")+a.link("Set","pencil",{set_input_level:"custom"},null)+a.link("","forward",{set_input_level:"plus"},e.inputLevel==e.inputLevelMax?"disabled":null)+a.link("","fast-forward",{set_input_level:"max"},e.inputLevel==e.inputLevelMax?"selected":null)+'
Available:
'+e.inputAvailable+' W

Output

Charge Mode:
'+a.link("On","power-off",{output_attempt:1},e.outputAttempt?"selected":null)+a.link("Off","close",{output_attempt:0},e.outputAttempt?null:"selected")+" ",l+=e.outputting?'[Sending]':e.charge>0?'[Not Sending]':'[No Charge]',l+='
Output Setting:
'+a.bar(e.outputLevel,0,e.outputLevelMax)+" "+e.outputLevel+' W
'+a.link("","fast-backward",{set_output_level:"0"},e.outputLevel?null:"selected")+a.link("","backward",{set_output_level:"minus"},e.outputLevel?null:"disabled")+a.link("Set","pencil",{set_output_level:"custom"},null)+a.link("","forward",{set_output_level:"plus"},e.outputLevel==e.outputLevelMax?"disabled":null)+a.link("","fast-forward",{set_output_level:"max"},e.outputLevel==e.outputLevelMax?"selected":null)+'
Outputting:
'+e.outputUsed+" W
"},TMPL.solar_control=function(e,s,a){var l='

Status

Generated Power:
'+e.generated+' W
Orientation:
'+e.angle+"° ("+e.direction+")"+a.link("15°","minus",{rate_control:"1",cdir:"-15"})+a.link("1°","minus",{rate_control:"1",cdir:"-1"})+a.link("1°","plus",{rate_control:"1",cdir:"1"})+a.link("15°","plus",{rate_control:"1",cdir:"15"})+'

Tracking

Tracker Mode:
'+a.link("Off","close",{track:"0"},0==e.tracking_state?"selected":"")+a.link("Timed","clock",{track:"1"},1==e.tracking_state?"selected":"");return l+=e.connected_tracker?""+a.link("Auto","signal-diag",{track:"2"},2==e.tracking_state?"selected":""):""+a.link("Auto","signal-diag",null,"disabled"),l+='
Tracking Rate:
'+e.tracking_rate+" deg/h ("+e.rotating_way+")"+a.link("180°","minus",{rate_control:"1",tdir:"-180"})+a.link("30°","minus",{rate_control:"1",tdir:"-30"})+a.link("1°","minus",{rate_control:"1",tdir:"-1"})+a.link("1°","plus",{rate_control:"1",tdir:"1"})+a.link("30°","plus",{rate_control:"1",tdir:"30"})+a.link("180°","plus",{rate_control:"1",tdir:"180"})+'

Devices

Solar Tracker:
',l+=e.connected_tracker?'Found':'Not Found',l+='
Solars Panels:
'+e.connected_panels+' Connected
'+a.link("","refresh",{search_connected:"1"})+"
"},TMPL.space_heater=function(e,s,a){var l='

Status

Power:
'+a.link("On","power",{power:1},e.on?"selected":null)+a.link("Off","close",{power:0},e.on?null:"selected")+'
Stored Energy:
';return e.hasPowercell?(l+=""+a.bar(e.powerLevel,0,100,"good")+" "+e.powerLevel+"%",e.open&&(l+="
"+a.link("Eject","eject",{cellremove:1},null))):(l+="No power cell loaded.",e.open&&(l+=""+a.link("Install","eject",{cellinstall:1},null))),l+='

Thermostat

Current Temp:
'+e.currentTemp+'°C
Target Temp:
'+e.targetTemp+"°C",e.open&&(l+="
"+a.link("","seek-prev",{temp:-20},e.targetTemp>e.minTemp?null:"disabled")+a.link("","triangle-1-w",{temp:-5},e.targetTemp>e.minTemp?null:"disabled")+a.link("Set","pencil",{temp:"custom"},null)+a.link("","triangle-1-e",{temp:5},e.targetTemp
Operational Mode:
',l+=e.open?""+a.link("Heat","arrowthick-1-n",{mode:"heat"},"heat"!=e.mode?null:"selected")+a.link("Cool","arrowthick-1-s",{mode:"cool"},"cool"!=e.mode?null:"selected")+a.link("Auto","arrowthick-2-n-s",{mode:"auto"},"heat"==e.mode||"cool"==e.mode?null:"selected"):"heat"==e.mode?"Heat":"cool"==e.mode?"Cool":"Auto",l+="
"},TMPL.tanks=function(e,s,a){var l="";return l+=e.maskConnected?'
The regulator is connected to a mask.
':'
The regulator is not connected to a mask.
',l+='
Tank Pressure:
'+a.bar(e.tankPressure,0,1013,e.tankPressure>200?"good":e.tankPressure>100?"average":"bad")+e.tankPressure+' kPa
Release Pressure:
'+a.bar(e.releasePressure,e.minReleasePressure,e.maxReleasePressure)+e.releasePressure+' kPa
Pressure Regulator:
'+a.link("Reset","refresh",{dist_p:"reset"},e.releasePressure!=e.defaultReleasePressure?null:"disabled")+a.link("Min","minus",{dist_p:"min"},e.releasePressure>e.minReleasePressure?null:"disabled")+a.link("Set","pencil",{dist_p:"custom"},null)+a.link("Max","plus",{dist_p:"max"},e.releasePressure'+a.link("Open","unlock",{stat:1},e.maskConnected?e.valveOpen?"selected":null:"disabled")+a.link("Close","lock",{stat:1},e.valveOpen?null:"selected")+"
"},TMPL._generic=function(e,s,a){var l="
Initiating...
";return l},TMPL._nanotrasen=function(e,s,a){var l="
"+s.title+"
Initiating...
";return l}; \ No newline at end of file diff --git a/nano/images/nanotrasen.svg b/nano/images/nanotrasen.svg index 781b577d940..b3f8db81905 100644 --- a/nano/images/nanotrasen.svg +++ b/nano/images/nanotrasen.svg @@ -1,6 +1,7 @@ - - - - + + + + + diff --git a/nano/package.json b/nano/package.json index 13fd842e95a..7ab774a9d02 100644 --- a/nano/package.json +++ b/nano/package.json @@ -3,8 +3,6 @@ "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", @@ -17,17 +15,19 @@ "gulp-if": "^2.0.0", "gulp-jsbeautifier": "^1.0.1", "gulp-less": "^3.0.5", + "gulp-load-plugins": "^1.1.0", "gulp-postcss": "^6.0.1", + "gulp-rename": "^1.2.2", "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", "pleeease-filters": "^2.0.0", - "postcss-clearfix": "^0.2.0", - "postcss-color-rgba-fallback": "^2.0.0", + "postcss-color-rgba-fallback": "git+https://github.com/postcss/postcss-color-rgba-fallback", + "postcss-colorblind": "^0.4.0", "postcss-filter-gradient": "^0.1.1", - "postcss-opacity": "^3.0.0", - "postcss-pseudoelements": "^3.0.0" + "postcss-font-weights": "^2.0.1", + "postcss-opacity": "^3.0.0" } } diff --git a/nano/reload.bat b/nano/reload.bat index 11286ecfafa..2fe4104eb07 100644 --- a/nano/reload.bat +++ b/nano/reload.bat @@ -1,2 +1,9 @@ -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) +@echo off + +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/styles/_interface.less b/nano/styles/_interface.less index 8a85d4c36d6..6c98d664594 100644 --- a/nano/styles/_interface.less +++ b/nano/styles/_interface.less @@ -21,17 +21,7 @@ article.display { section { width: 100%; - padding: 2px 0; - } - - section.text { - &:extend(section); - padding: 5px 0; - } - - section.button { - &:extend(section); - padding-bottom: 0; + padding: 3px 0; } .cell { @@ -44,6 +34,7 @@ article.display { width: 33%; color: @label; + vertical-align: top; } .content { @@ -56,6 +47,10 @@ article.display { width: 100%; } + .buttoninfo { + margin-left: 5px; + } + table { width: auto; diff --git a/nano/styles/_link.less b/nano/styles/_link.less index 834abf468b7..d3078be6c0c 100644 --- a/nano/styles/_link.less +++ b/nano/styles/_link.less @@ -50,4 +50,8 @@ &.danger { background-color: @danger; } } &.disabled { background-color: @disabled; } + + &.gridable { + width: 125px; + } } diff --git a/nano/styles/nanotrasen.less b/nano/styles/nanotrasen.less index c1ed2da634b..2171e15c4b3 100644 --- a/nano/styles/nanotrasen.less +++ b/nano/styles/nanotrasen.less @@ -6,32 +6,30 @@ body { linear-gradient(to bottom, @background-start 0%, @background-end 100%); - background-size: 80% 80%, 100% 100%; - background-position: 50% 33%, center; + background-size: 70% 70%, 100% 100%; + background-position: center, center; background-attachment: fixed, scroll; } -header[role="titlebar"] { - position: relative; - height: 30px; +header.titlebar { + width: 100%; + height: 32px; background-color: @navbar; - box-shadow: 0 4px 4px -2px rgba(0, 0, 0, 0.3); - - .statusicon { - position: absolute; - top: 4px; - left: 12px; - } + box-shadow: 0 3px 3px rgba(0, 0, 0, 0.1); .title { position: absolute; top: 6px; - left: 44px; - height: 24px; - width: 66%; + left: 12px; color: @title; font-size: 16px; } + + .statusicon { + position: absolute; + top: 4px; + right: 12px; + } } diff --git a/nano/templates/_nanotrasen.dot b/nano/templates/_nanotrasen.dot index 8ea3696fe5b..e62cece1524 100644 --- a/nano/templates/_nanotrasen.dot +++ b/nano/templates/_nanotrasen.dot @@ -1,6 +1,6 @@ -
+
+
{{=config.title}} -
{{=config.title}}
diff --git a/nano/templates/air_alarm.dot b/nano/templates/air_alarm.dot index 0f80e08d5b2..9633637e18f 100644 --- a/nano/templates/air_alarm.dot +++ b/nano/templates/air_alarm.dot @@ -1,9 +1,7 @@
{{? data.siliconUser}}
- - Interface Lock: - + Interface Lock:
{{=helper.link('Engaged', 'lock', {'toggleaccess': 1}, data.locked ? 'selected' : null)}} {{=helper.link('Disengaged', 'unlock', {'toggleaccess': 1}, data.locked ? null : 'selected')}} @@ -21,57 +19,53 @@

Air Status

{{? data.environment_data}} {{~ data.environment_data:info:i}} -
- - {{=info.name}}: - +
+ {{=info.name}}:
{{? info.danger_level == 2}} - + {{?? info.danger_level == 1}} - + {{??}} - + {{?}} {{=helper.fixed(info.value, 2)}}{{=info.unit}}
{{~}} -
- - Local Status: - +
+ Local Status:
{{? data.danger_level == 2}} - Danger (Internals Required) + Danger (Internals Required) {{?? data.danger_level == 1}} - Caution + Caution {{??}} - Optimal + Optimal {{?}}
-
- - Area Status: - +
+ Area Status:
{{? data.atmos_alarm}} - Atmosphere Alarm + Atmosphere Alarm {{?? data.fire_alarm}} - Fire Alarm + Fire Alarm {{??}} - Nominal + Nominal {{?}}
{{??}} -
Warning: Cannot obtain air sample for analysis.
+
+ Warning: Cannot obtain air sample for analysis. +
{{?}} {{? data.dangerous}}
- Warning: Safety measures offline. Device may exhibit abnormal behavior. + Warning: Safety measures offline. Device may exhibit abnormal behavior.
{{?}}
@@ -114,9 +108,7 @@

{{=vent.long_name}}

- - Power: - + Power:
{{? vent.power}} {{=helper.link('On', 'power-off', {'id_tag': vent.id_tag, 'command': 'power', 'val': 0}, null, null)}} @@ -126,9 +118,7 @@
- - Mode: - + Mode:
{{? vent.direction == "release"}} Pressurizing @@ -138,18 +128,14 @@
- - Pressure Checks: - + 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: - + 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)}} @@ -158,16 +144,14 @@
{{~}} {{? !data.vents.length}} - No vents connected. + No vents connected. {{?}} {{?? data.screen == 3}} {{~ data.scrubbers:scrubber:i}}

{{=scrubber.long_name}}

- - Power: - + Power:
{{? scrubber.power}} {{=helper.link('On', 'power-off', {'id_tag': scrubber.id_tag, 'command': 'power', 'val': 0}, null, null)}} @@ -177,9 +161,7 @@
- - Mode: - + Mode:
{{? scrubber.scrubbing}} {{=helper.link('Scrubbing', 'filter', {'id_tag': scrubber.id_tag, 'command': 'scrubbing', 'val': 0}, null, null)}} @@ -189,9 +171,7 @@
- - Range: - + Range:
{{? scrubber.widenet}} {{=helper.link('Extended', 'expand', {'id_tag': scrubber.id_tag, 'command': 'widenet', 'val': 0}, null, 'caution')}} @@ -201,9 +181,7 @@
- - Filters: - + 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)}} @@ -213,7 +191,7 @@
{{~}} {{? !data.scrubbers.length}} - No scrubbers connected. + No scrubbers connected. {{?}} {{?? data.screen == 4}}
@@ -231,10 +209,10 @@ - min2 - min1 - max1 - max2 + min2 + min1 + max1 + max2 diff --git a/nano/templates/apc.dot b/nano/templates/apc.dot index a8c6092288a..71fa6452886 100644 --- a/nano/templates/apc.dot +++ b/nano/templates/apc.dot @@ -1,9 +1,7 @@
{{? data.siliconUser}}
- - Interface Lock: - + 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'))}} @@ -20,15 +18,13 @@

Power Status

- - Main Breaker: - + Main Breaker:
{{? data.locked && !data.siliconUser}} {{? data.isOperating}} - On + On {{??}} - Off + Off {{?}} {{??}} {{=helper.link('On', 'power-off', {'breaker' : 1}, data.isOperating ? 'selected' : null)}} @@ -37,42 +33,36 @@
- - External Power: - + External Power:
{{? data.externalPower == 2}} - Good + Good {{?? data.externalPower == 1}} - Low + Low {{??}} - None + None {{?}}
- - Power Cell: - + Power Cell:
{{? data.powerCellStatus != null}} - {{=helper.bar(data.powerCellStatus, 0, 100, data.powerCellStatus >= 50 ? 'good' : data.powerCellStatus >= 25 ? 'average' : 'bad', helper.fixed(data.powerCellStatus) + "%")}} + {{=helper.bar(data.powerCellStatus, 0, 100, data.powerCellStatus >= 50 ? "good" : data.powerCellStatus >= 25 ? "average" : "bad", helper.fixed(data.powerCellStatus) + "%")}} {{??}} - Power cell removed. + Power cell removed. {{?}}
{{? data.powerCellStatus != null}}
- - Charge Mode: - + Charge Mode:
{{? data.locked && !data.siliconUser}} {{? data.chargeMode}} - Auto + Auto {{??}} - Off + Off {{?}} {{??}} {{=helper.link('Auto', 'refresh', {'cmode' : 1}, data.chargeMode ? 'selected' : null)}} @@ -80,11 +70,11 @@ {{?}}   {{? data.chargingStatus > 1}} - [Fully Charged] + [Fully Charged] {{?? data.chargingStatus == 1}} - [Charging] + [Charging] {{??}} - [Not Charging] + [Not Charging] {{?}}
@@ -99,9 +89,9 @@ {{=channel.powerLoad}} W {{? channel.status <= 1}} - Off + Off {{?? channel.status >= 2}} - On + On {{?}} @@ -150,9 +140,7 @@ {{?}}
- - Cover Lock: - + Cover Lock:
{{? data.locked && !data.siliconUser}} {{? data.coverLocked}} diff --git a/nano/templates/atmos_filter.dot b/nano/templates/atmos_filter.dot index 1ce177d094b..ac08c4dd864 100644 --- a/nano/templates/atmos_filter.dot +++ b/nano/templates/atmos_filter.dot @@ -1,31 +1,27 @@ -
-
- Power: -
-
- {{=helper.link(data.on? 'On' : 'Off', data.on? 'power' : 'close', {'power' : 1})}} -
-
-
-
- Output Pressure: -
-
- {{=helper.link('Set', 'pencil', {'set_press' : 'set'})}} - {{=helper.link('Max', 'plus', {'set_press' : 'max'}, data.set_pressure == data.max_pressure ? 'disabled' : null)}} - {{=data.set_pressure}} kPa -
-
-
-
- Filter: -
-
- {{=helper.link('Plasma', null, {'filterset' : 0}, (data.filter_type == 0)? 'selected' : null)}} - {{=helper.link('O2', null, {'filterset' : 1}, (data.filter_type == 1)? 'selected' : null)}} - {{=helper.link('N2', null, {'filterset' : 2}, (data.filter_type == 2)? 'selected' : null)}} - {{=helper.link('CO2', null, {'filterset' : 3}, (data.filter_type == 3)? 'selected' : null)}} - {{=helper.link('N2O', null, {'filterset' : 4}, (data.filter_type == 4)? 'selected' : null)}} - {{=helper.link('Nothing', null, {'filterset' : -1}, (data.filter_type == -1)? 'selected' : null)}} -
-
+
+
+ Power: +
+ {{=helper.link(data.on? 'On' : 'Off', data.on? 'power' : 'close', {'power' : 1})}} +
+
+
+ Output Pressure: +
+ {{=helper.link('Set', 'pencil', {'set_press' : 'set'})}} + {{=helper.link('Max', 'plus', {'set_press' : 'max'}, data.set_pressure == data.max_pressure ? 'disabled' : null)}} + {{=data.set_pressure}} kPa +
+
+
+ Filter: +
+ {{=helper.link('Plasma', null, {'filterset' : 0}, (data.filter_type == 0)? 'selected' : null)}} + {{=helper.link('O2', null, {'filterset' : 1}, (data.filter_type == 1)? 'selected' : null)}} + {{=helper.link('N2', null, {'filterset' : 2}, (data.filter_type == 2)? 'selected' : null)}} + {{=helper.link('CO2', null, {'filterset' : 3}, (data.filter_type == 3)? 'selected' : null)}} + {{=helper.link('N2O', null, {'filterset' : 4}, (data.filter_type == 4)? 'selected' : null)}} + {{=helper.link('Nothing', null, {'filterset' : -1}, (data.filter_type == -1)? 'selected' : null)}} +
+
+
diff --git a/nano/templates/atmos_mixer.dot b/nano/templates/atmos_mixer.dot index fa534cd2082..6510fa653da 100644 --- a/nano/templates/atmos_mixer.dot +++ b/nano/templates/atmos_mixer.dot @@ -1,42 +1,36 @@ -
-
- Power: -
-
- {{=helper.link(data.on? 'On' : 'Off', data.on? 'power' : 'close', {'power' : 1})}} -
-
-
-
- Output Pressure: -
-
- {{=helper.link('Set', 'pencil', {'set_press' : 'set'})}} - {{=helper.link('Max', 'plus', {'set_press' : 'max'}, data.set_pressure == data.max_pressure ? 'disabled' : null)}} - {{=data.set_pressure}} kPa -
-
-
-
- Node 1: -
-
- {{=helper.link('', 'seek-start', {'node1_c' : '-0.1'}, null)}} - {{=helper.link('', 'triangle-1-w', {'node1_c' : '-0.01'}, null)}} - {{=helper.link('', 'triangle-1-e', {'node1_c' : '0.01'}, null)}} - {{=helper.link('', 'seek-end', {'node1_c' : '0.1'}, null)}} - {{=data.node1_concentration}}% -
-
-
-
- Node 2: -
-
- {{=helper.link('', 'seek-start', {'node2_c' : '-0.1'}, null)}} - {{=helper.link('', 'triangle-1-w', {'node2_c' : '-0.01'}, null)}} - {{=helper.link('', 'triangle-1-e', {'node2_c' : '0.01'}, null)}} - {{=helper.link('', 'seek-end', {'node2_c' : '0.1'}, null)}} - {{=data.node2_concentration}}% -
-
+
+
+ Power: +
+ {{=helper.link(data.on? 'On' : 'Off', data.on? 'power' : 'close', {'power' : 1})}} +
+
+
+ Output Pressure: +
+ {{=helper.link('Set', 'pencil', {'set_press' : 'set'})}} + {{=helper.link('Max', 'plus', {'set_press' : 'max'}, data.set_pressure == data.max_pressure ? 'disabled' : null)}} + {{=data.set_pressure}} kPa +
+
+
+ Node 1: +
+ {{=helper.link('', 'fast-backward', {'node1_c' : '-0.1'}, null)}} + {{=helper.link('', 'backward', {'node1_c' : '-0.01'}, null)}} + {{=helper.link('', 'forward', {'node1_c' : '0.01'}, null)}} + {{=helper.link('', 'fast-forward', {'node1_c' : '0.1'}, null)}} + {{=data.node1_concentration}}% +
+
+
+ Node 2: +
+ {{=helper.link('', 'fast-backward', {'node2_c' : '-0.1'}, null)}} + {{=helper.link('', 'backward', {'node2_c' : '-0.01'}, null)}} + {{=helper.link('', 'forward', {'node2_c' : '0.01'}, null)}} + {{=helper.link('', 'fast-forward', {'node2_c' : '0.1'}, null)}} + {{=data.node2_concentration}}% +
+
+
diff --git a/nano/templates/atmos_pump.dot b/nano/templates/atmos_pump.dot index 0b93893b26c..1f29c07f3f6 100644 --- a/nano/templates/atmos_pump.dot +++ b/nano/templates/atmos_pump.dot @@ -1,31 +1,27 @@ -
-
- Power: -
-
- {{=helper.link(data.on? 'On' : 'Off', data.on? 'power' : 'close', {'power' : 1})}} -
-
-{{? data.max_rate}} -
-
- Transfer Rate: +
+
+ Power: +
+ {{=helper.link(data.on? 'On' : 'Off', data.on? 'power' : 'close', {'power' : 1})}}
-
- {{=helper.link('Set', 'pencil', {'set_transfer_rate' : 'set'})}} - {{=helper.link('Max', 'plus', {'set_transfer_rate' : 'max'}, data.transfer_rate == data.max_rate ? 'disabled' : null)}} - {{=data.transfer_rate}} L/s -
-
-{{??}} -
-
- Output Pressure: -
-
- {{=helper.link('Set', 'pencil', {'set_press' : 'set'})}} - {{=helper.link('Max', 'plus', {'set_press' : 'max'}, data.set_pressure == data.max_pressure ? 'disabled' : null)}} - {{=data.set_pressure}} kPa -
-
-{{?}} +
+ {{? data.max_rate}} +
+ Transfer Rate: +
+ {{=helper.link('Set', 'pencil', {'set_transfer_rate' : 'set'})}} + {{=helper.link('Max', 'plus', {'set_transfer_rate' : 'max'}, data.transfer_rate == data.max_rate ? 'disabled' : null)}} + {{=data.transfer_rate}} L/s +
+
+ {{??}} +
+ Output Pressure: +
+ {{=helper.link('Set', 'pencil', {'set_press' : 'set'})}} + {{=helper.link('Max', 'plus', {'set_press' : 'max'}, data.set_pressure == data.max_pressure ? 'disabled' : null)}} + {{=data.set_pressure}} kPa +
+
+ {{?}} +
diff --git a/nano/templates/canister.dot b/nano/templates/canister.dot index 9cb23cc4e8d..14079dcc40d 100644 --- a/nano/templates/canister.dot +++ b/nano/templates/canister.dot @@ -1,77 +1,80 @@ -{{? data.hasHoldingTank }} -
The regulator is connected to a tank.
-{{??}} -
The regulator is not connected to a tank.
-{{?}} -

Canister

-
- {{=helper.link('Relabel', 'pencil', {'relabel' : 1}, data.canLabel ? null : 'disabled')}} -
-
-
- Pressure: -
-
- {{=data.tankPressure}} kPa -
-
-
-
- Port: -
-
- {{? data.portConnected}} - Connected - {{??}} - Disconnected - {{?}} -
-
-

Valve

-
-
- Release Pressure: -
-
- {{=helper.bar(data.releasePressure, data.minReleasePressure, data.maxReleasePressure)}} - {{=data.releasePressure}} kPa -
-
-
-
- Pressure Regulator: -
-
- {{=helper.link('Reset', 'refresh', {'release_p': 'reset'}, (data.releasePressure != data.defaultReleasePressure) ? null : 'disabled')}} - {{=helper.link('Min', 'minus', {'release_p': 'min'}, (data.releasePressure > data.minReleasePressure) ? null : 'disabled')}} - {{=helper.link('Set', 'pencil', {'release_p': 'custom'}, null)}} - {{=helper.link('Max', 'plus', {'release_p': 'max'}, (data.releasePressure < data.maxReleasePressure) ? null : 'disabled')}} -
- {{=helper.link('Open', 'unlock', {'toggle' : 1}, data.valveOpen ? 'selected' : null)}} - {{=helper.link('Close', 'lock', {'toggle' : 1}, data.valveOpen ? null : 'selected')}} -
-
-

Holding Tank

-{{? data.hasHoldingTank}} - {{=helper.link('Eject', 'eject', {'remove_tank' : 1})}} -
-
- Label: +
+ {{? data.hasHoldingTank }} + The regulator is connected to a tank. + {{??}} + The regulator is not connected to a tank. + {{?}} +
+
+

Canister

+
+ {{=helper.link('Relabel', 'pencil', {'relabel' : 1}, data.canLabel ? null : 'disabled')}} +
+
+ Pressure: +
+ {{=data.tankPressure}} kPa
-
- {{=data.holdingTank.name}} +
+
+ + Port: + +
+ {{? data.portConnected}} + Connected + {{??}} + Disconnected + {{?}}
-
-
-
- Tank Pressure: +
+
+
+

Valve

+
+ Release Pressure: +
+ {{=helper.bar(data.releasePressure, data.minReleasePressure, data.maxReleasePressure, null, data.releasePressure + ' kPa')}}
-
- {{=data.holdingTank.tankPressure}} kPa +
+
+
Pressure Regulator:
+
+ {{=helper.link('Reset', 'refresh', {'release_p': 'reset'}, (data.releasePressure != data.defaultReleasePressure) ? null : 'disabled')}} + {{=helper.link('Min', 'minus', {'release_p': 'min'}, (data.releasePressure > data.minReleasePressure) ? null : 'disabled')}} + {{=helper.link('Set', 'pencil', {'release_p': 'custom'}, null)}} + {{=helper.link('Max', 'plus', {'release_p': 'max'}, (data.releasePressure < data.maxReleasePressure) ? null : 'disabled')}}
-
-{{??}} -
- No Holding Tank -
-{{?}} +
+
+
Valve:
+
+ {{=helper.link('Open', 'unlock', {'toggle' : 1}, data.valveOpen ? 'selected' : null)}} + {{=helper.link('Close', 'lock', {'toggle' : 1}, data.valveOpen ? null : 'selected')}} +
+
+ +
+

Holding Tank

+ {{? data.hasHoldingTank}} +
+ {{=helper.link('Eject', 'eject', {'remove_tank' : 1})}} +
+
+ Label: +
+ {{=data.holdingTank.name}} +
+
+
+ Tank Pressure: +
+ {{=data.holdingTank.tankPressure}} kPa +
+
+ {{??}} +
+ No Holding Tank +
+ {{?}} +
diff --git a/nano/templates/chem_dispenser.dot b/nano/templates/chem_dispenser.dot index 1a55fa93501..9012f977271 100644 --- a/nano/templates/chem_dispenser.dot +++ b/nano/templates/chem_dispenser.dot @@ -1,64 +1,55 @@ -

Status

-
-
-
- Energy: -
-
- {{=helper.bar(data.energy, 0, data.maxEnergy, 'good')}} - {{=data.energy}} Units -
-
-
-
- Amount: -
-
- {{~ data.beakerTransferAmounts :amount:i}} - {{=helper.link(amount, 'plus', {'amount': amount}, (data.amount == amount) ? 'selected' : null)}} - {{~}} -
-
-
-

Dispense

-
-
-
- {{~ data.chemicals :chem:i}} - {{=helper.link(chem.title, 'tint', chem.commands, null, 'link fixedLeft')}} - {{~}} -
-
-
-

Beaker

-
-
-
- {{=helper.link('Eject', 'eject', {'ejectBeaker' : 1}, data.isBeakerLoaded ? null : 'disabled')}} -
-
- {{~ data.beakerTransferAmounts :amount:i}} - {{=helper.link(amount, 'minus', {'remove': amount})}} - {{~}} -
-
-
-
- Contents: -
-
- {{? data.isBeakerLoaded}} - Volume: {{=data.beakerCurrentVolume}}/{{=data.beakerMaxVolume}} Units
- {{? data.beakerContents.length}} - {{~ data.beakerContents :reagent:i}} - {{=reagent.volume}} units of {{=reagent.name}}
- {{~}} - {{??}} - Beaker Empty - {{?}} - {{??}} - No Beaker Loaded - {{?}} -
-
-
+
+

Status

+
+ Energy: +
+ {{=helper.bar(data.energy, 0, data.maxEnergy, null, data.energy + ' Units')}} +
+
+
+ Amount: +
+ {{~ data.beakerTransferAmounts :amount:i}} + {{=helper.link(amount, 'plus', {'amount': amount}, (data.amount == amount) ? 'selected' : null)}} + {{~}} +
+
+
+
+

Dispense

+
+ {{~ data.chemicals :chem:i}} + {{=helper.link(chem.title, 'tint', chem.commands, null, 'gridable')}} + {{~}} + +
+
+

Beaker

+
+
+ {{=helper.link('Eject', 'eject', {'ejectBeaker' : 1}, data.isBeakerLoaded ? null : 'disabled')}} +
+
+ {{~ data.beakerTransferAmounts :amount:i}} + {{=helper.link(amount, 'minus', {'remove': amount})}} + {{~}} +
+
+
+
Contents:
+
+ {{? data.isBeakerLoaded}} + {{? data.beakerContents.length}} + {{=data.beakerCurrentVolume}}/{{=data.beakerMaxVolume}} Units
+ {{~ data.beakerContents :reagent:i}} + {{=reagent.volume}} units of {{=reagent.name}}
+ {{~}} + {{??}} + Beaker Empty + {{?}} + {{??}} + No Beaker Loaded + {{?}} +
+
+
diff --git a/nano/templates/chem_heater.dot b/nano/templates/chem_heater.dot index bbf7b1abaa0..c5d2404942b 100644 --- a/nano/templates/chem_heater.dot +++ b/nano/templates/chem_heater.dot @@ -1,34 +1,26 @@ -

Status

-
-
-
- Power: -
-
+
+

Status

+
+ Power: +
{{=helper.link(data.isActive ? 'On' : 'Off', data.isActive ? 'power' : 'close', {'toggle_on' : 1}, data.isBeakerLoaded ? null : 'disabled')}}
-
-
-
- Target: -
-
+
+
+ Target: +
{{=helper.link(data.targetTemp + 'K', 'pencil', {'adjust_temperature' : 'input'})}}
- - -

Beaker

-
-
-
- {{=helper.link('Eject', 'eject', {'eject_beaker' : 1}, data.isBeakerLoaded ? null : 'disabled')}} -
-
-
-
- Contents: -
-
+
+ +
+

Beaker

+
+ {{=helper.link('Eject', 'eject', {'eject_beaker' : 1}, data.isBeakerLoaded ? null : 'disabled')}} +
+
+ Contents: +
{{? data.isBeakerLoaded}} Temperature: {{=data.currentTemp}}K
{{? data.beakerContents.length}} @@ -42,5 +34,5 @@ No Beaker Loaded {{?}}
- +
diff --git a/nano/templates/cryo.dot b/nano/templates/cryo.dot index d5598ce8bd4..3e519977721 100644 --- a/nano/templates/cryo.dot +++ b/nano/templates/cryo.dot @@ -1,23 +1,19 @@ -

Occupant

-
-
-
- Occupant: -
-
+
+

Occupant

+
+ Occupant: +
{{? data.hasOccupant}} - {{=data.occupant.name}} + {{=data.occupant.name}} {{??}} No Occupant {{?}}
-
+ {{? data.hasOccupant}} -
-
- State: -
-
+
+ State: +
{{? data.occupant.stat == 0}} Conscious {{?? data.occupant.stat == 1}} @@ -26,118 +22,85 @@ Dead {{?}}
-
-
-
- Temperature: -
-
+ +
+ Temperature: +
{{=helper.round(data.occupant.bodyTemperature)}} K
-
+ {{?}} {{? data.occupant.stat < 2}} -
-
- Health: +
+ Health: +
+ {{=helper.bar(data.occupant.health, data.occupant.minHealth, data.occupant.Maxhealth, data.occupant.health >= 0 ? 'good' : 'average', helper.round(data.occupant.health))}}
-
- {{? data.occupant.health >= 0}} - {{=helper.bar(data.occupant.health, 0, data.occupant.maxHealth, 'good')}} - {{??}} - {{=helper.bar(data.occupant.health, 0, data.occupant.minHealth, 'average')}} - {{?}} - {{=helper.round(data.occupant.health)}} +
+
+ Brute: +
+ {{=helper.bar(data.occupant.bruteLoss, 0, data.occupant.maxHealth, 'bad', helper.round(data.occupant.bruteLoss))}}
-
-
-
- Brute: + +
+ Respiratory: +
+ {{=helper.bar(data.occupant.oxyLoss, 0, data.occupant.maxHealth, 'bad', helper.round(data.occupant.oxyLoss))}}
-
- {{=helper.bar(data.occupant.bruteLoss, 0, data.occupant.maxHealth, 'bad')}} - {{=helper.round(data.occupant.bruteLoss)}} +
+
+ Toxin: +
+ {{=helper.bar(data.occupant.toxLoss, 0, data.occupant.maxHealth, 'bad', helper.round(data.occupant.toxLoss))}}
-
-
-
- Respiratory: +
+
+ Burn: +
+ {{=helper.bar(data.occupant.fireLoss, 0, data.occupant.maxHealth, 'bad', helper.round(data.occupant.fireLoss))}}
-
- {{=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)}} -
-
+ {{?}} -
-

Cell

-
-
-
- Power: -
-
- {{=helper.link('On', 'power', {'switchOn': 1}, data.isOperating ? 'selected' : null)}} +
+
+

Cell

+
+ Power: +
+ {{=helper.link('On', 'power-off', {'switchOn': 1}, data.isOperating ? 'selected' : null)}} {{=helper.link('Off', 'close', {'switchOff': 1}, data.isOperating ? null : 'selected')}}
- -
-
- Temperature: -
-
+
+
+ Temperature: +
{{=data.cellTemperature}} K
- -
-
- Door: +
+
+ Door: +
+ {{=helper.link('Open', 'unlock', {'openCell' : 1}, data.isOpen ? 'disabled' : null)}} + {{=helper.link('Close', 'lock', {'closeCell' : 1}, data.isOpen ? null : 'disabled')}}
-
- {{=helper.link('Open', 'unlocked', {'openCell' : 1}, data.isOpen ? 'disabled' : null)}} - {{=helper.link('Close', 'locked', {'closeCell' : 1}, data.isOpen ? null : 'disabled')}} +
+
+ Eject: +
+ {{=helper.link('Auto', 'sign-out', {'autoEject' : 1}, data.autoEject ? 'selected' : null)}} + {{=helper.link('Manual', 'sign-in', {'autoEject' : 0}, data.autoEject ? null : 'selected')}}
- -
-
- 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: -
-
+
+
+
+

Beaker

+
+ {{=helper.link('Eject', 'eject', {'ejectBeaker' : 1}, data.isBeakerLoaded ? null : 'disabled')}} +
+
+ Contents: +
{{? data.isBeakerLoaded}} {{? data.beakerContents.length}} {{~ data.beakerContents :reagent:i}} @@ -150,5 +113,5 @@ No Beaker Loaded {{?}}
- - +
+ diff --git a/nano/templates/smes.dot b/nano/templates/smes.dot index 4f2d5e9f03e..ab37149991c 100644 --- a/nano/templates/smes.dot +++ b/nano/templates/smes.dot @@ -1,100 +1,89 @@ -

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')}} -   - {{? data.capacityPercent >= 99}} - [Fully Charged] - {{?? data.inputting}} - [Charging] - {{??}} - [Not Charging] - {{?}} -
-
-
-
- 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')}} -   - {{? data.outputting}} - [Sending] - {{?? data.charge > 0}} - [Not Sending] - {{??}} - [No Charge] - {{?}} -
-
-
-
- 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 -
-
-
+
+

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')}} +   + {{? data.capacityPercent >= 99}} + [Fully Charged] + {{?? data.inputting}} + [Charging] + {{??}} + [Not Charging] + {{?}} +
+
+
+ Input Setting: +
+ {{=helper.bar(data.inputLevel, 0, data.inputLevelMax, null, data.inputLevel + ' W')}} +
+
+
+ Adjust Input: +
+ {{=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')}} +   + {{? data.outputting}} + [Sending] + {{?? data.charge > 0}} + [Not Sending] + {{??}} + [No Charge] + {{?}} +
+
+
+ Output Setting: +
+ {{=helper.bar(data.outputLevel, 0, data.outputLevelMax, null, data.outputLevel + ' W')}} +
+
+
+ Adjust Output: +
+ {{=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 +
+
+
diff --git a/nano/templates/solar_control.dot b/nano/templates/solar_control.dot index 1ba3ffa390d..f87dae33f5f 100644 --- a/nano/templates/solar_control.dot +++ b/nano/templates/solar_control.dot @@ -1,80 +1,85 @@ -

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' : '')}} - {{? data.connected_tracker}} - {{=helper.link('Auto', 'signal-diag', {'track': '2'}, (data.tracking_state == 2) ? 'selected' : '')}} - {{??}} - {{=helper.link('Auto', 'signal-diag', null, 'disabled')}} - {{?}} -
-
-
-
- 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: -
-
- {{? data.connected_tracker}} - Found - {{??}} - Not Found - {{?}} -
-
-
-
- Solars Panels: -
-
- {{=data.connected_panels}} Connected -
-
-
- {{=helper.link('', 'refresh', {'search_connected': '1'})}} -
-
+
+

Status

+
+ Generated Power: +
+ {{=data.generated}} W +
+
+
+ Orientation: +
+ {{=data.angle}}° ({{=data.direction}}) +
+
+
+ Adjust: +
+ {{=helper.link('15°', 'step-backward', {'rate_control': '1', 'cdir': '-15'})}} + {{=helper.link('1°', 'backward', {'rate_control': '1', 'cdir': '-1'})}} + {{=helper.link('1°', 'forward', {'rate_control': '1', 'cdir': '1'})}} + {{=helper.link('15°', 'step-forward', {'rate_control': '1', 'cdir': '15'})}} +
+
+
+
+

Tracking

+
+ Tracker Mode: +
+ {{=helper.link('Off', 'close', {'track': '0'}, (data.tracking_state == 0) ? 'selected' : '')}} + {{=helper.link('Timed', 'clock-o', {'track': '1'}, (data.tracking_state == 1) ? 'selected' : '')}} + {{? data.connected_tracker}} + {{=helper.link('Auto', 'refresh', {'track': '2'}, (data.tracking_state == 2) ? 'selected' : '')}} + {{??}} + {{=helper.link('Auto', 'refresh', null, 'disabled')}} + {{?}} +
+
+
+ Tracking Rate: +
+ {{=data.tracking_rate}} deg/h ({{=data.rotating_way}}) +
+
+
+ Adjust: +
+ {{=helper.link('180°', 'fast-backward', {'rate_control': '1', 'tdir': '-180'})}} + {{=helper.link('30°', 'step-backward', {'rate_control': '1', 'tdir': '-30'})}} + {{=helper.link('1°', 'backward', { 'rate_control': '1', 'tdir': '-1'})}} + {{=helper.link('1°', 'forward', { 'rate_control': '1', 'tdir': '1'})}} + {{=helper.link('30°', 'step-forward', { 'rate_control': '1', 'tdir': '30'})}} + {{=helper.link('180°', 'fast-forward', { 'rate_control': '1', 'tdir': '180'})}} +
+
+
+
+

Devices

+
+ Search: +
+ {{=helper.link('Refresh', 'refresh', {'search_connected': '1'})}} +
+
+
+ + Solar Tracker: + +
+ {{? data.connected_tracker}} + Found + {{??}} + Not Found + {{?}} +
+
+
+ + Solars Panels: + +
+ {{=data.connected_panels}} Connected +
+ +
diff --git a/nano/templates/space_heater.dot b/nano/templates/space_heater.dot index 230fe27202f..5405b4013b9 100644 --- a/nano/templates/space_heater.dot +++ b/nano/templates/space_heater.dot @@ -1,76 +1,79 @@ -

Status

-
-
-
- Power: -
-
- {{=helper.link('On', 'power', {'power': 1}, !data.on ? null : 'selected')}} - {{=helper.link('Off', 'close', {'power': 0}, data.on ? null : 'selected')}} -
-
-
-
- Stored Energy: -
-
- {{? data.hasPowercell}} - {{=helper.bar(data.powerLevel, 0, 100, 'good')}} {{=data.powerLevel}}% - {{? data.open}} -
- {{=helper.link('Eject', 'eject', {'cellremove' : 1}, null)}} - {{?}} - {{??}} - No power cell loaded. - {{? data.open}} - {{=helper.link('Install', 'eject', {'cellinstall' : 1}, null )}} - {{?}} - {{?}} -
-
-
- -

Thermostat

-
-
-
- Current Temp: -
-
- {{=data.currentTemp}}°C -
-
-
-
- Target Temp: -
-
- {{=data.targetTemp}}°C - {{? data.open}} -
- {{=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')}} - {{?}} -
-
-
-
- Operational Mode: -
-
- {{? data.open}} - {{=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')}} - {{??}} - {{? data.mode == "heat"}}Heat - {{?? data.mode == "cool"}}Cool - {{??}}Auto - {{?}} - {{?}} -
-
-
+
+

Status

+
+ Power: +
+ {{=helper.link('On', 'power-off', {'power': 1}, !data.on ? null : 'selected')}} + {{=helper.link('Off', 'close', {'power': 0}, data.on ? null : 'selected')}} +
+
+
+ Stored Energy: +
+ {{? data.hasPowercell}} + {{=helper.bar(data.powerLevel, 0, 100, 'good', data.powerLevel + '%')}} + {{??}} + No power cell loaded. + {{?}} +
+
+ {{? data.open}} +
+ Cell: +
+ {{? data.hasPowercell}} + {{=helper.link('Eject', 'eject', {'cellremove': 1})}} + {{??}} + {{=helper.link('Install', 'eject', {'cellinstall': 1})}} + {{?}} +
+
+ {{?}} +
+
+

Thermostat

+
+ Current Temp: +
+ {{=data.currentTemp}}°C +
+
+
+ Target Temp: +
+ {{=data.targetTemp}}°C +
+
+ {{? data.open}} +
+ Adjustment: +
+ {{=helper.link('', 'fast-backward', {'temp': -20}, data.targetTemp > data.minTemp ? null : 'disabled')}} + {{=helper.link('', 'backward', {'temp': -5}, data.targetTemp > data.minTemp ? null : 'disabled')}} + {{=helper.link('Set', 'pencil', {'temp': 'custom'}, null)}} + {{=helper.link('', 'forward', {'temp': 5}, data.targetTemp < data.maxTemp ? null : 'disabled')}} + {{=helper.link('', 'fast-forward', {'temp': 20}, data.targetTemp < data.maxTemp ? null : 'disabled')}} +
+
+ {{?}} +
+ + Operational Mode: + +
+ {{? data.open}} + {{=helper.link('Heat', 'long-arrow-up', {'mode': 'heat'}, data.mode != "heat" ? null : 'selected')}} + {{=helper.link('Cool', 'long-arrow-down', {'mode': 'cool'}, data.mode != "cool" ? null : 'selected')}} + {{=helper.link('Auto', 'arrows-v', {'mode': 'auto'}, (data.mode == "heat" || data.mode == "cool") ? null : 'selected')}} + {{??}} + {{? data.mode == "heat"}} + Heat + {{?? data.mode == "cool"}} + Cool + {{??}} + Auto + {{?}} + {{?}} +
+
+
diff --git a/nano/templates/tanks.dot b/nano/templates/tanks.dot index 40c54bf37fd..390d3538849 100644 --- a/nano/templates/tanks.dot +++ b/nano/templates/tanks.dot @@ -1,37 +1,37 @@ -{{? data.maskConnected}} -
The regulator is connected to a mask.
-{{??}} -
The regulator is not connected to a mask.
-{{?}} -
-
- 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')}} -
-
+
+ {{? data.hasHoldingTank }} + The regulator is connected to a mask. + {{??}} + The regulator is not connected to a mask. + {{?}} +
+
+
+ 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, null, 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')}} +
+
+
+ Valve: +
+ {{=helper.link('Open', 'unlock', {'stat': 1}, data.maskConnected ? (data.valveOpen ? 'selected' : null) : 'disabled')}} + {{=helper.link('Close', 'lock', {'stat': 1}, data.valveOpen ? null : 'selected')}} +
+
+