From 40c4659e18b67a678ebb47392798187eb6861168 Mon Sep 17 00:00:00 2001 From: Nils Schneider Date: Wed, 22 Jan 2014 16:51:26 +0100 Subject: [PATCH 1/4] gluon-luci-theme: new theme, still magenta/yellow This is the initial version of our new configmode theme. It's far from finished but at least configmode looks good. There are lots of declarations copied from OpenWRT's default theme so most other luci modules would be somewhat usable when shown using this theme. --- package/gluon-luci-theme/Makefile | 39 + .../files/etc/uci-defaults/luci-theme-gluon | 6 + .../lib/lua/luci/view/themes/gluon/footer.htm | 19 + .../lib/lua/luci/view/themes/gluon/header.htm | 164 +++ .../files/www/luci-static/gluon/cascade.css | 804 +++++++++++++ package/gluon-luci-theme/sass/cascade.scss | 1014 +++++++++++++++++ 6 files changed, 2046 insertions(+) create mode 100644 package/gluon-luci-theme/Makefile create mode 100755 package/gluon-luci-theme/files/etc/uci-defaults/luci-theme-gluon create mode 100644 package/gluon-luci-theme/files/usr/lib/lua/luci/view/themes/gluon/footer.htm create mode 100644 package/gluon-luci-theme/files/usr/lib/lua/luci/view/themes/gluon/header.htm create mode 100644 package/gluon-luci-theme/files/www/luci-static/gluon/cascade.css create mode 100644 package/gluon-luci-theme/sass/cascade.scss diff --git a/package/gluon-luci-theme/Makefile b/package/gluon-luci-theme/Makefile new file mode 100644 index 00000000..4fc947c4 --- /dev/null +++ b/package/gluon-luci-theme/Makefile @@ -0,0 +1,39 @@ +# Copyright (C) 2013 Nils Schneider +# This is free software, licensed under the Apache 2.0 license. + +include $(TOPDIR)/rules.mk + +PKG_NAME:=gluon-luci-theme +PKG_VERSION:=0.1 +PKG_RELEASE:=1 + +PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) + +include $(INCLUDE_DIR)/package.mk + +define Package/gluon-luci-theme + SECTION:=gluon + CATEGORY:=Gluon + TITLE:=Luci theme for Gluon + DEPENDS:= +endef + +define Package/gluon-luci-theme/description + Luci based config mode +endef + +define Build/Prepare + mkdir -p $(PKG_BUILD_DIR) +endef + +define Build/Configure +endef + +define Build/Compile +endef + +define Package/gluon-luci-theme/install + $(CP) ./files/* $(1)/ +endef + +$(eval $(call BuildPackage,gluon-luci-theme)) diff --git a/package/gluon-luci-theme/files/etc/uci-defaults/luci-theme-gluon b/package/gluon-luci-theme/files/etc/uci-defaults/luci-theme-gluon new file mode 100755 index 00000000..795bd186 --- /dev/null +++ b/package/gluon-luci-theme/files/etc/uci-defaults/luci-theme-gluon @@ -0,0 +1,6 @@ +#!/bin/sh +uci batch <<-EOF + set luci.themes.Gluon=/luci-static/gluon + commit luci +EOF + diff --git a/package/gluon-luci-theme/files/usr/lib/lua/luci/view/themes/gluon/footer.htm b/package/gluon-luci-theme/files/usr/lib/lua/luci/view/themes/gluon/footer.htm new file mode 100644 index 00000000..6b709030 --- /dev/null +++ b/package/gluon-luci-theme/files/usr/lib/lua/luci/view/themes/gluon/footer.htm @@ -0,0 +1,19 @@ +<%# +LuCI - Lua Configuration Interface +Copyright 2008 Steven Barth +Copyright 2008 Jo-Philipp Wich + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +$Id$ + +-%> + + + + + diff --git a/package/gluon-luci-theme/files/usr/lib/lua/luci/view/themes/gluon/header.htm b/package/gluon-luci-theme/files/usr/lib/lua/luci/view/themes/gluon/header.htm new file mode 100644 index 00000000..c0f10b75 --- /dev/null +++ b/package/gluon-luci-theme/files/usr/lib/lua/luci/view/themes/gluon/header.htm @@ -0,0 +1,164 @@ +<%# +LuCI - Lua Configuration Interface +Copyright 2008 Steven Barth +Copyright 2008-2010 Jo-Philipp Wich + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +$Id$ + +-%> +<% + local sys = require "luci.sys" + local http = require "luci.http" + local disp = require "luci.dispatcher" + + local hostname = sys.hostname() + local load1, load5, load15 = sys.loadavg() + + local request = disp.context.path + local request2 = disp.context.request + + local category = request[1] + local cattree = category and disp.node(category) + + local leaf = request2[#request2] + + local tree = disp.node() + local node = disp.context.dispatched + + local categories = disp.node_childs(tree) + + local c = tree + local i, r + + -- tag all nodes leading to this page + for i, r in ipairs(request) do + if c.nodes and c.nodes[r] then + c = c.nodes[r] + c._menu_selected = true + end + end + + http.prepare_content("application/xhtml+xml") + + local function nodeurl(prefix, name, query) + local url = controller .. prefix .. name .. "/" + if query then + url = url .. http.build_querystring(query) + end + return pcdata(url) + end + + local function subtree(prefix, node, level) + if not level then + level = 1 + end + + local childs = disp.node_childs(node) + if #childs > 0 then +%> +
+
    + <% + local selected_node + local selected_name + local i, v + + for i, v in ipairs(childs) do + local nnode = node.nodes[v] + if nnode._menu_selected then + selected_node = nnode + selected_name = v + end + %> +
  • + <%=striptags(translate(nnode.title))%> +
  • + <% + end + %> +
