OXYGEN #5: Oxygen theme draft 1

This commit is contained in:
Steven Barth 2008-10-11 15:27:55 +00:00
parent 39efe2207d
commit dfd272dc1d
34 changed files with 1030 additions and 0 deletions

2
themes/oxygen/Makefile Normal file
View file

@ -0,0 +1,2 @@
include ../../build/config.mk
include ../../build/module.mk

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

View file

@ -0,0 +1,656 @@
@charset "utf-8";
@media all {
html, body {
height: 100%;
}
body {
font-family: Verdana, Arial, sans-serif;
font-size: 101%;
line-height: 100%;
background: #557788 url(bg.png) no-repeat;
}
div#screen {
min-height: 100%;
background: url(footer.png) no-repeat bottom fixed;
}
* {
margin: 0;
padding: 0;
}
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;
}
.skiplink,
.navigation,
.hidden {
position: absolute;
left: -1000px;
top: -1000px;
width: 0px;
height: 0px;
overflow: hidden;
display: inline;
}
.error {
color: #ff0000;
background-color: white;
}
#header {
min-height: 98px;
background-image: url(header.png);
background-repeat: no-repeat;
background-position: left center;
background-color: #557788;
color: #ffffff;
text-align: right;
}
#header h1 {
padding: 1em 1em 0 1em;
}
#header p {
padding: 0 1em 1em 1em;
}
#header h1,
#header p {
font-size: 70%;
font-weight: normal;
line-height: 160%;
text-align: right;
}
.menubar {
background: #000000;
background: rgba(0, 0, 0, 0.8);
color: #ffffff;
width: 80%;
font-size: 0.8em;
margin: 0.5em auto;
padding: 0.25em;
padding-left: 0.5em;
padding-right: 0.5em;
border: 1px solid #000000;
border-radius: 0.8em;
-khtml-border-radius: 0.8em;
-moz-border-radius: 0.8em;
-webkit-border-radius:0.8em;
-opera-border-radius: 0.8em;
}
.menubar .warning {
color: red;
background-color: #557788;
}
html .menubar a:link,
html .menubar a:visited {
color: #ffffff;
text-decoration: none;
font-weight: bold;
}
html .menubar a.menulink {
margin-left: 1em;
}
html .menubar a:link:hover,
html .menubar a:visited:hover,
html .menubar a:link:active,
html .menubar a:visited:active,
.menubar a:link:focus,
.menubar a:visited:focus {
background: #000000;
color: #ffff00;
}
html .menubar a:link.active,
html .menubar a:visited.active,
html .menubar a:link.preactive,
html .menubar a:visited.preactive {
background: #000000;
color: #ffff00;
font-weight: bold;
}
html .menubar a:link.warning,
html .menubar a:visited.warning {
background: #000000;
color: red;
font-weight: bold;
}
.lang_de #submenu_admin_uci {
width: 12em;
}
.lang_ru #submenu_admin_uci {
width: 11.5em;
}
#maincontent {
clear: both;
width: 80%;
margin: 0 auto;
padding: 0.5em;
background: #f5f5f5;
background: rgba(245, 245, 245, 0.9);
color: #000000;
border-width: 1px solid #444444;
font-size: 80%;
border-radius: 1em;
-khtml-border-radius: 1em;
-moz-border-radius: 1em;
-webkit-border-radius: 1em;
-opera-border-radius: 1em;
}
#maincontent h2 {
margin: 0.25em 0 0.5em 0;
font-size: 150%;
font-weight: normal;
}
#maincontent h3 {
margin: 0.5em 0;
font-size: 120%;
font-weight: normal;
text-decoration: underline;
}
#maincontent p {
margin-bottom: 1em;
}
.cbi-section {
margin-bottom: 0.5em;
padding: 0.5em 1em;
border: 1px dotted #555555;
background-color: #ffffff;
background-color: rgba(255, 255, 255, 0.8);
color: #000000;
}
.cbi-section legend {
font-size: 110%;
font-weight: bold;
height: 1em;
padding: 0 0.25em;
background-color: transparent;
color: #555555;
}
*+html .cbi-section legend {
background-color: #ffffff;
background-color: rgba(255, 255, 255, 0.8);
color: #555555;
}
* html .cbi-section legend {
background-color: #ffffff;
background-color: rgba(255, 255, 255, 0.8);
color: #555555;
}
.cbi-section h2 {
margin: 0em 0 0.5em -0.5em !important;
}
.cbi-section h3 {
height: 1.5em;
font-size: 90%;
background-color: #ffffff;
background-color: rgba(255, 255, 255, 0.8);
color: #555555;
}
.cbi-section-descr {
margin-bottom: 0.5em;
font-size: 95%;
}
.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[type=submit],
input[type=reset],
input[type=image] {
cursor: pointer;
}
select,
input,
textarea {
background: #eeeeee;
color: #000000;
border-width: 1px;
border-color: #000000;
}
input[type=image] {
border: none;
}
input:focus,
input:hover,
select:focus,
select:hover,
textarea:focus,
textarea:hover {
background-color: #ffffff;
color: #000000;
}
select,
input[type=text],
input[type=password] {
width: 20em;
}
td select,
td input[type=text],
td input[type=password] {
width: 99%;
}
input.cbi-input-user {
background: url('../resources/cbi/user.gif') no-repeat scroll 1px center;
background-color: inherit;
color: #000000;
padding-left: 17px;
}
input.cbi-input-password {
background: url('../resources/cbi/key.gif') no-repeat scroll 1px center;
background-color: inherit;
color: #000000;
padding-left: 17px;
}
input.cbi-input-find {
background: url('../resources/cbi/find.gif') no-repeat scroll 1px center;
background-color: inherit;
color: #000000;
padding-left: 17px;
}
input.cbi-input-reload {
background: url('../resources/cbi/reload.gif') no-repeat scroll 1px center;
background-color: inherit;
color: #000000;
padding-left: 17px;
}
input.cbi-input-add,
input.cbi-button-add {
background: url('../resources/cbi/add.gif') no-repeat scroll 1px center;
background-color: inherit;
color: #000000;
padding-left: 17px;
padding-right: 1px;
}
input.cbi-input-fieldadd,
input.cbi-button-fieldadd {
background: url(../resources/cbi/fieldadd.gif) no-repeat scroll 1px center;
background-color: inherit;
color: #000000;
padding-left: 17px;
padding-right: 1px;
}
input.cbi-input-reset,
input.cbi-button-reset {
background: url('../resources/cbi/reset.gif') no-repeat scroll 1px center;
background-color: inherit;
color: #000000;
padding-left: 17px;
padding-right: 1px;
}
input.cbi-input-save,
input.cbi-button-save {
background: url('../resources/cbi/save.gif') no-repeat scroll 1px center;
background-color: inherit;
color: #000000;
padding-left: 17px;
padding-right: 1px;
}
input.cbi-input-apply,
input.cbi-button-apply {
background: url('../resources/cbi/apply.gif') no-repeat scroll 1px center;
background-color: inherit;
color: #000000;
padding-left: 17px;
padding-right: 1px;
}
input.cbi-input-remove,
div.cbi-section-remove input {
background: url('../resources/cbi/remove.gif') no-repeat scroll 1px center;
background-color: inherit;
color: #000000;
padding-left: 17px;
padding-right: 1px;
}
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] {
float: right;
margin-left: 0.5em;
}
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,
table.cbi-section-table .cbi-rowstyle-1 * {
background-color: #eeeeff;
color: #000000;
}
.cbi-section .cbi-rowstyle-1 h3 {
background-color: #eeeeff;
color: #555555;
}
.cbi-rowstyle-2 {
}
div.cbi-value {
clear: left;
vertical-align: middle;
padding-left: 0.25em;
border-bottom: 1px dotted #bbbbbb;
}
div.cbi-value:hover {
background: #f8f8f8;
color: #000000;
}
.cbi-value-title {
float: left;
width: 40%;
}
div.cbi-value-field {
width: 58%;
margin-left: 40%;
padding: 0.25em 0;
}
div.cbi-value-description {
font-size: 90%;
display: inline;
}
div.cbi-section-create {
clear: left;
white-space: nowrap;
}
div.cbi-map-descr {
margin-bottom: 1em;
}
div.cbi-optionals {
padding: 0.25em;
border-bottom: 1px dotted #bbbbbb;
}
div.cbi-section-remove {
float: right;
}
.cbi-section-node {
clear: both;
border-top: 1px dotted #bbbbbb;
border-left: 1px dotted #bbbbbb;
border-right: 1px dotted #bbbbbb;
border-bottom: none;
padding-bottom: 0;
}
.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%;
}
td.cbi-section-table-optionals {
text-align: left !important;
padding-top: 1em;
}
.cbi-value-helpicon img {
vertical-align: bottom;
}
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;
}
.right {
text-align: right;
}
.luci {
position: fixed;
bottom: 0;
left: 0;
text-align: right;
color: #ffffff;
}
.luci a:link,
.luci a:visited {
background-color: transparent;
color: #ffffff;
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;
}
#memorybar {
width: 200px;
height: 8px;
border: 1px solid #bbb;
color: black;
background-color: red;
}
#memfree, #membuffers, #memcached {
float: right;
border: 1px solid #bbb;
height: 6px;
}
#memfree {
background-color: green;
color: black;
}
#membuffers {
background-color: yellow;
color: black;
}
#memcached {
background-color: #ffa500;
color: black;
}
/* obligatory IE6 Voodoo Code */
* html body {
padding-left: 50% !important;
}
* html div#header {
margin-left: -100% !important;
}
* html div.menubar {
margin-left: -100% !important;
width: 200% !important;
}
* html div#maincontent {
margin-left: -80% !important;
width: 160% !important;
}
* html div.cbi-value-description {
margin-left: 40%;
}
}

