From 7573f64bf25cdebe46b6efed2d195efde8eeda16 Mon Sep 17 00:00:00 2001 From: Gnome Ann <> Date: Wed, 29 Dec 2021 23:15:59 -0500 Subject: [PATCH 01/10] Add Memory box to Random Story dialog and "Random Story Persist" --- aiserver.py | 40 ++++++++++++++++++++++++++++++---------- bridge.lua | 4 ++++ gensettings.py | 33 +++++++++++++++++++++++++++++++++ static/application.js | 11 ++++++++++- static/custom.css | 18 +++++++++++++++++- templates/index.html | 7 +++++-- 6 files changed, 99 insertions(+), 14 deletions(-) diff --git a/aiserver.py b/aiserver.py index 454a8825..e4e4b9f5 100644 --- a/aiserver.py +++ b/aiserver.py @@ -179,6 +179,7 @@ class vars: dynamicscan = False remote = False nopromptgen = False + rngpersist = False #==================================================================# # Function to get model selection at startup @@ -1263,9 +1264,12 @@ def lua_has_setting(setting): "setchatmode", "setdynamicscan", "setnopromptgen", + "setrngpersist", "temp", "topp", + "top_p", "topk", + "top_k", "tfs", "reppen", "tknmax", @@ -1276,6 +1280,7 @@ def lua_has_setting(setting): "adventure", "dynamicscan", "nopromptgen", + "rngpersist", "frmttriminc", "frmtrmblln", "frmtrmspch", @@ -1293,8 +1298,8 @@ def lua_has_setting(setting): #==================================================================# def lua_get_setting(setting): if(setting in ("settemp", "temp")): return vars.temp - if(setting in ("settopp", "topp")): return vars.top_p - if(setting in ("settopk", "topk")): return vars.top_k + if(setting in ("settopp", "topp", "top_p")): return vars.top_p + if(setting in ("settopk", "topk", "top_k")): return vars.top_k if(setting in ("settfs", "tfs")): return vars.tfs if(setting in ("setreppen", "reppen")): return vars.rep_pen if(setting in ("settknmax", "tknmax")): return vars.max_length @@ -1305,6 +1310,7 @@ def lua_get_setting(setting): if(setting in ("setchatmode", "chatmode")): return vars.chatmode if(setting in ("setdynamicscan", "dynamicscan")): return vars.dynamicscan if(setting in ("setnopromptgen", "nopromptgen")): return vars.nopromptgen + if(setting in ("setrngpersist", "rngpersist")): return vars.rngpersist if(setting in ("frmttriminc", "triminc")): return vars.formatoptns["frmttriminc"] if(setting in ("frmtrmblln", "rmblln")): return vars.formatoptns["frmttrmblln"] if(setting in ("frmtrmspch", "rmspch")): return vars.formatoptns["frmttrmspch"] @@ -1333,6 +1339,7 @@ def lua_set_setting(setting, v): if(setting in ("setadventure", "adventure")): vars.adventure = v if(setting in ("setdynamicscan", "dynamicscan")): vars.dynamicscan = v if(setting in ("setnopromptgen", "nopromptgen")): vars.nopromptgen = v + if(setting in ("setrngpersist", "rngpersist")): vars.rngpersist = v if(setting in ("setchatmode", "chatmode")): vars.chatmode = v if(setting in ("frmttriminc", "triminc")): vars.formatoptns["frmttriminc"] = v if(setting in ("frmtrmblln", "rmblln")): vars.formatoptns["frmttrmblln"] = v @@ -1667,7 +1674,7 @@ def get_message(msg): elif(msg['cmd'] == 'newgame'): newGameRequest() elif(msg['cmd'] == 'rndgame'): - randomGameRequest(msg['data']) + randomGameRequest(msg['data'], memory=msg['memory']) elif(msg['cmd'] == 'settemp'): vars.temp = float(msg['data']) emit('from_server', {'cmd': 'setlabeltemp', 'data': msg['data']}, broadcast=True) @@ -1883,6 +1890,10 @@ def get_message(msg): vars.nopromptgen = msg['data'] settingschanged() refresh_settings() + elif(msg['cmd'] == 'setrngpersist'): + vars.rngpersist = msg['data'] + settingschanged() + refresh_settings() elif(not vars.remote and msg['cmd'] == 'importwi'): wiimportrequest() @@ -1952,6 +1963,7 @@ def savesettings(): js["chatname"] = vars.chatname js["dynamicscan"] = vars.dynamicscan js["nopromptgen"] = vars.nopromptgen + js["rngpersist"] = vars.rngpersist js["userscripts"] = vars.userscripts js["corescript"] = vars.corescript @@ -2014,6 +2026,8 @@ def loadsettings(): vars.dynamicscan = js["dynamicscan"] if("nopromptgen" in js): vars.nopromptgen = js["nopromptgen"] + if("rngpersist" in js): + vars.rngpersist = js["rngpersist"] if("userscripts" in js): vars.userscripts = [] @@ -2992,6 +3006,7 @@ def refresh_settings(): emit('from_server', {'cmd': 'updatechatmode', 'data': vars.chatmode}, broadcast=True) emit('from_server', {'cmd': 'updatedynamicscan', 'data': vars.dynamicscan}, broadcast=True) emit('from_server', {'cmd': 'updatenopromptgen', 'data': vars.nopromptgen}, broadcast=True) + emit('from_server', {'cmd': 'updaterngpersist', 'data': vars.rngpersist}, broadcast=True) emit('from_server', {'cmd': 'updatefrmttriminc', 'data': vars.formatoptns["frmttriminc"]}, broadcast=True) emit('from_server', {'cmd': 'updatefrmtrmblln', 'data': vars.formatoptns["frmtrmblln"]}, broadcast=True) @@ -4184,23 +4199,28 @@ def newGameRequest(): emit('from_server', {'cmd': 'setanote', 'data': vars.authornote}, broadcast=True) setStartState() -def randomGameRequest(topic): +def randomGameRequest(topic, memory=""): + if(vars.noai): + newGameRequest() + return vars.recentrng = topic newGameRequest() - vars.memory = "You generate the following " + topic + " story concept :" + if(len(memory) > 0): + memory = memory.rstrip() + "\n\n" + vars.memory = memory + "You generate the following " + topic + " story concept :" vars.lua_koboldbridge.feedback = None actionsubmit("", force_submit=True, force_prompt_gen=True) - vars.memory = "" + vars.memory = memory + +# Load settings from client.settings +loadmodelsettings() +loadsettings() #==================================================================# # Final startup commands to launch Flask app #==================================================================# if __name__ == "__main__": - # Load settings from client.settings - loadmodelsettings() - loadsettings() - # Start Flask/SocketIO (Blocking, so this must be last method!) #socketio.run(app, host='0.0.0.0', port=5000) diff --git a/bridge.lua b/bridge.lua index ed177c4e..ccbc05e2 100644 --- a/bridge.lua +++ b/bridge.lua @@ -867,9 +867,12 @@ return function(_python, _bridged) ---@field setadventure boolean ---@field setdynamicscan boolean ---@field setnopromptgen boolean + ---@field setrngpersist boolean ---@field temp number ---@field topp number ---@field topk integer + ---@field top_p number + ---@field top_k integer ---@field tfs number ---@field reppen number ---@field tknmax integer @@ -878,6 +881,7 @@ return function(_python, _bridged) ---@field adventure boolean ---@field dynamicscan boolean ---@field nopromptgen boolean + ---@field rngpersist boolean ---@field frmttriminc boolean ---@field frmtrmblln boolean ---@field frmtrmspch boolean diff --git a/gensettings.py b/gensettings.py index be578464..fa4e14ef 100644 --- a/gensettings.py +++ b/gensettings.py @@ -151,6 +151,17 @@ gensettingstf = [{ "step": 1, "default": 0, "tooltip": "When enabled the AI does not generate when you enter the prompt, instead you need to do an action first." + }, + { + "uitype": "toggle", + "unit": "bool", + "label": "Random Story Persist", + "id": "setrngpersist", + "min": 0, + "max": 1, + "step": 1, + "default": 0, + "tooltip": "When enabled, the Memory text box in the Random Story dialog will be prefilled by default with your current story's memory instead of being empty." }] gensettingsik =[{ @@ -251,6 +262,28 @@ gensettingsik =[{ "step": 1, "default": 0, "tooltip": "Turn this on if you are playing a Choose your Adventure model." + }, + { + "uitype": "toggle", + "unit": "bool", + "label": "No Prompt Generation", + "id": "setnopromptgen", + "min": 0, + "max": 1, + "step": 1, + "default": 0, + "tooltip": "When enabled the AI does not generate when you enter the prompt, instead you need to do an action first." + }, + { + "uitype": "toggle", + "unit": "bool", + "label": "Random Story Persist", + "id": "setrngpersist", + "min": 0, + "max": 1, + "step": 1, + "default": 0, + "tooltip": "When enabled, the Memory text box in the Random Story dialog will be prefilled by default with your current story's memory instead of being empty." }] formatcontrols = [{ diff --git a/static/application.js b/static/application.js index 560568e9..3d27c69d 100644 --- a/static/application.js +++ b/static/application.js @@ -1054,6 +1054,9 @@ function hideNewStoryPopup() { function showRandomStoryPopup() { rspopup.removeClass("hidden"); rspopup.addClass("flex"); + if($("#setrngpersist").prop("checked")) { + $("#rngmemory").val(memorytext); + } } function hideRandomStoryPopup() { @@ -2180,6 +2183,12 @@ $(document).ready(function(){ } else if(msg.cmd == "updatenopromptgen") { // Update toggle state $("#setnopromptgen").prop('checked', msg.data).change(); + } else if(msg.cmd == "updaterngpersist") { + // Update toggle state + $("#setrngpersist").prop('checked', msg.data).change(); + if(!$("#setrngpersist").prop("checked")) { + $("#rngmemory").val(""); + } } else if(msg.cmd == "runs_remotely") { remote = true; hide([button_savetofile, button_import, button_importwi]); @@ -2435,7 +2444,7 @@ $(document).ready(function(){ rs_accept.on("click", function(ev) { hideMessage(); - socket.send({'cmd': 'rndgame', 'data': topic.val()}); + socket.send({'cmd': 'rndgame', 'memory': $("#rngmemory").val(), 'data': topic.val()}); hideRandomStoryPopup(); }); diff --git a/static/custom.css b/static/custom.css index ee573bac..858cf7af 100644 --- a/static/custom.css +++ b/static/custom.css @@ -32,6 +32,22 @@ chunk.editing, chunk.editing * { display: flex; } +#topic { + margin-top: 20px; + resize: none; + overflow: auto; + background-color: #404040; + color: #ffffff; +} + +#rngmemory { + height: 80px; + resize: none; + overflow:auto; + background-color: #404040; + color: #ffffff; +} + #chatname { background-color: #404040; color: #ffffff; @@ -387,7 +403,7 @@ chunk.editing, chunk.editing * { #rspopup { width: 800px; background-color: #262626; - margin-top: 200px; + margin-top: 150px; } /*================= Classes =================*/ diff --git a/templates/index.html b/templates/index.html index df53315d..f2b9509f 100644 --- a/templates/index.html +++ b/templates/index.html @@ -10,12 +10,12 @@ - + - + @@ -353,6 +353,9 @@
+
+ +
From 276f24029e494a763318b6747f6137c1b9d8aa1d Mon Sep 17 00:00:00 2001 From: Gnome Ann <> Date: Wed, 29 Dec 2021 23:43:36 -0500 Subject: [PATCH 02/10] Author's Note Template --- aiserver.py | 50 ++++++++++++++++++++++++++++++++++++++++--- bridge.lua | 20 +++++++++++++++++ static/application.js | 6 +++++- static/custom.css | 16 +++++++++++++- templates/index.html | 16 ++++++++++---- 5 files changed, 99 insertions(+), 9 deletions(-) diff --git a/aiserver.py b/aiserver.py index e4e4b9f5..ac828af8 100644 --- a/aiserver.py +++ b/aiserver.py @@ -107,6 +107,8 @@ class vars: prompt = "" # Prompt memory = "" # Text submitted to memory field authornote = "" # Text submitted to Author's Note field + authornotetemplate = "[Author's note: <|>]" # Author's note template + setauthornotetemplate = authornotetemplate # Saved author's note template in settings andepth = 3 # How far back in history to append author's note actions = structures.KoboldStoryRegister() # Actions submitted by user and AI worldinfo = [] # List of World Info key/value objects @@ -1002,6 +1004,7 @@ def download(): js["prompt"] = vars.prompt js["memory"] = vars.memory js["authorsnote"] = vars.authornote + js["anotetemplate"] = vars.authornotetemplate js["actions"] = tuple(vars.actions.values()) js["worldinfo"] = [] @@ -1373,6 +1376,19 @@ def lua_set_authorsnote(m): assert type(m) is str vars.authornote = m +#==================================================================# +# Get contents of author's note template +#==================================================================# +def lua_get_authorsnotetemplate(): + return vars.authornotetemplate + +#==================================================================# +# Set contents of author's note template +#==================================================================# +def lua_set_authorsnotetemplate(m): + assert type(m) is str + vars.authornotetemplate = m + #==================================================================# # Save settings and send them to client #==================================================================# @@ -1530,6 +1546,8 @@ bridged = { "set_memory": lua_set_memory, "get_authorsnote": lua_get_authorsnote, "set_authorsnote": lua_set_authorsnote, + "get_authorsnote": lua_get_authorsnotetemplate, + "set_authorsnote": lua_set_authorsnotetemplate, "compute_context": lua_compute_context, "get_numseqs": lua_get_numseqs, "set_numseqs": lua_set_numseqs, @@ -1568,6 +1586,7 @@ load_lua_scripts() def do_connect(): print("{0}Client connected!{1}".format(colors.GREEN, colors.END)) emit('from_server', {'cmd': 'setchatname', 'data': vars.chatname}) + emit('from_server', {'cmd': 'setanotetemplate', 'data': vars.authornotetemplate}) emit('from_server', {'cmd': 'connected', 'smandelete': vars.smandelete, 'smanrename': vars.smanrename}) if(vars.remote): emit('from_server', {'cmd': 'runs_remotely'}) @@ -1717,7 +1736,7 @@ def get_message(msg): refresh_settings() # Author's Note field update elif(msg['cmd'] == 'anote'): - anotesubmit(msg['data']) + anotesubmit(msg['data'], template=msg['template']) # Author's Note depth update elif(msg['cmd'] == 'anotedepth'): vars.andepth = int(msg['data']) @@ -1964,6 +1983,7 @@ def savesettings(): js["dynamicscan"] = vars.dynamicscan js["nopromptgen"] = vars.nopromptgen js["rngpersist"] = vars.rngpersist + js["antemplate"] = vars.setauthornotetemplate js["userscripts"] = vars.userscripts js["corescript"] = vars.corescript @@ -2028,6 +2048,11 @@ def loadsettings(): vars.nopromptgen = js["nopromptgen"] if("rngpersist" in js): vars.rngpersist = js["rngpersist"] + + if("antemplate" in js): + vars.setauthornotetemplate = js["antemplate"] + if(not vars.gamestarted): + vars.authornotetemplate = vars.setauthornotetemplate if("userscripts" in js): vars.userscripts = [] @@ -2288,7 +2313,7 @@ def calcsubmitbudgetheader(txt, **kwargs): # Build Author's Note if set if(vars.authornote != ""): - anotetxt = "\n[Author's note: "+vars.authornote+"]\n" + anotetxt = ("\n" + vars.authornotetemplate + "\n").replace("<|>", vars.authornote) else: anotetxt = "" @@ -3114,6 +3139,7 @@ def togglememorymode(): emit('from_server', {'cmd': 'memmode', 'data': 'true'}, broadcast=True) emit('from_server', {'cmd': 'setinputtext', 'data': vars.memory}, broadcast=True) emit('from_server', {'cmd': 'setanote', 'data': vars.authornote}, broadcast=True) + emit('from_server', {'cmd': 'setanotetemplate', 'data': vars.authornotetemplate}, broadcast=True) elif(vars.mode == "memory"): vars.mode = "play" emit('from_server', {'cmd': 'memmode', 'data': 'false'}, broadcast=True) @@ -3415,11 +3441,17 @@ def memsubmit(data): #==================================================================# # Commit changes to Author's Note #==================================================================# -def anotesubmit(data): +def anotesubmit(data, template=""): + assert type(data) is str and type(template) is str # Maybe check for length at some point # For now just send it to storage vars.authornote = data + if(vars.authornotetemplate != template): + vars.setauthornotetemplate = template + settingschanged() + vars.authornotetemplate = template + #==================================================================# # Assembles game data into a request to InferKit API #==================================================================# @@ -3648,6 +3680,7 @@ def saveRequest(savpath): js["prompt"] = vars.prompt js["memory"] = vars.memory js["authorsnote"] = vars.authornote + js["anotetemplate"] = vars.authornotetemplate js["actions"] = tuple(vars.actions.values()) js["worldinfo"] = [] js["wifolders_d"] = vars.wifolders_d @@ -3790,6 +3823,10 @@ def loadRequest(loadpath, filename=None): vars.authornote = js["authorsnote"] else: vars.authornote = "" + if("anotetemplate" in js): + vars.authornotetemplate = js["anotetemplate"] + else: + vars.authornotetemplate = "[Author's Note: <|>]" if("worldinfo" in js): num = 0 @@ -3840,6 +3877,7 @@ def loadRequest(loadpath, filename=None): sendwi() emit('from_server', {'cmd': 'setmemory', 'data': vars.memory}, broadcast=True) emit('from_server', {'cmd': 'setanote', 'data': vars.authornote}, broadcast=True) + emit('from_server', {'cmd': 'setanotetemplate', 'data': vars.authornotetemplate}, broadcast=True) refresh_story() emit('from_server', {'cmd': 'setgamestate', 'data': 'ready'}, broadcast=True) emit('from_server', {'cmd': 'hidegenseqs', 'data': ''}, broadcast=True) @@ -3971,6 +4009,7 @@ def importgame(): vars.prompt = "" vars.memory = ref["memory"] vars.authornote = ref["authorsNote"] if type(ref["authorsNote"]) is str else "" + vars.authornotetemplate = "[Author's Note: <|>]" vars.actions = structures.KoboldStoryRegister() vars.worldinfo = [] vars.worldinfo_i = [] @@ -4040,6 +4079,7 @@ def importgame(): sendwi() emit('from_server', {'cmd': 'setmemory', 'data': vars.memory}, broadcast=True) emit('from_server', {'cmd': 'setanote', 'data': vars.authornote}, broadcast=True) + emit('from_server', {'cmd': 'setanotetemplate', 'data': vars.authornotetemplate}, broadcast=True) refresh_story() emit('from_server', {'cmd': 'setgamestate', 'data': 'ready'}, broadcast=True) emit('from_server', {'cmd': 'hidegenseqs', 'data': ''}, broadcast=True) @@ -4061,6 +4101,7 @@ def importAidgRequest(id): vars.prompt = js["promptContent"] vars.memory = js["memory"] vars.authornote = js["authorsNote"] + vars.authornotetemplate = "[Author's Note: <|>]" vars.actions = structures.KoboldStoryRegister() vars.worldinfo = [] vars.worldinfo_i = [] @@ -4114,6 +4155,7 @@ def importAidgRequest(id): sendwi() emit('from_server', {'cmd': 'setmemory', 'data': vars.memory}, broadcast=True) emit('from_server', {'cmd': 'setanote', 'data': vars.authornote}, broadcast=True) + emit('from_server', {'cmd': 'setanotetemplate', 'data': vars.authornotetemplate}, broadcast=True) refresh_story() emit('from_server', {'cmd': 'setgamestate', 'data': 'ready'}, broadcast=True) @@ -4179,6 +4221,7 @@ def newGameRequest(): vars.actions = structures.KoboldStoryRegister() vars.authornote = "" + vars.authornotetemplate = vars.setauthornotetemplate vars.worldinfo = [] vars.worldinfo_i = [] vars.worldinfo_u = {} @@ -4197,6 +4240,7 @@ def newGameRequest(): sendwi() emit('from_server', {'cmd': 'setmemory', 'data': vars.memory}, broadcast=True) emit('from_server', {'cmd': 'setanote', 'data': vars.authornote}, broadcast=True) + emit('from_server', {'cmd': 'setanotetemplate', 'data': vars.authornotetemplate}, broadcast=True) setStartState() def randomGameRequest(topic, memory=""): diff --git a/bridge.lua b/bridge.lua index ccbc05e2..aec5f81f 100644 --- a/bridge.lua +++ b/bridge.lua @@ -145,6 +145,8 @@ return function(_python, _bridged) --========================================================================== ---@class KoboldLib + ---@field authorsnote string + ---@field authorsnotetemplate string ---@field memory string ---@field submission string ---@field model string @@ -998,6 +1000,24 @@ return function(_python, _bridged) bridged.set_authorsnote(v) end + ---@param t KoboldLib + ---@return string + function KoboldLib_getters.authorsnotetemplate(t) + return bridged.get_authorsnotetemplate() + end + + ---@param t KoboldLib + ---@param v string + ---@return KoboldLib + function KoboldLib_setters.authorsnotetemplate(t, v) + if type(v) ~= "string" then + error("`KoboldLib.authorsnotetemplate` must be a string; you attempted to set it to a "..type(v)) + return + end + maybe_require_regeneration() + bridged.set_authorsnotetemplate(v) + end + --========================================================================== -- Userscript API: User-submitted text (after applying input formatting) diff --git a/static/application.js b/static/application.js index 3d27c69d..a6547922 100644 --- a/static/application.js +++ b/static/application.js @@ -1420,6 +1420,7 @@ function downloadStory(format) { prompt: prompt, memory: memorytext, authorsnote: $("#anoteinput").val(), + anotetemplate: $("#anotetemplate").val(), actions: actionlist_compiled, worldinfo: wilist_compiled, wifolders_d: wifolders_d, @@ -2000,10 +2001,13 @@ $(document).ready(function(){ } else if(msg.cmd == "getanote") { // Request contents of Author's Note field var txt = anote_input.val(); - socket.send({'cmd': 'anote', 'data': txt}); + socket.send({'cmd': 'anote', 'template': $("#anotetemplate").val(), 'data': txt}); } else if(msg.cmd == "setanote") { // Set contents of Author's Note field anote_input.val(msg.data); + } else if(msg.cmd == "setanotetemplate") { + // Set contents of Author's Note Template field + $("#anotetemplate").val(msg.data); } else if(msg.cmd == "addsetting") { // Add setting controls addSetting(msg.data); diff --git a/static/custom.css b/static/custom.css index 858cf7af..b95ebf86 100644 --- a/static/custom.css +++ b/static/custom.css @@ -212,9 +212,19 @@ chunk.editing, chunk.editing * { padding-right: 10px; } -#anoteinput { +#anoteinput, #anotetemplate { background-color: #404040; color: #ffffff; + resize: none; + overflow: auto; +} + +#anoteinput { + height: 60px; +} + +#anotetemplate { + height: 60px; } #anoteslidelabel { @@ -428,6 +438,10 @@ chunk.editing, chunk.editing * { color: #ffffff; } +.anotelabel:not(.no-padding) { + padding-top: 10px; +} + .airange { width: 100px; } diff --git a/templates/index.html b/templates/index.html index f2b9509f..7dee78a6 100644 --- a/templates/index.html +++ b/templates/index.html @@ -10,12 +10,12 @@ - + - + @@ -146,11 +146,11 @@
-
+
Author's Note
- +
@@ -175,6 +175,14 @@
+
+
+ Author's Note Template (the "<|>" will be replaced with the Author's Note text) +
+
+ +
+
From 3532a30ad44bb096187b31c54ec3c5c5b8e764c8 Mon Sep 17 00:00:00 2001 From: Gnome Ann <> Date: Thu, 30 Dec 2021 01:44:35 -0500 Subject: [PATCH 03/10] Make the UI theme grey when not connected to server --- static/application.js | 2 + static/custom.css | 140 +++++++++++++++++++++++++++++++++++++++--- templates/index.html | 12 ++-- 3 files changed, 139 insertions(+), 15 deletions(-) diff --git a/static/application.js b/static/application.js index a6547922..337574c4 100644 --- a/static/application.js +++ b/static/application.js @@ -1815,6 +1815,7 @@ $(document).ready(function(){ document.activeElement.blur(); active_element.focus(); })(); + $("body").addClass("connected"); } else if(msg.cmd == "updatescreen") { var _gamestarted = gamestarted; gamestarted = msg.gamestarted; @@ -2201,6 +2202,7 @@ $(document).ready(function(){ socket.on('disconnect', function() { connected = false; + $("body").removeClass("connected"); connect_status.html("Lost connection..."); connect_status.removeClass("color_green"); connect_status.addClass("color_orange"); diff --git a/static/custom.css b/static/custom.css index b95ebf86..f1c50115 100644 --- a/static/custom.css +++ b/static/custom.css @@ -27,11 +27,15 @@ chunk.editing, chunk.editing * { } #topmenu { - background-color: #337ab7; + background-color: #757575; padding: 10px; display: flex; } +body.connected #topmenu, #topmenu.always-available { + background-color: #337ab7; +} + #topic { margin-top: 20px; resize: none; @@ -66,10 +70,14 @@ chunk.editing, chunk.editing * { #navbar li { margin-right: 5px; - background-color: #4787be; + background-color: #828282; border-radius: 5px; } +body.connected #navbar li, #navbar li.always-available { + background-color: #4787be; +} + #navbar li > a { color: #ffffff; font-weight: bold; @@ -78,16 +86,24 @@ chunk.editing, chunk.editing * { #settingsmenu { display: flex; flex-wrap: wrap; - background-color: #295071; + background-color: #4d4d4d; padding: 10px; } +body.connected #settingsmenu, #settingsmenu.always-available { + background-color: #295071; +} + #formatmenu { display:none; - background-color: #295071; + background-color: #4d4d4d; padding: 10px; } +body.connected #formatmenu, #formatmenu.always-available { + background-color: #295071; +} + #connectstatusdiv { display: flex; text-align: right; @@ -255,6 +271,10 @@ chunk.editing, chunk.editing * { #popuptitlebar { padding: 10px; + background-color: #757575; +} + +body.connected #popuptitlebar, #popuptitlebar.always-available { background-color: #337ab7; } @@ -283,6 +303,10 @@ chunk.editing, chunk.editing * { padding: 10px; display: flex; justify-content: center; + background-color: #4d4d4d; +} + +body.connected #popupfooter, #popupfooter.always-available { background-color: #295071; } @@ -418,6 +442,44 @@ chunk.editing, chunk.editing * { /*================= Classes =================*/ +body:not(.connected) .btn-primary { + background-color: #757575; + border-color: #4a4a4a; +} + +.btn-primary.always-available { + background-color: #337ab7; + border-color: #2e6da4; +} + +body:not(.connected) .btn-primary.focus, body:not(.connected) .btn-primary:focus { + background-color: #5c5c5c; + border-color: #292929; +} + +.btn-primary.focus.always-available, .btn-primary.always-available:focus { + background-color: #286090; + border-color: #122b40; +} + +body:not(.connected) .btn-primary:hover { + background-color: #5c5c5c; + border-color: #4a4a4a; +} + +.btn-primary.always-available:hover { + background-color: #286090; + border-color: #204d74; +} + +body:not(.connected) a.dropdown-item:focus, body:not(.connected) a.dropdown-item:hover { + color: #4f4f4f; +} + +a.dropdown-item.always-available:focus, a.dropdown-item.always-available:hover { + color: #23527c !important; +} + .aidgpopupcontent { padding: 10px 40px 10px 40px; } @@ -495,26 +557,42 @@ chunk.editing, chunk.editing * { } .dropdown-menu { - background-color: #337ab7; + background-color: #757575; width: 200px; } +body.connected .dropdown-menu, .dropdown-menu.always-available { + background-color: #337ab7; +} + .dropdown-item { display: block; padding: 10px; color: #ffffff; + border-bottom: 1px solid #4d4d4d; +} + +body.connected .dropdown-item, .dropdown-item.always-available { border-bottom: 1px solid #295071; } .dropdown-item:first-child { + border-top: 1px solid #4d4d4d; +} + +body.connected .dropdown-item:first-child, .dropdown-item:first-child.always-available { border-top: 1px solid #295071; } .dropdown-item:hover { - background-color: #98bcdb; + background-color: #bababa; text-decoration: none; } +body.connected .dropdown-item:hover, .dropdown-item.always-available:hover { + background-color: #98bcdb; +} + .edit-flash, .edit-flash * { color: #3bf723 !important; } @@ -708,6 +786,10 @@ chunk.editing, chunk.editing * { font-size: 1.4ex; line-height: 1.8ex; text-decoration: none; + color: #9e9e9e; +} + +body.connected .statusicon, .statusicon.always-available { color: #68a2d4; } @@ -739,12 +821,16 @@ chunk.editing, chunk.editing * { .statusiconlabel { pointer-events: none; - color: #337ab7; + color: #757575; text-align: center; font-weight: bold; font-size: 13px; } +body.connected .statusiconlabel, .statusiconlabel.always-available { + color: #337ab7; +} + #usiconlabel { transform: translate(-3px, 10px); -moz-transform: translate(-3px, 10px); @@ -976,23 +1062,51 @@ chunk.editing, chunk.editing * { .navbar .navbar-nav .nav-link:hover { border-radius: 5px; + background-color: #bababa; +} + +body.connected .navbar .navbar-nav .nav-link:hover, .navbar .navbar-nav .nav-link.always-available:hover { + background-color: #98bcdb; +} + +body .navbar .navbar-nav .dropdown-item.always-available { + background-color: #337ab7; +} + +body .navbar .navbar-nav .dropdown-item.always-available:hover { background-color: #98bcdb; } .navbar .navbar-nav .nav-link:focus { border-radius: 5px; + background-color: #bababa; +} + +body.connected .navbar .navbar-nav .nav-link:focus, .navbar .navbar-nav .nav-link.always-available:focus { background-color: #98bcdb; } .navbar-toggler { - background-color: #337ab7; - border: 1px solid #98bcdb; + background-color: #757575; + border: 1px solid #bababa; height: 45px; width: 60px; border-radius: 6px; } +body.connected .navbar-toggler, .navbar-toggler.always-available { + border: 1px solid #98bcdb; +} + +body .navbar-toggler { + background-color: #337ab7; +} + .navbar-toggler:hover { + background-color: #bababa; +} + +body.connected .navbar-togger:hover, .navbar-togger.always-available:hover { background-color: #98bcdb; } @@ -1062,6 +1176,10 @@ chunk.editing, chunk.editing * { .popuptitlebar { padding: 10px; + background-color: #757575; +} + +body .popuptitlebar { background-color: #337ab7; } @@ -1083,6 +1201,10 @@ chunk.editing, chunk.editing * { padding: 10px; display: flex; justify-content: center; + background-color: #4d4d4d; +} + +body.connected .popupfooter, .popupfooter.always-available { background-color: #295071; } diff --git a/templates/index.html b/templates/index.html index 7dee78a6..0b26c29b 100644 --- a/templates/index.html +++ b/templates/index.html @@ -10,12 +10,12 @@ - + - + @@ -39,14 +39,14 @@ Random Story -