+
+<% + if selected_node then + subtree(prefix .. selected_name .. "/", selected_node, level + 1) + end +%> +
+<% + end + end +-%> + + + + + + + + +<% if node and node.css then %> +<% end -%> +<% if css then %> +<% end -%> + +<%=striptags( hostname .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> - LuCI + + + + + +
+ <% if category then subtree("/" .. category .. "/", cattree) end %> + +
+ diff --git a/package/gluon-luci-theme/files/www/luci-static/gluon/cascade.css b/package/gluon-luci-theme/files/www/luci-static/gluon/cascade.css new file mode 100644 index 00000000..e8fa9f7d --- /dev/null +++ b/package/gluon-luci-theme/files/www/luci-static/gluon/cascade.css @@ -0,0 +1,804 @@ +@charset "UTF-8"; +.lang_he { + direction: RTL; + unicode-bidi: embed; } + +.hidden { + display: none; } + +html { + min-height: 100%; + height: auto; + position: relative; } + +body { + font-family: 'Open Sans', Arial, sans-serif; + font-size: 12pt; + color: #4d4e53; + line-height: 1.5em; + margin: 0; + display: flex; + flex-direction: column; + min-height: 100vh; + background-color: #f3f3f3; } + +a img { + border: none; + text-decoration: none; } + +.tabmenu1 { + text-align: center; } + +ul.tabmenu { + list-style: none; + padding: 0; + margin: 2em 0; + display: inline-flex; } + +ul.tabmenu li { + white-space: nowrap; + margin: 0 0.5em; + padding: 0; + text-align: center; } + ul.tabmenu li a { + display: block; + text-decoration: none; + padding: 1em; + margin: 0; + color: #333; + border-radius: 2em; } + ul.tabmenu li a:hover { + background: #ffe9b3; } + ul.tabmenu li.active a { + font-weight: bold; + background: white; + color: #333; } + +abbr, +acronym { + font-style: normal; + font-variant: normal; } + +abbr[title], +acronym[title] { + border-bottom: 1px dotted; + cursor: help; } + +a:link abbr[title], +a:visited abbr[title], +a:link acronym[title], +a:visited acronym[title] { + cursor: pointer; } + +code { + font-family: monospace; + white-space: pre; } + +#maincontent ul { + margin-left: 2em; } + +.warning { + color: red; + background-color: white; + font-weight: bold; } + +.clear { + clear: both; } + +.error { + color: #ff0000; + background-color: white; } + +div.hostinfo { + margin: 0; + padding: 0; + font-size: 80%; + padding: 0.5em; + flex: 1; + font-weight: bold; } + +#xhr_poll_status { + cursor: pointer; } + +#xhr_poll_status #xhr_poll_status_off { + font-weight: bold; + color: #FF0000; } + +#xhr_poll_status #xhr_poll_status_on { + font-weight: bold; + color: #00FF00; } + +#menubar { + display: flex; + background: #dc0067; + color: #ffffff; } + +#menubar .warning { + color: red; + background-color: #557788; } + +#menubar a:link, +#menubar a:visited { + position: relative; + display: block; + padding: 0.5em; + text-decoration: none; + font-size: 80%; + font-weight: normal; + color: white; } + +#menubar a:link:hover, +#menubar a:visited:hover, +#menubar a:link:focus, +#menubar a:visited:focus { + background: #ffb400; + color: black; } + +#menubar a:link.active, +#menubar a:visited.active { + background: #ffb400; + color: black; + font-weight: bold; } + +#menubar a:link.warning, +#menubar a:visited.warning { + background: #000000; + color: red; + font-weight: bold; } + +#modemenu { + list-style: none; + margin: 0; + padding: 0; } + +#modemenu li { + display: inline-block; } + +.lang_de #submenu_admin_uci { + width: 12em; } + +.lang_ru #submenu_admin_uci { + width: 11.5em; } + +textarea#syslog { + width: 98%; + min-height: 500px; + border: 3px solid #cccccc; + padding: 5px; + font-family: monospace; } + +#maincontent { + padding: 0 1em 2em; + max-width: 60em; + min-width: 40em; + margin: 1em auto; } + +.lang_he #maincontent { + direction: rtl; } + +#maincontent p { + margin-bottom: 1em; } + +.cbi-section { + margin: 0; + padding: 0; + border: none; } + +.cbi-section legend { + font-size: 1.4em; + font-weight: bold; + color: #dc0067; + position: relative; + padding: 0; + margin-bottom: 0.5em; } + +.cbi-section h2 { + margin: 0em 0 0.5em -0.5em !important; } + +.cbi-section h3 { + text-decoration: none !important; + font-weight: bold !important; + color: #555555 !important; + margin: 0.25em !important; + font-size: 100% !important; } + +.cbi-section-descr { + margin-bottom: 2em; } + +.cbi-title-ref { + color: inherit; + text-decoration: none; + padding-right: 18px; + background: url("../resources/cbi/link.gif") no-repeat scroll right center; + background-color: inherit; } + +ul.cbi-apply { + font-size: 90%; } + +input:-webkit-input-placeholder { + color: #AAAAAA; } + +input:-moz-placeholder { + color: #AAAAAA; } + +input:-ms-input-placeholder { + color: #AAAAAA; } + +input[type=checkbox] { + -moz-appearance: none; + -webkit-appearance: none; + -o-appearance: none; + appearance: none; + width: 2em; + height: 2em; + margin: 0; } + input[type=checkbox]:checked { + position: relative; } + input[type=checkbox]:checked::after { + content: '✔'; + color: #dc0067; + vertical-align: middle; + position: absolute; + top: 50%; + left: 0; + margin-top: -0.5em; + width: 100%; + text-align: center; + font-size: 1.7em; } + +input[type=submit], +input[type=reset], +input[type=image], +input[type=button] { + cursor: pointer; } + +select, +input, +textarea { + color: #003247; + border: none; + background: #ffe199; + border-radius: 3pt; + padding: 0.5em; } + +input[type=image] { + border: none; } + +select, +input[type=text], +input[type=password] { + width: 20em; } + +td select, +td input[type=text], +td input[type=password] { + width: 99%; } + +img.cbi-image-button { + cursor: pointer; + margin: 0 2px; + vertical-align: middle; } + +input.cbi-button { + display: inline-block; + zoom: 1; + line-height: normal; + white-space: nowrap; + vertical-align: baseline; + text-align: center; + cursor: pointer; + -webkit-user-drag: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + font-size: 100%; + padding: 0.5em 1em; + color: rgba(0, 0, 0, 0.8); + border: none rgba(0, 0, 0, 0); + background-color: #E6E6E6; + text-decoration: none; + border-radius: 2px; + /* Transitions */ + -webkit-transition: 0.1s linear -webkit-box-shadow; + -moz-transition: 0.1s linear -moz-box-shadow; + -ms-transition: 0.1s linear box-shadow; + -o-transition: 0.1s linear box-shadow; + transition: 0.1s linear box-shadow; + background-repeat: no-repeat; } + input.cbi-button::-moz-focus-inner { + padding: 0; + border: 0; } + input.cbi-button:active { + box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.15) inset, 0 0 6px rgba(0, 0, 0, 0.2) inset; } + input.cbi-button:focus { + outline: 0; } + input.cbi-button:hover, input.cbi-button:focus { + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(transparent), color-stop(40%, rgba(0, 0, 0, 0.05)), to(rgba(0, 0, 0, 0.1))); + background-image: -webkit-linear-gradient(transparent, rgba(0, 0, 0, 0.05) 40%, rgba(0, 0, 0, 0.1)); + background-image: -moz-linear-gradient(top, rgba(0, 0, 0, 0.05) 0%, rgba(0, 0, 0, 0.1)); + background-image: -o-linear-gradient(transparent, rgba(0, 0, 0, 0.05) 40%, rgba(0, 0, 0, 0.1)); + background-image: linear-gradient(transparent, rgba(0, 0, 0, 0.05) 40%, rgba(0, 0, 0, 0.1)); } + input.cbi-button[disabled] { + border: none; + background-image: none; + opacity: 0.40; + cursor: not-allowed; + box-shadow: none; } + +input.cbi-input-user { + background-image: url("../resources/cbi/user.gif"); + background-repeat: no-repeat; + background-position: 1px center; + color: #000000; + text-indent: 17px; } + +input.cbi-input-find, +input.cbi-button-find { + background-image: url("../resources/cbi/find.gif"); + color: #000000; + padding-left: 17px; } + +input.cbi-input-reload { + background-image: url("../resources/cbi/reload.gif"); + color: #000000; + padding-left: 17px; } + +input.cbi-input-add, +input.cbi-button-add { + background-image: url("../resources/cbi/add.gif"); + color: #000000; + padding-left: 17px; + padding-right: 1px; } + +input.cbi-input-fieldadd, +input.cbi-button-fieldadd { + background-image: url(../resources/cbi/fieldadd.gif); + color: #000000; + padding-left: 17px; + padding-right: 1px; } + +input.cbi-input-reset, +input.cbi-button-reset { + background-color: #ee3300; + color: #fff; } + +input.cbi-input-save, +input.cbi-button-save { + background-color: #009ee0; + color: #fff; } + +input.cbi-input-apply, +input.cbi-button-apply { + background-color: #009ee0; + color: #fff; } + +input.cbi-input-link, +input.cbi-button-link { + background-image: url("../resources/cbi/link.gif"); + color: #000000; + padding-left: 17px; + padding-right: 1px; } + +input.cbi-input-download, +input.cbi-button-download { + background-image: url("../resources/cbi/download.gif"); + color: #000000; + padding-left: 17px; + padding-right: 1px; } + +input.cbi-input-remove, +div.cbi-section-remove input { + background-image: url("../resources/cbi/remove.gif"); + color: #000000; + padding-left: 17px; + padding-right: 1px; } + +input.cbi-button-up { + background-image: url("../resources/cbi/up.gif"); + padding-left: 11px; + padding-right: 1px; } + +input.cbi-button-down { + background-image: url("../resources/cbi/down.gif"); + padding-left: 11px; + padding-right: 1px; } + +input.cbi-button-edit { + background-image: url("../resources/cbi/edit.gif"); + color: #000000; + padding-left: 17px; + padding-right: 1px; } + +input.cbi-button-reload { + background-image: url("../resources/cbi/reload.gif"); + color: #000000; + padding-left: 17px; + padding-right: 1px; } + +input.cbi-button-remove { + background-image: url("../resources/cbi/remove.gif"); + color: #000000; + padding-left: 17px; + padding-right: 1px; } + +.cbi-input-invalid { + background: #ee3300 !important; + color: white; } + +div.cbi-section-remove input { + border-bottom: none; } + +textarea { + margin-left: -1px; + margin-bottom: 0.5em; } + +form > div > input[type=submit], +form > div > input[type=reset] { + margin-left: 0.5em; } + +table td, +table th { + color: #000000; } + +table.smalltext { + background: #f5f5f5; + color: #000000; + border-top: 1px solid #666666; + border-right: 1px solid #666666; + border-bottom: 1px solid #666666; + font-size: 90%; + width: 80%; + margin-left: auto; + margin-right: auto; + border-collapse: collapse; } + +table.smalltext tr:hover td { + background-color: #bbddee; + color: #000000; } + +table.smalltext tr th { + padding: 0 0.25em; + border-left: 1px solid #666666; + text-align: left; } + +table.smalltext tr td { + padding: 0 0.25em; + border-top: 1px solid #666666; + border-left: 1px solid #666666; } + +table.cbi-section-table .cbi-rowstyle-1 { + background-color: #eeeeff; + color: #000000; } + +table.cbi-section-table .cbi-rowstyle-1:hover, +table.cbi-section-table .cbi-rowstyle-2:hover { + background-color: #b2c8d4; + color: #000000; } + +table.cbi-section-table .cbi-section-table-cell { + padding: 3px; + white-space: nowrap; } + +.cbi-section .cbi-rowstyle-1 h3 { + background-color: #eeeeff; + color: #555555; } + +.cbi-rowstyle-2 { + color: #000000; } + +div.cbi-value { + display: flex; + flex-direction: row; + margin-bottom: 0.5em; } + +.cbi-value-title { + flex: 2; + text-align: right; + padding-top: 0.39em; + padding-right: 1em; + font-weight: bold; } + +div.cbi-value-field { + flex: 3; } + +div.cbi-value-description { + font-size: 8pt; } + +div.cbi-section-create { + clear: left; + white-space: nowrap; + vertical-align: top; } + +div.cbi-section-create .cbi-button { + margin: 0.25em; } + +input.cbi-section-create-name { + margin-right: -0.25em; } + +div.cbi-map-descr { + margin-bottom: 1em; } + +.cbi-map-descr:empty, .cbi-section-descr:empty { + display: none; } + +.cbi-map-descr, .cbi-section-descr, .cbi-page-actions { + padding: 1em; + background: #ececec; } + +.cbi-page-actions { + text-align: right; + display: flex; + display: -moz-flex; + -moz-flex-flow: row-reverse; + flex-flow: row-reverse; } + +div.cbi-optionals { + padding: 0.25em; + border-bottom: 1px dotted #bbbbbb; } + +div.cbi-section-remove { + float: right; } + +.cbi-section-node { + clear: both; + position: relative; + border: none; } + +.cbi-section-node-tabbed { + border-top-left-radius: 0; } + +.cbi-section-node .cbi-value-last { + border-bottom: none; } + +.cbi-section-node table div { + padding-bottom: 0; + border-bottom: none; } + +.cbi-section-node div.cbi-section-table-row { + margin: 0.25em; } + +table.cbi-section-table { + width: 100%; + font-size: 95%; } + +table.cbi-section-table th, +table.cbi-section-table td { + text-align: center; } + +tr.cbi-section-table-descr th { + font-weight: normal; + font-size: 90%; + vertical-align: top; } + +td.cbi-section-table-optionals { + text-align: left !important; + padding-top: 1em; } + +.cbi-value-helpicon img { + display: none; } + +div.cbi-error { + font-size: 95%; + font-weight: bold; + color: #ff0000; + background-color: #ffffff; } + +td.cbi-value-error { + border-color: red; } + +.cbi-value-error input, +.cbi-value-error select { + color: red; + background-color: #ffcccc; } + +.cbi-section-error { + color: red; + background-color: white; + font-size: 95%; + border: 1px dotted red; + margin: 3px; + padding: 3px; } + +.cbi-value-field var { + color: #2222FF; } + +ul.cbi-tabmenu { + padding: 3px 0; + margin-left: 0 !important; + list-style-type: none; + position: relative; + z-index: 10; + top: 4px; + line-height: 20px; } + +ul.cbi-tabmenu li.cbi-tab, +ul.cbi-tabmenu li.cbi-tab-disabled { + display: inline; + margin: 0; } + +ul.cbi-tabmenu li.cbi-tab a, +ul.cbi-tabmenu li.cbi-tab-disabled a { + text-decoration: none; + padding: 3px 7px; + margin-right: 3px; + border: 1px solid #BBBBBB; + border-bottom: none; + border-radius: 3px 3px 0 0; + background-color: #EEEEEE; + color: #BBBBBB; } + +ul.cbi-tabmenu li.cbi-tab-highlighted a { + color: #000000; + background-color: #FFEEAA; } + +ul.cbi-tabmenu li a:hover { + color: #000000; } + +ul.cbi-tabmenu li.cbi-tab a { + padding-top: 4px; + color: #000000; + background-color: #FFFFFF; } + +div.cbi-tab-descr { + background-image: url(/luci-static/resources/cbi/help.gif); + background-position: 0.25em 50%; + background-repeat: no-repeat; + border-bottom: 1px solid #CCCCCC; + margin: 0.25em 0.25em 2em; + padding: 0.5em 0.5em 0.5em 2em; } + +.left { + text-align: left !important; } + +.right { + text-align: right !important; } + +.luci { + position: absolute; + bottom: 0; + left: 1em; + height: 1.5em; + font-size: 80%; } + +.luci a:link, +.luci a:visited { + background-color: transparent; + color: #666666; + text-decoration: none; + font-size: 70%; } + +.inline { + display: inline; } + +.error500 { + white-space: normal; + border: 1px dotted #ff0000; + background-color: #ffffff; + color: #000000; + padding: 0.5em; } + +.errorbox { + border: 1px solid #FF0000; + background-color: #FFCCCC; + padding: 5px; + margin-bottom: 5px; } + +.errorbox a { + color: #000000 !important; } + +.ifacebox { + background-color: #FFFFFF; + border: 1px solid #CCCCCC; + margin: 0 10px; + text-align: center; + white-space: nowrap; } + +.ifacebox .ifacebox-head { + border-bottom: 1px solid #CCCCCC; + padding: 2px; } + +.ifacebox .ifacebox-body { + padding: 2px; } + +.ifacebadge { + background-color: #FFFFFF; + border: 1px solid #CCCCCC; + padding: 2px; + margin-left: 2px; + display: inline-block; } + +.ifacebadge-active { + border-color: #000000; + font-weight: bold; } + +.zonebadge { + padding: 2px; + display: inline-block; + white-space: nowrap; + cursor: pointer; } + +.zonebadge em, +.zonebadge strong { + margin: 3px; + display: inline-block; } + +.zonebadge input { + width: 6em; + height: 1.5em; } + +.zonebadge-empty { + border: 1px dashed #AAAAAA; + color: #AAAAAA; + font-style: italic; + font-size: smaller; } + +.uci-change-list { + font-family: monospace; } + +.uci-change-list ins, +.uci-change-legend-label ins { + text-decoration: none; + border: 1px solid #00FF00; + background-color: #CCFFCC; + display: block; + padding: 2px; } + +.uci-change-list del, +.uci-change-legend-label del { + text-decoration: none; + border: 1px solid #FF0000; + background-color: #FFCCCC; + display: block; + font-style: normal; + padding: 2px; } + +.uci-change-list var, +.uci-change-legend-label var { + text-decoration: none; + border: 1px solid #CCCCCC; + background-color: #EEEEEE; + display: block; + font-style: normal; + padding: 2px; } + +.uci-change-list var ins, +.uci-change-list var del { + /*display: inline;*/ + border: none; + white-space: pre; + font-style: normal; + padding: 0px; } + +.uci-change-legend { + padding: 5px; } + +.uci-change-legend-label { + width: 150px; + float: left; + font-size: 80%; } + +.uci-change-legend-label > ins, +.uci-change-legend-label > del, +.uci-change-legend-label > var { + float: left; + margin-right: 4px; + width: 10px; + height: 10px; + display: block; } + +.uci-change-legend-label var ins, +.uci-change-legend-label var del { + line-height: 6px; + border: none; } + +.cbi-input-password + img { + display: none; } + +.the-key { + text-align: left; + font-size: 1.4em; + background: #ffe9b3; + border: 3pt dashed #dc0067; + margin-bottom: 0.5em; + padding: 0.5em; } diff --git a/package/gluon-luci-theme/sass/cascade.scss b/package/gluon-luci-theme/sass/cascade.scss new file mode 100644 index 00000000..eb0e1bc2 --- /dev/null +++ b/package/gluon-luci-theme/sass/cascade.scss @@ -0,0 +1,1014 @@ +/* ATTENTION: This file is not compiled when building gluon. + The compiled version is at ../files/www/luci-static/gluon/cascade.css + + Use sass like this to update it: + + sass cascade.scss ../files/www/luci-static/gluon/cascade.css + + When commiting changes to this file make sure to commit the respective + changes to the compilid version within the same commit! + */ + +@charset "utf-8"; + +$ffyellow: #ffb400; +$ffmagenta: #dc0067; +$ffzusatz: #009ee0; +$red: #ee3300; + +@mixin button { + &::-moz-focus-inner { + padding: 0; + border: 0; + } + + display: inline-block; + zoom: 1; + line-height: normal; + white-space: nowrap; + vertical-align: baseline; + text-align: center; + cursor: pointer; + -webkit-user-drag: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + + + font-size: 100%; + padding: 0.5em 1em; + color: rgba(0, 0, 0, 0.80); + border: none rgba(0, 0, 0, 0); + background-color: #E6E6E6; + text-decoration: none; + border-radius: 2px; + + /* Transitions */ + -webkit-transition: 0.1s linear -webkit-box-shadow; + -moz-transition: 0.1s linear -moz-box-shadow; + -ms-transition: 0.1s linear box-shadow; + -o-transition: 0.1s linear box-shadow; + transition: 0.1s linear box-shadow; + + &:active { + box-shadow: 0 0 0 1px rgba(0,0,0, 0.15) inset, 0 0 6px rgba(0,0,0, 0.20) inset; + } + + &:focus { + outline: 0; + } + + &:hover, &:focus { + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(transparent), color-stop(40%, rgba(0,0,0, 0.05)), to(rgba(0,0,0, 0.10))); + background-image: -webkit-linear-gradient(transparent, rgba(0,0,0, 0.05) 40%, rgba(0,0,0, 0.10)); + background-image: -moz-linear-gradient(top, rgba(0,0,0, 0.05) 0%, rgba(0,0,0, 0.10)); + background-image: -o-linear-gradient(transparent, rgba(0,0,0, 0.05) 40%, rgba(0,0,0, 0.10)); + background-image: linear-gradient(transparent, rgba(0,0,0, 0.05) 40%, rgba(0,0,0, 0.10)); + } + + &[disabled] { + border: none; + background-image: none; + opacity: 0.40; + cursor: not-allowed; + box-shadow: none; + } +} + +@mixin button-primary { + background-color: $ffzusatz; + color: #fff; +} + +.lang_he { + direction: RTL; + unicode-bidi: embed; +} + +.hidden { + display: none; +} + +html { + min-height: 100%; + height: auto; + position:relative; +} + +body { + font-family: 'Open Sans', Arial, sans-serif; + font-size: 12pt; + color: rgb(77, 78, 83); + line-height: 1.5em; + margin: 0; + display: flex; + flex-direction: column; + min-height: 100vh; + background-color: #f3f3f3; +} + +a img { + border: none; + text-decoration: none; +} + +.tabmenu1 { + text-align: center; +} + +ul.tabmenu { + list-style: none; + padding: 0; + margin: 2em 0; + display: inline-flex; +} + +ul.tabmenu li { + white-space: nowrap; + margin: 0 0.5em; + padding: 0; + text-align: center; + + a { + display: block; + text-decoration: none; + padding: 1em; + margin: 0; + color: #333; + border-radius: 2em; + + &:hover { + background: lighten($ffyellow, 35); + } + } + + &.active a { + font-weight: bold; + background: white; + color: #333; + } +} + +abbr, +acronym { + font-style: normal; + font-variant: normal; +} + +abbr[title], +acronym[title] { + border-bottom: 1px dotted; + cursor: help; +} + +a:link abbr[title], +a:visited abbr[title], +a:link acronym[title], +a:visited acronym[title] { + cursor: pointer; +} + +code { + font-family: monospace; + white-space: pre; +} + +#maincontent ul { + margin-left: 2em; +} + +.warning { + color: red; + background-color: white; + font-weight: bold; +} + +.clear { + clear: both; +} + +.error { + color: #ff0000; + background-color: white; +} + +div.hostinfo { + margin: 0; + padding: 0; + font-size: 80%; + padding: 0.5em; + flex: 1; + font-weight: bold; +} + +#xhr_poll_status { + cursor: pointer; +} + +#xhr_poll_status #xhr_poll_status_off { + font-weight: bold; + color: #FF0000; +} + +#xhr_poll_status #xhr_poll_status_on { + font-weight: bold; + color: #00FF00; +} + +#menubar { + display: flex; + background: $ffmagenta; + color: #ffffff; +} + +#menubar .warning { + color: red; + background-color: #557788; +} + +#menubar a:link, +#menubar a:visited { + position: relative; + display: block; + padding: 0.5em; + text-decoration: none; + font-size: 80%; + font-weight: normal; + color: white; +} + +#menubar a:link:hover, +#menubar a:visited:hover, +#menubar a:link:focus, +#menubar a:visited:focus { + background: $ffyellow; + color: black; +} + +#menubar a:link.active, +#menubar a:visited.active { + background: $ffyellow; + color: black; + font-weight: bold; +} + +#menubar a:link.warning, +#menubar a:visited.warning { + background: #000000; + color: red; + font-weight: bold; +} + +#modemenu { + list-style: none; + margin: 0; + padding: 0; +} + +#modemenu li { + display: inline-block; +} + +#savemenu { +} + +.lang_he #savemenu { +} + +.lang_de #submenu_admin_uci { + width: 12em; +} + +.lang_ru #submenu_admin_uci { + width: 11.5em; +} + +textarea#syslog { + width: 98%; + min-height: 500px; + border: 3px solid #cccccc; + padding: 5px; + font-family: monospace; +} + +#maincontent { + padding: 0 1em 2em; + max-width: 60em; + min-width: 40em; + margin: 1em auto; +} + +.lang_he #maincontent { + direction: rtl; +} + +#maincontent h2 { +} + +#maincontent h3 { +} + +#maincontent p { + margin-bottom: 1em; +} + +.cbi-section { + margin: 0; + padding: 0; + border: none; +} + +.cbi-section legend { + font-size: 1.4em; + font-weight: bold; + color: $ffmagenta; + position: relative; + padding: 0; + margin-bottom: 0.5em; +} + +.cbi-section h2 { + margin: 0em 0 0.5em -0.5em !important; +} + +.cbi-section h3 { + text-decoration: none !important; + font-weight: bold !important; + color: #555555 !important; + margin: 0.25em !important; + font-size: 100% !important; +} + +.cbi-section-descr { + margin-bottom: 2em; +} + +.cbi-title-ref { + color: inherit; + text-decoration: none; + padding-right: 18px; + background: url('../resources/cbi/link.gif') no-repeat scroll right center; + background-color: inherit; +} + +ul.cbi-apply { + font-size: 90%; +} + +input:-webkit-input-placeholder { + color: #AAAAAA; +} + +input:-moz-placeholder { + color: #AAAAAA; +} + +input:-ms-input-placeholder { + color: #AAAAAA; +} + +input[type=checkbox] { + -moz-appearance:none; + -webkit-appearance:none; + -o-appearance:none; + appearance: none; + width: 2em; + height: 2em; + margin: 0; + + &:checked { + position: relative; + + &::after { + content: '✔'; + color: $ffmagenta; + vertical-align: middle; + position: absolute; + top: 50%; + left: 0; + margin-top: -0.5em; + width: 100%; + text-align: center; + font-size: 1.7em; + } + } +} + +input[type=submit], +input[type=reset], +input[type=image], +input[type=button] { + cursor: pointer; +} + +select, +input, +textarea { + color: darken($ffzusatz, 30); + border: none; + background: lighten($ffyellow, 30); + border-radius: 3pt; + padding: 0.5em; +} + +input[type=image] { + border: none; +} + +select, +input[type=text], +input[type=password] { + width: 20em; +} + +td select, +td input[type=text], +td input[type=password] { + width: 99%; +} + +img.cbi-image-button { + cursor: pointer; + margin: 0 2px; + vertical-align: middle; +} + +input.cbi-button { + @include button; + + background-repeat: no-repeat; +} + +input.cbi-input-user { + background-image: url('../resources/cbi/user.gif'); + background-repeat: no-repeat; + background-position: 1px center; + color: #000000; + text-indent: 17px; +} + +input.cbi-input-find, +input.cbi-button-find { + background-image: url('../resources/cbi/find.gif'); + color: #000000; + padding-left: 17px; +} + +input.cbi-input-reload { + background-image: url('../resources/cbi/reload.gif'); + color: #000000; + padding-left: 17px; +} + +input.cbi-input-add, +input.cbi-button-add { + background-image: url('../resources/cbi/add.gif'); + color: #000000; + padding-left: 17px; + padding-right: 1px; +} + +input.cbi-input-fieldadd, +input.cbi-button-fieldadd { + background-image: url(../resources/cbi/fieldadd.gif); + color: #000000; + padding-left: 17px; + padding-right: 1px; +} + +input.cbi-input-reset, +input.cbi-button-reset { + background-color: $red; + color: #fff; +} + +input.cbi-input-save, +input.cbi-button-save { + @include button-primary; +} + +input.cbi-input-apply, +input.cbi-button-apply { + @include button-primary; +} + +input.cbi-input-link, +input.cbi-button-link { + background-image: url('../resources/cbi/link.gif'); + color: #000000; + padding-left: 17px; + padding-right: 1px; +} + +input.cbi-input-download, +input.cbi-button-download { + background-image: url('../resources/cbi/download.gif'); + color: #000000; + padding-left: 17px; + padding-right: 1px; +} + +input.cbi-input-remove, +div.cbi-section-remove input { + background-image: url('../resources/cbi/remove.gif'); + color: #000000; + padding-left: 17px; + padding-right: 1px; +} + +input.cbi-button-up { + background-image: url('../resources/cbi/up.gif'); + padding-left: 11px; + padding-right: 1px; +} + +input.cbi-button-down { + background-image: url('../resources/cbi/down.gif'); + padding-left: 11px; + padding-right: 1px; +} + +input.cbi-button-edit { + background-image: url('../resources/cbi/edit.gif'); + color: #000000; + padding-left: 17px; + padding-right: 1px; +} + +input.cbi-button-reload { + background-image: url('../resources/cbi/reload.gif'); + color: #000000; + padding-left: 17px; + padding-right: 1px; +} + +input.cbi-button-remove { + background-image: url('../resources/cbi/remove.gif'); + color: #000000; + padding-left: 17px; + padding-right: 1px; +} + +.cbi-input-invalid { + background: $red !important; + color: white; +} + +div.cbi-section-remove input { + border-bottom: none; +} + +textarea { + margin-left: -1px; + margin-bottom: 0.5em; +} + +form > div > input[type=submit], +form > div > input[type=reset] { + margin-left: 0.5em; +} + +table td, +table th { + color: #000000; +} + +table.smalltext { + background: #f5f5f5; + color: #000000; + border-top: 1px solid #666666; + border-right: 1px solid #666666; + border-bottom: 1px solid #666666; + font-size: 90%; + width: 80%; + margin-left: auto; + margin-right: auto; + border-collapse: collapse; +} + +table.smalltext tr:hover td { + background-color: #bbddee; + color: #000000; +} + +table.smalltext tr th { + padding: 0 0.25em; + border-left: 1px solid #666666; + text-align: left; +} + +table.smalltext tr td { + padding: 0 0.25em; + border-top: 1px solid #666666; + border-left: 1px solid #666666; +} + +table.cbi-section-table .cbi-rowstyle-1 { + background-color: #eeeeff; + color: #000000; +} + +table.cbi-section-table .cbi-rowstyle-1:hover, +table.cbi-section-table .cbi-rowstyle-2:hover { + background-color: #b2c8d4; + color: #000000; +} + +table.cbi-section-table .cbi-section-table-cell { + padding: 3px; + white-space: nowrap; +} + +.cbi-section .cbi-rowstyle-1 h3 { + background-color: #eeeeff; + color: #555555; +} + +.cbi-rowstyle-2 { + color: #000000; +} + +div.cbi-value { + display: flex; + flex-direction: row; + margin-bottom: 0.5em; +} + +.cbi-value-title { + flex: 2; + text-align: right; + padding-top: 0.39em; + padding-right: 1em; + font-weight: bold; +} + +div.cbi-value-field { + flex: 3; +} + +div.cbi-value-description { + font-size: 8pt; +} + +div.cbi-section-create { + clear: left; + white-space: nowrap; + vertical-align: top; +} + +div.cbi-section-create .cbi-button { + margin: 0.25em; +} + +input.cbi-section-create-name { + margin-right: -0.25em; +} + +div.cbi-map-descr { + margin-bottom: 1em; +} + +.cbi-map-descr:empty, .cbi-section-descr:empty { + display: none; +} + +.cbi-map-descr, .cbi-section-descr, .cbi-page-actions { + padding: 1em; + background: #ececec; +} + +.cbi-page-actions { + text-align: right; + display: flex; + display: -moz-flex; + -moz-flex-flow: row-reverse; + flex-flow: row-reverse; +} + +div.cbi-optionals { + padding: 0.25em; + border-bottom: 1px dotted #bbbbbb; +} + +div.cbi-section-remove { + float: right; +} + +.cbi-section-node { + clear: both; + position: relative; + border: none; +} + +.cbi-section-node-tabbed { + border-top-left-radius: 0; +} + +.cbi-section-node .cbi-value-last { + border-bottom: none; +} + +.cbi-section-node table div { + padding-bottom: 0; + border-bottom: none; +} + +.cbi-section-node div.cbi-section-table-row { + margin: 0.25em; +} + +table.cbi-section-table { + width: 100%; + font-size: 95%; +} + +table.cbi-section-table th, +table.cbi-section-table td { + text-align: center; +} + +tr.cbi-section-table-descr th { + font-weight: normal; + font-size: 90%; + vertical-align: top; +} + +td.cbi-section-table-optionals { + text-align: left !important; + padding-top: 1em; +} + +.cbi-value-helpicon img { + display: none; +} + +div.cbi-error { + font-size: 95%; + font-weight: bold; + color: #ff0000; + background-color: #ffffff; +} + +td.cbi-value-error { + border-color: red; +} + +.cbi-value-error input, +.cbi-value-error select { + color: red; + background-color: #ffcccc; +} + +.cbi-section-error { + color: red; + background-color: white; + font-size: 95%; + border: 1px dotted red; + margin: 3px; + padding: 3px; +} + +.cbi-value-field var { + color: #2222FF; +} + +ul.cbi-tabmenu { + padding: 3px 0; + margin-left: 0 !important; + list-style-type: none; + position: relative; + z-index: 10; + top: 4px; + line-height: 20px; +} + +ul.cbi-tabmenu li.cbi-tab, +ul.cbi-tabmenu li.cbi-tab-disabled { + display: inline; + margin: 0; +} + +ul.cbi-tabmenu li.cbi-tab a, +ul.cbi-tabmenu li.cbi-tab-disabled a { + text-decoration: none; + padding: 3px 7px; + margin-right: 3px; + border: 1px solid #BBBBBB; + border-bottom: none; + border-radius: 3px 3px 0 0; + background-color: #EEEEEE; + color: #BBBBBB; +} + +ul.cbi-tabmenu li.cbi-tab-highlighted a { + color: #000000; + background-color: #FFEEAA; +} + +ul.cbi-tabmenu li a:hover { + color: #000000; +} + +ul.cbi-tabmenu li.cbi-tab a { + padding-top: 4px; + color: #000000; + background-color: #FFFFFF; +} + +div.cbi-tab-descr { + background-image: url(/luci-static/resources/cbi/help.gif); + background-position: 0.25em 50%; + background-repeat: no-repeat; + border-bottom: 1px solid #CCCCCC; + margin: 0.25em 0.25em 2em; + padding: 0.5em 0.5em 0.5em 2em; +} + +.left { + text-align: left !important; +} + +.right { + text-align: right !important; +} + +.luci { + position: absolute; + bottom: 0; + left: 1em; + height: 1.5em; + font-size: 80%; +} + +.luci a:link, +.luci a:visited { + background-color: transparent; + color: #666666; + text-decoration: none; + font-size: 70%; +} + +.inline { + display: inline; +} + +.error500 { + white-space: normal; + border: 1px dotted #ff0000; + background-color: #ffffff; + color: #000000; + padding: 0.5em; +} + +.errorbox { + border: 1px solid #FF0000; + background-color: #FFCCCC; + padding: 5px; + margin-bottom: 5px; +} + +.errorbox a { + color: #000000 !important; +} + + +.ifacebox { + background-color: #FFFFFF; + border: 1px solid #CCCCCC; + margin: 0 10px; + text-align: center; + white-space: nowrap; +} + +.ifacebox .ifacebox-head { + border-bottom: 1px solid #CCCCCC; + padding: 2px; +} + +.ifacebox .ifacebox-body { + padding: 2px; +} + + +.ifacebadge { + background-color: #FFFFFF; + border: 1px solid #CCCCCC; + padding: 2px; + margin-left: 2px; + display: inline-block; +} + +.ifacebadge-active { + border-color: #000000; + font-weight: bold; +} + + +.zonebadge { + padding: 2px; + display: inline-block; + white-space: nowrap; + cursor: pointer; +} + +.zonebadge em, +.zonebadge strong { + margin: 3px; + display: inline-block; +} + +.zonebadge input { + width: 6em; + height: 1.5em; +} + +.zonebadge-empty { + border: 1px dashed #AAAAAA; + color: #AAAAAA; + font-style: italic; + font-size: smaller; +} + + +.uci-change-list { + font-family: monospace; +} + +.uci-change-list ins, +.uci-change-legend-label ins { + text-decoration: none; + border: 1px solid #00FF00; + background-color: #CCFFCC; + display: block; + padding: 2px; +} + +.uci-change-list del, +.uci-change-legend-label del { + text-decoration: none; + border: 1px solid #FF0000; + background-color: #FFCCCC; + display: block; + font-style: normal; + padding: 2px; +} + +.uci-change-list var, +.uci-change-legend-label var { + text-decoration: none; + border: 1px solid #CCCCCC; + background-color: #EEEEEE; + display: block; + font-style: normal; + padding: 2px; +} + +.uci-change-list var ins, +.uci-change-list var del { + /*display: inline;*/ + border: none; + white-space: pre; + font-style: normal; + padding: 0px; +} + +.uci-change-legend { + padding: 5px; +} + +.uci-change-legend-label { + width: 150px; + float: left; + font-size: 80%; +} + +.uci-change-legend-label>ins, +.uci-change-legend-label>del, +.uci-change-legend-label>var { + float: left; + margin-right: 4px; + width: 10px; + height: 10px; + display: block; +} + +.uci-change-legend-label var ins, +.uci-change-legend-label var del { + line-height: 6px; + border: none; +} + +// Hide show/hide password toggle image +.cbi-input-password + img { + display: none; +} + +.the-key { + text-align: left; + font-size: 1.4em; + background: lighten($ffyellow, 35); + border: 3pt dashed $ffmagenta; + margin-bottom: 0.5em; + padding: 0.5em +} From b1cc62b680f770fab9fea45cc17c18b2328909f2 Mon Sep 17 00:00:00 2001 From: Nils Schneider Date: Tue, 21 Jan 2014 16:15:27 +0100 Subject: [PATCH 2/4] gluon-config-mode,luci-admin: use gluon-luci-theme This makes gluon-config-mode and gluon-luci-admin depend on gluon-luci-theme instead of luci-theme-openwrt. --- package/gluon-config-mode/Makefile | 2 +- package/gluon-luci-admin/Makefile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package/gluon-config-mode/Makefile b/package/gluon-config-mode/Makefile index 75a87826..dfd252ef 100644 --- a/package/gluon-config-mode/Makefile +++ b/package/gluon-config-mode/Makefile @@ -15,7 +15,7 @@ define Package/gluon-config-mode SECTION:=gluon CATEGORY:=Gluon TITLE:=Luci based config mode for user friendly setup of new meshnodes - DEPENDS:=+gluon-core +gluon-lock-password +gluon-location +gluon-simple-tc +uhttpd +dnsmasq +luci-mod-admin-core +ip +luci-theme-openwrt + DEPENDS:=+gluon-core +gluon-lock-password +gluon-location +gluon-simple-tc +gluon-luci-theme +uhttpd +dnsmasq +luci-mod-admin-core +ip endef define Package/gluon-config-mode/description diff --git a/package/gluon-luci-admin/Makefile b/package/gluon-luci-admin/Makefile index 45a849dc..d9d96381 100644 --- a/package/gluon-luci-admin/Makefile +++ b/package/gluon-luci-admin/Makefile @@ -15,7 +15,7 @@ define Package/gluon-luci-admin SECTION:=gluon CATEGORY:=Gluon TITLE:=Luci based simple administration interface for mesh nodes - DEPENDS:=+gluon-core +luci-mod-admin-core +luci-theme-openwrt + DEPENDS:=+gluon-core +gluon-luci-theme +luci-mod-admin-core endef define Package/gluon-luci-admin/description From 57f65acaf2a8c47e0c19490053026ed0c63674bb Mon Sep 17 00:00:00 2001 From: Nils Schneider Date: Tue, 21 Jan 2014 22:34:52 +0100 Subject: [PATCH 3/4] gluon-config-mode: replace inline style with class Replace the inline stylesheet for the public key box on the reboot page with a CSS class so it can be styled using the theme. --- .../generate/usr/lib/lua/luci/view/gluon-config-mode/reboot.htm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/gluon-config-mode/generate/usr/lib/lua/luci/view/gluon-config-mode/reboot.htm b/package/gluon-config-mode/generate/usr/lib/lua/luci/view/gluon-config-mode/reboot.htm index 7d192b6a..27be9385 100644 --- a/package/gluon-config-mode/generate/usr/lib/lua/luci/view/gluon-config-mode/reboot.htm +++ b/package/gluon-config-mode/generate/usr/lib/lua/luci/view/gluon-config-mode/reboot.htm @@ -27,7 +27,7 @@ $Id$

@config_mode.msg_pubkey@

-
+
# <%=luci.sys.hostname()%>
<%=pubkey%> From de22275c607b8e666912a0da70a4ee16288d46f5 Mon Sep 17 00:00:00 2001 From: Nils Schneider Date: Tue, 21 Jan 2014 17:08:03 +0100 Subject: [PATCH 4/4] gluon-config-mode: remove subsection headings Those headings do not convey much information make the wizard less compact. The help texts will be rewritten to guide the user instead. --- .../usr/lib/lua/luci/model/cbi/gluon-config-mode/wizard.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package/gluon-config-mode/files/usr/lib/lua/luci/model/cbi/gluon-config-mode/wizard.lua b/package/gluon-config-mode/files/usr/lib/lua/luci/model/cbi/gluon-config-mode/wizard.lua index 9c1ee2fb..a7d13490 100644 --- a/package/gluon-config-mode/files/usr/lib/lua/luci/model/cbi/gluon-config-mode/wizard.lua +++ b/package/gluon-config-mode/files/usr/lib/lua/luci/model/cbi/gluon-config-mode/wizard.lua @@ -9,7 +9,7 @@ configmode.setup_fastd_secret(meshvpn_name) f = SimpleForm("wizard", "Willkommen!", "Willkommen zum Einrichtungsassistenten für deinen neuen Lübecker Freifunk-Knoten. Fülle das folgende Formular deinen Vorstellungen entsprechend aus und klicke anschließend auf den „Senden“-Button.") f.reset = false -s = f:section(SimpleSection, "Grundeinstellungen", nil) +s = f:section(SimpleSection, nil, nil) o = s:option(Value, "_hostname", "Knotenname") o.value = uci:get_first("system", "system", "hostname") @@ -22,7 +22,7 @@ o.default = uci:get_bool("autoupdater", "settings", "enabled") and o.enabled or o.rmempty = false o.description = "Aktiviert automatische Updates der Firmware (empfohlen)" -s = f:section(SimpleSection, "Mesh-VPN", "Nutzt die Internet-Verbindung, um diesem Knoten auch dann Zugang zum Freifunknetz zu geben, wenn er außerhalb der Funkreichweite anderer Freifunk-Knoten ist.") +s = f:section(SimpleSection, nil, "Nutzt die Internet-Verbindung, um diesem Knoten auch dann Zugang zum Freifunknetz zu geben, wenn er außerhalb der Funkreichweite anderer Freifunk-Knoten ist.") o = s:option(Flag, "_meshvpn", "Mesh-VPN aktivieren?") o.default = uci:get_bool("fastd", meshvpn_name, "enabled") and o.enabled or o.disabled @@ -46,7 +46,7 @@ o.value = uci:get("gluon-simple-tc", meshvpn_name, "limit_egress") o.rmempty = false o.datatype = "integer" -s = f:section(SimpleSection, "GPS Koordinaten", "Hier kannst du die GPS-Koordinaten deines Knotens eintragen, um ihn in der Knotenkarte anzeigen zu lassen.") +s = f:section(SimpleSection, nil, "Hier kannst du die GPS-Koordinaten deines Knotens eintragen, um ihn in der Knotenkarte anzeigen zu lassen.") o = s:option(Flag, "_location", "Koordinaten veröffentlichen?") o.default = uci:get_first("gluon-locaton", "location", "share_location", o.disabled)