View file

@ -0,0 +1,99 @@
@charset "utf-8";
@media all {
div.dashicon {
float: left;
}
div.dashicon a {
background-image: url(icons/default.png);
background-repeat: no-repeat;
background-position: top;
display: block;
width: 70px;
padding-top: 70px;
color: #000000;
text-decoration: none;
text-align: center;
margin: 2em;
font-weight: bold;
}
div.di_network a {
background-image: url(icons/network.png);
}
div.di_luci a {
background-image: url(icons/desktop.png);
}
div.di_index a {
background-image: url(icons/overview.png);
}
div.di_logout a {
background-image: url(icons/logout.png);
}
div.di_freifunk a {
background-image: url(icons/freifunk.png);
}
div.di_status a {
background-image: url(icons/status.png);
}
div.di_system a {
background-image: url(icons/system.png);
}
div.di_syslog a {
background-image: url(icons/shell.png);
}
div.di_ntpc a {
background-image: url(icons/datetime.png);
}
div.di_leds a {
background-image: url(icons/lightbulb.png);
}
div.di_reboot a {
background-image: url(icons/restart.png);
}
div.di_passwd a {
background-image: url(icons/login.png);
}
div.di_statistics a {
background-image: url(icons/stats.png);
}
div.di_packages a {
background-image: url(icons/package.png);
}
div.di_sshkeys a {
background-image: url(icons/key.png);
}
div.di_upgrade a {
background-image: url(icons/flash.png);
}
div.di_services a {
background-image: url(icons/worker.png);
}
div.di_backup a {
background-image: url(icons/switch.png);
}
div.di_fstab a {
background-image: url(icons/harddisk.png);
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

View file

@ -0,0 +1,48 @@
The Oxygen Icon Theme
Copyright (C) 2007 David Vignoni <david@icon-king.com>
Copyright (C) 2007 Johann Ollivier Lapeyre <johann@oxygen-icons.org>
Copyright (C) 2007 Kenneth Wimer <kwwii@bootsplash.org>
Copyright (C) 2007 Nuno Fernades Pinheiro <nf.pinheiro@gmail.com>
Copyright (C) 2007 Riccardo Iaconelli <riccardo@oxygen-icons.org>
Copyright (C) 2007 David Miller <miller@oxygen-icons.org>
and others
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 3 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library. If not, see <http://www.gnu.org/licenses/>.
Clarification:
The GNU Lesser General Public License or LGPL is written for
software libraries in the first place. We expressly want the LGPL to
be valid for this artwork library too.
KDE Oxygen theme icons is a special kind of software library, it is an
artwork library, it's elements can be used in a Graphical User Interface, or
GUI.
Source code, for this library means:
- where they exist, SVG;
- otherwise, if applicable, the multi-layered formats xcf or psd, or
otherwise png.
The LGPL in some sections obliges you to make the files carry
notices. With images this is in some cases impossible or hardly useful.
With this library a notice is placed at a prominent place in the directory
containing the elements. You may follow this practice.
The exception in section 5 of the GNU Lesser General Public License covers
the use of elements of this art library in a GUI.
kde-artists [at] kde.org

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

4
themes/oxygen/ipkg/postinst Executable file
View file

@ -0,0 +1,4 @@
#!/bin/sh
[ -n "${IPKG_INSTROOT}" ] || {
( . /etc/uci-defaults/luci-theme-oxygen ) && rm -f /etc/uci-defaults/luci-theme-oxygen
}

View file

@ -0,0 +1,46 @@
<%#
LuCI - Lua Configuration Interface
Copyright 2008 Steven Barth <steven@midlink.org>
Copyright 2008 Jo-Philipp Wich <xm@leipzig.freifunk.net>
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 node = luci.dispatcher.context.requested
if node.nodes then
%>
<div class="dashboard">
<%-
for k, v in luci.util.spairs(node.nodes, function (a,b)
return (node.nodes[a].order or 100) < (node.nodes[b].order or 100)
end) do
if v.title and #v.title > 0 and not v.ignoreindex and (v.index or v.target) then
local csscl = "dashicon di_%s" % (v.style or k)
local iconl = v.icon
local pref = luci.util.clone(luci.dispatcher.context.request)
pref[#pref+1] = k
local target = luci.dispatcher.build_url(unpack(pref))
%>
<div class="<%=csscl%>">
<a href="<%=target%>" <%-
if iconl then
%> style="background-image: url(<%=resource%>/<%=iconl%>)"<%-
end
-%>><%=v.title%></a>
</div>
<%
end
end
-%>
</div>
<div class="clear"></div>
<%
end
%>

View file

@ -0,0 +1,22 @@
<%#
LuCI - Lua Configuration Interface
Copyright 2008 Steven Barth <steven@midlink.org>
Copyright 2008 Jo-Philipp Wich <xm@leipzig.freifunk.net>
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$
-%>
<div class="clear"></div>
</div>
<p class="luci"><a href="<%=controller%>/about">Powered by <%= luci.__appname__ .. " " .. luci.__version__%></a></p>
</div>
</body>
</html>

View file

@ -0,0 +1,130 @@
<%#
LuCI - Lua Configuration Interface
Copyright 2008 Steven Barth <steven@midlink.org>
Copyright 2008 Jo-Philipp Wich <xm@leipzig.freifunk.net>
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 hostname = require("luci.sys").hostname()
local crequest = luci.dispatcher.context.request
local request = require("luci.dispatcher").context.path
local category = request[1]
local tree = luci.dispatcher.node()
local cattree = category and luci.dispatcher.node(category)
local node = luci.dispatcher.context.dispatched
local c = tree
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
require("luci.i18n").loadc("default")
require("luci.http").prepare_content("application/xhtml+xml")
-%>
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<%=luci.i18n.context.lang%>" lang="<%=luci.i18n.context.lang%>">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<link rel="stylesheet" type="text/css" media="screen" href="<%=media%>/cascade.css" />
<link rel="stylesheet" type="text/css" media="screen" href="<%=media%>/dashboard.css" />
<% if node and node.css then %><link rel="stylesheet" type="text/css" media="screen" href="<%=resource%>/<%=node.css%>" />
<% end -%>
<title><%=striptags( hostname .. ( (node and node.title) and ' - ' .. node.title or '')) %> - LuCI</title>
</head>
<body class="lang_<%=luci.i18n.context.lang%>">
<div id="screen">
<p class="skiplink">
<span id="skiplink1"><a href="#navigation"><%:skiplink1 Skip to navigation%></a></span>
<span id="skiplink2"><a href="#content"><%:skiplink2 Skip to content%></a></span>
</p>
<%-
local function ucimenu(prefix, node)
if not node.nodes or node.hidden then
return false
end
local index = {}
local count = 0
for k, n in pairs(node.nodes) do
if n.title and n.target then
table.insert(index, {name=k, order=n.order or 100})
count = count + 1
end
end
table.sort(index, function(a, b) return a.order < b.order end)
if count > 0 then
for j, v in pairs(index) do
if #v.name > 0 then
local nnode = node.nodes[v.name]
local href = controller .. prefix .. v.name .. "/"
href = (nnode.query) and href .. luci.http.build_querystring(nnode.query) or href
%>
<span><a class="menulink<% if nnode._menu_selected then %> active<%end%>" href="<%=luci.util.pcdata(href)%>"> &gt; <%=nnode.title%></a></span>
<%-
end
end
%>
<%
end
end
%>
<div id="header"></div>
<%
if tree.nodes[category] and tree.nodes[category].ucidata then
local ucic = 0
for i, j in pairs(require("luci.model.uci").cursor():changes()) do
for k, l in pairs(j) do
for m, n in pairs(l) do
ucic = ucic + 1;
end
end
end
-%>
<% if ucic > 0 then %><div class="menubar"><div><a class="warning" href="<%=controller%>/<%=category%>/uci/changes/"><%:unsavedchanges%>: <%=ucic%></a><%
ucimenu("/" .. category .. "/uci/", tree.nodes[category].nodes["uci"], "changes")-%>
<div class="clear"></div>
</div></div>
<% end %>
<% end %>
<div class="menubar">
<h2 class="navigation"><a id="navigation" name="navigation"><%:navigation Navigation%></a></h2>
<strong><%:path%>:</strong>
<a href="<%=controller%>"><%= luci.__appname__ %></a>
<%
local pointer = tree
for k, v in ipairs(crequest) do
if pointer.nodes and pointer.nodes[v] then
pointer = pointer.nodes[v]
%>
&#187; <a href="<%=luci.dispatcher.build_url(unpack(crequest, 1, k))%>"><%=pointer.title or v%></a>
<%
end
end
%>
</div>
<div id="maincontent">
<% if node.subindex then %><%+themes/oxygen/dashboard%><% end %>

View file

@ -0,0 +1,17 @@
<%#
LuCI - Lua Configuration Interface
Copyright 2008 Steven Barth <steven@midlink.org>
Copyright 2008 Jo-Philipp Wich <xm@leipzig.freifunk.net>
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$
-%>
<%+header%>
<%+themes/oxygen/dashboard%>
<%+footer%>

View file

@ -0,0 +1,6 @@
#!/bin/sh
uci batch <<-EOF
set luci.themes.Oxygen=/luci-static/oxygen
commit luci
EOF