From 63b5f63a420a4f096dda4e67bf811ba2d1e842df Mon Sep 17 00:00:00 2001 From: Jo-Philipp Wich Date: Mon, 23 Mar 2020 22:31:50 +0100 Subject: [PATCH] themes: add new theme OpenWrt 2020 Introduce a new theme modelled after the logo guidelines published in https://openwrt.org/_media/docs/guide-graphic-designer/openwrt-logo-usage-guidelines.pdf Signed-off-by: Jo-Philipp Wich --- themes/luci-theme-openwrt-2020/Makefile | 14 + .../GalanoGrotesqueW00-Regular.woff2 | Bin 0 -> 29004 bytes .../luci-static/openwrt2020/cascade.css | 1816 +++++++++++++++++ .../luci-static/openwrt2020/favicon.png | Bin 0 -> 2184 bytes .../htdocs/luci-static/openwrt2020/logo.svg | 7 + .../luci-static/openwrt2020/spinner.svg | 12 + .../luasrc/view/themes/openwrt2020/footer.htm | 16 + .../luasrc/view/themes/openwrt2020/header.htm | 236 +++ .../uci-defaults/30_luci-theme-openwrt-2020 | 11 + 9 files changed, 2112 insertions(+) create mode 100644 themes/luci-theme-openwrt-2020/Makefile create mode 100644 themes/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/GalanoGrotesqueW00-Regular.woff2 create mode 100644 themes/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/cascade.css create mode 100644 themes/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/favicon.png create mode 100644 themes/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/logo.svg create mode 100644 themes/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/spinner.svg create mode 100644 themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/footer.htm create mode 100644 themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm create mode 100755 themes/luci-theme-openwrt-2020/root/etc/uci-defaults/30_luci-theme-openwrt-2020 diff --git a/themes/luci-theme-openwrt-2020/Makefile b/themes/luci-theme-openwrt-2020/Makefile new file mode 100644 index 000000000..dcbe11012 --- /dev/null +++ b/themes/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 ../../luci.mk + +# call BuildPackage - OpenWrt buildroot signature diff --git a/themes/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/GalanoGrotesqueW00-Regular.woff2 b/themes/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/themes/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/cascade.css b/themes/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/cascade.css new file mode 100644 index 000000000..eb25f5975 --- /dev/null +++ b/themes/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/cascade.css @@ -0,0 +1,1816 @@ +: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: var(--main-bright-color) url(logo.svg) 10px center/50px 50px 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; +} + +#menubar .indicators { + flex: 1 1 25%; + text-align: right; +} + +#menubar .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; +} + +#menubar .indicators > * > #xhr_poll_status_off { + background: var(--main-bright-color); + color: var(--secondary-bright-color); + border-radius: 1em; + margin: 0 -.5em; + display: block; + padding: 0 .5em; + border: 2px solid var(--secondary-bright-color); + line-height: calc(1.5em - 4px); +} + +#menubar h2, +.skiplink { + display: none; +} + +#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 > 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: 80%; + margin: 10% auto 25% auto; + background: var(--secondary-bright-color); + box-shadow: 0 0 3px 1px var(--main-bright-color); + padding: .5em; + border-radius: .25em; +} + +.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[type="text"], +.td input[type="password"], +.td select, +.td .cbi-dropdown:not(.btn):not(.cbi-button), +.td .cbi-dynlist { + 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 { + margin: 0 0 1em 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; +} + +.cbi-tabmenu > li > a { + flex: 1; + margin: .1em .5em; +} + +.cbi-tabmenu > .cbi-tab > a { + border-bottom: 2px solid var(--main-dark-color); +} + +[data-tab] { + display: none; + opacity: 0; + transition: opacity .25s ease-in-out; +} + +[data-tab-active="true"] { + opacity: 1; + height: auto; + display: block; +} + +.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 + */ + +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; +} + +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: .5; +} + +.cbi-button-apply, .cbi-button-positive { + background: var(--main-dark-color); +} + +.cbi-button-negative, .cbi-button-remove { + background: var(--danger-color); +} + +.cbi-checkbox input[type="checkbox"] { + display: none; +} + +.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; + cursor: pointer; +} + +.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; +} + +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[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[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[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; +} + +.control-group > *, +.control-group > .cbi-dropdown > ul > li { + justify-content: space-around; +} + +.control-group > * { + margin: .125rem !important; + min-width: auto; +} + +.control-group > select, +.control-group > input[type="text"] { + 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; + border-radius: .25em; + position: relative; + overflow: hidden; + transition: box-shadow .25s ease-in-out; + pointer-events: none; + flex: 1 1 100%; +} + +.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 > .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: flex; + align-items: center; + top: 0; + bottom: 0; + left: .4em; + width: 1.3em; + animation: spin 1s linear infinite; + content: url("/luci-static/openwrt2020/spinner.svg"); +} + +button.spinning, .btn.spinning { + padding-left: 1.6em !important; +} + +button.spinning::before, .btn.spinning::before { + filter: invert(1); + left: .2em; + width: 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; + } + + #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; + } + + [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 { + 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 { 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 { + max-width: 95%; + margin: 5% auto; + } + + 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/themes/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/favicon.png b/themes/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..ee841e823cd25240f7effe2de8164be6e0397351 GIT binary patch literal 2184 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 KMNUMnLSTZja0@*E literal 0 HcmV?d00001 diff --git a/themes/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/logo.svg b/themes/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/logo.svg new file mode 100644 index 000000000..878a39d40 --- /dev/null +++ b/themes/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/logo.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/themes/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/spinner.svg b/themes/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/spinner.svg new file mode 100644 index 000000000..f3b52efac --- /dev/null +++ b/themes/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/spinner.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/footer.htm b/themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/footer.htm new file mode 100644 index 000000000..07be0d65a --- /dev/null +++ b/themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/footer.htm @@ -0,0 +1,16 @@ +<%# + 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/themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm b/themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm new file mode 100644 index 000000000..ad1a84c40 --- /dev/null +++ b/themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm @@ -0,0 +1,236 @@ +<%# + 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 and enable SSH.%>

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