From c4157477de9176672f51a6342c1d95584ee1f763 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaka=20Pra=C5=A1nikar?= Date: Tue, 20 Aug 2024 21:00:50 +0200 Subject: [PATCH] misc/theme-Aavanced: Theme based on AdvancedTomato project by the original author (#4189) This is a new modern theme based on the AdvancedTomato project I used to work on years ago. The design is blueish with conservative shadows. Love to change it, so any ideas are welcome. Initial release working with OPNSense 24.7.1. Any issues you find I will be more than happy to fix. But I have been using theme as "beta" for months now and I haven't found any specific issues yet. But more people more to find! --- misc/theme-advanced/Makefile | 7 + misc/theme-advanced/pkg-descr | 1 + .../glyphicons-halflings-regular.eot | Bin 0 -> 20127 bytes .../glyphicons-halflings-regular.svg | 288 ++++ .../glyphicons-halflings-regular.ttf | Bin 0 -> 45404 bytes .../glyphicons-halflings-regular.woff | Bin 0 -> 23424 bytes .../stylesheets/_bootstrap-compass.scss | 7 + .../assets/stylesheets/_bootstrap-mincer.scss | 17 + .../stylesheets/_bootstrap-sprockets.scss | 7 + .../assets/stylesheets/bootstrap-dialog.less | 137 ++ .../less/bootstrap-select.less | 348 +++++ .../bootstrap-select/less/variables.less | 7 + .../sass/bootstrap-select.css | 1 + .../sass/bootstrap-select.scss | 519 +++++++ .../bootstrap-select/sass/variables.scss | 17 + .../assets/stylesheets/bootstrap/_alerts.scss | 68 + .../assets/stylesheets/bootstrap/_badges.scss | 57 + .../stylesheets/bootstrap/_breadcrumbs.scss | 26 + .../stylesheets/bootstrap/_button-groups.scss | 240 ++++ .../stylesheets/bootstrap/_buttons.scss | 159 +++ .../stylesheets/bootstrap/_carousel.scss | 243 ++++ .../assets/stylesheets/bootstrap/_close.scss | 35 + .../assets/stylesheets/bootstrap/_code.scss | 68 + .../bootstrap/_component-animations.scss | 35 + .../stylesheets/bootstrap/_dropdowns.scss | 214 +++ .../assets/stylesheets/bootstrap/_forms.scss | 541 +++++++ .../stylesheets/bootstrap/_glyphicons.scss | 237 +++ .../assets/stylesheets/bootstrap/_grid.scss | 84 ++ .../stylesheets/bootstrap/_input-groups.scss | 166 +++ .../stylesheets/bootstrap/_jumbotron.scss | 48 + .../assets/stylesheets/bootstrap/_labels.scss | 66 + .../stylesheets/bootstrap/_list-group.scss | 159 +++ .../assets/stylesheets/bootstrap/_media.scss | 56 + .../assets/stylesheets/bootstrap/_mixins.scss | 39 + .../assets/stylesheets/bootstrap/_modals.scss | 150 ++ .../assets/stylesheets/bootstrap/_navbar.scss | 658 +++++++++ .../assets/stylesheets/bootstrap/_navs.scss | 239 ++++ .../stylesheets/bootstrap/_normalize.scss | 425 ++++++ .../assets/stylesheets/bootstrap/_pager.scss | 55 + .../stylesheets/bootstrap/_pagination.scss | 88 ++ .../assets/stylesheets/bootstrap/_panels.scss | 243 ++++ .../stylesheets/bootstrap/_popovers.scss | 133 ++ .../assets/stylesheets/bootstrap/_print.scss | 101 ++ .../stylesheets/bootstrap/_progress-bars.scss | 107 ++ .../bootstrap/_responsive-embed.scss | 34 + .../bootstrap/_responsive-utilities.scss | 180 +++ .../stylesheets/bootstrap/_scaffolding.scss | 150 ++ .../assets/stylesheets/bootstrap/_tables.scss | 236 +++ .../assets/stylesheets/bootstrap/_theme.scss | 258 ++++ .../stylesheets/bootstrap/_thumbnails.scss | 38 + .../stylesheets/bootstrap/_tooltip.scss | 95 ++ .../assets/stylesheets/bootstrap/_type.scss | 304 ++++ .../stylesheets/bootstrap/_utilities.scss | 57 + .../stylesheets/bootstrap/_variables.scss | 853 +++++++++++ .../assets/stylesheets/bootstrap/_wells.scss | 29 + .../stylesheets/bootstrap/mixins/_alerts.scss | 14 + .../bootstrap/mixins/_background-variant.scss | 11 + .../bootstrap/mixins/_border-radius.scss | 18 + .../bootstrap/mixins/_buttons.scss | 50 + .../bootstrap/mixins/_center-block.scss | 7 + .../bootstrap/mixins/_clearfix.scss | 22 + .../stylesheets/bootstrap/mixins/_forms.scss | 85 ++ .../bootstrap/mixins/_gradients.scss | 58 + .../bootstrap/mixins/_grid-framework.scss | 81 ++ .../stylesheets/bootstrap/mixins/_grid.scss | 122 ++ .../bootstrap/mixins/_hide-text.scss | 21 + .../stylesheets/bootstrap/mixins/_image.scss | 34 + .../stylesheets/bootstrap/mixins/_labels.scss | 12 + .../bootstrap/mixins/_list-group.scss | 31 + .../bootstrap/mixins/_nav-divider.scss | 10 + .../bootstrap/mixins/_nav-vertical-align.scss | 9 + .../bootstrap/mixins/_opacity.scss | 8 + .../bootstrap/mixins/_pagination.scss | 23 + .../stylesheets/bootstrap/mixins/_panels.scss | 24 + .../bootstrap/mixins/_progress-bar.scss | 10 + .../bootstrap/mixins/_reset-filter.scss | 8 + .../stylesheets/bootstrap/mixins/_resize.scss | 6 + .../mixins/_responsive-visibility.scss | 21 + .../stylesheets/bootstrap/mixins/_size.scss | 10 + .../bootstrap/mixins/_tab-focus.scss | 10 + .../bootstrap/mixins/_table-row.scss | 28 + .../bootstrap/mixins/_text-emphasis.scss | 11 + .../bootstrap/mixins/_text-overflow.scss | 8 + .../bootstrap/mixins/_vendor-prefixes.scss | 219 +++ .../assets/stylesheets/dashboard.scss | 350 +++++ .../advanced/assets/stylesheets/main.scss | 1270 +++++++++++++++++ .../advanced/build/css/bootstrap-dialog.css | 113 ++ .../advanced/build/css/bootstrap-select.css | 1 + .../themes/advanced/build/css/dashboard.css | 1 + .../www/themes/advanced/build/css/main.css | 1 + ...UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa1ZL7.woff2 | Bin 0 -> 37924 bytes .../glyphicons-halflings-regular.eot | Bin 0 -> 20127 bytes .../glyphicons-halflings-regular.svg | 288 ++++ .../glyphicons-halflings-regular.ttf | Bin 0 -> 45404 bytes .../glyphicons-halflings-regular.woff | Bin 0 -> 23424 bytes .../themes/advanced/build/images/caret.png | Bin 0 -> 2935 bytes .../advanced/build/images/default-logo.svg | 95 ++ .../themes/advanced/build/images/favicon.png | Bin 0 -> 2938 bytes .../advanced/build/images/icon-logo.svg | 84 ++ 99 files changed, 11504 insertions(+) create mode 100644 misc/theme-advanced/Makefile create mode 100644 misc/theme-advanced/pkg-descr create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/fonts/bootstrap/glyphicons-halflings-regular.eot create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/fonts/bootstrap/glyphicons-halflings-regular.svg create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/fonts/bootstrap/glyphicons-halflings-regular.ttf create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/fonts/bootstrap/glyphicons-halflings-regular.woff create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/_bootstrap-compass.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/_bootstrap-mincer.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/_bootstrap-sprockets.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap-dialog.less create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap-select/less/bootstrap-select.less create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap-select/less/variables.less create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap-select/sass/bootstrap-select.css create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap-select/sass/bootstrap-select.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap-select/sass/variables.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_alerts.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_badges.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_breadcrumbs.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_button-groups.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_buttons.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_carousel.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_close.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_code.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_component-animations.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_dropdowns.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_forms.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_glyphicons.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_grid.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_input-groups.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_jumbotron.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_labels.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_list-group.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_media.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_mixins.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_modals.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_navbar.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_navs.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_normalize.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_pager.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_pagination.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_panels.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_popovers.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_print.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_progress-bars.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_responsive-embed.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_responsive-utilities.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_scaffolding.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_tables.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_theme.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_thumbnails.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_tooltip.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_type.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_utilities.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_variables.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_wells.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/mixins/_alerts.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/mixins/_background-variant.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/mixins/_border-radius.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/mixins/_buttons.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/mixins/_center-block.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/mixins/_clearfix.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/mixins/_forms.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/mixins/_gradients.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/mixins/_grid-framework.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/mixins/_grid.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/mixins/_hide-text.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/mixins/_image.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/mixins/_labels.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/mixins/_list-group.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/mixins/_nav-divider.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/mixins/_nav-vertical-align.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/mixins/_opacity.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/mixins/_pagination.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/mixins/_panels.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/mixins/_progress-bar.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/mixins/_reset-filter.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/mixins/_resize.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/mixins/_responsive-visibility.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/mixins/_size.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/mixins/_tab-focus.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/mixins/_table-row.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/mixins/_text-overflow.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/mixins/_vendor-prefixes.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/dashboard.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/main.scss create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/build/css/bootstrap-dialog.css create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/build/css/bootstrap-select.css create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/build/css/dashboard.css create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/build/css/main.css create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/build/fonts/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa1ZL7.woff2 create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/build/fonts/bootstrap/glyphicons-halflings-regular.eot create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/build/fonts/bootstrap/glyphicons-halflings-regular.svg create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/build/fonts/bootstrap/glyphicons-halflings-regular.ttf create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/build/fonts/bootstrap/glyphicons-halflings-regular.woff create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/build/images/caret.png create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/build/images/default-logo.svg create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/build/images/favicon.png create mode 100644 misc/theme-advanced/src/opnsense/www/themes/advanced/build/images/icon-logo.svg diff --git a/misc/theme-advanced/Makefile b/misc/theme-advanced/Makefile new file mode 100644 index 000000000..9af08541f --- /dev/null +++ b/misc/theme-advanced/Makefile @@ -0,0 +1,7 @@ +PLUGIN_NAME= theme-advanced +PLUGIN_VERSION= 1.0 +PLUGIN_COMMENT= OPNsense theme based on AdvancedTomato GUI +PLUGIN_MAINTAINER= jacky@prahec.com +PLUGIN_WWW= https://prahec.com/ + +.include "../../Mk/plugins.mk" diff --git a/misc/theme-advanced/pkg-descr b/misc/theme-advanced/pkg-descr new file mode 100644 index 000000000..10d636884 --- /dev/null +++ b/misc/theme-advanced/pkg-descr @@ -0,0 +1 @@ +Advanced - Modern theme based on AdvancedTomato project by the original author diff --git a/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/fonts/bootstrap/glyphicons-halflings-regular.eot b/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/fonts/bootstrap/glyphicons-halflings-regular.eot new file mode 100644 index 0000000000000000000000000000000000000000..b93a4953fff68df523aa7656497ee339d6026d64 GIT binary patch literal 20127 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/fonts/bootstrap/glyphicons-halflings-regular.ttf b/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/fonts/bootstrap/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1413fc609ab6f21774de0cb7e01360095584f65b GIT binary patch literal 45404 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 literal 0 HcmV?d00001 diff --git a/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/_bootstrap-compass.scss b/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/_bootstrap-compass.scss new file mode 100644 index 000000000..82706c47c --- /dev/null +++ b/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/_bootstrap-compass.scss @@ -0,0 +1,7 @@ +@function twbs-font-path($path) { + @return font-url($path, true); +} + +@function twbs-image-path($path) { + @return image-url($path, true); +} diff --git a/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/_bootstrap-mincer.scss b/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/_bootstrap-mincer.scss new file mode 100644 index 000000000..34132501f --- /dev/null +++ b/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/_bootstrap-mincer.scss @@ -0,0 +1,17 @@ +// Mincer asset helper functions +// +// This must be imported into a .css.ejs.scss file. +// Then, <% %>-interpolations will be parsed as strings by Sass, and evaluated by EJS after Sass compilation. + + +@function twbs-font-path($path) { + // do something like following + // from "path/to/font.ext#suffix" to "<%- asset_path(path/to/font.ext)) + #suffix %>" + // from "path/to/font.ext?#suffix" to "<%- asset_path(path/to/font.ext)) + ?#suffix %>" + // or from "path/to/font.ext" just "<%- asset_path(path/to/font.ext)) %>" + @return "<%- asset_path('#{$path}'.replace(/[#?].*$/, '')) + '#{$path}'.replace(/(^[^#?]*)([#?]?.*$)/, '$2') %>"; +} + +@function twbs-image-path($file) { + @return "<%- asset_path('#{$file}') %>"; +} diff --git a/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/_bootstrap-sprockets.scss b/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/_bootstrap-sprockets.scss new file mode 100644 index 000000000..7d3069280 --- /dev/null +++ b/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/_bootstrap-sprockets.scss @@ -0,0 +1,7 @@ +@function twbs-font-path($path) { + @return font-path($path); +} + +@function twbs-image-path($path) { + @return image-path($path); +} diff --git a/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap-dialog.less b/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap-dialog.less new file mode 100644 index 000000000..284a99402 --- /dev/null +++ b/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap-dialog.less @@ -0,0 +1,137 @@ +.modal-backdrop { + z-index: -1; +} + +.bootstrap-dialog { + + .modal-header { + border-top-left-radius: 4px; + border-top-right-radius: 4px; + } + .bootstrap-dialog-title { + color: #fff; + display: inline-block; + } + .bootstrap-dialog-button-icon { + margin-right: 3px; + } + .bootstrap-dialog-close-button { + float: right; + filter:alpha(opacity=90); + -moz-opacity:0.9; + -khtml-opacity: 0.9; + opacity: 0.9; + &:hover { + cursor: pointer; + filter: alpha(opacity=100); + -moz-opacity: 1; + -khtml-opacity: 1; + opacity: 1; + } + } + + /* dialog types */ + &.type-default { + .modal-header { + background-color: #fff; + } + .bootstrap-dialog-title { + color: #333; + } + } + + &.type-info { + .modal-header { + background-color: #B0CDDB; + } + } + + &.type-primary { + .modal-header { + background-color: #51aded; + } + } + + &.type-success { + .modal-header { + background-color: #7ebc59; + } + } + + &.type-warning { + .modal-header { + background-color: #f0ad4e; + } + } + + &.type-danger { + .modal-header { + background-color: #EE451F; + } + } + + &.size-large { + .bootstrap-dialog-title { + font-size: 24px; + } + .bootstrap-dialog-close-button { + font-size: 30px; + } + .bootstrap-dialog-message { + font-size: 18px; + } + } + + /** + * Icon animation + * Copied from font-awesome: http://fontawesome.io/ + **/ + .icon-spin { + display: inline-block; + -moz-animation: spin 2s infinite linear; + -o-animation: spin 2s infinite linear; + -webkit-animation: spin 2s infinite linear; + animation: spin 2s infinite linear; + } + @-moz-keyframes spin { + 0% { + -moz-transform: rotate(0deg); + } + 100% { + -moz-transform: rotate(359deg); + } + } + @-webkit-keyframes spin { + 0% { + -webkit-transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + } + } + @-o-keyframes spin { + 0% { + -o-transform: rotate(0deg); + } + 100% { + -o-transform: rotate(359deg); + } + } + @-ms-keyframes spin { + 0% { + -ms-transform: rotate(0deg); + } + 100% { + -ms-transform: rotate(359deg); + } + } + @keyframes spin { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(359deg); + } + } + /** End of icon animation **/ +} diff --git a/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap-select/less/bootstrap-select.less b/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap-select/less/bootstrap-select.less new file mode 100644 index 000000000..49f13a702 --- /dev/null +++ b/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap-select/less/bootstrap-select.less @@ -0,0 +1,348 @@ +@import "variables"; + +// Mixins +.cursor-disabled() { + cursor: not-allowed; +} + +// Rules +.bootstrap-select { + width: 348px \0; /*IE9 and below*/ + + // The selectpicker button + > .dropdown-toggle { + width: 100%; + padding-right: 25px; + z-index: 1; + } + + > select { + position: absolute !important; + bottom: 0; + left: 50%; + width: 0.11px !important; + height: 100% !important; + padding: 0 !important; + opacity: 0 !important; + border: none; + + &.mobile-device { + top: 0; + left: 0; + display: block !important; + width: 100% !important; + z-index: 2; + } + } + + // Error display + .has-error & .dropdown-toggle, + .error & .dropdown-toggle { + border-color: @color-red-error; + } + + &.fit-width { + width: auto !important; + } + + &:not([class*="col-"]):not([class*="form-control"]):not(.input-group-btn) { + width: @width-default; + } + + .dropdown-toggle:focus { + outline: thin dotted #333333 !important; + outline: 5px auto -webkit-focus-ring-color !important; + outline-offset: -2px; + } +} + +.bootstrap-select.form-control { + margin-bottom: 0; + padding: 0; + border: none; + + &:not([class*="col-"]) { + width: 100%; + } + + &.input-group-btn { + z-index: auto; + } +} + +// The selectpicker components +.bootstrap-select.btn-group { + &:not(.input-group-btn), + &[class*="col-"] { + float: none; + display: inline-block; + margin-left: 0; + } + + // Forces the pull to the right, if necessary + &, + &[class*="col-"], + .row &[class*="col-"] { + &.dropdown-menu-right { + float: right; + } + } + + .form-inline &, + .form-horizontal &, + .form-group & { + margin-bottom: 0; + } + + .form-group-lg &.form-control, + .form-group-sm &.form-control { + padding: 0; + } + + // Set the width of the live search (and any other form control within an inline form) + // see https://github.com/silviomoreto/bootstrap-select/issues/685 + .form-inline & .form-control { + width: 100%; + } + + &.disabled, + > .disabled { + .cursor-disabled(); + + &:focus { + outline: none !important; + } + } + + &.bs-container { + position: absolute; + + .dropdown-menu { + z-index: @zindex-select-dropdown; + } + } + + // The selectpicker button + .dropdown-toggle { + .filter-option { + display: inline-block; + overflow: hidden; + width: 100%; + text-align: left; + } + + .caret { + position: absolute; + top: 50%; + right: 12px; + margin-top: -2px; + vertical-align: middle; + } + } + + &[class*="col-"] .dropdown-toggle { + width: 100%; + } + + // The selectpicker dropdown + .dropdown-menu { + min-width: 100%; + box-sizing: border-box; + + &.inner { + position: static; + float: none; + border: 0; + padding: 0; + margin: 0; + border-radius: 0; + box-shadow: none; + } + + li { + position: relative; + + &.active small { + color: #fff; + } + + &.disabled a { + .cursor-disabled(); + } + + a { + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + + &.opt { + position: relative; + padding-left: 2.25em; + } + + span.check-mark { + display: none; + } + + span.text { + display: inline-block; + } + } + + small { + padding-left: 0.5em; + } + } + + .notify { + position: absolute; + bottom: 5px; + width: 96%; + margin: 0 2%; + min-height: 26px; + padding: 3px 5px; + background: rgb(245, 245, 245); + border: 1px solid rgb(227, 227, 227); + box-shadow: inset 0 1px 1px fade(rgb(0, 0, 0), 5%); + pointer-events: none; + opacity: 0.9; + box-sizing: border-box; + } + } + + .no-results { + padding: 3px; + background: #f5f5f5; + margin: 0 5px; + white-space: nowrap; + } + + &.fit-width .dropdown-toggle { + .filter-option { + position: static; + } + + .caret { + position: static; + top: auto; + margin-top: -1px; + } + } + + &.show-tick .dropdown-menu li { + &.selected a span.check-mark { + position: absolute; + display: inline-block; + right: 15px; + margin-top: 5px; + } + + a span.text { + margin-right: 34px; + } + } +} + +.bootstrap-select.show-menu-arrow { + &.open > .dropdown-toggle { + z-index: (@zindex-select-dropdown + 1); + } + + .dropdown-toggle { + &:before { + content: ''; + border-left: 7px solid transparent; + border-right: 7px solid transparent; + border-bottom: 7px solid @color-grey-arrow; + position: absolute; + bottom: -4px; + left: 9px; + display: none; + } + + &:after { + content: ''; + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-bottom: 6px solid white; + position: absolute; + bottom: -4px; + left: 10px; + display: none; + } + } + + &.dropup .dropdown-toggle { + &:before { + bottom: auto; + top: -3px; + border-top: 7px solid @color-grey-arrow; + border-bottom: 0; + } + + &:after { + bottom: auto; + top: -3px; + border-top: 6px solid white; + border-bottom: 0; + } + } + + &.pull-right .dropdown-toggle { + &:before { + right: 12px; + left: auto; + } + + &:after { + right: 13px; + left: auto; + } + } + + &.open > .dropdown-toggle { + &:before, + &:after { + display: block; + } + } +} + +.bs-searchbox, +.bs-actionsbox, +.bs-donebutton { + padding: 4px 8px; +} + +.bs-actionsbox { + width: 100%; + box-sizing: border-box; + + & .btn-group button { + width: 50%; + } +} + +.bs-donebutton { + float: left; + width: 100%; + box-sizing: border-box; + + & .btn-group button { + width: 100%; + } +} + +.bs-searchbox { + & + .bs-actionsbox { + padding: 0 8px 4px; + } + + & .form-control { + margin-bottom: 0; + width: 100%; + float: none; + } +} diff --git a/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap-select/less/variables.less b/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap-select/less/variables.less new file mode 100644 index 000000000..97a510c23 --- /dev/null +++ b/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap-select/less/variables.less @@ -0,0 +1,7 @@ +@color-red-error: rgb(185, 74, 72); +@color-blue-hover: rgba(100, 177, 216, 0.4); +@color-grey-arrow: rgba(204, 204, 204, 0.2); + +@width-default: 348px; // 3 960px-grid columns + +@zindex-select-dropdown: 1035; // must be lower than a modal background (1040) but higher than the fixed navbar (1030) diff --git a/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap-select/sass/bootstrap-select.css b/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap-select/sass/bootstrap-select.css new file mode 100644 index 000000000..b6c2903d8 --- /dev/null +++ b/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap-select/sass/bootstrap-select.css @@ -0,0 +1 @@ +@keyframes bs-notify-fadeOut{0%{opacity:0.9}100%{opacity:0}}select.bs-select-hidden,.bootstrap-select>select.bs-select-hidden,select.selectpicker{display:none !important}.bootstrap-select{width:220px \0;vertical-align:middle}.bootstrap-select>.dropdown-toggle{position:relative;width:100%;text-align:right;white-space:nowrap;display:inline-flex;align-items:center;justify-content:space-between}.bootstrap-select>.dropdown-toggle:after{margin-top:-1px}.bootstrap-select>.dropdown-toggle.bs-placeholder,.bootstrap-select>.dropdown-toggle.bs-placeholder:hover,.bootstrap-select>.dropdown-toggle.bs-placeholder:focus,.bootstrap-select>.dropdown-toggle.bs-placeholder:active{color:#999}.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-primary,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-primary:hover,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-primary:focus,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-primary:active,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-secondary,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-secondary:hover,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-secondary:focus,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-secondary:active,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-success,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-success:hover,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-success:focus,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-success:active,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-danger,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-danger:hover,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-danger:focus,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-danger:active,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-info,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-info:hover,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-info:focus,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-info:active,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-dark,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-dark:hover,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-dark:focus,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-dark:active{color:rgba(255,255,255,0.5)}.bootstrap-select>select{position:absolute !important;bottom:0;left:50%;display:block !important;width:0.5px !important;height:100% !important;padding:0 !important;opacity:0 !important;border:none;z-index:0 !important}.bootstrap-select>select.mobile-device{top:0;left:0;display:block !important;width:100% !important;z-index:2 !important}.has-error .bootstrap-select .dropdown-toggle,.error .bootstrap-select .dropdown-toggle,.bootstrap-select.is-invalid .dropdown-toggle,.was-validated .bootstrap-select select:invalid+.dropdown-toggle{border-color:#b94a48}.bootstrap-select.is-valid .dropdown-toggle,.was-validated .bootstrap-select select:valid+.dropdown-toggle{border-color:#28a745}.bootstrap-select.fit-width{width:auto !important}.bootstrap-select:not([class*="col-"]):not([class*="form-control"]):not(.input-group-btn){width:220px}.bootstrap-select>select.mobile-device:focus+.dropdown-toggle{outline:thin dotted #333333 !important;outline:5px auto -webkit-focus-ring-color !important;outline-offset:-2px}.bootstrap-select.form-control{margin-bottom:0;padding:0;border:none;height:auto}:not(.input-group)>.bootstrap-select.form-control:not([class*="col-"]){width:100%}.bootstrap-select.form-control.input-group-btn{float:none;z-index:auto}.form-inline .bootstrap-select,.form-inline .bootstrap-select.form-control:not([class*="col-"]){width:auto}.bootstrap-select:not(.input-group-btn),.bootstrap-select[class*="col-"]{float:none;display:inline-block;margin-left:0}.bootstrap-select.dropdown-menu-right,.bootstrap-select[class*="col-"].dropdown-menu-right,.row .bootstrap-select[class*="col-"].dropdown-menu-right{float:right}.form-inline .bootstrap-select,.form-horizontal .bootstrap-select,.form-group .bootstrap-select{margin-bottom:0}.form-group-lg .bootstrap-select.form-control,.form-group-sm .bootstrap-select.form-control{padding:0}.form-group-lg .bootstrap-select.form-control .dropdown-toggle,.form-group-sm .bootstrap-select.form-control .dropdown-toggle{height:100%;font-size:inherit;line-height:inherit;border-radius:inherit}.bootstrap-select.form-control-sm .dropdown-toggle,.bootstrap-select.form-control-lg .dropdown-toggle{font-size:inherit;line-height:inherit;border-radius:inherit}.bootstrap-select.form-control-sm .dropdown-toggle{padding:.25rem .5rem}.bootstrap-select.form-control-lg .dropdown-toggle{padding:.5rem 1rem}.form-inline .bootstrap-select .form-control{width:100%}.bootstrap-select.disabled,.bootstrap-select>.disabled{cursor:not-allowed}.bootstrap-select.disabled:focus,.bootstrap-select>.disabled:focus{outline:none !important}.bootstrap-select.bs-container{position:absolute;top:0;left:0;height:0 !important;padding:0 !important}.bootstrap-select.bs-container .dropdown-menu{z-index:9998}.bootstrap-select .dropdown-toggle .filter-option{position:static;top:0;left:0;float:left;height:100%;width:100%;text-align:left;overflow:hidden;flex:0 1 auto}.bs3.bootstrap-select .dropdown-toggle .filter-option{padding-right:inherit}.input-group .bs3-has-addon.bootstrap-select .dropdown-toggle .filter-option{position:absolute;padding-top:inherit;padding-bottom:inherit;padding-left:inherit;float:none}.input-group .bs3-has-addon.bootstrap-select .dropdown-toggle .filter-option .filter-option-inner{padding-right:inherit}.bootstrap-select .dropdown-toggle .filter-option-inner-inner{overflow:hidden}.bootstrap-select .dropdown-toggle .filter-expand{width:0 !important;float:left;opacity:0 !important;overflow:hidden}.bootstrap-select .dropdown-toggle .caret{position:absolute;top:50%;right:12px;margin-top:-2px;vertical-align:middle}.input-group .bootstrap-select.form-control .dropdown-toggle{border-radius:inherit}.bootstrap-select[class*="col-"] .dropdown-toggle{width:100%}.bootstrap-select .dropdown-menu{min-width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bootstrap-select .dropdown-menu>.inner:focus{outline:none !important}.bootstrap-select .dropdown-menu.inner{position:static;float:none;border:0;padding:0;margin:0;border-radius:0;box-shadow:none}.bootstrap-select .dropdown-menu li{position:relative}.bootstrap-select .dropdown-menu li.active small{color:rgba(255,255,255,0.5) !important}.bootstrap-select .dropdown-menu li.disabled a{cursor:not-allowed}.bootstrap-select .dropdown-menu li a{cursor:pointer;user-select:none}.bootstrap-select .dropdown-menu li a.opt{position:relative;padding-left:2.25em}.bootstrap-select .dropdown-menu li a span.check-mark{display:none}.bootstrap-select .dropdown-menu li a span.text{display:inline-block}.bootstrap-select .dropdown-menu li small{padding-left:0.5em}.bootstrap-select .dropdown-menu .notify{position:absolute;bottom:5px;width:96%;margin:0 2%;min-height:26px;padding:3px 5px;background:#f5f5f5;border:1px solid #e3e3e3;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);pointer-events:none;opacity:0.9;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bootstrap-select .dropdown-menu .notify.fadeOut{animation:300ms linear 750ms forwards bs-notify-fadeOut}.bootstrap-select .no-results{padding:3px;background:#f5f5f5;margin:0 5px;white-space:nowrap}.bootstrap-select.fit-width .dropdown-toggle .filter-option{position:static;display:inline;padding:0}.bootstrap-select.fit-width .dropdown-toggle .filter-option-inner,.bootstrap-select.fit-width .dropdown-toggle .filter-option-inner-inner{display:inline}.bootstrap-select.fit-width .dropdown-toggle .bs-caret:before{content:'\00a0'}.bootstrap-select.fit-width .dropdown-toggle .caret{position:static;top:auto;margin-top:-1px}.bootstrap-select.show-tick .dropdown-menu .selected span.check-mark{position:absolute;display:inline-block;right:15px;top:5px}.bootstrap-select.show-tick .dropdown-menu li a span.text{margin-right:34px}.bootstrap-select .bs-ok-default:after{content:'';display:block;width:0.5em;height:1em;border-style:solid;border-width:0 0.26em 0.26em 0;transform:rotate(45deg)}.bootstrap-select.show-menu-arrow.open>.dropdown-toggle,.bootstrap-select.show-menu-arrow.show>.dropdown-toggle{z-index:9999}.bootstrap-select.show-menu-arrow .dropdown-toggle .filter-option:before{content:'';border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid rgba(204,204,204,0.2);position:absolute;bottom:-4px;left:9px;display:none}.bootstrap-select.show-menu-arrow .dropdown-toggle .filter-option:after{content:'';border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid white;position:absolute;bottom:-4px;left:10px;display:none}.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle .filter-option:before{bottom:auto;top:-4px;border-top:7px solid rgba(204,204,204,0.2);border-bottom:0}.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle .filter-option:after{bottom:auto;top:-4px;border-top:6px solid white;border-bottom:0}.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle .filter-option:before{right:12px;left:auto}.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle .filter-option:after{right:13px;left:auto}.bootstrap-select.show-menu-arrow.open>.dropdown-toggle .filter-option:before,.bootstrap-select.show-menu-arrow.open>.dropdown-toggle .filter-option:after,.bootstrap-select.show-menu-arrow.show>.dropdown-toggle .filter-option:before,.bootstrap-select.show-menu-arrow.show>.dropdown-toggle .filter-option:after{display:block}.bs-searchbox,.bs-actionsbox,.bs-donebutton{padding:4px 8px}.bs-actionsbox{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bs-actionsbox .btn-group button{width:50%}.bs-donebutton{float:left;width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bs-donebutton .btn-group button{width:100%}.bs-searchbox+.bs-actionsbox{padding:0 8px 4px}.bs-searchbox .form-control{margin-bottom:0;width:100%;float:none} diff --git a/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap-select/sass/bootstrap-select.scss b/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap-select/sass/bootstrap-select.scss new file mode 100644 index 000000000..ce955acc9 --- /dev/null +++ b/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap-select/sass/bootstrap-select.scss @@ -0,0 +1,519 @@ +@import "variables"; + +@keyframes bs-notify-fadeOut { + 0% {opacity: 0.9;} + 100% {opacity: 0;} +} + +// Mixins +@mixin cursor-disabled() { + cursor: not-allowed; +} + +@mixin box-sizing($fmt) { + -webkit-box-sizing: $fmt; + -moz-box-sizing: $fmt; + box-sizing: $fmt; +} + +@mixin box-shadow($fmt) { + -webkit-box-shadow: $fmt; + box-shadow: $fmt; +} + +@function fade($color, $amnt) { + @if $amnt > 1 { + $amnt: $amnt / 100; // convert to percentage if int + } + @return rgba($color, $amnt); +} + +// Rules +select.bs-select-hidden, +.bootstrap-select > select.bs-select-hidden, +select.selectpicker { + display: none !important; +} + +.bootstrap-select { + width: 220px \0; /*IE9 and below*/ + vertical-align: middle; + + // The selectpicker button + > .dropdown-toggle { + position: relative; + width: 100%; + // necessary for proper positioning of caret in Bootstrap 4 (pushes caret to the right) + text-align: right; + white-space: nowrap; + // force caret to be vertically centered for Bootstrap 4 multi-line buttons + display: inline-flex; + align-items: center; + justify-content: space-between; + + &:after { + margin-top: -1px; + } + + &.bs-placeholder { + &, + &:hover, + &:focus, + &:active { + color: $input-color-placeholder; + } + + &.btn-primary, + &.btn-secondary, + &.btn-success, + &.btn-danger, + &.btn-info, + &.btn-dark { + &, + &:hover, + &:focus, + &:active { + color: $input-alt-color-placeholder; + } + } + } + } + + > select { + position: absolute !important; + bottom: 0; + left: 50%; + display: block !important; + width: 0.5px !important; + height: 100% !important; + padding: 0 !important; + opacity: 0 !important; + border: none; + z-index: 0 !important; + + &.mobile-device { + top: 0; + left: 0; + display: block !important; + width: 100% !important; + z-index: 2 !important; + } + } + + // Error display + .has-error & .dropdown-toggle, + .error & .dropdown-toggle, + &.is-invalid .dropdown-toggle, + .was-validated & select:invalid + .dropdown-toggle { + border-color: $color-red-error; + } + + &.is-valid .dropdown-toggle, + .was-validated & select:valid + .dropdown-toggle { + border-color: $color-green-success; + } + + &.fit-width { + width: auto !important; + } + + &:not([class*="col-"]):not([class*="form-control"]):not(.input-group-btn) { + width: $width-default; + } + + > select.mobile-device:focus + .dropdown-toggle { + outline: thin dotted #333333 !important; + outline: 5px auto -webkit-focus-ring-color !important; + outline-offset: -2px; + } +} + +// The selectpicker components +.bootstrap-select { + &.form-control { + margin-bottom: 0; + padding: 0; + border: none; + height: auto; + + :not(.input-group) > &:not([class*="col-"]) { + width: 100%; + } + + &.input-group-btn { + float: none; + z-index: auto; + } + } + + .form-inline &, + .form-inline &.form-control:not([class*="col-"]) { + width: auto; + } + + &:not(.input-group-btn), + &[class*="col-"] { + float: none; + display: inline-block; + margin-left: 0; + } + + // Forces the pull to the right, if necessary + &, + &[class*="col-"], + .row &[class*="col-"] { + &.dropdown-menu-right { + float: right; + } + } + + .form-inline &, + .form-horizontal &, + .form-group & { + margin-bottom: 0; + } + + .form-group-lg &.form-control, + .form-group-sm &.form-control { + padding: 0; + + .dropdown-toggle { + height: 100%; + font-size: inherit; + line-height: inherit; + border-radius: inherit; + } + } + + &.form-control-sm .dropdown-toggle, + &.form-control-lg .dropdown-toggle { + font-size: inherit; + line-height: inherit; + border-radius: inherit; + } + + &.form-control-sm .dropdown-toggle { + padding: $input-padding-y-sm $input-padding-x-sm; + } + + &.form-control-lg .dropdown-toggle { + padding: $input-padding-y-lg $input-padding-x-lg; + } + + // Set the width of the live search (and any other form control within an inline form) + // see https://github.com/silviomoreto/bootstrap-select/issues/685 + .form-inline & .form-control { + width: 100%; + } + + &.disabled, + > .disabled { + @include cursor-disabled(); + + &:focus { + outline: none !important; + } + } + + &.bs-container { + position: absolute; + top: 0; + left: 0; + height: 0 !important; + padding: 0 !important; + + .dropdown-menu { + z-index: $zindex-select-dropdown; + } + } + + // The selectpicker button + .dropdown-toggle { + .filter-option { + position: static; + top: 0; + left: 0; + float: left; + height: 100%; + width: 100%; + text-align: left; + overflow: hidden; + flex: 0 1 auto; // for IE10 + + @at-root .bs3#{&} { + padding-right: inherit; + } + + @at-root .input-group .bs3-has-addon#{&} { + position: absolute; + padding-top: inherit; + padding-bottom: inherit; + padding-left: inherit; + float: none; + + .filter-option-inner { + padding-right: inherit; + } + } + } + + .filter-option-inner-inner { + overflow: hidden; + } + + // used to expand the height of the button when inside an input group + .filter-expand { + width: 0 !important; + float: left; + opacity: 0 !important; + overflow: hidden; + } + + .caret { + position: absolute; + top: 50%; + right: 12px; + margin-top: -2px; + vertical-align: middle; + } + } + + .input-group &.form-control .dropdown-toggle { + border-radius: inherit; + } + + &[class*="col-"] .dropdown-toggle { + width: 100%; + } + + // The selectpicker dropdown + .dropdown-menu { + min-width: 100%; + @include box-sizing(border-box); + + > .inner:focus { + outline: none !important; + } + + &.inner { + position: static; + float: none; + border: 0; + padding: 0; + margin: 0; + border-radius: 0; + box-shadow: none; + } + + li { + position: relative; + + &.active small { + color: $input-alt-color-placeholder !important; + } + + &.disabled a { + @include cursor-disabled(); + } + + a { + cursor: pointer; + user-select: none; + + &.opt { + position: relative; + padding-left: 2.25em; + } + + span.check-mark { + display: none; + } + + span.text { + display: inline-block; + } + } + + small { + padding-left: 0.5em; + } + } + + .notify { + position: absolute; + bottom: 5px; + width: 96%; + margin: 0 2%; + min-height: 26px; + padding: 3px 5px; + background: rgb(245, 245, 245); + border: 1px solid rgb(227, 227, 227); + @include box-shadow(inset 0 1px 1px fade(rgb(0, 0, 0), 5)); + pointer-events: none; + opacity: 0.9; + @include box-sizing(border-box); + + &.fadeOut { + animation: 300ms linear 750ms forwards bs-notify-fadeOut; + } + } + } + + .no-results { + padding: 3px; + background: #f5f5f5; + margin: 0 5px; + white-space: nowrap; + } + + &.fit-width .dropdown-toggle { + .filter-option { + position: static; + display: inline; + padding: 0; + } + + .filter-option-inner, + .filter-option-inner-inner { + display: inline; + } + + .bs-caret:before { + content: '\00a0'; + } + + .caret { + position: static; + top: auto; + margin-top: -1px; + } + } + + &.show-tick .dropdown-menu { + .selected span.check-mark { + position: absolute; + display: inline-block; + right: 15px; + top: 5px; + } + + li a span.text { + margin-right: 34px; + } + } + + // default check mark for use without an icon font + .bs-ok-default:after { + content: ''; + display: block; + width: 0.5em; + height: 1em; + border-style: solid; + border-width: 0 0.26em 0.26em 0; + transform: rotate(45deg); + } +} + +.bootstrap-select.show-menu-arrow { + &.open > .dropdown-toggle, + &.show > .dropdown-toggle { + z-index: ($zindex-select-dropdown + 1); + } + + .dropdown-toggle .filter-option { + &:before { + content: ''; + border-left: 7px solid transparent; + border-right: 7px solid transparent; + border-bottom: 7px solid $color-grey-arrow; + position: absolute; + bottom: -4px; + left: 9px; + display: none; + } + + &:after { + content: ''; + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-bottom: 6px solid white; + position: absolute; + bottom: -4px; + left: 10px; + display: none; + } + } + + &.dropup .dropdown-toggle .filter-option { + &:before { + bottom: auto; + top: -4px; + border-top: 7px solid $color-grey-arrow; + border-bottom: 0; + } + + &:after { + bottom: auto; + top: -4px; + border-top: 6px solid white; + border-bottom: 0; + } + } + + &.pull-right .dropdown-toggle .filter-option { + &:before { + right: 12px; + left: auto; + } + + &:after { + right: 13px; + left: auto; + } + } + + &.open > .dropdown-toggle .filter-option, + &.show > .dropdown-toggle .filter-option { + &:before, + &:after { + display: block; + } + } +} + +.bs-searchbox, +.bs-actionsbox, +.bs-donebutton { + padding: 4px 8px; +} + +.bs-actionsbox { + width: 100%; + @include box-sizing(border-box); + + & .btn-group button { + width: 50%; + } +} + +.bs-donebutton { + float: left; + width: 100%; + @include box-sizing(border-box); + + & .btn-group button { + width: 100%; + } +} + +.bs-searchbox { + & + .bs-actionsbox { + padding: 0 8px 4px; + } + + & .form-control { + margin-bottom: 0; + width: 100%; + float: none; + } +} \ No newline at end of file diff --git a/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap-select/sass/variables.scss b/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap-select/sass/variables.scss new file mode 100644 index 000000000..555ef10fc --- /dev/null +++ b/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap-select/sass/variables.scss @@ -0,0 +1,17 @@ +$color-red-error: rgb(185, 74, 72) !default; +$color-green-success: #28a745; +$color-grey-arrow: rgba(204, 204, 204, 0.2) !default; + +$width-default: 220px !default; // 3 960px-grid columns + +$zindex-select-dropdown: 9998 !default; // must be higher than a modal background (1050) + +//** Placeholder text color +$input-color-placeholder: #999 !default; +$input-alt-color-placeholder: rgba(255, 255, 255, 0.5) !default; + +$input-padding-y-sm: .25rem !default; +$input-padding-x-sm: .5rem !default; + +$input-padding-y-lg: 0.5rem !default; +$input-padding-x-lg: 1rem !default; \ No newline at end of file diff --git a/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_alerts.scss b/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_alerts.scss new file mode 100644 index 000000000..e45de8305 --- /dev/null +++ b/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_alerts.scss @@ -0,0 +1,68 @@ +// +// Alerts +// -------------------------------------------------- + + +// Base styles +// ------------------------- + +.alert { + padding: $alert-padding; + margin-bottom: $line-height-computed; + border: 1px solid transparent; + border-radius: $alert-border-radius; + + // Headings for larger alerts + h4 { + margin-top: 0; + // Specified for the h4 to prevent conflicts of changing $headings-color + color: inherit; + } + // Provide class for links that match alerts + .alert-link { + font-weight: $alert-link-font-weight; + } + + // Improve alignment and spacing of inner content + > p, + > ul { + margin-bottom: 0; + } + > p + p { + margin-top: 5px; + } +} + +// Dismissible alerts +// +// Expand the right padding and account for the close button's positioning. + +.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0. +.alert-dismissible { + padding-right: ($alert-padding + 20); + + // Adjust close link position + .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; + } +} + +// Alternate styles +// +// Generate contextual modifier classes for colorizing the alert. + +.alert-success { + @include alert-variant($alert-success-bg, $alert-success-border, $alert-success-text); +} +.alert-info { + @include alert-variant($alert-info-bg, $alert-info-border, $alert-info-text); +} +.alert-warning { + @include alert-variant($alert-warning-bg, $alert-warning-border, $alert-warning-text); +} +.alert-danger { + @include alert-variant($alert-danger-bg, $alert-danger-border, $alert-danger-text); +} diff --git a/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_badges.scss b/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_badges.scss new file mode 100644 index 000000000..02394ae7f --- /dev/null +++ b/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_badges.scss @@ -0,0 +1,57 @@ +// +// Badges +// -------------------------------------------------- + + +// Base class +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: $font-size-small; + font-weight: $badge-font-weight; + color: $badge-color; + line-height: $badge-line-height; + vertical-align: baseline; + white-space: nowrap; + text-align: center; + background-color: $badge-bg; + border-radius: $badge-border-radius; + + // Empty badges collapse automatically (not available in IE8) + &:empty { + display: none; + } + + // Quick fix for badges in buttons + .btn & { + position: relative; + top: -1px; + } + .btn-xs & { + top: 0; + padding: 1px 5px; + } + + // [converter] extracted a& to a.badge + + // Account for badges in navs + a.list-group-item.active > &, + .nav-pills > .active > a > & { + color: $badge-active-color; + background-color: $badge-active-bg; + } + .nav-pills > li > a > & { + margin-left: 3px; + } +} + +// Hover state, but only for links +a.badge { + &:hover, + &:focus { + color: $badge-link-hover-color; + text-decoration: none; + cursor: pointer; + } +} diff --git a/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_breadcrumbs.scss b/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_breadcrumbs.scss new file mode 100644 index 000000000..3641e333b --- /dev/null +++ b/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_breadcrumbs.scss @@ -0,0 +1,26 @@ +// +// Breadcrumbs +// -------------------------------------------------- + + +.breadcrumb { + padding: $breadcrumb-padding-vertical $breadcrumb-padding-horizontal; + margin-bottom: $line-height-computed; + list-style: none; + background-color: $breadcrumb-bg; + border-radius: $border-radius-base; + + > li { + display: inline-block; + + + li:before { + content: "#{$breadcrumb-separator}\00a0"; // Unicode space added since inline-block means non-collapsing white-space + padding: 0 5px; + color: $breadcrumb-color; + } + } + + > .active { + color: $breadcrumb-active-color; + } +} diff --git a/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_button-groups.scss b/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_button-groups.scss new file mode 100644 index 000000000..63ccd927c --- /dev/null +++ b/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_button-groups.scss @@ -0,0 +1,240 @@ +// +// Button groups +// -------------------------------------------------- + +// Make the div behave like a button +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; // match .btn alignment given font-size hack above + > .btn { + position: relative; + float: left; + // Bring the "active" button to the front + &:hover, + &:focus, + &:active, + &.active { + z-index: 2; + } + &:focus { + // Remove focus outline when dropdown JS adds it after closing the menu + outline: 0; + } + } +} + +// Prevent double borders when buttons are next to each other +.btn-group { + .btn + .btn, + .btn + .btn-group, + .btn-group + .btn, + .btn-group + .btn-group { + margin-left: -1px; + } +} + +// Optional: Group multiple button groups together for a toolbar +.btn-toolbar { + margin-left: -5px; // Offset the first child's margin + @include clearfix(); + + .btn-group, + .input-group { + float: left; + } + > .btn, + > .btn-group, + > .input-group { + margin-left: 5px; + } +} + +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} + +// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match +.btn-group > .btn:first-child { + margin-left: 0; + &:not(:last-child):not(.dropdown-toggle) { + @include border-right-radius(0); + } +} +// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + @include border-left-radius(0); +} + +// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group) +.btn-group > .btn-group { + float: left; +} +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group > .btn-group:first-child { + > .btn:last-child, + > .dropdown-toggle { + @include border-right-radius(0); + } +} +.btn-group > .btn-group:last-child > .btn:first-child { + @include border-left-radius(0); +} + +// On active and open, don't show outline +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} + + +// Sizing +// +// Remix the default button sizing classes into new ones for easier manipulation. + +.btn-group-xs > .btn { @extend .btn-xs; } +.btn-group-sm > .btn { @extend .btn-sm; } +.btn-group-lg > .btn { @extend .btn-lg; } + + +// Split button dropdowns +// ---------------------- + +// Give the line between buttons some depth +.btn-group > .btn + .dropdown-toggle { + padding-left: 8px; + padding-right: 8px; +} +.btn-group > .btn-lg + .dropdown-toggle { + padding-left: 12px; + padding-right: 12px; +} + +// The clickable button for toggling the menu +// Remove the gradient and set the same inset shadow as the :active state +.btn-group.open .dropdown-toggle { + @include box-shadow(inset 0 3px 5px rgba(0,0,0,.125)); + + // Show no shadow for `.btn-link` since it has no other button styles. + &.btn-link { + @include box-shadow(none); + } +} + + +// Reposition the caret +.btn .caret { + margin-left: 0; +} +// Carets in other button sizes +.btn-lg .caret { + border-width: $caret-width-large $caret-width-large 0; + border-bottom-width: 0; +} +// Upside down carets for .dropup +.dropup .btn-lg .caret { + border-width: 0 $caret-width-large $caret-width-large; +} + + +// Vertical button groups +// ---------------------- + +.btn-group-vertical { + > .btn, + > .btn-group, + > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; + } + + // Clear floats so dropdown menus can be properly placed + > .btn-group { + @include clearfix(); + > .btn { + float: none; + } + } + + > .btn + .btn, + > .btn + .btn-group, + > .btn-group + .btn, + > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; + } +} + +.btn-group-vertical > .btn { + &:not(:first-child):not(:last-child) { + border-radius: 0; + } + &:first-child:not(:last-child) { + border-top-right-radius: $border-radius-base; + @include border-bottom-radius(0); + } + &:last-child:not(:first-child) { + border-bottom-left-radius: $border-radius-base; + @include border-top-radius(0); + } +} +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group-vertical > .btn-group:first-child:not(:last-child) { + > .btn:last-child, + > .dropdown-toggle { + @include border-bottom-radius(0); + } +} +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { + @include border-top-radius(0); +} + + + +// Justified button groups +// ---------------------- + +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; + > .btn, + > .btn-group { + float: none; + display: table-cell; + width: 1%; + } + > .btn-group .btn { + width: 100%; + } + + > .btn-group .dropdown-menu { + left: auto; + } +} + + +// Checkbox and radio options +// +// In order to support the browser's form validation feedback, powered by the +// `required` attribute, we have to "hide" the inputs via `opacity`. We cannot +// use `display: none;` or `visibility: hidden;` as that also hides the popover. +// This way, we ensure a DOM element is visible to position the popover from. +// +// See https://github.com/twbs/bootstrap/pull/12794 for more. + +[data-toggle="buttons"] > .btn > input[type="radio"], +[data-toggle="buttons"] > .btn > input[type="checkbox"] { + position: absolute; + z-index: -1; + @include opacity(0); +} diff --git a/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_buttons.scss b/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_buttons.scss new file mode 100644 index 000000000..f2684c1b7 --- /dev/null +++ b/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_buttons.scss @@ -0,0 +1,159 @@ +// +// Buttons +// -------------------------------------------------- + + +// Base styles +// -------------------------------------------------- + +.btn { + display: inline-block; + margin-bottom: 0; // For input.btn + font-weight: $btn-font-weight; + text-align: center; + vertical-align: middle; + cursor: pointer; + background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214 + border: 1px solid transparent; + white-space: nowrap; + @include button-size($padding-base-vertical, $padding-base-horizontal, $font-size-base, $line-height-base, $border-radius-base); + @include user-select(none); + + @include button-variant($btn-default-color, $btn-default-bg, $btn-default-border); + + &, + &:active, + &.active { + &:focus { + @include tab-focus(); + } + } + + &:hover, + &:focus { + color: $btn-default-color; + text-decoration: none; + } + + &:active, + &.active { + outline: 0; + background-image: none; + @include box-shadow(inset 0 3px 5px rgba(0,0,0,.125)); + } + + &.disabled, + &[disabled], + fieldset[disabled] & { + cursor: not-allowed; + pointer-events: none; // Future-proof disabling of clicks + @include opacity(.65); + @include box-shadow(none); + } +} + + +// Alternate buttons +// -------------------------------------------------- + +.btn-default { + @include button-variant($btn-default-color, $btn-default-bg, $btn-default-border); +} +.btn-primary { + @include button-variant($btn-primary-color, $btn-primary-bg, $btn-primary-border); +} +// Success appears as green +.btn-success { + @include button-variant($btn-success-color, $btn-success-bg, $btn-success-border); +} +// Info appears as blue-green +.btn-info { + @include button-variant($btn-info-color, $btn-info-bg, $btn-info-border); +} +// Warning appears as orange +.btn-warning { + @include button-variant($btn-warning-color, $btn-warning-bg, $btn-warning-border); +} +// Danger and error appear as red +.btn-danger { + @include button-variant($btn-danger-color, $btn-danger-bg, $btn-danger-border); +} + + +// Link buttons +// ------------------------- + +// Make a button look and behave like a link +.btn-link { + color: $link-color; + font-weight: normal; + cursor: pointer; + border-radius: 0; + + &, + &:active, + &[disabled], + fieldset[disabled] & { + background-color: transparent; + @include box-shadow(none); + } + &, + &:hover, + &:focus, + &:active { + border-color: transparent; + } + &:hover, + &:focus { + color: $link-hover-color; + text-decoration: underline; + background-color: transparent; + } + &[disabled], + fieldset[disabled] & { + &:hover, + &:focus { + color: $btn-link-disabled-color; + text-decoration: none; + } + } +} + + +// Button Sizes +// -------------------------------------------------- + +.btn-lg { + // line-height: ensure even-numbered height of button next to large input + @include button-size($padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $border-radius-large); +} +.btn-sm { + // line-height: ensure proper height of button next to small input + @include button-size($padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $border-radius-small); +} +.btn-xs { + @include button-size($padding-xs-vertical, $padding-xs-horizontal, $font-size-small, $line-height-small, $border-radius-small); +} + + +// Block button +// -------------------------------------------------- + +.btn-block { + display: block; + width: 100%; +} + +// Vertically space out multiple block buttons +.btn-block + .btn-block { + margin-top: 5px; +} + +// Specificity overrides +input[type="submit"], +input[type="reset"], +input[type="button"] { + &.btn-block { + width: 100%; + } +} diff --git a/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_carousel.scss b/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_carousel.scss new file mode 100644 index 000000000..e9e2f7ce1 --- /dev/null +++ b/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_carousel.scss @@ -0,0 +1,243 @@ +// +// Carousel +// -------------------------------------------------- + + +// Wrapper for the slide container and indicators +.carousel { + position: relative; +} + +.carousel-inner { + position: relative; + overflow: hidden; + width: 100%; + + > .item { + display: none; + position: relative; + @include transition(.6s ease-in-out left); + + // Account for jankitude on images + > img, + > a > img { + @include img-responsive(); + line-height: 1; + } + } + + > .active, + > .next, + > .prev { + display: block; + } + + > .active { + left: 0; + } + + > .next, + > .prev { + position: absolute; + top: 0; + width: 100%; + } + + > .next { + left: 100%; + } + > .prev { + left: -100%; + } + > .next.left, + > .prev.right { + left: 0; + } + + > .active.left { + left: -100%; + } + > .active.right { + left: 100%; + } + +} + +// Left/right controls for nav +// --------------------------- + +.carousel-control { + position: absolute; + top: 0; + left: 0; + bottom: 0; + width: $carousel-control-width; + @include opacity($carousel-control-opacity); + font-size: $carousel-control-font-size; + color: $carousel-control-color; + text-align: center; + text-shadow: $carousel-text-shadow; + // We can't have this transition here because WebKit cancels the carousel + // animation if you trip this while in the middle of another animation. + + // Set gradients for backgrounds + &.left { + @include gradient-horizontal($start-color: rgba(0,0,0,.5), $end-color: rgba(0,0,0,.0001)); + } + &.right { + left: auto; + right: 0; + @include gradient-horizontal($start-color: rgba(0,0,0,.0001), $end-color: rgba(0,0,0,.5)); + } + + // Hover/focus state + &:hover, + &:focus { + outline: 0; + color: $carousel-control-color; + text-decoration: none; + @include opacity(.9); + } + + // Toggles + .icon-prev, + .icon-next, + .glyphicon-chevron-left, + .glyphicon-chevron-right { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; + } + .icon-prev, + .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; + } + .icon-next, + .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; + } + .icon-prev, + .icon-next { + width: 20px; + height: 20px; + margin-top: -10px; + font-family: serif; + } + + + .icon-prev { + &:before { + content: '\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039) + } + } + .icon-next { + &:before { + content: '\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A) + } + } +} + +// Optional indicator pips +// +// Add an unordered list with the following class and add a list item for each +// slide your carousel holds. + +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + margin-left: -30%; + padding-left: 0; + list-style: none; + text-align: center; + + li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + border: 1px solid $carousel-indicator-border-color; + border-radius: 10px; + cursor: pointer; + + // IE8-9 hack for event handling + // + // Internet Explorer 8-9 does not support clicks on elements without a set + // `background-color`. We cannot use `filter` since that's not viewed as a + // background color by the browser. Thus, a hack is needed. + // + // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we + // set alpha transparency for the best results possible. + background-color: #000 \9; // IE8 + background-color: rgba(0,0,0,0); // IE9 + } + .active { + margin: 0; + width: 12px; + height: 12px; + background-color: $carousel-indicator-active-bg; + } +} + +// Optional captions +// ----------------------------- +// Hidden by default for smaller viewports +.carousel-caption { + position: absolute; + left: 15%; + right: 15%; + bottom: 20px; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: $carousel-caption-color; + text-align: center; + text-shadow: $carousel-text-shadow; + & .btn { + text-shadow: none; // No shadow for button elements in carousel-caption + } +} + + +// Scale up controls for tablets and up +@media screen and (min-width: $screen-sm-min) { + + // Scale up the controls a smidge + .carousel-control { + .glyphicon-chevron-left, + .glyphicon-chevron-right, + .icon-prev, + .icon-next { + width: 30px; + height: 30px; + margin-top: -15px; + font-size: 30px; + } + .glyphicon-chevron-left, + .icon-prev { + margin-left: -15px; + } + .glyphicon-chevron-right, + .icon-next { + margin-right: -15px; + } + } + + // Show and left align the captions + .carousel-caption { + left: 20%; + right: 20%; + padding-bottom: 30px; + } + + // Move up the indicators + .carousel-indicators { + bottom: 20px; + } +} diff --git a/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_close.scss b/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_close.scss new file mode 100644 index 000000000..62ce30fa3 --- /dev/null +++ b/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_close.scss @@ -0,0 +1,35 @@ +// +// Close icons +// -------------------------------------------------- + + +.close { + float: right; + font-size: ($font-size-base * 1.5); + font-weight: $close-font-weight; + line-height: 1; + color: $close-color; + text-shadow: $close-text-shadow; + @include opacity(.2); + + &:hover, + &:focus { + color: $close-color; + text-decoration: none; + cursor: pointer; + @include opacity(.5); + } + + // [converter] extracted button& to button.close +} + +// Additional properties for button version +// iOS requires the button element instead of an anchor tag. +// If you want the anchor version, it requires `href="#"`. +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} diff --git a/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_code.scss b/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_code.scss new file mode 100644 index 000000000..3a434b946 --- /dev/null +++ b/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_code.scss @@ -0,0 +1,68 @@ +// +// Code (inline and block) +// -------------------------------------------------- + + +// Inline and block code styles +code, +kbd, +pre, +samp { + font-family: $font-family-monospace; +} + +// Inline code +code { + padding: 2px 4px; + font-size: 90%; + color: $code-color; + background-color: $code-bg; + border-radius: $border-radius-base; +} + +// User input typically entered via keyboard +kbd { + padding: 2px 4px; + font-size: 90%; + color: $kbd-color; + background-color: $kbd-bg; + border-radius: $border-radius-small; + box-shadow: inset 0 -1px 0 rgba(0,0,0,.25); + + kbd { + padding: 0; + font-size: 100%; + box-shadow: none; + } +} + +// Blocks of code +pre { + display: block; + padding: calc(($line-height-computed - 100%) / 2); + margin: 0 0 calc($line-height-computed / 2); + font-size: ($font-size-base - 1); // 14px to 13px + line-height: $line-height-base; + word-break: break-all; + word-wrap: break-word; + color: $pre-color; + background-color: $pre-bg; + border: 1px solid $pre-border-color; + border-radius: $border-radius-base; + + // Account for some code outputs that place code tags in pre tags + code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; + } +} + +// Enable scrollable blocks of code +.pre-scrollable { + max-height: $pre-scrollable-max-height; + overflow-y: scroll; +} diff --git a/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_component-animations.scss b/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_component-animations.scss new file mode 100644 index 000000000..8c3fd07a2 --- /dev/null +++ b/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_component-animations.scss @@ -0,0 +1,35 @@ +// +// Component animations +// -------------------------------------------------- + +// Heads up! +// +// We don't use the `.opacity()` mixin here since it causes a bug with text +// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552. + +.fade { + opacity: 0; + @include transition(opacity .15s linear); + &.in { + opacity: 1; + } +} + +.collapse { + display: none; + + &.in { display: block; } + // [converter] extracted tr&.in to tr.collapse.in + // [converter] extracted tbody&.in to tbody.collapse.in +} + +tr.collapse.in { display: table-row; } + +tbody.collapse.in { display: table-row-group; } + +.collapsing { + position: relative; + height: 0; + overflow: hidden; + @include transition(height .35s ease); +} diff --git a/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_dropdowns.scss b/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_dropdowns.scss new file mode 100644 index 000000000..df50ec0cb --- /dev/null +++ b/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_dropdowns.scss @@ -0,0 +1,214 @@ +// +// Dropdown menus +// -------------------------------------------------- + + +// Dropdown arrow/caret +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: $caret-width-base solid; + border-right: $caret-width-base solid transparent; + border-left: $caret-width-base solid transparent; +} + +// The dropdown wrapper (div) +.dropdown { + position: relative; +} + +// Prevent the focus on the dropdown toggle when closing dropdowns +.dropdown-toggle:focus { + outline: 0; +} + +// The dropdown menu (ul) +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: $zindex-dropdown; + display: none; // none by default, but block on "open" of the menu + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; // override default ul + list-style: none; + font-size: $font-size-base; + text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer) + background-color: $dropdown-bg; + border: 1px solid $dropdown-fallback-border; // IE8 fallback + border: 1px solid $dropdown-border; + border-radius: $border-radius-base; + @include box-shadow(0 6px 12px rgba(0,0,0,.175)); + background-clip: padding-box; + + // Aligns the dropdown menu to right + // + // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]` + &.pull-right { + right: 0; + left: auto; + } + + // Dividers (basically an hr) within the dropdown + .divider { + @include nav-divider($dropdown-divider-bg); + } + + // Links within the dropdown menu + > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: $line-height-base; + color: $dropdown-link-color; + white-space: nowrap; // prevent links from randomly breaking onto new lines + } +} + +// Hover/Focus state +.dropdown-menu > li > a { + &:hover, + &:focus { + text-decoration: none; + color: $dropdown-link-hover-color; + background-color: $dropdown-link-hover-bg; + } +} + +// Active state +.dropdown-menu > .active > a { + &, + &:hover, + &:focus { + color: $dropdown-link-active-color; + text-decoration: none; + outline: 0; + background-color: $dropdown-link-active-bg; + } +} + +// Disabled state +// +// Gray out text and ensure the hover/focus state remains gray + +.dropdown-menu > .disabled > a { + &, + &:hover, + &:focus { + color: $dropdown-link-disabled-color; + } +} +// Nuke hover/focus effects +.dropdown-menu > .disabled > a { + &:hover, + &:focus { + text-decoration: none; + background-color: transparent; + background-image: none; // Remove CSS gradient + @include reset-filter(); + cursor: not-allowed; + } +} + +// Open state for the dropdown +.open { + // Show the menu + > .dropdown-menu { + display: block; + } + + // Remove the outline when :focus is triggered + > a { + outline: 0; + } +} + +// Menu positioning +// +// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown +// menu with the parent. +.dropdown-menu-right { + left: auto; // Reset the default from `.dropdown-menu` + right: 0; +} +// With v3, we enabled auto-flipping if you have a dropdown within a right +// aligned nav component. To enable the undoing of that, we provide an override +// to restore the default dropdown menu alignment. +// +// This is only for left-aligning a dropdown menu within a `.navbar-right` or +// `.pull-right` nav component. +.dropdown-menu-left { + left: 0; + right: auto; +} + +// Dropdown section headers +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: $font-size-small; + line-height: $line-height-base; + color: $dropdown-header-color; + white-space: nowrap; // as with > li > a +} + +// Backdrop to catch body clicks on mobile, etc. +.dropdown-backdrop { + position: fixed; + left: 0; + right: 0; + bottom: 0; + top: 0; + z-index: ($zindex-dropdown - 10); +} + +// Right aligned dropdowns +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} + +// Allow for dropdowns to go bottom up (aka, dropup-menu) +// +// Just add .dropup after the standard .dropdown class and you're set, bro. +// TODO: abstract this so that the navbar fixed styles are not placed here? + +.dropup, +.navbar-fixed-bottom .dropdown { + // Reverse the caret + .caret { + border-top: 0; + border-bottom: $caret-width-base solid; + content: ""; + } + // Different positioning for bottom up menu + .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 1px; + } +} + + +// Component alignment +// +// Reiterate per navbar.less and the modified component alignment there. + +@media (min-width: $grid-float-breakpoint) { + .navbar-right { + .dropdown-menu { + right: 0; left: auto; + } + // Necessary for overrides of the default right aligned menu. + // Will remove come v4 in all likelihood. + .dropdown-menu-left { + left: 0; right: auto; + } + } +} diff --git a/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_forms.scss b/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_forms.scss new file mode 100644 index 000000000..cd5e5f1bf --- /dev/null +++ b/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_forms.scss @@ -0,0 +1,541 @@ +// +// Forms +// -------------------------------------------------- + + +// Normalize non-controls +// +// Restyle and baseline non-control form elements. + +fieldset { + padding: 0; + margin: 0; + border: 0; + // Chrome and Firefox set a min-width: min-content; on fieldsets, + // so we reset that to ensure it behaves more like a standard block element. + // See https://github.com/twbs/bootstrap/issues/12359. + min-width: 0; +} + +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: $line-height-computed; + font-size: ($font-size-base * 1.5); + line-height: inherit; + color: $legend-color; + border: 0; + border-bottom: 1px solid $legend-border-color; +} + +label { + display: inline-block; + max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141) + margin-bottom: 5px; + font-weight: normal; +} + + +// Normalize form controls +// +// While most of our form styles require extra classes, some basic normalization +// is required to ensure optimum display with or without those classes to better +// address browser inconsistencies. + +// Override content-box in Normalize (isnt specific enough) +input[type="search"] { + @include box-sizing(border-box); +} + +// Position radios and checkboxes better +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; // IE8-9 + line-height: normal; +} + +// Set the height of file controls to match text inputs +input[type="file"] { + display: block; +} + +// Make range inputs behave like textual form controls +input[type="range"] { + display: block; + width: 100%; +} + +// Make multiple select elements height not fixed +select[multiple], +select[size] { + height: auto; +} + +// Focus for file, radio, and checkbox +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + @include tab-focus(); +} + +// Adjust output element +output { + display: block; + padding-top: ($padding-base-vertical + 1); + font-size: $font-size-base; + line-height: $line-height-base; + color: $input-color; +} + + +// Common form controls +// +// Shared size and type resets for form controls. Apply `.form-control` to any +// of the following form controls: +// +select, +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"] +/* .form-control */ +{ + display: block; + width: 100%; + height: $input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border) + padding: $padding-base-vertical $padding-base-horizontal; + font-size: $font-size-base; + line-height: $line-height-base; + color: $input-color; + background-color: $input-bg; + background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214 + border: 1px solid $input-border; + border-radius: $input-border-radius; + text-overflow: ellipsis; + max-width:450px; + transition: none; + //@include box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); + @include transition(border-color ease-in-out .1s, box-shadow ease-in-out .1s); + + // Customize the `:focus` state to imitate native WebKit styles. + @include form-control-focus(); + + // Placeholder + @include placeholder(); + + // Disabled and read-only inputs + // + // HTML5 says that controls under a fieldset > legend:first-child wont be + // disabled if the fieldset is disabled. Due to implementation difficulty, we + // dont honor that edge case; we style them as disabled anyway. + &[disabled], + &[readonly], + fieldset[disabled] & { + cursor: not-allowed; + background-color: $input-bg-disabled; + opacity: 1; // iOS fix for unreadable disabled content + } + + // [converter] extracted textarea& to textarea.form-control +} + +// Reset height for `textarea`s +textarea{ + height: auto; +} + + +// Search inputs in iOS +// +// This overrides the extra rounded corners on search inputs in iOS so that our +// `.form-control` class can properly style them. Note that this cannot simply +// be added to `.form-control` as its not specific enough. For details, see +// https://github.com/twbs/bootstrap/issues/11586. + +input[type="search"] { + -webkit-appearance: none; +} + + +// Special styles for iOS temporal inputs +// +// In Mobile Safari, setting `display: block` on temporal inputs causes the +// text within the input to become vertically misaligned. +// As a workaround, we set a pixel line-height that matches the +// given height of the input. Since this fucks up everything else, we have to +// appropriately reset it for Internet Explorer and the size variations. + +input[type="date"], +input[type="time"], +input[type="datetime-local"], +input[type="month"] { + line-height: $input-height-base; + // IE8+ misaligns the text within date inputs, so we reset + line-height: $line-height-base #{\0}; + + &.input-sm { + line-height: $input-height-small; + } + &.input-lg { + line-height: $input-height-large; + } +} + + +// Form groups +// +// Designed to help with the organization and spacing of vertical forms. For +// horizontal forms, use the predefined grid classes. + +.form-group { + margin-bottom: 15px; +} + + +// Checkboxes and radios +// +// Indent the labels to position radios/checkboxes as hanging controls. + +.radio, +.checkbox { + position: relative; + display: block; + min-height: $line-height-computed; // clear the floating input if there is no label text + margin-top: 10px; + margin-bottom: 10px; + + label { + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; + } +} +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + position: absolute; + margin-left: -20px; + margin-top: 4px \9; +} + +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing +} + +// Radios and checkboxes on same line +.radio-inline, +.checkbox-inline { + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + vertical-align: middle; + font-weight: normal; + cursor: pointer; +} +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; // space out consecutive inline controls +} + +// Apply same disabled cursor tweak as for inputs +// Some special care is needed because