From 3bcb00ba682e6a957e4d5359b1687fef6252e068 Mon Sep 17 00:00:00 2001 From: "Ycarus (Yannick Chabanois)" Date: Thu, 25 Feb 2021 14:28:23 +0100 Subject: [PATCH] Add openwrt 2020 theme --- luci-theme-openwrt-2020/Makefile | 14 + .../GalanoGrotesqueW00-Regular.woff2 | Bin 0 -> 29004 bytes .../luci-static/openwrt2020/cascade.css | 1925 +++++++++++++++++ .../luci-static/openwrt2020/favicon.png | Bin 0 -> 535 bytes .../luci-static/openwrt2020/omr-logo.png | Bin 0 -> 50790 bytes .../luci-static/openwrt2020/spinner.svg | 12 + .../luci-static/resources/menu-openwrt2020.js | 147 ++ .../luasrc/view/themes/openwrt2020/footer.htm | 17 + .../luasrc/view/themes/openwrt2020/header.htm | 63 + .../uci-defaults/30_luci-theme-openwrt-2020 | 12 + 10 files changed, 2190 insertions(+) create mode 100644 luci-theme-openwrt-2020/Makefile create mode 100644 luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/GalanoGrotesqueW00-Regular.woff2 create mode 100644 luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/cascade.css create mode 100644 luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/favicon.png create mode 100644 luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/omr-logo.png create mode 100644 luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/spinner.svg create mode 100644 luci-theme-openwrt-2020/htdocs/luci-static/resources/menu-openwrt2020.js create mode 100644 luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/footer.htm create mode 100644 luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm create mode 100755 luci-theme-openwrt-2020/root/etc/uci-defaults/30_luci-theme-openwrt-2020 diff --git a/luci-theme-openwrt-2020/Makefile b/luci-theme-openwrt-2020/Makefile new file mode 100644 index 000000000..e5ef95832 --- /dev/null +++ b/luci-theme-openwrt-2020/Makefile @@ -0,0 +1,14 @@ +# +# Copyright (C) 2020 Jo-Philipp Wich +# +# This is free software, licensed under the Apache License, Version 2.0 . +# + +include $(TOPDIR)/rules.mk + +LUCI_TITLE:=LuCI modern OpenWrt theme +LUCI_DEPENDS:= + +include $(TOPDIR)/feeds/luci/luci.mk + +# call BuildPackage - OpenWrt buildroot signature diff --git a/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/GalanoGrotesqueW00-Regular.woff2 b/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/GalanoGrotesqueW00-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..950ac98cc5f79db9863bd001fe66a20d551d0785 GIT binary patch literal 29004 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 Dq@qpE literal 0 HcmV?d00001 diff --git a/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/cascade.css b/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/cascade.css new file mode 100644 index 000000000..b412764d4 --- /dev/null +++ b/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/cascade.css @@ -0,0 +1,1925 @@ +:root { + --main-bright-color: #00A3E1; + --main-dark-color: #002B49; + --secondary-bright-color: #FFFFFF; + --secondary-dark-color: #212322; + --danger-color: #CC1111; + --warning-color: #CC8800; + --regular-font: "GalanoGrotesqueW00-Regular"; + --base-font-size: 16px; +} + +@font-face { + font-family: "GalanoGrotesqueW00-Regular"; + src: url("GalanoGrotesqueW00-Regular.woff2") format("woff2"); +} + +/* + * resets and base style + */ + +* { + margin: 0; + padding: 0; + box-sizing: border-box; + text-decoration: none; + list-style: none; + color: inherit; + font-family: var(--regular-font), "sans-serif"; + border: none; + font-size: 100%; + background: none; + outline: none; + -webkit-appearance: none; + -webkit-text-size-adjust: none; +} + +html { + height: 100%; + width: 100%; + max-width: 1366px; + margin: 0 auto; + background: #fff linear-gradient(90deg, rgba(0, 0, 0, .8), rgba(0, 0, 0 ,.5), rgba(0, 0, 0, .8)); +} + +body { + background: var(--secondary-bright-color); + color: var(--secondary-dark-color); + font-size: var(--base-font-size); + cursor: default; + display: inline-flex; + flex-direction: column; + min-height: 100%; + min-width: 100%; +} + +/* + * scaffholding + */ + +#menubar { + background-color: var(--main-bright-color); + background-image: url("omr-logo.png"); + background-position: 10px center; + background-size: 50px 50px; + background-repeat: no-repeat; + padding: 0 1em 0 70px; + min-height: 70px; + display: flex; + align-items: center; + color: var(--secondary-bright-color); + flex: 0; + width: 100%; + box-shadow: inset 0 0 1px var(--main-dark-color); +} + +#menubar > * { + flex: 1 1 auto; +} + +#menubar .hostname { + font-weight: bold; + font-size: 2em; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +#menubar .distversion { + flex: 3; +} + +#indicators { + flex: 1 1 25%; + text-align: right; +} + +#indicators > * { + background: var(--secondary-bright-color); + color: var(--main-bright-color); + display: inline-block; + font-size: .85em; + line-height: 1.5em; + padding: 0 .5em; + margin: .125em; + border-radius: 1em; + cursor: pointer; + white-space: nowrap; +} + +#indicators > [data-style="inactive"] { + background: var(--main-bright-color); + color: var(--secondary-bright-color); + border: 2px solid var(--secondary-bright-color); + line-height: calc(1.5em - 4px); + padding: 0 calc(.5em - 2px); +} + +#menubar h2, +.skiplink { + display: none; +} + +#modemenu { + background: var(--main-bright-color); + padding: .5rem 1rem; + display: flex; + align-items: center; + color: var(--secondary-bright-color); + box-shadow: inset 0 0 1px var(--main-dark-color); + font-size: 1rem; + flex-wrap: wrap; +} + +#modemenu > * { + margin: .125rem; +} + +#modemenu > .active { + font-weight: bold; + border-bottom: 2px solid var(--secondary-bright-color); +} + +#maincontainer { + flex-direction: row; + display: inline-flex; + flex: 1 0 auto; +} + +#mainmenu { + flex: 1 1 200px; + background: var(--main-dark-color); + color: var(--main-bright-color); + padding: 1em; +} + +#mainmenu:empty { + max-width: 0; + padding: 1em 0; + transition: all .2s ease-in-out; +} + +#mainmenu > div { + position: sticky; + top: 1em; +} + +#mainmenu ul { + padding: 0; + margin: 0 0 .5em .5em; + line-height: 1.5em; +} + +#mainmenu ul > li { + list-style: none; +} + +#mainmenu li > ul { + max-height: 0; + overflow: hidden; + transition: max-height .1s ease-in-out; +} + +#mainmenu li.selected > a { + color: var(--secondary-bright-color); +} + +#mainmenu ul:not(.active) > li.selected > ul, +#mainmenu li.active > ul { + max-height: 3000px; + transition: max-height 1s ease-in-out; +} + +#mainmenu .l1 > li > a { + font-weight: bold; + font-size: 1.05em; +} + +#maincontent { + flex: 10; + padding: 1em 1em 0 1em; +} + +body > .luci { + flex: 0; + font-size: .7em; + padding: .25em; + text-align: right; + background: var(--main-bright-color); + color: var(--secondary-bright-color); + margin: 0; +} + +/* + * modal + */ + +body.modal-overlay-active { + overflow: hidden; +} + +body.modal-overlay-active #modal_overlay { + left: 0; + right: 0; + opacity: 1; +} + +#modal_overlay { + position: fixed; + top: 0; + bottom: 0; + left: -10000px; + right: 10000px; + background: rgba(0, 0, 0, 0.7); + z-index: 10000; + overflow-y: scroll; + -webkit-overflow-scrolling: touch; + transition: opacity .125s ease-in; + opacity: 0; +} + +#modal_overlay > .modal { + max-width: 1300px; + width: 80%; + margin: 10% auto 5rem auto; + background: var(--secondary-bright-color); + box-shadow: 0 0 3px 1px var(--main-bright-color); + padding: .5em; + border-radius: .25em; + display: flex; + flex-direction: column; +} + +.modal > h4:first-child { + padding: .5rem; + margin: -.5rem -.5rem .5rem -.5rem; + background: var(--main-bright-color); + color: var(--secondary-bright-color); + border-radius: .25rem .25rem 0 0; +} + +.modal > *:first-child:last-child { + margin: .5em 0 !important; +} + +.modal .cbi-section > legend:first-child { font-size: 120%; } + + +/* + * table layout + */ + +.table { + display: table; + width: 100%; + margin: 0 0 1rem 0; + position: relative; +} + +.tr { + display: table-row; +} + +.tr.cbi-section-table-titles[data-title]::before { + font-weight: bold; + border-top: none; +} + +.tr[data-title]::before { + content: attr(data-title); + display: table-cell; + border-top: 1px solid var(--main-dark-color); + padding: .5em; +} + +.th { + font-weight: bold; + display: table-cell; + padding: .5em; + /* word-break: break-word; */ +} + +.cbi-section-table-descr .th { + opacity: .8; + font-size: 90%; + font-weight: normal; +} + +.td { + display: table-cell; + border-top: 1px solid var(--main-dark-color); + padding: .5em; + vertical-align: middle; +} + +.td input:not([type]), +.td input[type="text"], +.td input[type="password"], +.td select, +.td .cbi-dropdown:not(.btn):not(.cbi-button), +.td .cbi-dynlist, +.td .control-group { + min-width: auto; + width: 100%; +} + +.tr.drag-over-above { + box-shadow: 0 -6px 6px var(--main-bright-color); +} + +.tr.drag-over-below { + box-shadow: 0 6px 6px var(--main-bright-color); +} + +.tr.placeholder { + height: 4em; + position: relative; +} + +.tr.placeholder > .td { + position: absolute; + left: 0; + right: 0; + bottom: 0; + text-align: center; + line-height: 3em; + font-size: 90%; + opacity: .8; +} + +/* + * view specific table invariants + */ + + #cbi-wireless-wifi-device .ifacebadge { + flex-direction: column; + justify-content: space-around; + } + +.assoclist .td, +[data-page="admin-status-overview"] .td { + font-size: .9rem; + vertical-align: middle; +} + +.assoclist .td:nth-of-type(3) > span { + display: block; + max-width: 270px; + font-size: .8rem; +} + +.assoclist .td:nth-of-type(5) > span { + font-size: .8rem; +} + +.assoclist .td > .ifacebadge { + flex-wrap: wrap; + justify-content: space-around; + max-width: 120px; + padding: .2em; +} + +.assoclist .td > .ifacebadge::after { + overflow: hidden; + text-overflow: ellipsis; +} + +.assoclist .td > .ifacebadge > img { + margin: 0 25px; +} + +.assoclist .td > .ifacebadge[data-ssid][data-ifname] > span { + display: none; +} + +.assoclist .td > .ifacebadge[data-ssid][data-ifname]::after { + content: attr(data-ssid) " (" attr(data-ifname) ")"; +} + +[data-page="admin-status-overview"] .td:nth-of-type(3) { + min-width: 100px; +} + +[data-page="admin-network-firewall"] .table > .tr > *:nth-child(1) { + flex: 1 1 30%; +} + +[data-page="admin-network-wireless"] .cbi-section-actions > div { + display: flex; +} + +[data-page="admin-network-wireless"] .cbi-section-actions > div > * { + flex: 1; +} + +[data-page="admin-status-processes"] .table .td:nth-of-type(3), +[data-tab="leases"] .table .td[data-name="duid"] { + word-break: break-word; +} + +/* + * uci changelog + */ + +.uci-change-list { + font-size: 90%; + white-space: pre; + overflow: hidden; +} + +.uci-change-list del, +.uci-change-list ins, +.uci-change-list var, +.uci-change-legend-label del, +.uci-change-legend-label ins, +.uci-change-legend-label var { + text-decoration: none; + font-family: monospace; + font-style: normal; + border: 1px solid #ccc; + background: #eee; + padding: 2px; + display: block; + line-height: 15px; + margin-bottom: 1px; +} + +.uci-change-list h5 { + margin: .5em 0 .25em 0; +} + +.uci-change-list ins, +.uci-change-legend-label ins { + border-color: #0f0; + background: #cfc; +} + +.uci-change-list del, +.uci-change-legend-label del { + border-color: #f00; + background: #fcc; +} + +.uci-change-list var, +.uci-change-legend-label var { + border-color: #ccc; + background: #eee; +} + +.uci-change-list var ins, +.uci-change-list var del { + display: inline-block; + border: none; + width: 100%; + padding: 0; +} + +.uci-change-legend { + margin: .5em 0 0 0; + display: flex; + flex-wrap: wrap; +} + +.uci-change-legend-label { + flex: 1 1 10em; + white-space: nowrap; +} + +.uci-change-legend-label > ins, +.uci-change-legend-label > del, +.uci-change-legend-label > var { + float: left; + margin-right: 4px; + width: 16px; + height: 16px; + display: block; + position: relative; +} + +.uci-change-legend-label var ins, +.uci-change-legend-label var del { + border: none; + position: absolute; + top: 2px; + left: 2px; + right: 2px; + bottom: 2px; +} + +/* + * alignment helpers + */ + +.left { + text-align: left !important; +} + +.right { + text-align: right !important; +} + +.center { + text-align: center !important; +} + +.top { + vertical-align: top !important; +} + +.bottom { + vertical-align: bottom !important; +} + +.middle { + vertical-align: middle !important; +} + +.nowrap { + white-space: nowrap !important; +} + +.hidden { + display: none !important; +} + +/* + * legacy hacks + */ + +[width="33%"] { + width: 33%; + max-width: 33%; +} + +[width="50%"] { + width: 50%; + max-width: 50%; +} + +[data-name="_freq"] select { + min-width: auto; +} + +.cbi-value-field > div:first-child + br { + display: none; +} + +/* + * typography + */ + +h1, h2, h3, h4, h5, h6, +.cbi-section > legend:first-child { + font-weight: bold; + margin: 0 0 1rem 0; +} + +strong, b { + font-weight: bold; +} + +h1 { font-size: 160%; } +h2 { font-size: 150%; } +h3 { font-size: 140%; } +h4 { font-size: 130%; } +h5 { font-size: 120%; } +h6 { font-size: 110%; } + +.cbi-section > legend:first-child { font-size: 140%; } + +p, ul, textarea { + margin: 0 0 1em 0; +} + +p > textarea:last-child { + margin: 0; +} + +var { + color: var(--main-dark-color); + font-weight: bold; +} + +code { + font-family: monospace; + color: var(--main-dark-color); +} + +pre { + font-family: monospace; + margin: 0 0 1em 0; + font-size: .9rem; + box-shadow: inset 0 0 2px var(--main-dark-color); + padding: .25rem; + overflow: auto; +} + +big { + font-size: 110%; +} + +small { + font-size: 95%; +} + +ul { + padding: 0 0 0 1.5em; +} + +ul > li { + list-style: disc; +} + +/* + * widgets + */ + +.ifacebox, .ifacebadge, .zonebadge { + display: inline-flex; + line-height: 1.8em; + padding: 0 .25em; + margin: .25em; + box-shadow: 0px 0px 2px var(--main-dark-color); + font-size: .9em; + border-radius: .5em; + overflow: hidden; + font-size: .8rem; + vertical-align: text-top; + background: var(--secondary-bright-color); + align-items: center; + color: var(--secondary-dark-color); + vertical-align: middle; +} + +.zonebadge > .ifacebadge { + margin: .125em -.125em .125em .35em; +} + +.zonebadge > .ifacebadge > img +{ + margin: .125em 0 .125em .25em; +} + +.ifacebox { + display: inline-flex; + flex-direction: column; + padding: 0; + text-align: center; + width: 100%; + max-width: 100px; +} + +.ifacebox-head { + background: var(--main-bright-color); + width: 100%; +} + +.ifacebox-body { + text-align: center; + padding: .3em .25em .25em .25em; + white-space: nowrap; +} + +.ifacebadge { + display: inline-flex; + align-items: center; +} + +.ifacebadge.large { + line-height: 1.3em; +} + +.ifacebadge > img { + vertical-align: text-bottom; + margin: .25em; + height: 16px; +} + +.ifacebadge > * { + margin-left: .25em; +} + +.network-status-table { + display: inline-flex; + flex-wrap: wrap; + width: 100%; + margin: 0 -.2em 1em -.2em; +} + +.network-status-table > .ifacebox { + max-width: none; + flex: 1 1 45%; + margin: .25em; + min-width: 250px; +} + +.network-status-table > .ifacebox .ifacebadge { + font-size: 100%; + max-width: none; + flex: 1 1 45%; + margin: .2em; +} + +.network-status-table .ifacebox-body > div { + display: flex; + flex-wrap: wrap; + margin: .3em -.1em -.1em -.1em; +} + +.cbi-tooltip-container { + cursor: help; +} + +.cbi-tooltip { + position: absolute; + z-index: 10000; + left: -10000px; + box-shadow: 0 0 2px rgba(0, 0, 0, .7); + border-radius: 3px; + background: var(--secondary-bright-color); + white-space: pre; + padding: 2px 5px; + opacity: 0; + transition: opacity .25s ease-in; + font-size: .8rem; +} + +.cbi-tooltip.error { + color: var(--danger-color); +} + +.cbi-tooltip-container:hover .cbi-tooltip:not(:empty) { + left: auto; + opacity: 1; + transition: opacity .25s ease-in; +} + +.zone-forwards { + display: flex; + align-items: center; +} + +.cbi-progressbar { + border-radius: .25em; + position: relative; + min-width: 20rem; + height: 1.5em; + box-shadow: 0 0 2px var(--main-dark-color); + overflow: hidden; + margin: .125rem 0; +} + +.cbi-progressbar > div { + background: var(--main-bright-color); + height: 100%; + transition: width .25s ease-in; + width: 0%; +} + +.cbi-progressbar::after { + position: absolute; + bottom: 0; + top: 0; + right: 0; + left: 0; + text-align: center; + text-shadow: 0 0 2px var(--secondary-bright-color); + content: attr(title); + white-space: nowrap; + line-height: 1.5em; +} + +.cbi-tabmenu { + padding: 0; + margin: 0 -.5em 1em -.5em; + font-weight: bold; + color: var(--main-dark-color); +} + +.cbi-tabmenu > li { + display: inline-flex; + white-space: nowrap; + opacity: 1; + height: 1.8em; + max-height: none; + overflow: visible; +} + +.cbi-tabmenu > li > a { + flex: 1; + margin: .1em .5em; +} + +.cbi-tabmenu > .cbi-tab > a { + border-bottom: 2px solid var(--main-dark-color); +} + +[data-tab] { + opacity: 0; + max-height: 0; + transition: opacity .25s ease-in-out; + overflow: hidden; +} + +[data-tab-active="true"] { + opacity: 1; + height: auto; + max-height: none; + overflow: visible; +} + +.alert-message:not(.modal) { + box-shadow: 0 0 3px var(--secondary-dark-color); + padding: .5em; + margin: 0 0 1em 0; + background: var(--warning-color); + color: var(--secondary-bright-color); + transition: opacity .4s ease; +} + +.alert-message + .alert-message { + margin: -.5em 0 1em 0; +} + +.alert-message.info { + background: var(--main-bright-color); +} + +.alert-message.warning { + background: var(--warning-color); +} + +.alert-message.danger { + background: var(--danger-color); +} + +.alert-message .btn { + background: inherit; + box-shadow: 0 0 2px var(--secondary-bright-color); +} + +.alert-message .btn:hover { + box-shadow: 0 0 4px 1px var(--secondary-bright-color); +} + +@keyframes fade-in { + 0% { opacity: 0; } + 100% { opacity: 1; } +} + +@keyframes fade-out { + 0% { opacity: 1; } + 100% { opacity: 0; } +} + +.fade-in { + animation: fade-in .4s ease; +} + +.fade-out { + animation: fade-out .4s ease; + opacity: 0; +} + +/* + * forms + */ + +.cbi-button, button, .btn { + background: var(--main-bright-color); + color: var(--secondary-bright-color); + line-height: 1.5em; + border-radius: .25em; + cursor: pointer; + box-shadow: 0 0 2px var(--main-dark-color); + padding: 0 .5em; + display: inline-block; +} + +.cbi-button:hover, button:hover, .btn:hover { + box-shadow: 0 0 6px var(--main-bright-color); +} + +button + button, .btn + .btn, button + .btn, .btn + button, select + button { + margin-left: .25em; +} + +button.important { + background: var(--main-dark-color); +} + +button[disabled], button.disabled, .btn[disabled], .btn.disabled { + pointer-events: none; + opacity: .6; +} + +.cbi-button-apply, .cbi-button-positive { + background: var(--main-dark-color); +} + +.cbi-button-negative, .cbi-button-remove { + background: var(--danger-color); +} + +.cbi-checkbox { + position: relative; +} + +.cbi-checkbox input[type="checkbox"] { + position: absolute; + z-index: 10; + -webkit-appearence: button; + height: 1.3em; + width: 1.3em; + opacity: 0; + cursor: pointer; +} + +.cbi-checkbox input[type="checkbox"] + label { + position: relative; + display: inline-block; + width: 1.3em; + height: 1.3em; + vertical-align: text-top; +} + +.cbi-checkbox input[type="checkbox"] + label::before { + content: "\0a"; + height: 1em; + width: 1em; + box-shadow: 0 0 2px var(--main-dark-color); + display: inline-block; + border-radius: .25em; + margin: .15em 0; + position: absolute; + left: 0; + top: 0; +} + +.cbi-checkbox input[type="checkbox"]:checked + label::after { + content: "\0a"; + position: absolute; + display: inline-block; + background: var(--main-dark-color); + top: .35em; + left: .2em; + width: .6em; + height: .6em; + border-radius: .15em; + cursor: pointer; +} + +.cbi-checkbox input.cbi-input-invalid[type="checkbox"] + label::before { + box-shadow: 0 0 2px var(--danger-color); +} + +.cbi-checkbox input.cbi-input-invalid[type="checkbox"]:checked + label::after { + background: var(--danger-color); +} + +.cbi-checkbox input[type="checkbox"][disabled] + label::before, +.cbi-checkbox input[type="checkbox"][disabled] + label::after { + pointer-events: none; + opacity: .6; +} + +.cbi-checkbox input[type="checkbox"][disabled] { + pointer-events: none; +} + +input:not([type]), +input[type="text"], +input[type="password"], +select, +.cbi-dropdown:not(.btn):not(.cbi-button) { + border-bottom: 2px solid transparent; + box-shadow: inset 0 0 1px var(--main-dark-color); + padding: 0 .2rem; + line-height: 1.5rem; + min-height: calc(1.5rem + 2px); + min-width: 20rem; + border-radius: .25em; +} + +input:not([type]):focus, +input[type="text"]:focus, +input[type="password"]:focus, +select:focus, +.cbi-dropdown:not(.btn):not(.cbi-button):focus, +.cbi-dropdown[open]:not(.btn):not(.cbi-button) { + border-color: var(--main-dark-color); +} + +input[disabled]:not([type]), +input[disabled][type="text"], +input[disabled][type="password"], +select[disabled], +.cbi-dynlist[disabled] { + opacity: .6; + pointer-events: none; +} + +input:not([type]) + .btn, input:not([type]) + button, +input[type="text"] + .btn, input[type="text"] + button, +input[type="password"] + .btn, input[type="password"] + button { + margin: 0 0 2px -1px; + background: var(--main-dark-color); + border-radius: 0 .25em .25em 0; +} + +.control-group > select + .btn, .control-group > select + button { + margin-left: .25em; +} + +.control-group > input:not([type]) + .btn, .control-group > input:not([type]) + button, +.control-group > input[type="text"] + .btn, .control-group > input[type="text"] + button, +.control-group > input[type="password"] + .btn, .control-group > input[type="password"] + button { + margin: .125em .125em calc(.125em + 2px) calc(-.125em - .25em) !important; +} + +input[type="checkbox"] { + height: 1em; + vertical-align: middle; + -webkit-appearance: checkbox; +} + +select { + padding: .1rem 0; + -webkit-appearance: menulist; +} + +textarea { + width: 100%; + box-shadow: inset 0 0 2px var(--main-dark-color); + font-family: monospace; + font-size: .9rem; + padding: .2rem; +} + +.cbi-input-invalid, +.cbi-input-invalid:focus { + color: var(--danger-color); + border-color: var(--danger-color) !important; + box-shadow: inset 0 0 2px var(--danger-color); +} + +.control-group { + display: inline-flex; + margin: 0 -.125rem; + min-width: 20.25em; +} + +.control-group > *, +.control-group > .cbi-dropdown > ul > li { + justify-content: space-around; +} + +.control-group > * { + margin: .125rem !important; + min-width: auto !important; +} + +.control-group > select, +.control-group > input:not([type]), +.control-group > input[type="text"], +.control-group > input[type="password"] { + flex: 10; +} + +.cbi-value { + display: flex; + flex-wrap: wrap; + margin: 0 0 1em 0; +} + +.cbi-value > label:first-child { + flex: 1 1 40%; + padding: 0 .5em 0 0; +} + +.cbi-value > .cbi-value-field { + flex: 2 2 55%; +} + +.cbi-value > .cbi-section { + flex: 1 1 100%; +} + +.cbi-map-descr, +.cbi-tab-descr, +.cbi-section-descr, +.cbi-value-description, +.cbi-value[data-widget="CBI.DummyValue"] > div:first-child { + opacity: .8; + font-size: .9rem; + padding: .2em 0; +} + +.cbi-map-descr, +.cbi-tab-descr, +.cbi-section-descr, +.cbi-section-table, +.cbi-section-create { + margin: 0 0 1em 0; +} + +.cbi-dynlist { + display: inline-block; + font-size: 90%; + min-height: calc(1.5em + 2px); + line-height: 1.5em; + min-width: 20rem; + flex-wrap: wrap; +} + +.cbi-dynlist > .item { + box-shadow: 0 0 2px var(--main-dark-color); + margin: .3em 0; + padding: .15em 2em .15em .2em; + border-radius: .25em; + position: relative; + overflow: hidden; + transition: box-shadow .25s ease-in-out; + pointer-events: none; + flex: 1 1 100%; + word-break: break-all; +} + +.cbi-dynlist > .item::after { + content: "-"; + top: 0; + right: 0; + bottom: 0; + width: 1.6rem; + background: var(--main-bright-color); + display: flex; + align-items: center; + justify-content: space-around; + position: absolute; + box-shadow: 0 0 2px var(--main-dark-color); + text-align: center; + color: var(--secondary-bright-color); + cursor: pointer; + pointer-events: all; +} + +.cbi-dynlist[disabled] > .item::after { + pointer-events: none; +} + +.cbi-dynlist > .item:hover { + box-shadow: 0 0 2px var(--main-bright-color); +} + +.cbi-dynlist > .add-item { + flex: 1; + display: flex; +} + +.cbi-dynlist > .add-item > input { + flex: 1; + min-width: 18.5rem; + border-radius: .25rem 0 0 .25rem; +} + +.cbi-dynlist > .add-item > .btn { + flex: 0 0 1.6rem; + margin: 0 0 2px -1px; + width: 1.6rem; + text-align: center; +} + +.cbi-dropdown { + display: inline-flex !important; + cursor: pointer; + height: auto; + position: relative; + padding: 0 !important; +} + +.cbi-dropdown:not(.btn):not(.cbi-button) { + box-shadow: inset 0 0 1px var(--main-dark-color); +} + +.cbi-dropdown > ul { + margin: 0 !important; + padding: 0; + list-style: none; + overflow-x: hidden; + overflow-y: auto; + display: flex; + width: 100%; +} + +.cbi-dropdown.btn > ul:not(.dropdown) { + padding-left: .5em; +} + +.cbi-dropdown.btn.spinning > ul:not(.dropdown) { + padding-left: 0; +} + +.cbi-dropdown.btn > ul.dropdown > li { + color: var(--main-dark-color); +} + +.cbi-dropdown > ul.preview { + display: none; +} + +.cbi-dropdown > .open, +.cbi-dropdown > .more { + flex-grow: 0; + flex-shrink: 0; + display: flex; + flex-direction: column; + justify-content: center; + text-align: center; + padding: 0 .25em; +} + +.cbi-dropdown.btn > .open, +.cbi-dropdown.cbi-button > .open { + padding: 0 .5em; + margin-left: .5em; + border-left: 1px solid; +} + +.cbi-dropdown > .more, +.cbi-dropdown:not(.btn):not(.cbi-button) > ul > li[placeholder] { + display: none; + justify-content: center; + color: rgba(0, 0, 0, .5); +} + +.cbi-dropdown > ul > li { + display: none; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + flex-shrink: 1; + flex-grow: 1; + align-items: center; + align-self: center; + color: inherit; +} + +.cbi-dropdown > ul.dropdown > li, +.cbi-dropdown:not(.btn):not(.cbi-button) > ul > li { + padding: 0 .25em; +} + +.cbi-dropdown > ul > li .hide-open { display: block; display: initial; } +.cbi-dropdown > ul > li .hide-close { display: none; } + +.cbi-dropdown > ul > li[display]:not([display="0"]) { + border-left: 1px solid #ccc; +} + +.cbi-dropdown[empty] > ul { + max-width: 1px; + max-height: 1.5em; +} + +.cbi-dropdown > ul > li > form { + display: none; + margin: 0; + padding: 0; + pointer-events: none; +} + +.cbi-dropdown > ul > li img { + align-self: center; + margin-right: .25em; +} + +.cbi-dropdown > ul > li input[type="text"] { + margin: .25em 0; + border: none; + background: var(--secondary-bright-color); +} + +.cbi-dropdown[open] { + position: relative; +} + +.cbi-dropdown[open] > ul.dropdown { + display: block; + background: var(--secondary-bright-color); + box-shadow: 0 0 1px var(--main-dark-color), 0 0 4px rgba(0, 0, 0, .7); + position: absolute; + z-index: 1100; + max-width: none; + min-width: 100%; + width: auto; + transition: max-height .125s ease-in; +} + +.cbi-dropdown > ul > li[display], +.cbi-dropdown[open] > ul.preview, +.cbi-dropdown[open] > ul.dropdown > li, +.cbi-dropdown[multiple] > ul > li > label, +.cbi-dropdown[multiple][open] > ul.dropdown > li, +.cbi-dropdown[multiple][more] > .more, +.cbi-dropdown[multiple][empty] > .more { + flex-grow: 1; + display: flex !important; +} + +.cbi-dropdown[empty] > ul > li, +.cbi-dropdown[optional][open] > ul.dropdown > li[placeholder], +.cbi-dropdown[multiple][open] > ul.dropdown > li > form { + display: block !important; +} + +.cbi-dropdown[open] > ul.dropdown > li .hide-open { display: none; } +.cbi-dropdown[open] > ul.dropdown > li .hide-close { display: block; display: initial; } + +.cbi-dropdown[open] > ul.dropdown > li { + border-bottom: 1px solid #ccc; +} + +.cbi-dropdown[open] > ul.dropdown > li[selected] { + background: var(--main-dark-color); + color: var(--secondary-bright-color); +} + +.cbi-dropdown[open] > ul.dropdown > li.focus { + background: var(--main-bright-color); +} + +.cbi-dropdown[open] > ul.dropdown > li:last-child { + margin-bottom: 0; + border-bottom: none; +} + +.cbi-dropdown[open] > ul.dropdown > li[unselectable] { + opacity: 0.7; +} + +.cbi-dropdown[open] > ul.dropdown > li > input.create-item-input:first-child:last-child { + width: 100%; +} + +.cbi-dropdown[disabled] { + pointer-events: none; + opacity: .6; +} + +.cbi-filebrowser { + max-width: 100%; + width: 1px; + box-shadow: 0 0 2px var(--main-dark-color); + border-radius: .25rem; + display: flex; + flex-direction: column; + opacity: 0; + height: 0; + overflow: hidden; +} + +.cbi-filebrowser.open { + min-width: 20rem; + width: auto; + opacity: 1; + height: auto; + overflow: visible; + transition: opacity .25s ease-in; +} + +.cbi-filebrowser > * { + max-width: 100%; + overflow: hidden; + text-overflow: ellipsis; + padding: 0 0 .25em 0; + margin: .25em .25em 0px .25em; + white-space: nowrap; + border-bottom: 1px solid var(--main-dark-color); +} + +.cbi-filebrowser .cbi-button-positive { + margin-right: .25em; +} + +.cbi-filebrowser > div { + border-bottom: none; +} + +.cbi-filebrowser > ul > li { + display: flex; + flex-direction: row; + align-items: center; +} + +.cbi-filebrowser > ul > li a:hover { + font-weight: bold; + text-decoration: underline; +} + +.cbi-filebrowser > ul > li > div:first-child { + flex: 10; + overflow: hidden; + text-overflow: ellipsis; +} + +.cbi-filebrowser > ul > li > div:last-child { + flex: 3 3 10em; + text-align: right; +} + +.cbi-filebrowser > ul > li > div:last-child > button { + padding: .125em .25em; + margin: 1px 0 1px .25em; +} + +.cbi-filebrowser .upload { + display: flex; + flex-direction: row; + flex-wrap: wrap; + margin: 0 -.125em .25em -.125em; + padding: 0 0 .125em 0px; + border-bottom: 1px solid var(--main-dark-color); +} + +.cbi-filebrowser .upload > * { + margin: .125em; + flex: 1; +} + +.cbi-filebrowser .upload > div > input { + width: 100%; +} + +.cbi-section-actions { + text-align: right; +} + +.cbi-page-actions { + flex-wrap: wrap; + width: 100%; + justify-content: flex-end; + margin-bottom: 1em; + margin-top: 1em; + border-top: 1px solid var(--main-dark-color); + padding-top: 1em; + text-align: right; +} + +div[id$=".ipaddr"] > input, +.cbi-value-field > div > input[type="password"] { + min-width: 18.5rem; + border-radius: .25rem 0 0 .25rem; +} + +div[id$=".txpower"] { + flex-wrap: wrap; + align-items: center; +} + +div[id$=".txpower"] > span { + white-space: nowrap; + margin-left: .25em; +} + +div[id$=".editlist"] { + flex: 1; +} + +[data-errors]::after { + content: attr(data-errors); + background: var(--danger-color); + color: var(--secondary-bright-color); + border-radius: .6rem; + height: 1.1rem; + padding: 0 .25rem; + font-size: .9rem; + display: inline-block; + font-weight: bold; + min-width: .6rem; + line-height: 1rem; + margin: -.1rem 0 0 -.2rem; + text-align: center; +} + +@keyframes spin { + 100% { transform: rotate(360deg); } +} + +.spinning { + position: relative; + padding-left: 2.1em !important; +} + +.spinning::before { + position: absolute; + display: block; + align-items: center; + top: 0; + bottom: 0; + left: .4em; + width: 1.3em; + height: 1.3em; + animation: spin 1s linear infinite; + content: url("spinner.svg"); + margin: auto; +} + +button.spinning, .btn.spinning { + padding-left: 1.6em !important; +} + +button.spinning::before, .btn.spinning::before { + filter: invert(1); + left: .2em; + width: 1.2em; + height: 1.2em; +} + +#view > div.spinning:first-child { + padding: .5em 0; +} + +#view > *:last-child { + margin: 0 0 1em 0; +} + +.label { + background: var(--main-bright-color); + color: var(--secondary-bright-color); + font-size: .8rem; + padding: 0 .4rem; + border-radius: .5rem; +} + +.label.warning { + background: var(--danger-color); +} + +ul.deps { + margin: 0; + padding: 0; + font-size: .9rem; +} + +ul.errors { + margin: 0 0 1em 0; + padding: 0; +} + +@media only screen and (max-width: 800px) { + body { + padding-top: 70px; + } + + #maincontent { + padding: .25em; + max-width: 100vw; + } + + #menubar { + background: var(--main-bright-color); + padding: 0 .5em; + position: fixed; + top: 0; + z-index: 1000; + } + + #menubar > h2 { + flex: 0 0 2em; + display: block; + border: 2px solid var(--secondary-bright-color); + color: var(--secondary-bright-color); + border-radius: .5em; + cursor: pointer; + font-size: 100%; + margin: 0 1em 0 0; + } + + #menubar > h2:hover { + border-color: var(--secondary-bright-color); + color: var(--secondary-bright-color); + } + + #menubar > h2 > * { + display: none; + } + + #menubar > h2::before { + content: "☰"; + width: 35px; + line-height: 35px; + text-align: center; + display: inline-block; + color: inherit; + font-weight: bold; + } + + #menubar > h2.active::before { + content: "×"; + font-size: 200%; + } + + #menubar .hostname { + font-size: 1.6em; + } + + .distversion { + display: none; + } + + #modemenu { + padding: .125em .25em; + } + + #mainmenu { + overflow-x: hidden; + overflow-y: auto; + max-width: 0; + padding: 1em 0; + transition: max-width .25s ease-in-out, padding .25s ease-in-out; + position: fixed; + z-index: 900; + height: 100%; + } + + #mainmenu.active { + max-width: 200px; + padding: 1em 1em calc(1em + 70px) 1em; + overflow-x: visible; + } + + #mainmenu > div { + position: static; + } + + #mainmenu ul > li { + padding: .25em 0; + } + + .hide-xs { + display: none !important; + } + + .table { + display: flex; + flex-direction: column; + } + + .tr { + display: block; + border-bottom: 1px solid var(--main-dark-color); + margin-bottom: .5em; + padding-bottom: .5em; + } + + .tr.cbi-section-table-titles[data-title]::before, + .tr.cbi-section-table-titles, + .tr.cbi-section-table-descr { + display: none; + } + + .tr[data-title]::before { + display: block; + font-weight: bold; + border-top: none; + padding: .4em 0; + font-size: 110%; + } + + .td { + display: block; + border-top: none; + text-align: left !important; + padding: .2em 0; + } + + .th, .table-titles { + display: none; + } + + .td[data-title] { + position: relative; + padding: .2em 0 .2em 40%; + } + + .td[data-title]::before { + content: attr(data-title) ": "; + white-space: nowrap; + font-weight: bold; + width: 40%; + overflow: hidden; + text-overflow: ellipsis; + position: absolute; + left: 0; + top: 0; + bottom: 0; + padding: .2em 0; + text-align: left; + display: inline-flex; + align-items: center; + } + + .td[data-title]::after { + content: ""; + width: 2em; + position: absolute; + left: calc(40% - 2em); + top: 0; + bottom: 0; + display: block; + background: linear-gradient(90deg, rgba(255, 255, 255, 0), var(--secondary-bright-color) 90%); + } + + [data-page="admin-status-overview"] .cbi-section:nth-of-type(1) .td:first-of-type, + [data-page="admin-status-overview"] .cbi-section:nth-of-type(2) .td:first-of-type { + font-weight: bold; + max-width: none; + width: 100%; + } + + [data-page="admin-status-overview"] .td > span > span { font-size: .9rem; } + + [data-page="admin-status-routes"] .table:nth-of-type(3) .td:nth-of-type(1) { word-break: break-all; } + + [data-page="admin-network-firewall-zones"] .td[data-name="_info"] { + padding: .2em 0; + line-height: 2.2rem; + } + + [data-page="admin-network-firewall-zones"] .td[data-name="_info"]::before, + [data-page="admin-network-firewall-zones"] .td[data-name="_info"]::after { + display: none; + } + + [data-page="admin-network-firewall-zones"] .td[data-name="_info"] label { + font-size: 1rem; + } + + #cbi-wireless-wifi-device .tr { display: flex; flex-wrap: wrap; } + #cbi-wireless-wifi-device .tr > *:nth-child(1) { flex: 1 1 20%; align-self: center; } + #cbi-wireless-wifi-device .tr > *:nth-child(2) { flex: 2 2 75%; } + #cbi-wireless-wifi-device .tr > *:nth-child(3) { flex: 3 3 100%; } + + #cbi-network-interface .tr { display: flex; flex-wrap: wrap; } + #cbi-network-interface .tr > *:nth-child(1) { flex: 1 1 33%; align-self: center; } + #cbi-network-interface .tr > *:nth-child(2) { flex: 2 2 60%; align-self: center; font-size: .9rem; overflow: hidden; } + #cbi-network-interface .tr > *:nth-child(3) { flex: 3 3 100%; } + #cbi-network-interface .tr > *:nth-child(2) > div { overflow: hidden; text-overflow: ellipsis; } + + .assoclist .tr { + display: flex; + flex-wrap: wrap; + } + + .assoclist .td > .ifacebadge { + max-width: 90px; + } + + .assoclist .td > .ifacebadge > img { + margin: 0 35px; + } + + .assoclist .td > .ifacebadge > span { + display: none; + } + + .assoclist .td > .ifacebadge[data-ifname]::after { + content: attr(data-ifname); + } + + .assoclist .td > .ifacebadge[data-signal]::after { + content: attr(data-signal) " dBm"; + } + + .assoclist .td:nth-of-type(3) { + font-weight: bold; + font-size: 1rem; + } + + .assoclist .td:nth-of-type(1), .assoclist .td:nth-of-type(4) { + flex: 1 1 100px; + margin-right: .5em; + } + + .assoclist .td:nth-of-type(3), .assoclist .td:nth-of-type(5) { + flex: 2 2 calc(100% - 110px); + overflow: hidden; + text-overflow: ellipsis; + align-self: center; + } + + .assoclist .td:nth-of-type(6) { flex: 1; text-align: right !important; } + .assoclist .td[data-title] { padding: .2em 0; } + .assoclist .td[data-title]::before, + .assoclist .td[data-title]::after { display: none; } + + .leases6 .td:nth-of-type(3) { word-wrap: break-word; } + + .td.cbi-section-actions > div { display: flex; } + .td.cbi-section-actions > div > * { flex: 1; } + + body.modal-overlay-active #modal_overlay > .modal { + width: 95%; + margin: 5% auto; + } + + input:not([type]), + input[type="text"], + input[type="password"], + select, + .cbi-dropdown:not(.btn):not(.cbi-button), + .cbi-dynlist { + min-height: calc(2.2rem + 2px); + line-height: 2.2rem; + font-size: 1.2rem; + min-width: 10rem; + } + + button, .btn { + line-height: 1.8rem; + font-size: 1.2rem; + } + + select { + padding: .4em 0; + } + + .cbi-value > .cbi-value-field { + flex: 1 0 100%; + display: flex; + flex-direction: column; + max-width: 100%; + } + + .cbi-value > .cbi-value-field > div[id] { + display: flex; + flex-direction: row; + } + + .cbi-value > .cbi-value-field > div[id] > input, + .cbi-value > .cbi-value-field > div[id] > select, + .cbi-value > .cbi-value-field > div[id] > .cbi-filebrowser.open { + flex: 1; + width: 100%; + } + + .cbi-dynlist .item::after, + .cbi-dynlist .add-item > .btn { + line-height: 2em; + flex-basis: 2rem; + width: 2rem; + } + + .ifacebadge.large { + font-size: .9rem; + } + + .control-group > *, + .control-group > .cbi-dropdown > ul > li { + flex: 1; + white-space: normal; + word-wrap: break-word; + } + + .cbi-page-actions .cbi-dropdown, + .cbi-page-actions .cbi-button-apply:first-child { + flex-basis: 100%; + } + + .cbi-checkbox { + margin: .25rem; + } + + .cbi-tabmenu { + margin: 0 -.25em 1em -.25em; + } + + .cbi-tooltip { + font-size: 1rem; + box-shadow: 0 0 4px rgba(0, 0, 0, .7); + } + + .cbi-value > label:first-child { + padding: 0 0 .5em 0; + } + + [data-page="admin-system-admin-sshkeys"] .cbi-dynlist > .item { + font-size: .9rem; + line-height: 1rem; + } + + [data-page="admin-system-opkg"] .control-group { + flex-wrap: wrap; + } + + [data-page="admin-status-iptables"] h2 + div.right { + margin: 0 0 1em 0 !important; + display: flex; + } +} + +@media only screen and (min-width: 800px) and (max-width: 1200px) { + .assoclist .tr > *:nth-of-type(2) { + display: none; + } +} diff --git a/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/favicon.png b/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..7c3f3acb1f0c7c142d0dbd3f42a4926b07f8eb38 GIT binary patch literal 535 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 literal 0 HcmV?d00001 diff --git a/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/spinner.svg b/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/spinner.svg new file mode 100644 index 000000000..f3b52efac --- /dev/null +++ b/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/spinner.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/luci-theme-openwrt-2020/htdocs/luci-static/resources/menu-openwrt2020.js b/luci-theme-openwrt-2020/htdocs/luci-static/resources/menu-openwrt2020.js new file mode 100644 index 000000000..b6fbfd4c2 --- /dev/null +++ b/luci-theme-openwrt-2020/htdocs/luci-static/resources/menu-openwrt2020.js @@ -0,0 +1,147 @@ +'use strict'; +'require baseclass'; +'require ui'; + +return baseclass.extend({ + __init__: function() { + ui.menu.load().then(L.bind(this.render, this)); + }, + + render: function(tree) { + var node = tree, + url = ''; + + this.renderModeMenu(node); + + if (L.env.dispatchpath.length >= 3) { + for (var i = 0; i < 3 && node; i++) { + node = node.children[L.env.dispatchpath[i]]; + url = url + (url ? '/' : '') + L.env.dispatchpath[i]; + } + + if (node) + this.renderTabMenu(node, url); + } + + document.querySelector('#menubar > .navigation') + .addEventListener('click', ui.createHandlerFn(this, 'handleSidebarToggle')); + }, + + handleMenuExpand: function(ev) { + var a = ev.target, ul1 = a.parentNode.parentNode, ul2 = a.nextElementSibling; + + document.querySelectorAll('ul.mainmenu.l1 > li.active').forEach(function(li) { + if (li !== a.parentNode) + li.classList.remove('active'); + }); + + if (!ul2) + return; + + if (ul2.parentNode.offsetLeft + ul2.offsetWidth <= ul1.offsetLeft + ul1.offsetWidth) + ul2.classList.add('align-left'); + + ul1.classList.add('active'); + a.parentNode.classList.add('active'); + a.blur(); + + ev.preventDefault(); + ev.stopPropagation(); + }, + + renderMainMenu: function(tree, url, level) { + var l = (level || 0) + 1, + ul = E('ul', { 'class': 'mainmenu l%d'.format(l) }), + children = ui.menu.getChildren(tree); + + if (children.length == 0 || l > 2) + return E([]); + + for (var i = 0; i < children.length; i++) { + var isActive = (L.env.dispatchpath[l] == children[i].name), + isReadonly = children[i].readonly, + activeClass = 'mainmenu-item-%s%s'.format(children[i].name, isActive ? ' selected' : ''); + + ul.appendChild(E('li', { 'class': activeClass }, [ + E('a', { + 'href': L.url(url, children[i].name), + 'click': (l == 1) ? ui.createHandlerFn(this, 'handleMenuExpand') : null + }, [ _(children[i].title) ]), + this.renderMainMenu(children[i], url + '/' + children[i].name, l) + ])); + } + + if (l == 1) + document.querySelector('#mainmenu').appendChild(E('div', [ ul ])); + + return ul; + }, + + renderModeMenu: function(tree) { + var menu = document.querySelector('#modemenu'), + children = ui.menu.getChildren(tree); + + for (var i = 0; i < children.length; i++) { + var isActive = (L.env.requestpath.length ? children[i].name == L.env.requestpath[0] : i == 0); + + if (i > 0) + menu.appendChild(E([], ['\u00a0|\u00a0'])); + + menu.appendChild(E('div', { 'class': isActive ? 'active' : null }, [ + E('a', { 'href': L.url(children[i].name) }, [ _(children[i].title) ]) + ])); + + if (isActive) + this.renderMainMenu(children[i], children[i].name); + } + + if (menu.children.length > 1) + menu.style.display = ''; + }, + + renderTabMenu: function(tree, url, level) { + var container = document.querySelector('#tabmenu'), + l = (level || 0) + 1, + ul = E('ul', { 'class': 'cbi-tabmenu' }), + children = ui.menu.getChildren(tree), + activeNode = null; + + if (children.length == 0) + return E([]); + + for (var i = 0; i < children.length; i++) { + var isActive = (L.env.dispatchpath[l + 2] == children[i].name), + activeClass = isActive ? ' cbi-tab' : '', + className = 'tabmenu-item-%s %s'.format(children[i].name, activeClass); + + ul.appendChild(E('li', { 'class': className }, [ + E('a', { 'href': L.url(url, children[i].name) }, [ _(children[i].title) ] ) + ])); + + if (isActive) + activeNode = children[i]; + } + + container.appendChild(ul); + container.style.display = ''; + + if (activeNode) + container.appendChild(this.renderTabMenu(activeNode, url + '/' + activeNode.name, l)); + + return ul; + }, + + handleSidebarToggle: function(ev) { + var btn = ev.currentTarget, + bar = document.querySelector('#mainmenu'); + + if (btn.classList.contains('active')) { + btn.classList.remove('active'); + bar.classList.remove('active'); + } + else { + btn.classList.add('active'); + bar.classList.add('active'); + } + } +}); diff --git a/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/footer.htm b/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/footer.htm new file mode 100644 index 000000000..e9122f0b5 --- /dev/null +++ b/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/footer.htm @@ -0,0 +1,17 @@ +<%# + Copyright 2020 Jo-Philipp Wich + Licensed to the public under the Apache License 2.0. +-%> + + + + +

+ <% local ver = require "luci.version" -%> + Powered by <%= ver.luciname %> (<%= ver.luciversion %>) +

+ + + + + diff --git a/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm b/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm new file mode 100644 index 000000000..fb0842df0 --- /dev/null +++ b/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm @@ -0,0 +1,63 @@ +<%# + Copyright 2020 Jo-Philipp Wich + Licensed to the public under the Apache License 2.0. +-%> + +<% + local sys = require "luci.sys" + local util = require "luci.util" + local http = require "luci.http" + local disp = require "luci.dispatcher" + local ver = require "luci.version" + + local boardinfo = util.ubus("system", "board") or { } + + local node = disp.context.dispatched + local path = table.concat(disp.context.path, "-") + + http.prepare_content("text/html; charset=UTF-8") +-%> + + + + + + + + + + +<%=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> - LuCI + + + + + + + + + +
+ + +
+ <%- if luci.sys.process.info("uid") == 0 and luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") and category ~= "failsafe" and path ~= "admin-system-admin-password" then -%> +
+

<%:No password set!%>

+

<%:There is no password set on this router. Please configure a root password to protect the web interface.%>

+ <% if disp.lookup("admin/system/admin") then %> + + <% end %> +
+ <%- end -%> + + diff --git a/luci-theme-openwrt-2020/root/etc/uci-defaults/30_luci-theme-openwrt-2020 b/luci-theme-openwrt-2020/root/etc/uci-defaults/30_luci-theme-openwrt-2020 new file mode 100755 index 000000000..7c49acfda --- /dev/null +++ b/luci-theme-openwrt-2020/root/etc/uci-defaults/30_luci-theme-openwrt-2020 @@ -0,0 +1,12 @@ +#!/bin/sh + +if [ "$PKG_UPGRADE" != 1 ]; then + uci get luci.themes.OpenWrt2020 >/dev/null 2>&1 || \ + uci batch <<-EOF + set luci.themes.OpenWrt2020=/luci-static/openwrt2020 + set luci.main.mediaurlbase=/luci-static/openwrt2020 + commit luci + EOF +fi + +exit 0