├── .gitignore ├── default.doctype.xml ├── default.jpg ├── favicon.png ├── images ├── logo.png ├── logo-1000.png ├── landingpage │ ├── logo.png │ └── logo.svg └── logo.svg ├── landingpage.jpg ├── InvisibleContainer.zip ├── thumbnail_default.jpg ├── thumbnail_landingpage.jpg ├── nav ├── main │ ├── menudef.xml │ └── template.cshtml ├── sub │ ├── menudef.xml │ └── template.cshtml ├── blank │ ├── menudef.xml │ └── template.cshtml ├── main-mobile │ ├── menudef.xml │ └── template.cshtml └── nav-main-submenu │ ├── menudef.xml │ └── template.cshtml ├── src ├── scss │ ├── components │ │ ├── _print.scss │ │ ├── _fancybox.scss │ │ ├── _base-layout.scss │ │ ├── _typography.scss │ │ ├── _footer.scss │ │ ├── _nav-mobile-to-top.scss │ │ ├── _dnn-overrides.scss │ │ ├── _header.scss │ │ ├── _nav-desktop-main.scss │ │ ├── _nav-desktop-sub.scss │ │ ├── optional │ │ │ └── _form-dnncentric.scss │ │ └── _nav-mobile.scss │ ├── layout-variations │ │ ├── _layout-variation-default.scss │ │ ├── _layout-header-variations.scss │ │ ├── _layout-variation-full.scss │ │ ├── _layout-variation-box.scss │ │ ├── _layout-variation-wide.scss │ │ └── _layout-variation-landingpage.scss │ ├── readme.md │ ├── theme.scss │ └── _variables.scss └── ts │ └── theme.ts ├── tsconfig.json ├── koi.json ├── .vscode └── tasks.json ├── controls ├── optimize-page-title.ascx ├── 2sxc-quickedit.ascx ├── LanguageNavigation.ascx └── body-css-classes.ascx ├── package.json ├── LICENSE ├── CHANGELOG-bs3-bs4.md ├── webpack.config.js ├── readme.md ├── dist ├── theme.min.js └── theme.min.js.map ├── App_LocalResources ├── default.ascx.resx ├── landingpage.ascx.resx ├── default.ascx.de-DE.resx └── landingpage.ascx.de-DE.resx ├── landingpage.ascx ├── default.ascx ├── dnn-theme-bootstrap4-instant.dnn └── 2sic_dnn-theme-bootstrap4-instant.dnn /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /default.doctype.xml: -------------------------------------------------------------------------------- 1 | ]]> -------------------------------------------------------------------------------- /default.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2sic/dnn-theme-bootstrap4-instant/HEAD/default.jpg -------------------------------------------------------------------------------- /favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2sic/dnn-theme-bootstrap4-instant/HEAD/favicon.png -------------------------------------------------------------------------------- /images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2sic/dnn-theme-bootstrap4-instant/HEAD/images/logo.png -------------------------------------------------------------------------------- /landingpage.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2sic/dnn-theme-bootstrap4-instant/HEAD/landingpage.jpg -------------------------------------------------------------------------------- /InvisibleContainer.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2sic/dnn-theme-bootstrap4-instant/HEAD/InvisibleContainer.zip -------------------------------------------------------------------------------- /images/logo-1000.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2sic/dnn-theme-bootstrap4-instant/HEAD/images/logo-1000.png -------------------------------------------------------------------------------- /thumbnail_default.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2sic/dnn-theme-bootstrap4-instant/HEAD/thumbnail_default.jpg -------------------------------------------------------------------------------- /images/landingpage/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2sic/dnn-theme-bootstrap4-instant/HEAD/images/landingpage/logo.png -------------------------------------------------------------------------------- /thumbnail_landingpage.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2sic/dnn-theme-bootstrap4-instant/HEAD/thumbnail_landingpage.jpg -------------------------------------------------------------------------------- /nav/main/menudef.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /nav/sub/menudef.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /nav/blank/menudef.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /nav/main-mobile/menudef.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /nav/nav-main-submenu/menudef.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /src/scss/components/_print.scss: -------------------------------------------------------------------------------- 1 | @media print { 2 | a[href]:after { 3 | content: "" !important; 4 | } 5 | 6 | .ly-nav-mobile-trigger { 7 | display: block; 8 | } 9 | } -------------------------------------------------------------------------------- /src/scss/components/_fancybox.scss: -------------------------------------------------------------------------------- 1 | @media all { 2 | /* 2sic Fancybox overrides */ 3 | .fancybox-skin.fancybox-skin { 4 | -webkit-border-radius: 0; 5 | -moz-border-radius: 0; 6 | border-radius: 0; 7 | } 8 | } -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "sourceMap": true, 4 | "noImplicitAny": true, 5 | "module": "commonjs", 6 | "lib": ["es6", "dom"], 7 | "target": "es3", 8 | "allowJs": true 9 | } 10 | } -------------------------------------------------------------------------------- /koi.json: -------------------------------------------------------------------------------- 1 | { 2 | "instructions": { 3 | "purpose": "This file is placed in the folder of DNN skins/themes. It tells the Koi system, what the primary CSS framework is for the themes in this folder.", 4 | "discoverMore": "https://github.com/DNN-Connect/connect.koi" 5 | }, 6 | "default": { 7 | "cssFramework": "bs4" 8 | } 9 | } -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | // See https://go.microsoft.com/fwlink/?LinkId=733558 3 | // for the documentation about the tasks.json format 4 | "version": "2.0.0", 5 | "tasks": [ 6 | { 7 | "type": "npm", 8 | "script": "build-prod", 9 | "group": "build", 10 | "problemMatcher": [] 11 | } 12 | ] 13 | } -------------------------------------------------------------------------------- /src/scss/layout-variations/_layout-variation-default.scss: -------------------------------------------------------------------------------- 1 | @media all { 2 | body.va-layout-default { 3 | .container-fluid { 4 | @include media-breakpoint-up(xl) { 5 | max-width: 1400px; 6 | } 7 | } 8 | .ly-header-pane { 9 | @include media-breakpoint-up(xl) { 10 | margin-top: $grid-gutter-width*2; 11 | } 12 | } 13 | .ly-header-pane-empty { 14 | background: transparent; 15 | height: 1px; 16 | } 17 | .ly-fullwrapper .ly-push { 18 | display: none; 19 | } 20 | footer { 21 | @include media-breakpoint-up(lg) { 22 | margin-bottom: $grid-gutter-width; 23 | } 24 | 25 | } 26 | } 27 | } -------------------------------------------------------------------------------- /src/scss/readme.md: -------------------------------------------------------------------------------- 1 | # SCSS Variables 2 | 3 | ## How it works 4 | 5 | 1. The `theme.scss` file is the entry point. Webpack takes this and generates the `dist/theme.min.css` 6 | 1. The `_variables.scss` is the file that prepares all the variables. This is where you will usually make adjustments or override Bootstrap variables 7 | 8 | ## How to use 9 | 10 | 1. First make sure you can build. That means make sure you already did `npm install` 11 | 1. To compile the CSS, use `npm run develop` or `npm run build`. Build will also minify the files. 12 | 13 | Then make changes to the `_variables.scss` as you need. In case you need more bootstrap parts like _jumbotron_ just activate them in the `theme.scss`. -------------------------------------------------------------------------------- /src/scss/layout-variations/_layout-header-variations.scss: -------------------------------------------------------------------------------- 1 | @media all { 2 | /* Logo left */ /* Logo right */ 3 | body.va-mainnav-left { 4 | .container-fluid { 5 | @include media-breakpoint-up(lg) { 6 | flex-direction: row-reverse; 7 | } 8 | } 9 | } 10 | /* header centered */ 11 | body.va-mainnav-center { 12 | header { 13 | .container-fluid { 14 | @include media-breakpoint-up(lg) { 15 | flex-direction: column !important; 16 | justify-content: center !important; 17 | padding-bottom: 0px; 18 | } 19 | 20 | .ly-logo { 21 | @include media-breakpoint-up(lg) { 22 | margin-bottom: 10px; 23 | } 24 | } 25 | } 26 | } 27 | .co-navigation { 28 | text-align: center; 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/scss/layout-variations/_layout-variation-full.scss: -------------------------------------------------------------------------------- 1 | @media all { 2 | /*layout full*/ 3 | body.va-layout-full { 4 | header { 5 | box-shadow: 0 0 20px; 6 | } 7 | .ly-header-pane { 8 | background: transparent; 9 | &.container-fluid { 10 | max-width: 100%; 11 | } 12 | } 13 | 14 | .container-fluid { 15 | &.ly-content { 16 | background: transparent; 17 | position: relative; 18 | } 19 | } 20 | footer { 21 | height: 60px; 22 | background: $primary; 23 | } 24 | .ly-fullwrapper { 25 | min-height: 100%; 26 | margin: 0 auto -60px; 27 | } 28 | #Form { 29 | height: 100vh; 30 | } 31 | .ly-fullwrapper .ly-push { 32 | height: 60px; 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /controls/optimize-page-title.ascx: -------------------------------------------------------------------------------- 1 | <%@ Control language="C#" Inherits="System.Web.UI.UserControl" %> 2 | 3 | 23 | -------------------------------------------------------------------------------- /src/scss/layout-variations/_layout-variation-box.scss: -------------------------------------------------------------------------------- 1 | @media all { 2 | /*layout box*/ 3 | body.va-layout-box { 4 | header { 5 | background: transparent; 6 | .container-fluid { 7 | background: $tosic-header-background; 8 | } 9 | &.fixed-header { 10 | box-shadow: none; 11 | .container-fluid { 12 | box-shadow: 0px 15px 20px -15px rgba(0, 0, 0, 0.3); 13 | } 14 | } 15 | } 16 | .container-fluid { 17 | max-width: 1400px; 18 | @include media-breakpoint-up(md) { 19 | padding-left: $grid-gutter-width * 3; 20 | padding-right: $grid-gutter-width * 3; 21 | } 22 | } 23 | .ly-header-pane { 24 | margin-top: 0; 25 | background: #fff; 26 | } 27 | .ly-header-pane-empty { 28 | min-height:5px; 29 | background: $primary; 30 | } 31 | .ly-fullwrapper .ly-push { 32 | display: none; 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/scss/components/_base-layout.scss: -------------------------------------------------------------------------------- 1 | @media all { 2 | html { 3 | height: 100vh; 4 | body { 5 | overflow-y: scroll; 6 | min-height: 100vh; 7 | height: auto; 8 | padding: 0; 9 | .container-fluid { 10 | max-width: 1200px; 11 | padding-left: $grid-gutter-width/2; 12 | padding-right: $grid-gutter-width/2; 13 | @include media-breakpoint-up(md) { 14 | padding-left: $grid-gutter-width * 1.5; 15 | padding-right: $grid-gutter-width * 1.5; 16 | } 17 | &.ly-content { 18 | min-height: 370px; 19 | padding-top: $grid-gutter-width; 20 | padding-bottom: $grid-gutter-width * 1.5; 21 | background: $white; 22 | @include media-breakpoint-up(md) { 23 | padding-top: $grid-gutter-width * 1.5; 24 | padding-bottom: $grid-gutter-width * 2; 25 | } 26 | } 27 | } 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/scss/components/_typography.scss: -------------------------------------------------------------------------------- 1 | // Import fonts from google 2 | // 2016-12-05 2rm changed include to default.ascx (caused issues with ClientDependency) 3 | // @import url(https://fonts.googleapis.com/css?family=Maven+Pro:400,500,700); 4 | 5 | @media all { 6 | h1, h2 ,h3, h4, h5, h6 { 7 | font-family:$font-family-base; 8 | } 9 | body, p, .Normal, li p { 10 | font-size: $font-size-base; 11 | line-height: 1.6em; 12 | } 13 | p { margin-bottom: $font-size-base * 0.6875; } 14 | 15 | ul, ol { 16 | padding-left:$grid-gutter-width; 17 | margin: 0; 18 | margin-bottom: $grid-gutter-width; 19 | line-height: 1.2; 20 | p { 21 | margin-bottom: 0; 22 | } 23 | li { 24 | margin-bottom: 5px; 25 | } 26 | ul, ol { 27 | margin: 0; 28 | padding-left:$grid-gutter-width; 29 | margin-bottom: 2px; 30 | } 31 | } 32 | a, a:visited { 33 | text-decoration: $tosic-link-decoration; color: $link-color; 34 | } 35 | a:hover, a:focus { color:$link-hover-color; text-decoration: $link-hover-decoration; } 36 | } -------------------------------------------------------------------------------- /src/scss/components/_footer.scss: -------------------------------------------------------------------------------- 1 | @media all { 2 | footer { 3 | &, 4 | p, 5 | .Normal, 6 | li p { 7 | font-size: 14px; 8 | color: $tosic-footer-color; 9 | line-height: 1.2em; 10 | } 11 | .container-fluid { 12 | background: $tosic-footer-background; 13 | position: relative; 14 | padding-top: $grid-gutter-width/2; 15 | padding-bottom: $grid-gutter-width/2; 16 | a { 17 | color: $tosic-footer-color; 18 | &:hover, 19 | &:focus { 20 | text-decoration: underline; 21 | } 22 | } 23 | .ly-footer-address { 24 | list-style-type: none; 25 | margin: 0; 26 | margin-bottom: 8px; 27 | padding: 0; 28 | @include media-breakpoint-up(md) { 29 | margin-bottom: 0; 30 | } 31 | li { 32 | @include media-breakpoint-up(xl) { 33 | display: inline-flex; 34 | margin-right: 6px; 35 | } 36 | } 37 | } 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /controls/2sxc-quickedit.ascx: -------------------------------------------------------------------------------- 1 | <%@ Control language="C#" Inherits="System.Web.UI.UserControl" %> 2 | <%-- 3 | This control automatically injects the 2sxc Quickedit control, if 2sxc is 4 | installed. If it's not installed, the control will not do anything. 5 | Read more about the quickedit functionality here:' 6 | https://github.com/2sic/2sxc/wiki/Concept-Quick-Edit 7 | --%> 8 | 9 | 10 | 27 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "2sic-standard-skin-template", 3 | "version": "04.10.00", 4 | "description": "The default skin template for 2sic websites", 5 | "main": "(none)", 6 | "scripts": { 7 | "build-prod": "webpack" 8 | }, 9 | "author": "2sic internet solutions", 10 | "license": "MIT", 11 | "repository": "https://github.com/2sic/dnn-theme-bootstrap4-instant", 12 | "devDependencies": { 13 | "autoprefixer": "^10.3.6", 14 | "css-loader": "^6.3.0", 15 | "file-loader": "^6.2.0", 16 | "friendly-errors-webpack-plugin": "^1.7.0", 17 | "mini-css-extract-plugin": "^2.3.0", 18 | "optimize-css-assets-webpack-plugin": "^6.0.1", 19 | "postcss-loader": "^6.1.1", 20 | "sass": "^1.42.1", 21 | "sass-loader": "^12.1.0", 22 | "terser-webpack-plugin": "^5.2.4", 23 | "ts-loader": "^9.2.6", 24 | "typescript": "^4.4.3", 25 | "webpack": "^5.55.1", 26 | "webpack-cli": "^4.8.0", 27 | "webpackbar": "^4.0.0" 28 | }, 29 | "dependencies": { 30 | "bootstrap": "^4.4.1", 31 | "slidetoggle": "^3.2.2" 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /nav/blank/template.cshtml: -------------------------------------------------------------------------------- 1 | @using DotNetNuke.Web.DDRMenu; 2 | @using System.Dynamic; 3 | @inherits DotNetNuke.Web.Razor.DotNetNukeWebPage 4 | @{ var root = Model.Source.root; } 5 | 6 | @helper RenderNodes(IList nodes) { 7 | if (nodes.Count > 0) { 8 |
    9 | @foreach (var node in nodes) { 10 | var cssClasses = new List(); 11 | cssClasses.Add("nav-" + node.TabId); 12 | if (node.First) { cssClasses.Add("first"); } 13 | if (node.Last) { cssClasses.Add("last"); } 14 | if (node.HasChildren()) { cssClasses.Add("has-child"); } 15 | if (node.Breadcrumb) { cssClasses.Add("active"); } else { cssClasses.Add("inactive"); } 16 | var classString = new HtmlString((cssClasses.Count == 0) ? "" : (" class=\"" + String.Join(" ", cssClasses.ToArray()) + "\"")); 17 |
  • 18 | @if (node.Enabled) { 19 | @node.Text 20 | } else { 21 | @node.Text 22 | } 23 | @RenderNodes(node.Children) 24 |
  • 25 | } 26 |
27 | } 28 | } 29 | @RenderNodes(root.Children) -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 2sic Internet Solutions GmbH 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /nav/main/template.cshtml: -------------------------------------------------------------------------------- 1 | @using DotNetNuke.Web.DDRMenu; 2 | @using System.Dynamic; 3 | @inherits DotNetNuke.Web.Razor.DotNetNukeWebPage 4 | @{ var root = Model.Source.root; } 5 | 6 | @helper RenderNodes(IList nodes) { 7 | if (nodes.Count > 0) { 8 |
    9 | @foreach (var node in nodes) { 10 | var cssClasses = new List(); 11 | cssClasses.Add("nav-item"); 12 | cssClasses.Add("nav-" + node.TabId); 13 | if (node.First) { cssClasses.Add("first"); } 14 | if (node.Last) { cssClasses.Add("last"); } 15 | if (node.HasChildren()) { cssClasses.Add("has-child"); } 16 | if (node.Breadcrumb) { cssClasses.Add("active"); } else { cssClasses.Add("inactive"); } 17 | var classString = new HtmlString((cssClasses.Count == 0) ? "" : (" class=\"" + String.Join(" ", cssClasses.ToArray()) + "\"")); 18 |
  • 19 | @if (node.Enabled) { 20 | @node.Text 21 | } else { 22 | @node.Text 23 | } 24 | @RenderNodes(node.Children) 25 |
  • 26 | } 27 |
28 | } 29 | } 30 | @RenderNodes(root.Children) -------------------------------------------------------------------------------- /src/scss/components/_nav-mobile-to-top.scss: -------------------------------------------------------------------------------- 1 | @media all { 2 | a.ly-top { 3 | position: fixed; 4 | bottom: 20px; 5 | right: 25px; 6 | background-color: theme-color("primary"); 7 | color: #ffffff; 8 | overflow: hidden; 9 | width: 40px; 10 | height: 40px; 11 | line-height: 40px; 12 | padding: 0; 13 | border-radius: 50%; 14 | -webkit-transition: .3s; 15 | cursor: pointer; 16 | vertical-align: middle; 17 | -webkit-box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -2px rgba(0, 0, 0, 0.2); 18 | box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -2px rgba(0, 0, 0, 0.2); 19 | font-size: 35px; 20 | opacity: 0; 21 | z-index: 100; 22 | text-align: center; 23 | transition: opacity 0.5s; 24 | pointer-events: none; 25 | 26 | i { 27 | border: solid #ffffff; 28 | border-width: 0 2px 2px 0; 29 | display: inline-block; 30 | padding: 5px; 31 | transform: rotate(-135deg); 32 | -webkit-transform: rotate(-135deg); 33 | vertical-align: middle; 34 | margin-left: -1px; 35 | } 36 | 37 | @include media-breakpoint-up(md) { 38 | display: none !important; 39 | } 40 | } 41 | 42 | .ly-top.ly-top-visible { 43 | opacity: 1; 44 | pointer-events: auto; 45 | } 46 | } -------------------------------------------------------------------------------- /src/scss/components/_dnn-overrides.scss: -------------------------------------------------------------------------------- 1 | @media all { 2 | /*DNN Overrides and default styles (do not change) */ 3 | /* box-sizing Fixes for DNN components, 3dr party plugins, modules */ 4 | #ControlBar_ControlPanel * { box-sizing:content-box; } 5 | #ControlBar_ControlPanel .mark { background-color: transparent; padding: 0; } 6 | #ControlNav > li > a { text-decoration: none; } 7 | .actionMenu * { box-sizing:content-box; } 8 | .dnnCheckbox .mark { padding:0; background:none; } 9 | .ui-dialog { color:black; font-family:Arial, sans-serif;} 10 | 11 | ul, ol { 12 | margin: 0; 13 | } 14 | ul { 15 | list-style-type: disc; 16 | ul { 17 | list-style-type: circle; 18 | } 19 | } 20 | 21 | a.ly-login, a.ly-login:link, a.ly-login:visited { 22 | color:$tosic-footer-background; 23 | font-size:10px; 24 | } 25 | a.ly-login:hover { 26 | color:$tosic-footer-color; 27 | } 28 | #ControlBar_ControlPanel #ServiceImg { 29 | display:none; 30 | } 31 | 32 | // ---------------------------------------------------------------------------------------------------- 33 | // 9. Final adjustments / tweaking / DNN workarounds 34 | 35 | // 9.1 Fix links which look like buttons so the text doesn't get underlined 36 | a.btn-primary.btn-primary { 37 | &:link, &:visited, &:hover { 38 | color: #fff; 39 | } 40 | } 41 | a.btn.btn { 42 | &:link, &:visited, &:hover { 43 | text-decoration: none; 44 | } 45 | } 46 | 47 | // 9.2 Override width of DNNEmptyPane for 2sxc Quick-Edit control (DNN9) 48 | body:not(.dnnEditState) .DNNEmptyPane { 49 | width: 100%; 50 | } 51 | 52 | 53 | } -------------------------------------------------------------------------------- /nav/sub/template.cshtml: -------------------------------------------------------------------------------- 1 | @using DotNetNuke.Web.DDRMenu; 2 | @using System.Dynamic; 3 | @inherits DotNetNuke.Web.Razor.DotNetNukeWebPage 4 | @{ var root = Model.Source.root; } 5 | 6 | @helper RenderNodes(IList nodes) { 7 | if (nodes.Count > 0) { 8 |
    9 | @foreach (var node in nodes) { 10 | var cssClasses = new List(); 11 | cssClasses.Add("nav-" + node.TabId); 12 | if (node.First) { cssClasses.Add("first"); } 13 | if (node.Last) { cssClasses.Add("last"); } 14 | if (node.HasChildren()) { cssClasses.Add("has-child"); } 15 | if (node.Breadcrumb) { cssClasses.Add("active"); cssClasses.Add("ly-active"); } else { cssClasses.Add("inactive"); } 16 | var classString = new HtmlString((cssClasses.Count == 0) ? "" : (" class=\"" + String.Join(" ", cssClasses.ToArray()) + "\"")); 17 |
  • 18 | @if (node.Enabled) { 19 | 28 | } else { 29 | @node.Text 30 | } 31 | @RenderNodes(node.Children) 32 |
  • 33 | } 34 |
35 | } 36 | } 37 | @RenderNodes(root.Children) -------------------------------------------------------------------------------- /nav/main-mobile/template.cshtml: -------------------------------------------------------------------------------- 1 | @using DotNetNuke.Web.DDRMenu; 2 | @using System.Dynamic; 3 | @inherits DotNetNuke.Web.Razor.DotNetNukeWebPage 4 | @{ var root = Model.Source.root; } 5 | 6 | @helper RenderNodes(IList nodes) { 7 | if (nodes.Count > 0) { 8 |
    9 | @foreach (var node in nodes) { 10 | var cssClasses = new List(); 11 | cssClasses.Add("nav-" + node.TabId); 12 | if (node.First) { cssClasses.Add("first"); } 13 | if (node.Last) { cssClasses.Add("last"); } 14 | if (node.HasChildren()) { cssClasses.Add("has-child"); } 15 | if (node.Breadcrumb) { cssClasses.Add("active"); cssClasses.Add("ly-active"); } else { cssClasses.Add("inactive"); } 16 | var classString = new HtmlString((cssClasses.Count == 0) ? "" : (" class=\"" + String.Join(" ", cssClasses.ToArray()) + "\"")); 17 |
  • 18 | @if (node.Enabled) { 19 | 28 | } else { 29 | @node.Text 30 | } 31 | @RenderNodes(node.Children) 32 |
  • 33 | } 34 |
35 | } 36 | } 37 | @RenderNodes(root.Children) -------------------------------------------------------------------------------- /CHANGELOG-bs3-bs4.md: -------------------------------------------------------------------------------- 1 | # Changes from dnn-theme-boostrap3-instant to dnn-theme-bootstrap4-instant 2 | 3 | * removed bower (deprecated), uses npm now 4 | * Dependencies moved from *bower.json* to *package.json* 5 | * Files are now located in *node_modules* instead of *bower_components* 6 | * Versions are locked with *package.lock* 7 | * Renamed classes which were changed by bootstrap, including 8 | * `pull-left` > `float-left` 9 | * `hidden-*` > `d-none`, `d-lg-block` 10 | * Breakpoint shift: Moved all classes 11 | * Breakpoint shift: Moved media queries 12 | * Bootstrap 4 added a new breakpoint for 576px+ 13 | * Bootstrap 4 breakpoint sizes have shifted (sm is now md, md is now lg, lg is now xl) 14 | * Media queries with @include 15 | * before: `@media (min-width: $screen-sm-min)` 16 | * after: `@include media-breakpoint-up(md)` 17 | * Fixed issue in *package.json* (comments are not allowed) 18 | * Removed separate *typography.css* from dist because we don't need this anymore 19 | * Main (desktop) menu: added classes `nav-link` (li>a) and `nav-item` (li) 20 | * Nav-sub: removed bootstrap class because it had no effect 21 | * Variables: Bootstrap 4 has renamed and changed variables - took new variables file and moved existing variables (if existed) to new version 22 | * For variables that did not exist: defined variable in variables_2sic 23 | * Changed `$brand-primary` to `theme-color("primary")` globally 24 | * `$gray` is now $`gray-100`, there are more grayscales in bs4 25 | * Removed Glyphicons and switched to FontAwesome 26 | * renamed all icon classes from `glyphicons-*` to `fa-*` 27 | * Removed old shim files for IE9- 28 | -------------------------------------------------------------------------------- /src/scss/components/_header.scss: -------------------------------------------------------------------------------- 1 | @media all { 2 | header { 3 | background: $tosic-header-background; 4 | position: relative; 5 | z-index: 800; 6 | .ly-logo { 7 | display: block; 8 | width: 150px; 9 | max-width: 80%; 10 | height: auto; 11 | transition: width 0.4s ease-in-out; 12 | @include media-breakpoint-up(md) { 13 | width: 200px; 14 | } 15 | svg { 16 | //If you use an SVG as Logo, you will have to give it a fixed height 17 | //in this selector, orelse you may experience issues in IE */ 18 | height: 37px; 19 | @include media-breakpoint-up(md) { 20 | height: 53px; 21 | } 22 | } 23 | } 24 | .container-fluid { 25 | justify-content: space-between; 26 | align-items: center; 27 | padding-top: $grid-gutter-width/2; 28 | padding-bottom: $grid-gutter-width/2; 29 | @include media-breakpoint-up(md) { 30 | padding-top: $grid-gutter-width/1.5; 31 | padding-bottom: $grid-gutter-width/1.5; 32 | } 33 | } 34 | &.fixed-header { 35 | box-shadow: 0px 2px 16px 0px rgba(0, 0, 0, 0.3); 36 | position: fixed; 37 | top: -150px; 38 | left:0; 39 | transition: top 0.4s ease-in-out; 40 | &.fixed-top { 41 | top: 0; 42 | } 43 | .container-fluid { 44 | padding-top: $grid-gutter-width/2; 45 | padding-bottom: $grid-gutter-width/2; 46 | } 47 | .ly-logo { 48 | width: 150px; 49 | svg { 50 | //If you use an SVG as Logo, you will have to give it a fixed height 51 | //in this selector, orelse you may experience issues in IE */ 52 | height: 37px; 53 | } 54 | } 55 | } 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /controls/LanguageNavigation.ascx: -------------------------------------------------------------------------------- 1 | <%@ Control Language="C#" AutoEventWireup="true" %> 2 | 3 | 33 | 34 |
    35 | <% foreach (var language in LanguagesArray) { %> 36 | <% var lang = language.Split(':'); %> 37 | <% if (ShowLanguageSwitchForLanguage(lang[0])) 38 | { %> 39 |
  • <%= lang[0].ToLower() == CultureInfo.CurrentCulture.ToString().ToLower() ? " active" : "" %>"> 40 | <%= lang[1] %> 41 |
  • 42 | <% } %> 43 | <% } %> 44 |
-------------------------------------------------------------------------------- /src/scss/layout-variations/_layout-variation-wide.scss: -------------------------------------------------------------------------------- 1 | @media all { 2 | /*layout wide*/ 3 | body.va-layout-wide { 4 | background-color: #eceff1; 5 | .ly-fullwrapper { 6 | max-width: 1600px; 7 | margin: 0 auto; 8 | overflow: hidden; 9 | } 10 | .ly-header-pane { 11 | margin-top: 0; 12 | @include media-breakpoint-up(xl) { 13 | margin-bottom: -300px; 14 | } 15 | .ly-container-inner { 16 | position: relative; 17 | @include media-breakpoint-up(xl) { 18 | margin-left: -200px; 19 | margin-right: -200px; 20 | } 21 | &:before { 22 | content:""; 23 | display:none; 24 | @include media-breakpoint-up(xl) { 25 | display:block; 26 | position: absolute; 27 | z-index:1; 28 | left:0; 29 | width:100%; 30 | bottom:0; 31 | height:200px; 32 | background: linear-gradient(0deg, rgba($body-bg,1) 0%, rgba($body-bg,0) 100%); 33 | } 34 | 35 | } 36 | } 37 | /* only one module in headerpane -> bugs in dnn-sortable (moving modules in panes with drag and drop) */ 38 | &:not(.ly-header-pane-empty) .dnnSortable { 39 | min-height: 0 !important; 40 | height: 0; 41 | } 42 | } 43 | 44 | &.tab-is-home { 45 | .ly-header-pane { 46 | @include media-breakpoint-up(xl) { 47 | margin-bottom: -200px; 48 | } 49 | } 50 | } 51 | 52 | .ly-header-pane-empty { 53 | .ly-container-inner { 54 | background: $primary; 55 | background: linear-gradient(to bottom, rgba($primary, 1) 0%, rgba(255, 255, 255, 0) 100%); 56 | @include media-breakpoint-up(xl) { 57 | margin-bottom: -300px; 58 | min-height: 485px + $grid-gutter-width; 59 | } 60 | } 61 | } 62 | 63 | .container-fluid.ly-content { 64 | position: relative; 65 | z-index: 11; 66 | } 67 | 68 | .ly-fullwrapper .ly-push { 69 | display: none; 70 | } 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /src/scss/layout-variations/_layout-variation-landingpage.scss: -------------------------------------------------------------------------------- 1 | @media all { 2 | /*layout full*/ 3 | body.va-layout-landingpage { 4 | background:$white; 5 | header { 6 | background: linear-gradient(to bottom, rgba(0,0,0,0.7) 0%, rgba(255,255,255,0) 100%); 7 | position: fixed; 8 | top:0; 9 | left:0; 10 | width:100%; 11 | .container-fluid { 12 | padding-top: $grid-gutter-width/2; 13 | padding-bottom: $grid-gutter-width/2; 14 | @include media-breakpoint-up(md) { 15 | padding-top: $grid-gutter-width/1.5; 16 | padding-bottom: $grid-gutter-width; 17 | } 18 | } 19 | &.fixed-header { 20 | box-shadow: 0px 2px 16px 0px rgba(0, 0, 0, 0.3); 21 | position: fixed; 22 | top: 0px; 23 | left:0; 24 | transition: background 0.4s ease-in-out; 25 | &.fixed-top { 26 | top: 0; 27 | background: $dark; 28 | } 29 | .container-fluid { 30 | padding-top: $grid-gutter-width/2; 31 | padding-bottom: $grid-gutter-width/2; 32 | } 33 | .ly-logo { 34 | width: 120px; 35 | svg { 36 | //If you use an SVG as Logo, you will have to give it a fixed height 37 | //in this selector, orelse you may experience issues in IE */ 38 | height: 37px; 39 | } 40 | } 41 | } 42 | } 43 | 44 | .container-fluid { 45 | &.ly-content { 46 | background: transparent; 47 | position: relative; 48 | width:100%; 49 | max-width:100%; 50 | padding:0; 51 | } 52 | } 53 | footer { 54 | height: 60px; 55 | background: $primary; 56 | } 57 | .ly-fullwrapper { 58 | min-height: 100%; 59 | margin: 0 auto -60px; 60 | } 61 | #Form { 62 | height: 100vh; 63 | } 64 | .ly-fullwrapper .ly-push { 65 | height: 60px; 66 | } 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /src/scss/components/_nav-desktop-main.scss: -------------------------------------------------------------------------------- 1 | @media all { 2 | #nav-desktop { 3 | margin: 0; 4 | padding: 0; 5 | transition: margin .4s; 6 | } 7 | /* Reset for all Navigations */ 8 | .ly-nav { 9 | &, ul, li { 10 | margin: 0; 11 | padding: 0; 12 | } 13 | } 14 | .navbar { 15 | .ly-nav-main { 16 | li { 17 | a { 18 | color: $body-color; 19 | padding: 10px 0; 20 | margin-left: 20px; 21 | border: 0px solid transparent; 22 | transition: color .5s; 23 | position: relative; 24 | &:hover, 25 | &:focus { 26 | background-color: transparent; 27 | color: $primary; 28 | &:after { 29 | width:100%; 30 | } 31 | } 32 | &:after { 33 | content: " "; 34 | height: 1px; 35 | width: 0; 36 | background: $primary; 37 | position: absolute; 38 | left: 0; 39 | bottom: 0; 40 | transition: width .4s; 41 | } 42 | } 43 | &.active>a { 44 | background-color: transparent; 45 | color: $primary; 46 | &:hover, 47 | &:focus { 48 | background-color: transparent; 49 | color: $primary; 50 | } 51 | &:after { 52 | width: 100%; 53 | } 54 | } 55 | } 56 | } 57 | 58 | /* Language Selection Styling */ 59 | .ly-language { 60 | display: flex; 61 | justify-content: flex-end; 62 | list-style: none; 63 | font-size: 12px; 64 | margin-top: 0; 65 | margin-right: 0; 66 | padding-right: 0; 67 | 68 | >li { 69 | display: inline-block; 70 | padding-right: 5px; 71 | 72 | &:last-child { 73 | padding-right: 0; 74 | } 75 | 76 | a { 77 | color: $secondary; 78 | text-decoration: none; 79 | } 80 | } 81 | } 82 | } 83 | } -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const MiniCssExtractPlugin = require('mini-css-extract-plugin'); 3 | const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin'); 4 | const FriendlyErrorsWebpackPlugin = require('friendly-errors-webpack-plugin'); 5 | const TerserPlugin = require('terser-webpack-plugin'); 6 | const WebpackBar = require('webpackbar'); 7 | 8 | module.exports = { 9 | entry: ['./src/scss/theme.scss', './src/ts/theme.ts'], 10 | output: { 11 | path: path.resolve(__dirname, 'dist'), 12 | filename: 'theme.min.js', 13 | }, 14 | mode: 'production', 15 | devtool: 'source-map', 16 | watch: true, 17 | stats: { 18 | all: false, 19 | assets: true 20 | }, 21 | resolve: { 22 | extensions: ['.ts', '.tsx', '.js', '.scss'] 23 | }, 24 | optimization: { 25 | minimize: true, 26 | minimizer: [ 27 | new TerserPlugin({ 28 | terserOptions: { 29 | output: { 30 | comments: false, 31 | }, 32 | }, 33 | extractComments: false, 34 | }), 35 | new OptimizeCSSAssetsPlugin({ 36 | cssProcessorOptions: { 37 | map: { 38 | inline: false, 39 | annotation: true, 40 | } 41 | } 42 | }) 43 | ], 44 | }, 45 | plugins: [ 46 | new MiniCssExtractPlugin({ 47 | filename: 'theme.min.css', 48 | }), 49 | new WebpackBar(), 50 | new FriendlyErrorsWebpackPlugin(), 51 | ], 52 | module: { 53 | rules: [{ 54 | test: /\.scss$/, 55 | exclude: /node_modules/, 56 | use: [ 57 | MiniCssExtractPlugin.loader, 58 | { 59 | loader: 'css-loader', 60 | options: { 61 | sourceMap: true 62 | } 63 | }, { 64 | loader: 'postcss-loader', 65 | options: { 66 | sourceMap: true, 67 | postcssOptions: { 68 | plugins: [ 69 | require('autoprefixer') 70 | ] 71 | } 72 | } 73 | }, { 74 | loader: 'sass-loader', 75 | options: { 76 | sourceMap: true 77 | } 78 | } 79 | ], 80 | }, 81 | { 82 | test: /\.ts$/, 83 | exclude: /node_modules/, 84 | use: { 85 | loader: 'ts-loader' 86 | } 87 | }, 88 | { 89 | test: /\.(png|jpe?g|gif)$/, 90 | use: [{ 91 | loader: 'file-loader', 92 | options: { 93 | name: '[name].[ext]', 94 | outputPath: 'images/' 95 | } 96 | }] 97 | } 98 | ], 99 | }, 100 | }; -------------------------------------------------------------------------------- /nav/nav-main-submenu/template.cshtml: -------------------------------------------------------------------------------- 1 | @using DotNetNuke.Web.DDRMenu; 2 | @using System.Dynamic; 3 | @inherits DotNetNuke.Web.Razor.DotNetNukeWebPage 4 | 5 | @{ var root = Model.Source.root; } 6 | @helper RenderNodes(IList nodes) 7 | { 8 | if (nodes.Count > 0) 9 | { 10 | 25 | } 26 | } 27 | 28 | @helper RenderChildNodes(IList nodes) 29 | { 30 | if (nodes.Count > 0) 31 | { 32 | foreach (var node in nodes) 33 | { 34 | var classString = GetClasses(node); 35 | @RenderChildItem(node) 36 | } 37 | } 38 | } 39 | @helper RenderItem(MenuNode node) 40 | { 41 | if (node.Enabled) 42 | { 43 | if (node.Depth == 0) { 44 | if (node.HasChildren()) { 45 | } 46 | else { 47 | @node.Text} 48 | } 49 | else { 50 | @node.Text} 51 | } 52 | else 53 | { 54 | @node.Text 55 | } 56 | } 57 | 58 | @helper RenderChildItem(MenuNode node) 59 | { 60 | if (node.Enabled) 61 | { 62 | @node.Text 63 | } 64 | else 65 | { 66 | @node.Text 67 | } 68 | } 69 | @functions{ 70 | public HtmlString GetClasses(MenuNode node) 71 | { 72 | return GetClasses(node, String.Empty); 73 | } 74 | 75 | public HtmlString GetClasses(MenuNode node, string additionalClasses) 76 | { 77 | List cssClasses = GetClassList(node); 78 | if (String.IsNullOrEmpty(additionalClasses)){ 79 | return new HtmlString((cssClasses.Count == 0) ? 80 | String.Empty : 81 | ("class=\"" + 82 | (String.Join(" ", cssClasses.ToArray()) + 83 | additionalClasses + "\"").TrimStart())); 84 | } 85 | else { 86 | return new HtmlString("class=\"" + 87 | (String.Join(" ", cssClasses.ToArray()) + 88 | additionalClasses + "\"").TrimStart()); 89 | } 90 | } 91 | 92 | public List GetClassList(MenuNode node) 93 | { 94 | var classList = new List(); 95 | classList.Add("nav-item"); 96 | if (node.HasChildren() && node.Depth == 0) { classList.Add("dropdown"); } 97 | if (node.Selected) { classList.Add("active"); } 98 | return classList; 99 | } 100 | } 101 | @RenderNodes(root.Children) 102 | 103 | -------------------------------------------------------------------------------- /src/scss/components/_nav-desktop-sub.scss: -------------------------------------------------------------------------------- 1 | @media all { 2 | .ly-nav-sub { 3 | margin: ($grid-gutter-width / 2) 0; 4 | &,ul { 5 | margin-left: 0; 6 | padding: 0; 7 | list-style-type: none; 8 | } 9 | /* default styling for all li */ 10 | li { 11 | border-bottom: 1px solid $white; 12 | a { 13 | transition: color 0.4s; 14 | color: $body-color; 15 | display: block; 16 | padding: 10px 40px 10px 0; 17 | &:hover, 18 | &:focus { 19 | color: $primary; 20 | text-decoration: none; 21 | 22 | } 23 | } 24 | &.active >.ly-linkwrapper a { 25 | color: $primary; 26 | } 27 | .ly-linkwrapper { 28 | position: relative; 29 | .ly-navopener { 30 | display: flex; 31 | align-items: center; 32 | justify-content: center; 33 | background: rgba($primary, 0); 34 | position: absolute; 35 | right: 0; 36 | width: 40px; 37 | text-align: center; 38 | top: 0; 39 | bottom: 0; 40 | cursor: pointer; 41 | 42 | .ly-navopener-icon { 43 | font-size: 20px; 44 | font-family: sans-serif; 45 | 46 | &:before { 47 | content: "+"; 48 | } 49 | } 50 | } 51 | } 52 | &.ly-active >.ly-linkwrapper { 53 | .ly-navopener { 54 | .ly-navopener-icon { 55 | &:before { 56 | content: "–"; 57 | } 58 | } 59 | } 60 | } 61 | li { 62 | a { 63 | font-size: 0.85em; 64 | } 65 | &.active { 66 | .ly-nav-child { 67 | display: block; 68 | } 69 | } 70 | &.last { 71 | border-bottom: none; 72 | } 73 | } 74 | 75 | } 76 | /* level 1 */ 77 | >li { 78 | &.active { 79 | >a { 80 | color: $primary !important; 81 | } 82 | >.ly-nav-child { 83 | display: block; 84 | } 85 | } 86 | /* mobilenavigation level 2 */ 87 | >ul { 88 | background-color: rgba($primary, 0.1); 89 | display: none; 90 | >li { 91 | >.ly-linkwrapper >a { 92 | padding-left: 15px; 93 | } 94 | /* mobilenavigation level 3 */ 95 | >ul { 96 | display: none; 97 | background: rgba($primary, 0.1); 98 | >li { 99 | >.ly-linkwrapper >a { 100 | padding-left: 30px; 101 | } 102 | /* mobilenavigation level 4 */ 103 | >ul { 104 | display: none; 105 | background: rgba($primary, 0.1); 106 | 107 | >li { 108 | >.ly-linkwrapper >a { 109 | padding-left: 40px; 110 | } 111 | /* mobilenavigation level 5+ */ 112 | } 113 | } 114 | } 115 | } 116 | } 117 | } 118 | } 119 | } 120 | } 121 | -------------------------------------------------------------------------------- /src/ts/theme.ts: -------------------------------------------------------------------------------- 1 | import { hide, show, toggle } from 'slidetoggle'; 2 | 3 | /* Open all PDF links in a new window */ 4 | document.querySelectorAll('a').forEach((linkElem: Element, index) => { 5 | if(linkElem.hasAttribute('href') && linkElem.getAttribute('href').endsWith('.pdf')) { 6 | linkElem.setAttribute('target', '_blank'); 7 | } 8 | }); 9 | 10 | /* Mobile Navigation */ 11 | document.querySelector('.ly-hamburger').addEventListener('click', () => { 12 | document.querySelector('.ly-hamburger').classList.toggle('open'); 13 | document.querySelector('#nav-mobile').classList.toggle('open'); 14 | document.querySelector('body').classList.toggle('ly-disablescroll'); 15 | }); 16 | 17 | /* mailencrypting */ 18 | setTimeout(function () { 19 | let mailElement = document.querySelectorAll('[data-madr1]:not(.madr-done)'); 20 | 21 | mailElement.forEach((mail: HTMLElement, index) => { 22 | const maddr = mail.getAttribute('data-madr1') + '@' + mail.getAttribute('data-madr2') + '.' + mail.getAttribute('data-madr3'); 23 | const linktext = mail.getAttribute('data-linktext') ? mail.getAttribute('data-linktext') : maddr; 24 | 25 | const a = document.createElement('a') 26 | a.setAttribute('href', `mailto:${maddr}`) 27 | a.innerHTML = linktext; 28 | 29 | mail.parentElement.appendChild(a); 30 | mail.classList.add('madr-done'); 31 | mail.style.display = 'none'; 32 | }); 33 | }, 500); 34 | 35 | /* Go to top button */ 36 | document.querySelector('.ly-top').addEventListener('click', (e) => { 37 | e.preventDefault(); 38 | 39 | window.scrollTo({ 40 | top: 0, 41 | left: 0, 42 | behavior: 'smooth' 43 | }); 44 | }) 45 | 46 | /* Check if DNN < 9 */ 47 | if(document.getElementsByTagName('body.role-admin').length > 0 && document.getElementsByClassName('personalBarContainer').length > 0) { 48 | document.querySelector('header').style.marginTop = "0"; 49 | } 50 | 51 | const navheader = document.querySelector('header'); 52 | const navheight = navheader.offsetHeight; 53 | window.addEventListener('scroll', function (event) { 54 | /* show / hide scroll to top button */ 55 | if (window.scrollY > 200) { 56 | document.querySelector('.ly-top').classList.add('ly-top-visible'); 57 | } else { 58 | document.querySelector('.ly-top').classList.remove('ly-top-visible'); 59 | } 60 | 61 | /* sticky header */ 62 | if (window.scrollY >= navheight) { 63 | navheader.classList.add('fixed-header'); 64 | document.querySelector('body').style.paddingTop = `${navheight}px`; 65 | if(document.querySelector('body').classList.contains('va-layout-landingpage')) { 66 | (document.querySelector('body.va-layout-landingpage') as HTMLElement).style.paddingTop = `0px`; 67 | } 68 | 69 | if (window.scrollY >= navheight + 1) { 70 | navheader.classList.add('fixed-top'); 71 | } 72 | } else { 73 | navheader.classList.remove('fixed-header','fixed-top'); 74 | document.querySelector('body').style.paddingTop = `0px`; 75 | } 76 | }, false); 77 | 78 | /* opens sub navs and mobile navs */ 79 | document.querySelectorAll('.ly-navopener').forEach((openerElem: HTMLElement, index) => { 80 | openerElem.addEventListener('click', (e) => { 81 | const targetElem = e.currentTarget as HTMLElement; 82 | const targetParent = targetElem.parentElement.parentElement; 83 | 84 | if(!targetParent.classList.contains('ly-active')) { 85 | if(targetElem.closest('.has-child').classList.contains('ly-active')) { 86 | document.querySelector('.ly-active').classList.remove('ly-active') 87 | hide(document.querySelector('.ly-active ul') as HTMLElement, {}); 88 | } 89 | targetParent.classList.toggle('ly-active'); 90 | show(targetParent.querySelector('ul') as HTMLElement, {}); 91 | } else { 92 | targetParent.classList.toggle('ly-active'); 93 | hide(targetParent.querySelector('ul') as HTMLElement, {}); 94 | } 95 | }) 96 | }) -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # DNN Skin/Theme Bootstrap4 Instant! for DNN 7, 8, 9 4 | 5 | A clean, prepared bootstrap4 skin for DNN (DotNetNuke), ready to make awesomeness - ideally combined with bootstrap content-templates. 6 | 7 | 1. This theme needs the [Invisible Container](https://github.com/2sic/dnn-container-invisible) to work, but this gets installed automatically for you when you install the theme with the installer. 8 | 1. Check out other DNN Bootstrap Skins like: 9 | 1. [DNN Bootstrap3 Single Pager](https://github.com/2sic/dnn-theme-bootstrap3-single-pager) 10 | 1. [DNN Bootster Bootstrap 4](http://www.dnnbootster.com/) 11 | 1. [nvQuickTheme Bootstrap 4](http://www.nvquicktheme.com/) 12 | 1. And it's awesome together with professional content-templates like 13 | 1. [Standard Content Blocks/Templates](https://github.com/2sic/2sxc-content-app) 14 | 15 | # Important: Check out Newer Bootstrap5 Version 🚀 16 | 17 | This repo uses Bootstrap 4 and will not be maintained any more. 18 | We strongly suggest you check out the new 👉🏽 [2shine Bootstrap5](https://github.com/2sic/dnn-theme-2shine-bs5) 19 | 20 | 21 | # The Bootstrap4 Instant Theme for DNN 22 | 23 | This theme is a layout/skin for the CMS [DNN](https://github.com/dnnsoftware/Dnn.Platform) based on [Bootstrap4](http://getbootstrap.com/) and [SASS](http://sass-lang.com/). It allows you to create simple custom designs within minutes and complex designs within a few hours. This is why it's called *instant*. 24 | 25 | ## What's in the Package 26 | 27 | 1. A clean, best-practices, responsive Bootstrap 4 Skin / Theme 28 | 1. ...based on SASS, with a set of variables-files to customize layouts in minutes 29 | 1. An e-mail encryptor to encrypt mail addresses in the layout 30 | 1. A SEO-title optimizer 31 | 1. An automatic svg/png integration for responsive logos 32 | 1. Layout footer implementing SEO microformats 33 | 1. NPM for all dependencies 34 | 1. Webpack to process the sass/typescript into the resulting CSS/Javascript 35 | 36 | ## Theme Installation 37 | 38 | There are three ways to install the initial package 39 | 40 | 1. [By downloading the _package_ and installing it through the web UI of DNN](https://azing.org/dnn-community/r/jRA6BIxn) 41 | 2. [By using `git clone` to create a copy of this repository in your _Skins_ folder](https://azing.org/dnn-community/r/dV0_C3yY) 42 | 3. [By downloading the zip and manually copying it to the _Skins_ folder](https://azing.org/dnn-community/r/0DIROnG-) 43 | 44 | You can read more about this [here](https://azing.org/dnn-community/r/xmvM_gD7). 45 | 46 | ## Customize and Redesign everything within Minutes 47 | 48 | You can now quickly customize and redesign everything within minutes. Check out the instructions [here](https://azing.org/2sxc/r/TIvm7V0H). 49 | 50 | ## Creating Awesome Designed Content 51 | 52 | You now have created the layout within minutes or hours, but you're still missing the perfectly designed inner pieces, like tile-lists, content-accordeons, galleries, sliders, blogs and more. Fortunately these are both super-easy to add and use the same mechanisms for design. They can even re-use the variables of your skin, to automatically match look and feel :) 53 | 54 | To get the awesome designed content, install [2sxc](https://github.com/2sic/2sxc/releases) and the default bootstrap4 content-templates. You can then change the SCSS in the content-templates to also point to the `_variables.scss` of this skin, and re-generate all styles for an amazingly fast development workflow. 55 | 56 | ## History 57 | 58 | * v4.20.00 2021-11-05 59 | * removed jquery 60 | * added language switch 61 | * added optional dropdown menu to main menu 62 | * v4.11.00 2021-10-22 updates npm packages 63 | 64 | ## Love from Switzerland 65 | 66 | Daniel & Tom 67 | -------------------------------------------------------------------------------- /controls/body-css-classes.ascx: -------------------------------------------------------------------------------- 1 | <%@ Control language="C#" Inherits="System.Web.UI.UserControl" %> 2 | <%@ Import Namespace="DotNetNuke.Entities.Portals" %> 3 | 4 | 103 | -------------------------------------------------------------------------------- /src/scss/theme.scss: -------------------------------------------------------------------------------- 1 | /* ---------------------------------------------------------------------------------------------------- 2 | INFO: Here are some instructions for the "Instant Theme" that may help you 3 | https://azing.org/2sxc/l/t8U9NMGu/theme-bootstrap-4-instant 4 | ----------------------------------------------------------------------------------------------------*/ 5 | 6 | 7 | // 1. Initialize Theme styles and all default Bootstrap Variables 8 | @import "variables"; 9 | 10 | // ---------------------------------------------------------------------------------------------------- 11 | // 2. Generate all standard Bootstrap CSS 12 | // The following bootstrap parts are used by the default setup 13 | // so we are including them here 14 | @import "../../node_modules/bootstrap/scss/root"; 15 | @import "../../node_modules/bootstrap/scss/reboot"; 16 | @import "../../node_modules/bootstrap/scss/type"; 17 | @import "../../node_modules/bootstrap/scss/images"; 18 | @import "../../node_modules/bootstrap/scss/code"; 19 | @import "../../node_modules/bootstrap/scss/grid"; 20 | @import "../../node_modules/bootstrap/scss/tables"; 21 | @import "../../node_modules/bootstrap/scss/forms"; 22 | @import "../../node_modules/bootstrap/scss/buttons"; 23 | @import "../../node_modules/bootstrap/scss/nav"; 24 | @import "../../node_modules/bootstrap/scss/navbar"; 25 | @import "../../node_modules/bootstrap/scss/card"; 26 | @import "../../node_modules/bootstrap/scss/breadcrumb"; 27 | @import "../../node_modules/bootstrap/scss/pagination"; 28 | @import "../../node_modules/bootstrap/scss/badge"; 29 | @import "../../node_modules/bootstrap/scss/alert"; 30 | @import "../../node_modules/bootstrap/scss/media"; 31 | @import "../../node_modules/bootstrap/scss/list-group"; 32 | @import "../../node_modules/bootstrap/scss/close"; 33 | @import "../../node_modules/bootstrap/scss/utilities"; 34 | @import "../../node_modules/bootstrap/scss/print"; 35 | @import "../../node_modules/bootstrap/scss/button-group"; 36 | @import "../../node_modules/bootstrap/scss/input-group"; 37 | 38 | // The following bootstrap parts are not used by the default setup 39 | // But in case you need them, just uncommented the lines 40 | //@import "../../node_modules/bootstrap/scss/jumbotron"; 41 | //@import "../../node_modules/bootstrap/scss/progress"; 42 | //@import "../../node_modules/bootstrap/scss/toasts"; 43 | //@import "../../node_modules/bootstrap/scss/modal"; 44 | //@import "../../node_modules/bootstrap/scss/tooltip"; 45 | //@import "../../node_modules/bootstrap/scss/popover"; 46 | //@import "../../node_modules/bootstrap/scss/carousel"; 47 | //@import "../../node_modules/bootstrap/scss/spinners"; 48 | //@import "../../node_modules/bootstrap/scss/transitions"; 49 | //@import "../../node_modules/bootstrap/scss/dropdown"; 50 | //@import "../../node_modules/bootstrap/scss/custom-forms"; 51 | 52 | // ---------------------------------------------------------------------------------------------------- 53 | // 3. Generate CSS for this theme / skin 54 | @import "components/typography"; // Fonts / typography 55 | @import "components/base-layout"; // Layout styles, body, html, fluid, etc. 56 | @import "components/header"; // Header styles 57 | @import "components/footer"; // Footer styles 58 | @import "components/dnn-overrides"; 59 | 60 | // Navigations / Menus 61 | @import "components/nav-desktop-main"; 62 | @import "components/nav-desktop-sub"; 63 | @import "components/nav-mobile"; 64 | @import "components/nav-mobile-to-top"; 65 | 66 | // More components 67 | @import "components/fancybox"; 68 | 69 | // Other medias 70 | @import "components/print"; 71 | 72 | // ---------------------------------------------------------------------------------------------------- 73 | // 4. Layout Variations 74 | @import "layout-variations/layout-variation-default"; 75 | @import "layout-variations/layout-variation-box"; 76 | @import "layout-variations/layout-variation-wide"; 77 | @import "layout-variations/layout-variation-full"; 78 | @import "layout-variations/layout-variation-landingpage"; 79 | @import "layout-variations/layout-header-variations"; 80 | 81 | -------------------------------------------------------------------------------- /src/scss/_variables.scss: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------------------------------------- 2 | // 1. Load Bootstrap 4 Helpers 3 | @import "../../node_modules/bootstrap/scss/functions"; 4 | @import "../../node_modules/bootstrap/scss/mixins"; 5 | 6 | 7 | // ---------------------------------------------------------------------------------------------------- 8 | // 2. Set Bootstrap Core Variables Presets 9 | // These variables should be set before we load the standard bootstrap variables 10 | // Bootstrap will keep what we set here, and only set variables we have not defined yet 11 | 12 | // 2.1 Set primary and secondary color - used all over the theme 13 | $primary: #65345c; 14 | $secondary: #6c757d; 15 | 16 | // 2.2 set Body colors 17 | $body-bg: #efefef; 18 | $body-color: #222222; 19 | 20 | 21 | // 2.3 Custom Bootstrap Instant 4 Theme variables - used in the variations of the themes */ 22 | $tosic-header-background: #fff; 23 | $tosic-footer-background: $primary; 24 | $tosic-footer-color: #fff; 25 | $tosic-link-decoration: none; 26 | 27 | // ---------------------------------------------------------------------------------------------------- 28 | // 3. Special CSS for specific pages 29 | // The body tag always has things like tab-xx to say what page it's on. Use these to target special CSS. 30 | // Classes you can use are: 31 | // - tab-## 32 | // - tab-is-home (this class is only added on home) 33 | // - root-tab-## the top level tab which is activated, to allow different colors across an entire section 34 | // - lang-en / lang-de etc. 35 | 36 | // Set the width of the logo specifically for the home page only 37 | // .tab-is-home { 38 | // header { 39 | // .ly-logo { 40 | // width: 250px; 41 | // } 42 | // } 43 | // } 44 | 45 | 46 | // ---------------------------------------------------------------------------------------------------- 47 | // 4. Variables we often override 48 | // These are placed after the bootstrap variables import, so that things like $gray already exist 49 | // Unocmment the lines you want to change, or get more from the ../../node_modules/bootstrap/scss/variables.scss 50 | 51 | // Fonts 52 | // stylelint-disable value-keyword-case 53 | $font-family-sans-serif: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, "Helvetica Neue", Arial, "Noto Sans",sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; 54 | $font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; 55 | $font-family-base: $font-family-sans-serif; 56 | // stylelint-enable value-keyword-case 57 | 58 | // Links 59 | // Style anchor elements. 60 | // $link-color: $primary; 61 | // $link-decoration: none; 62 | // $link-hover-color: darken($link-color, 15%); 63 | // $link-hover-decoration: none; 64 | 65 | // Fonts 66 | // Font, line-height, and color for body text, headings, and more. 67 | // $font-size-base: 1rem; // Assumes the browser default, typically `16px` 68 | // $font-size-lg: ($font-size-base * 1.25); 69 | // $font-size-sm: ($font-size-base * .875); 70 | 71 | // $font-weight-light: 300; 72 | // $font-weight-normal: 400; 73 | // $font-weight-bold: 700; 74 | 75 | // $font-weight-base: $font-weight-normal; 76 | // $line-height-base: 1.42857; 77 | 78 | // $h1-font-size: $font-size-base * 2.125; 79 | // $h2-font-size: $font-size-base * 1.7; 80 | // $h3-font-size: $font-size-base * 1.25; 81 | // $h4-font-size: $font-size-base * 1.25; 82 | // $h5-font-size: $font-size-base; 83 | // $h6-font-size: $font-size-base; 84 | 85 | // $headings-font-family: inherit; 86 | // $headings-font-weight: 700; 87 | // $headings-line-height: 1.2; 88 | // $headings-color: inherit; 89 | 90 | // $display1-size: 6rem; 91 | // $display2-size: 5.5rem; 92 | // $display3-size: 4.5rem; 93 | // $display4-size: 3.5rem; 94 | 95 | // $display1-weight: 300; 96 | // $display2-weight: 300; 97 | // $display3-weight: 300; 98 | // $display4-weight: 300; 99 | // $display-line-height: $headings-line-height; 100 | 101 | // $lead-font-size: ($font-size-base * 1.25); 102 | 103 | 104 | // ---------------------------------------------------------------------------------------------------- 105 | // 5. Initialize the default bootstrap variables so they are ready 106 | // Tip: In VS-Code, Ctrl+Click on the link below to open the file 107 | @import "../../node_modules/bootstrap/scss/variables"; 108 | 109 | -------------------------------------------------------------------------------- /src/scss/components/optional/_form-dnncentric.scss: -------------------------------------------------------------------------------- 1 | /* 2 | This file contains all CSS rules for the DNNCentric Contact Form 3 | */ 4 | 5 | /* General field styles*/ 6 | .DnnModule-DNNCentric-MultilanguageForms input[type=text], 7 | .DnnModule-DNNCentric-MultilanguageForms input[type=file], 8 | .DnnModule-DNNCentric-MultilanguageForms textarea, 9 | .DnnModule-DNNCentric-MultilanguageForms select { 10 | font-size: 13px; 11 | color: #46535b !important; 12 | width: 100% !important; 13 | } 14 | 15 | .DnnModule-DNNCentric-MultilanguageForms [id$='_ViewEmailForm_dtEF'] { 16 | width: 100% !important; 17 | max-width: 600px; 18 | } 19 | 20 | .DnnModule-DNNCentric-MultilanguageForms [id$='_ViewEmailForm_dtEF']>tbody>tr>td { 21 | padding-bottom: 10px; 22 | padding-right: 10px; 23 | } 24 | 25 | .DnnModule-DNNCentric-MultilanguageForms input[type='text'], 26 | .DnnModule-DNNCentric-MultilanguageForms input[type='file'], 27 | .DnnModule-DNNCentric-MultilanguageForms textarea { 28 | background: #E2E2E2; 29 | border: 0px solid; 30 | resize: none; 31 | padding: 5px; 32 | color: inherit !important; 33 | font: inherit !important; 34 | } 35 | 36 | .DnnModule-DNNCentric-MultilanguageForms textarea { 37 | display: block; 38 | } 39 | 40 | .DnnModule-DNNCentric-MultilanguageForms select { 41 | background: #E2E2E2; 42 | border: 0; 43 | padding: 5px; 44 | } 45 | 46 | .DnnModule-DNNCentric-MultilanguageForms input.EML_FieldError[type='text'], 47 | .DnnModule-DNNCentric-MultilanguageForms input.EML_FieldError[type='file'], 48 | .DnnModule-DNNCentric-MultilanguageForms .EML_FieldError { 49 | background: #ffbbba; 50 | } 51 | 52 | /* Checkbox / Radio Buttons */ 53 | .DnnModule-DNNCentric-MultilanguageForms .CFC_NormalTextBox1, 54 | .DnnModule-DNNCentric-MultilanguageForms .EML_FieldError { 55 | width: 100% !important; 56 | color: inherit !important; 57 | font: inherit !important; 58 | font-weight: normal; 59 | } 60 | 61 | .DnnModule-DNNCentric-MultilanguageForms .CFC_NormalTextBox1 td, 62 | .DnnModule-DNNCentric-MultilanguageForms .EML_FieldError td { 63 | padding-bottom: 3px; 64 | } 65 | 66 | .DnnModule-DNNCentric-MultilanguageForms .CFC_NormalTextBox1 label, 67 | .DnnModule-DNNCentric-MultilanguageForms .EML_FieldError label { 68 | font-weight: normal; 69 | margin-left: 3px; 70 | display: inline; 71 | } 72 | 73 | .DnnModule-DNNCentric-MultilanguageForms input[type="checkbox"], 74 | .DnnModule-DNNCentric-MultilanguageForms input[type="radio"] { 75 | position: relative; 76 | top: 2px; 77 | } 78 | 79 | .DnnModule-DNNCentric-MultilanguageForms [id$='_dcc_rdl_RadiobuttonList'] input, 80 | .DnnModule-DNNCentric-MultilanguageForms [id$='_dcc_chklst_CheckboxListVertical'] input { 81 | float: left; 82 | } 83 | 84 | .DnnModule-DNNCentric-MultilanguageForms [id$='_dcc_rdl_RadiobuttonList'] label, 85 | .DnnModule-DNNCentric-MultilanguageForms [id$='_dcc_chklst_CheckboxListVertical'] label { 86 | display: block; 87 | line-height: 1.3em; 88 | margin-left: 19px; 89 | margin-bottom: 2px; 90 | } 91 | 92 | .DnnModule-DNNCentric-MultilanguageForms [id$='_ViewEmailForm_dtEF']>tbody>tr>td.DCC_EF_FieldCaptionStyle { 93 | padding: 4px 20px 0 0 !important; 94 | vertical-align: top; 95 | } 96 | 97 | td.DCC_EF_FieldCaptionStyle, 98 | .DCC_EF_FieldCaptionStyle label { 99 | color: inherit !important; 100 | font: inherit !important; 101 | font-weight: normal; 102 | } 103 | 104 | .DnnModule-DNNCentric-MultilanguageForms [id$='_ViewEmailForm_tcSubmit'] .CommandButton, 105 | .DnnModule-DNNCentric-MultilanguageForms [id$='_ViewEmailForm_tcSubmit'] .btnSubmit { 106 | background: #3067b4; 107 | padding: 7px 14px; 108 | color: #ffffff; 109 | margin-top: 5px; 110 | display: inline-block; 111 | border-radius: 5px; 112 | text-decoration: none; 113 | } 114 | 115 | .DnnModule-DNNCentric-MultilanguageForms [id$='_ViewEmailForm_tcSubmit'] .CommandButton:hover, 116 | .DnnModule-DNNCentric-MultilanguageForms [id$='_ViewEmailForm_tcSubmit'] .btnSubmit:hover { 117 | background: #3067b4; 118 | color: #ffffff; 119 | text-decoration: none; 120 | } 121 | 122 | .DnnModule-DNNCentric-MultilanguageForms .MyCategory { 123 | padding-top: 20px; 124 | } 125 | 126 | /* Error Messages */ 127 | .DnnModule-DNNCentric-MultilanguageForms img[src="/DesktopModules/DNNCentric-MultilanguageForms/Images/Alert.png"] { 128 | filter: grayscale(.4); 129 | -webkit-filter: grayscale(.4); 130 | -moz-filter: grayscale(.4); 131 | -ms-filter: grayscale(.4); 132 | -o-filter: grayscale(.4); 133 | } 134 | 135 | .tdErrorMsg, 136 | .EML_FieldError, 137 | .tableErrorMsg { 138 | border: none; 139 | background: transparent; 140 | color: inherit; 141 | padding: 0; 142 | font: inherit !important; 143 | } 144 | 145 | .tdErrorMsg { 146 | display: block; 147 | color: #AF1616; 148 | background-color: #ffbbba; 149 | padding: 15px; 150 | margin-bottom: 20px; 151 | } 152 | 153 | .tdErrorMsg ul, 154 | .tdErrorMsg ul li { 155 | padding: 0 !important; 156 | margin: 0 !important; 157 | list-style: none; 158 | color: inherit !important; 159 | font: inherit !important; 160 | font-weight: normal; 161 | } 162 | 163 | .tableErrorMsg { 164 | float: left; 165 | margin: 25px 0 15px 0; 166 | } 167 | 168 | /* Required-* */ 169 | .co-reqfield { 170 | color: #AF1616; 171 | } 172 | 173 | 174 | /* Screen width: 767 and below */ 175 | @media screen and (max-width: 767px) { 176 | 177 | .DnnModule-DNNCentric-MultilanguageForms [id$='_ViewEmailForm_dtEF'] { 178 | max-width: 400px; 179 | table-layout: fixed; 180 | } 181 | 182 | .DnnModule-DNNCentric-MultilanguageForms [id$='_ViewEmailForm_dtEF']>tbody>tr>td { 183 | display: block; 184 | width: auto !important; 185 | } 186 | 187 | } -------------------------------------------------------------------------------- /images/landingpage/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 13 | 19 | 21 | 26 | 27 | 33 | 36 | 40 | 43 | 46 | 52 | 59 | 60 | 61 | 62 | 63 | 65 | 66 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /dist/theme.min.js: -------------------------------------------------------------------------------- 1 | (()=>{"use strict";var t={126:(t,e,o)=>{var n,r,i;o.r(e),o.d(e,{hide:()=>u,show:()=>p,toggle:()=>g}),function(t){t.parseOrElse=function(t,e){return void 0===e&&(e="0"),t?parseInt(t):e&&"string"==typeof e?parseInt(e):0}}(n||(n={})),function(t){var e=function(t){return t instanceof HTMLElement};t.setStyles=function(t,e){Object.keys(e).map((function(o){t.style[o]=e[o]}))},t.getBoxStyles=function(t){var e=window.getComputedStyle(t);return{height:n.parseOrElse(e.height),padding:{top:n.parseOrElse(e.paddingTop),bottom:n.parseOrElse(e.paddingBottom)},border:{top:n.parseOrElse(e.borderTopWidth),bottom:n.parseOrElse(e.borderBottomWidth)}}},t.getElement=function(t){if(e(t))return t;var o=document.querySelector(t);if(e(o))return o;throw new Error("Your element does not exist in the DOM.")},t.setAttribute=function(t,e,o){t.setAttribute(e,o)},t.getAttribute=function(t,e){return t.getAttribute(e)}}(r||(r={})),function(t){t.on=function(t,e,o){return t.addEventListener(e,o),{destroy:function(){return t&&t.removeEventListener(e,o)}}}}(i||(i={}));var d,a,l=function(t,e){var o={};for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&e.indexOf(n)<0&&(o[n]=t[n]);if(null!=t&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(n=Object.getOwnPropertySymbols(t);r0}return"true"===r.getAttribute(t,e)},t.hide=function(t,d){var a;if(!function(t){return"false"===r.getAttribute(t,e)}(t)){null===(a=d.onAnimationStart)||void 0===a||a.call(d);var s=r.getBoxStyles(t),u=s.height,c=l(s,["height"]);r.setStyles(t,{transition:""}),o((function(){r.setStyles(t,{overflow:"hidden",height:u+"px",paddingTop:c.padding.top+"px",paddingBottom:c.padding.bottom+"px",borderTopWidth:c.border.top+"px",borderBottomWidth:c.border.bottom+"px",transition:n(d)}),o((function(){r.setStyles(t,{height:"0",paddingTop:"0",paddingBottom:"0",borderTopWidth:"0",borderBottomWidth:"0"});var e=i.on(t,"transitionend",(function(){var t;e.destroy(),null===(t=d.onAnimationEnd)||void 0===t||t.call(d)}))}))})),r.setAttribute(t,e,"false")}},t.show=function(t,d){var a;if(!function(t){return"true"===r.getAttribute(t,e)}(t)){null===(a=d.onAnimationStart)||void 0===a||a.call(d),r.setStyles(t,{transition:"",display:"block",height:"auto",paddingTop:"",paddingBottom:"",borderTopWidth:"",borderBottomWidth:""});var s=r.getBoxStyles(t),u=s.height,c=l(s,["height"]);r.setStyles(t,{display:"none"}),o((function(){r.setStyles(t,{display:"block",overflow:"hidden",height:"0",paddingTop:"0",paddingBottom:"0",borderTopWidth:"0",borderBottomWidth:"0",transition:n(d)}),o((function(){r.setStyles(t,{height:u+"px",paddingTop:c.padding.top+"px",paddingBottom:c.padding.bottom+"px",borderTopWidth:c.border.top+"px",borderBottomWidth:c.border.bottom+"px"});var e=i.on(t,"transitionend",(function(){var o;r.setStyles(t,{height:"",overflow:"",paddingTop:"",paddingBottom:"",borderTopWidth:"",borderBottomWidth:""}),e.destroy(),null===(o=d.onAnimationEnd)||void 0===o||o.call(d)}))}))})),r.setAttribute(t,e,"true")}}}(d||(d={})),function(t){t.on=function(t,e){d.hide(t,e)}}(a||(a={}));var s,u=function(t,e){a.on(r.getElement(t),e)};!function(t){t.on=function(t,e){d.show(t,e)}}(s||(s={}));var c,p=function(t,e){s.on(r.getElement(t),e)};!function(t){t.on=function(t,e){d.shouldCollapse(t)?d.hide(t,e):d.show(t,e)}}(c||(c={}));var g=function(t,e){c.on(r.getElement(t),e)}}},e={};function o(n){var r=e[n];if(void 0!==r)return r.exports;var i=e[n]={exports:{}};return t[n](i,i.exports,o),i.exports}o.d=(t,e)=>{for(var n in e)o.o(e,n)&&!o.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},o.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),o.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})};(()=>{var t=o(126);document.querySelectorAll("a").forEach((function(t,e){t.hasAttribute("href")&&t.getAttribute("href").endsWith(".pdf")&&t.setAttribute("target","_blank")})),document.querySelector(".ly-hamburger").addEventListener("click",(function(){document.querySelector(".ly-hamburger").classList.toggle("open"),document.querySelector("#nav-mobile").classList.toggle("open"),document.querySelector("body").classList.toggle("ly-disablescroll")})),setTimeout((function(){document.querySelectorAll("[data-madr1]:not(.madr-done)").forEach((function(t,e){var o=t.getAttribute("data-madr1")+"@"+t.getAttribute("data-madr2")+"."+t.getAttribute("data-madr3"),n=t.getAttribute("data-linktext")?t.getAttribute("data-linktext"):o,r=document.createElement("a");r.setAttribute("href","mailto:"+o),r.innerHTML=n,t.parentElement.appendChild(r),t.classList.add("madr-done"),t.style.display="none"}))}),500),document.querySelector(".ly-top").addEventListener("click",(function(t){t.preventDefault(),window.scrollTo({top:0,left:0,behavior:"smooth"})})),document.getElementsByTagName("body.role-admin").length>0&&document.getElementsByClassName("personalBarContainer").length>0&&(document.querySelector("header").style.marginTop="0");var e=document.querySelector("header"),n=e.offsetHeight;window.addEventListener("scroll",(function(t){window.scrollY>200?document.querySelector(".ly-top").classList.add("ly-top-visible"):document.querySelector(".ly-top").classList.remove("ly-top-visible"),window.scrollY>=n?(e.classList.add("fixed-header"),document.querySelector("body").style.paddingTop=n+"px",document.querySelector("body").classList.contains("va-layout-landingpage")&&(document.querySelector("body.va-layout-landingpage").style.paddingTop="0px"),window.scrollY>=n+1&&e.classList.add("fixed-top")):(e.classList.remove("fixed-header","fixed-top"),document.querySelector("body").style.paddingTop="0px")}),!1),document.querySelectorAll(".ly-navopener").forEach((function(e,o){e.addEventListener("click",(function(e){var o=e.currentTarget,n=o.parentElement.parentElement;n.classList.contains("ly-active")?(n.classList.toggle("ly-active"),(0,t.hide)(n.querySelector("ul"),{})):(o.closest(".has-child").classList.contains("ly-active")&&(document.querySelector(".ly-active").classList.remove("ly-active"),(0,t.hide)(document.querySelector(".ly-active ul"),{})),n.classList.toggle("ly-active"),(0,t.show)(n.querySelector("ul"),{}))}))}))})()})(); 2 | //# sourceMappingURL=theme.min.js.map -------------------------------------------------------------------------------- /App_LocalResources/default.ascx.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | close 122 | 123 | 124 | Imprint 125 | 126 | 127 | /imprint 128 | 129 | 130 | Privacy 131 | 132 | 133 | /privacy 134 | 135 | 136 | Skip to main content 137 | 138 | 139 | Sub Navigation 140 | 141 | 142 | Back to top 143 | 144 | -------------------------------------------------------------------------------- /App_LocalResources/landingpage.ascx.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | close 122 | 123 | 124 | Imprint 125 | 126 | 127 | /imprint 128 | 129 | 130 | Privacy 131 | 132 | 133 | /privacy 134 | 135 | 136 | Skip to main content 137 | 138 | 139 | Sub Navigation 140 | 141 | 142 | Back to top 143 | 144 | -------------------------------------------------------------------------------- /App_LocalResources/default.ascx.de-DE.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | schliessen 122 | 123 | 124 | Impressum 125 | 126 | 127 | /impressum 128 | 129 | 130 | Datenschutz 131 | 132 | 133 | /datenschutz 134 | 135 | 136 | Zum Inhalt springen 137 | 138 | 139 | Unternavigation 140 | 141 | 142 | Nach oben 143 | 144 | -------------------------------------------------------------------------------- /App_LocalResources/landingpage.ascx.de-DE.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | schliessen 122 | 123 | 124 | Impressum 125 | 126 | 127 | /impressum 128 | 129 | 130 | Datenschutz 131 | 132 | 133 | /datenschutz 134 | 135 | 136 | Zum Inhalt springen 137 | 138 | 139 | Unternavigation 140 | 141 | 142 | Nach oben 143 | 144 | -------------------------------------------------------------------------------- /landingpage.ascx: -------------------------------------------------------------------------------- 1 | <%@ Control language="C#" AutoEventWireup="false" Explicit="True" Inherits="DotNetNuke.UI.Skins.Skin" %> 2 | <%@ Register TagPrefix="dnn" TagName="LOGIN" Src="~/Admin/Skins/Login.ascx" %> 3 | <%@ Register TagPrefix="dnn" Namespace="DotNetNuke.Web.DDRMenu.TemplateEngine" Assembly="DotNetNuke.Web.DDRMenu" %> 4 | <%@ Register TagPrefix="dnn" TagName="MENU" src="~/DesktopModules/DDRMenu/Menu.ascx" %> 5 | <%@ Register TagPrefix="dnn" Namespace="DotNetNuke.Web.Client.ClientResourceManagement" Assembly="DotNetNuke.Web.Client" %> 6 | 7 | <%-- Change the page title to contain the breadcrumbi in an SEO optimized way --%> 8 | <%@ Register TagPrefix="tosic" TagName="PageTitle" src="controls/optimize-page-title.ascx" %> 9 | 10 | 11 | <%-- Set common CSS classes on the body which determine the Layout 12 | Layout="Full" are: Default, Wide, Full, Box 13 | Navigation="Left": Right, Center, Left 14 | --%> 15 | <%@ Register TagPrefix="tosic" TagName="BodyCssClasses" src="controls/body-css-classes.ascx" %> 16 | 17 | 18 | <%-- Activate Quick-Edit in empty pages if 2sxc is installed 19 | more infos on 2sxc quick-edit: https://2sxc.org/en/blog/post/quick-edit-2-add-move-delete-modules-in-preview-touch-capable-for-dnn 20 | --%> 21 | <%@ Register TagPrefix="tosic" TagName="SxcQuickEdit" src="controls/2sxc-quickedit.ascx" %> 22 | 23 | 24 | <%-- Include Google Font 25 | 26 | --%> 27 | 28 | 29 | <%= LocalizeString("SkipLink.MainContent") %> 30 | 31 |
32 |
33 |
34 | 37 | 60 |
61 |
62 | 63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 | 71 |
72 |
73 |
74 |
75 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 134 | 135 | -------------------------------------------------------------------------------- /src/scss/components/_nav-mobile.scss: -------------------------------------------------------------------------------- 1 | @media all { 2 | // MENU animation and Hamburger 3 | .ly-hamburger { 4 | position: absolute; 5 | right: 15px; 6 | top: 0px; 7 | z-index: 1040; 8 | width: 40px; 9 | height: 100%; 10 | cursor: pointer; 11 | display: flex; 12 | align-items: center; 13 | overflow: hidden; 14 | @include media-breakpoint-up(md) { 15 | right: 25px; 16 | } 17 | @include media-breakpoint-up(lg) { 18 | display: none; 19 | } 20 | > div { 21 | width: 100%; 22 | position: relative; 23 | height: 18px; 24 | } 25 | span { 26 | display: block; 27 | background-color: $primary; 28 | position: absolute; 29 | width: 30px; 30 | height: 2px; 31 | border-radius: 4px; 32 | &:nth-child(1) { 33 | top: 0px; 34 | left: 0px; 35 | transition: transform 0.4s, top 0.4s; 36 | } 37 | &:nth-child(2) { 38 | top: 8px; 39 | left: 0px; 40 | transition: left 0.5s, opacity 0.5s; 41 | } 42 | &:nth-child(3) { 43 | top: 16px; 44 | left: 0px; 45 | transition: transform 0.4s, top 0.4s; 46 | } 47 | } 48 | &.open { 49 | height: 65px; 50 | span { 51 | &:nth-child(1) { 52 | transform: rotate(135deg); 53 | top: 8px; 54 | } 55 | &:nth-child(2) { 56 | left: 60px; 57 | opacity: 0; 58 | } 59 | &:nth-child(3) { 60 | transform: rotate(-135deg); 61 | top: 8px; 62 | } 63 | } 64 | } 65 | } 66 | .ly-disablescroll { 67 | overflow: hidden; 68 | @include media-breakpoint-up(lg) { 69 | overflow-y: auto; 70 | } 71 | } 72 | // MENU Wrapper 73 | #nav-mobile { 74 | width: 100%; 75 | height: 100vh; 76 | position: fixed; 77 | z-index: 1020; 78 | bottom: 0; 79 | left: -100%; 80 | top: 0%; 81 | padding-bottom: 80px; 82 | background-color: $primary; 83 | transition: transform 0.3s ease-in-out; 84 | @include media-breakpoint-up(lg) { 85 | display: none; 86 | } 87 | &.open { 88 | transform: translateX(100%); 89 | } 90 | .ly-header-mobile { 91 | background: #fff; 92 | padding: 10px 0; 93 | position: absolute; 94 | top: 0; 95 | left: 0; 96 | width: 100%; 97 | z-index: 1025; 98 | height: 65px; 99 | .container-fluid { 100 | padding: 0 15px; 101 | display: flex; 102 | justify-content: space-between; 103 | } 104 | .ly-logo { 105 | display: block; 106 | img { 107 | width: 100%; 108 | max-width: 100%; 109 | height: auto; 110 | } 111 | svg { 112 | max-height: 54px; 113 | } 114 | } 115 | } 116 | } 117 | // MENU Styling 118 | 119 | /* Region Mobile Navigation (in Sidr) */ 120 | .ly-nav-mobile-container { 121 | overflow-x: hidden; 122 | overflow-y: auto; 123 | height:100vh; 124 | 125 | .ly-nav-mobile { 126 | margin: ($grid-gutter-width / 2) 0; 127 | margin-top: 65px; 128 | &, 129 | ul { 130 | margin-left: 0; 131 | padding: 0; 132 | list-style-type: none; 133 | } 134 | /* default styling for all li */ 135 | li { 136 | border-bottom: 1px solid rgba($black, 1); 137 | a { 138 | transition: color 0.4s; 139 | color: rgba($white, 0.8); 140 | display: block; 141 | padding: 10px 40px 10px 15px; 142 | @include media-breakpoint-up(md) { 143 | font-size: 20px; 144 | } 145 | &:hover, 146 | &:focus { 147 | color: rgba($white, 1); 148 | text-decoration: none; 149 | } 150 | } 151 | &.active > .ly-linkwrapper a { 152 | color: rgba($white, 1); 153 | } 154 | .ly-linkwrapper { 155 | position: relative; 156 | .ly-navopener { 157 | display: flex; 158 | align-items: center; 159 | justify-content: center; 160 | background: rgba($black, 0.3); 161 | position: absolute; 162 | right: 0; 163 | width: 40px; 164 | text-align: center; 165 | top: 0; 166 | bottom: 0; 167 | cursor: pointer; 168 | 169 | .ly-navopener-icon { 170 | font-size: 20px; 171 | font-family: sans-serif; 172 | color:rgba($white,.8); 173 | 174 | 175 | &:before { 176 | content: "+"; 177 | } 178 | } 179 | } 180 | } 181 | &.ly-active > .ly-linkwrapper { 182 | .ly-navopener { 183 | .ly-navopener-icon { 184 | &:before { 185 | content: "–"; 186 | } 187 | } 188 | } 189 | } 190 | li { 191 | border-bottom: 1px solid rgba($primary, 1); 192 | &.active { 193 | .ly-nav-child { 194 | display: block; 195 | } 196 | } 197 | &.last { 198 | border-bottom: none; 199 | } 200 | li { 201 | a { 202 | font-size: 0.85em; 203 | } 204 | } 205 | } 206 | } 207 | /* level 1 */ 208 | > li { 209 | &.active { 210 | > a { 211 | color: $primary !important; 212 | } 213 | > .ly-nav-child { 214 | display: block; 215 | } 216 | } 217 | /* mobilenavigation level 2 */ 218 | > ul { 219 | background-color: rgba($black, 0.4); 220 | display: none; 221 | > li { 222 | > .ly-linkwrapper > a { 223 | padding-left: 25px; 224 | } 225 | /* mobilenavigation level 3 */ 226 | > ul { 227 | display: none; 228 | background: rgba($black, 0.3); 229 | > li { 230 | > .ly-linkwrapper > a { 231 | padding-left: 35px; 232 | } 233 | /* mobilenavigation level 4 */ 234 | > ul { 235 | display: none; 236 | background: rgba($black, 0.3); 237 | 238 | > li { 239 | > .ly-linkwrapper > a { 240 | padding-left: 45px; 241 | } 242 | /* mobilenavigation level 5+ */ 243 | > ul { 244 | display: none; 245 | background: rgba($black, 0.3); 246 | 247 | > li { 248 | > .ly-linkwrapper > a { 249 | padding-left: 55px; 250 | } 251 | /* mobilenavigation level 5+ */ 252 | } 253 | } 254 | } 255 | } 256 | } 257 | } 258 | } 259 | } 260 | } 261 | } 262 | 263 | /* Language Selection Styling */ 264 | .ly-language { 265 | display: flex; 266 | list-style: none; 267 | font-size: 16px; 268 | margin-top: 0; 269 | margin-right: 0; 270 | padding-right: 0; 271 | 272 | > li { 273 | display: inline-block; 274 | padding-right: 10px; 275 | margin-right: 10px; 276 | border-right: 1px solid #fff; 277 | 278 | &:last-child { 279 | padding-right: 0; 280 | border-right: none; 281 | } 282 | 283 | a { 284 | color: #fff; 285 | text-decoration: none; 286 | } 287 | } 288 | } 289 | } 290 | } 291 | -------------------------------------------------------------------------------- /default.ascx: -------------------------------------------------------------------------------- 1 | <%@ Control language="C#" AutoEventWireup="false" Explicit="True" Inherits="DotNetNuke.UI.Skins.Skin" %> 2 | <%@ Register TagPrefix="dnn" TagName="LOGIN" Src="~/Admin/Skins/Login.ascx" %> 3 | <%@ Register TagPrefix="dnn" Namespace="DotNetNuke.Web.DDRMenu.TemplateEngine" Assembly="DotNetNuke.Web.DDRMenu" %> 4 | <%@ Register TagPrefix="dnn" TagName="MENU" src="~/DesktopModules/DDRMenu/Menu.ascx" %> 5 | <%@ Register TagPrefix="dnn" Namespace="DotNetNuke.Web.Client.ClientResourceManagement" Assembly="DotNetNuke.Web.Client" %> 6 | <%@ Register TagPrefix="tosic" TagName="LanguageNavigation" src="controls/LanguageNavigation.ascx" %> 7 | 8 | <%-- Change the page title to contain the breadcrumbi in an SEO optimized way --%> 9 | <%@ Register TagPrefix="tosic" TagName="PageTitle" src="controls/optimize-page-title.ascx" %> 10 | 11 | 12 | <%-- Set common CSS classes on the body which determine the Layout 13 | Layout="Full" are: Default, Wide, Full, Box 14 | Navigation="Left": Right, Center, Left 15 | --%> 16 | <%@ Register TagPrefix="tosic" TagName="BodyCssClasses" src="controls/body-css-classes.ascx" %> 17 | 18 | 19 | <%-- Activate Quick-Edit in empty pages if 2sxc is installed 20 | more infos on 2sxc quick-edit: https://2sxc.org/en/blog/post/quick-edit-2-add-move-delete-modules-in-preview-touch-capable-for-dnn 21 | --%> 22 | <%@ Register TagPrefix="tosic" TagName="SxcQuickEdit" src="controls/2sxc-quickedit.ascx" %> 23 | 24 | 25 | <%-- Include Google Font 26 | 27 | --%> 28 | 29 | 30 | <%= LocalizeString("SkipLink.MainContent") %> 31 | 32 |
33 |
34 |
35 | 38 | 51 | 58 | 62 |
63 |
64 | 65 |
"> 66 |
67 |
68 |
69 |
70 | 71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 | 85 |
86 | 87 |
88 |
89 |
90 |
91 | 92 |
93 |
94 |
95 |
96 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 153 | 154 | -------------------------------------------------------------------------------- /images/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 11 | 12 | 17 | 22 | 27 | 30 | 36 | 39 | 41 | 46 | 51 | 52 | 54 | 57 | 63 | 66 | 70 | 73 | 76 | 77 | 78 | 79 | 81 | 82 | 84 | 85 | 86 | 87 | 88 | 89 | 93 | 97 | 98 | 100 | 104 | 107 | 108 | 109 | -------------------------------------------------------------------------------- /dnn-theme-bootstrap4-instant.dnn: -------------------------------------------------------------------------------- 1 | 2 | 3 | Bootstrap 4 Instant 4 | A clean, prepared bootstrap 4 skin for DNN (DotNetNuke), ready to make awesomeness - ideally combined with bootstrap content-templates. 5 | /Images/icon_skin.gif 6 | 7 | 2sic 8 | 2sic internet solutions gmbh 9 | https://www.2sic.com/ 10 | info@2sic.com 11 | 12 | MIT License 13 | 14 | Copyright (c) 2020 2sic Internet Solutions GmbH 15 | 16 | Permission is hereby granted, free of charge, to any person obtaining a copy 17 | of this software and associated documentation files (the "Software"), to deal 18 | in the Software without restriction, including without limitation the rights 19 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 20 | copies of the Software, and to permit persons to whom the Software is 21 | furnished to do so, subject to the following conditions: 22 | 23 | The above copyright notice and this permission notice shall be included in all 24 | copies or substantial portions of the Software. 25 | 26 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 27 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 28 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 29 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 30 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 31 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 32 | SOFTWARE. 33 | 34 | 35 | 36 | 37 | Bootstrap 4 Instant 38 | Portals\_default\Skins\Bootstrap 4 Instant 39 | 40 | .vscode 41 | tasks.json 42 | 43 | 44 | App_LocalResources 45 | default.ascx.de-DE.resx 46 | 47 | 48 | App_LocalResources 49 | default.ascx.resx 50 | 51 | 52 | App_LocalResources 53 | landingpage.ascx.de-DE.resx 54 | 55 | 56 | App_LocalResources 57 | landingpage.ascx.resx 58 | 59 | 60 | controls 61 | 2sxc-quickedit.ascx 62 | 63 | 64 | controls 65 | body-css-classes.ascx 66 | 67 | 68 | controls 69 | LanguageNavigation.ascx 70 | 71 | 72 | controls 73 | optimize-page-title.ascx 74 | 75 | 76 | dist\lib 77 | bootstrap.min.css 78 | 79 | 80 | dist\lib 81 | bootstrap.min.js 82 | 83 | 84 | dist 85 | theme.min.css 86 | 87 | 88 | dist 89 | theme.min.css.map 90 | 91 | 92 | dist 93 | theme.min.js 94 | 95 | 96 | dist 97 | theme.min.js.map 98 | 99 | 100 | images\landingpage 101 | logo.png 102 | 103 | 104 | images\landingpage 105 | logo.svg 106 | 107 | 108 | images 109 | logo-1000.png 110 | 111 | 112 | images 113 | logo.png 114 | 115 | 116 | images 117 | logo.svg 118 | 119 | 120 | nav\blank 121 | menudef.xml 122 | 123 | 124 | nav\blank 125 | template.cshtml 126 | 127 | 128 | nav\main 129 | menudef.xml 130 | 131 | 132 | nav\main 133 | template.cshtml 134 | 135 | 136 | nav\main-mobile 137 | menudef.xml 138 | 139 | 140 | nav\main-mobile 141 | template.cshtml 142 | 143 | 144 | nav\nav-main-submenu 145 | menudef.xml 146 | 147 | 148 | nav\nav-main-submenu 149 | template.cshtml 150 | 151 | 152 | nav\sub 153 | menudef.xml 154 | 155 | 156 | nav\sub 157 | template.cshtml 158 | 159 | 160 | src\scss\components\optional 161 | _form-dnncentric.scss 162 | 163 | 164 | src\scss\components 165 | _base-layout.scss 166 | 167 | 168 | src\scss\components 169 | _dnn-overrides.scss 170 | 171 | 172 | src\scss\components 173 | _fancybox.scss 174 | 175 | 176 | src\scss\components 177 | _footer.scss 178 | 179 | 180 | src\scss\components 181 | _header.scss 182 | 183 | 184 | src\scss\components 185 | _nav-desktop-main.scss 186 | 187 | 188 | src\scss\components 189 | _nav-desktop-sub.scss 190 | 191 | 192 | src\scss\components 193 | _nav-mobile-to-top.scss 194 | 195 | 196 | src\scss\components 197 | _nav-mobile.scss 198 | 199 | 200 | src\scss\components 201 | _print.scss 202 | 203 | 204 | src\scss\components 205 | _typography.scss 206 | 207 | 208 | src\scss\layout-variations 209 | _layout-header-variations.scss 210 | 211 | 212 | src\scss\layout-variations 213 | _layout-variation-box.scss 214 | 215 | 216 | src\scss\layout-variations 217 | _layout-variation-default.scss 218 | 219 | 220 | src\scss\layout-variations 221 | _layout-variation-full.scss 222 | 223 | 224 | src\scss\layout-variations 225 | _layout-variation-landingpage.scss 226 | 227 | 228 | src\scss\layout-variations 229 | _layout-variation-wide.scss 230 | 231 | 232 | src\scss 233 | readme.md 234 | 235 | 236 | src\scss 237 | theme.scss 238 | 239 | 240 | src\scss 241 | _variables.scss 242 | 243 | 244 | src\ts 245 | theme.ts 246 | 247 | 248 | CHANGELOG-bs3-bs4.md 249 | 250 | 251 | default.ascx 252 | 253 | 254 | default.doctype.xml 255 | 256 | 257 | default.jpg 258 | 259 | 260 | favicon.png 261 | 262 | 263 | InvisibleContainer.zip 264 | 265 | 266 | koi.json 267 | 268 | 269 | landingpage.ascx 270 | 271 | 272 | landingpage.jpg 273 | 274 | 275 | LICENSE 276 | 277 | 278 | package-lock.json 279 | 280 | 281 | package.json 282 | 283 | 284 | readme.md 285 | 286 | 287 | thumbnail_default.jpg 288 | 289 | 290 | thumbnail_landingpage.jpg 291 | 292 | 293 | tsconfig.json 294 | 295 | 296 | webpack.config.js 297 | 298 | 299 | 300 | 301 | 302 | -------------------------------------------------------------------------------- /2sic_dnn-theme-bootstrap4-instant.dnn: -------------------------------------------------------------------------------- 1 | 2 | 3 | Bootstrap 4 Instant 4 | A clean, prepared bootstrap 4 skin for DNN (DotNetNuke), ready to make awesomeness - ideally combined with bootstrap content-templates. 5 | 6 | 7 | 2sic 8 | 2sic internet solutions gmbh 9 | https://www.2sic.com/ 10 | info@2sic.com 11 | 12 | MIT License 13 | 14 | Copyright (c) 2020 2sic Internet Solutions GmbH 15 | 16 | Permission is hereby granted, free of charge, to any person obtaining a copy 17 | of this software and associated documentation files (the "Software"), to deal 18 | in the Software without restriction, including without limitation the rights 19 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 20 | copies of the Software, and to permit persons to whom the Software is 21 | furnished to do so, subject to the following conditions: 22 | 23 | The above copyright notice and this permission notice shall be included in all 24 | copies or substantial portions of the Software. 25 | 26 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 27 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 28 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 29 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 30 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 31 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 32 | SOFTWARE. 33 | 34 | 35 | 36 | 37 | Bootstrap 4 Instant 38 | Portals\_default\Skins\Bootstrap 4 Instant 39 | 40 | App_LocalResources 41 | default.ascx.de-DE.resx 42 | 43 | 44 | App_LocalResources 45 | default.ascx.resx 46 | 47 | 48 | App_LocalResources 49 | landingpage.ascx.de-DE.resx 50 | 51 | 52 | App_LocalResources 53 | landingpage.ascx.resx 54 | 55 | 56 | controls 57 | 2sxc-quickedit.ascx 58 | 59 | 60 | controls 61 | body-css-classes.ascx 62 | 63 | 64 | controls 65 | optimize-page-title.ascx 66 | 67 | 68 | dist\lib 69 | bootstrap.min.css 70 | 71 | 72 | dist\lib 73 | bootstrap.min.js 74 | 75 | 76 | dist\lib 77 | jquery.min.js 78 | 79 | 80 | dist 81 | theme.min.css 82 | 83 | 84 | dist 85 | theme.min.css.map 86 | 87 | 88 | dist 89 | theme.min.js 90 | 91 | 92 | dist 93 | theme.min.js.map 94 | 95 | 96 | images\landingpage 97 | logo.png 98 | 99 | 100 | images\landingpage 101 | logo.svg 102 | 103 | 104 | images 105 | logo-1000.png 106 | 107 | 108 | images 109 | logo.png 110 | 111 | 112 | images 113 | logo.svg 114 | 115 | 116 | nav\blank 117 | menudef.xml 118 | 119 | 120 | nav\blank 121 | template.cshtml 122 | 123 | 124 | nav\main 125 | menudef.xml 126 | 127 | 128 | nav\main 129 | template.cshtml 130 | 131 | 132 | nav\main-mobile 133 | menudef.xml 134 | 135 | 136 | nav\main-mobile 137 | template.cshtml 138 | 139 | 140 | nav\sub 141 | menudef.xml 142 | 143 | 144 | nav\sub 145 | template.cshtml 146 | 147 | 148 | src\scss\components\optional 149 | _form-dnncentric.scss 150 | 151 | 152 | src\scss\components 153 | _base-layout.scss 154 | 155 | 156 | src\scss\components 157 | _dnn-overrides.scss 158 | 159 | 160 | src\scss\components 161 | _fancybox.scss 162 | 163 | 164 | src\scss\components 165 | _footer.scss 166 | 167 | 168 | src\scss\components 169 | _header.scss 170 | 171 | 172 | src\scss\components 173 | _nav-desktop-main.scss 174 | 175 | 176 | src\scss\components 177 | _nav-desktop-sub.scss 178 | 179 | 180 | src\scss\components 181 | _nav-mobile-to-top.scss 182 | 183 | 184 | src\scss\components 185 | _nav-mobile.scss 186 | 187 | 188 | src\scss\components 189 | _print.scss 190 | 191 | 192 | src\scss\components 193 | _typography.scss 194 | 195 | 196 | src\scss\layout-variations 197 | _layout-header-variations.scss 198 | 199 | 200 | src\scss\layout-variations 201 | _layout-variation-box.scss 202 | 203 | 204 | src\scss\layout-variations 205 | _layout-variation-default.scss 206 | 207 | 208 | src\scss\layout-variations 209 | _layout-variation-full.scss 210 | 211 | 212 | src\scss\layout-variations 213 | _layout-variation-landingpage.scss 214 | 215 | 216 | src\scss\layout-variations 217 | _layout-variation-wide.scss 218 | 219 | 220 | src\scss 221 | readme.md 222 | 223 | 224 | src\scss 225 | theme.scss 226 | 227 | 228 | src\scss 229 | _variables.scss 230 | 231 | 232 | src\ts 233 | theme.ts 234 | 235 | 236 | CHANGELOG-bs3-bs4.md 237 | 238 | 239 | default.ascx 240 | 241 | 242 | default.doctype.xml 243 | 244 | 245 | default.jpg 246 | 247 | 248 | favicon.png 249 | 250 | 251 | InvisibleContainer.zip 252 | 253 | 254 | koi.json 255 | 256 | 257 | landingpage.ascx 258 | 259 | 260 | landingpage.jpg 261 | 262 | 263 | LICENSE 264 | 265 | 266 | package-lock.json 267 | 268 | 269 | package.json 270 | 271 | 272 | readme.md 273 | 274 | 275 | thumbnail_default.jpg 276 | 277 | 278 | thumbnail_landingpage.jpg 279 | 280 | 281 | tsconfig.json 282 | 283 | 284 | webpack.config.js 285 | 286 | 287 | 288 | 289 | 290 | 291 | Invisible Container 292 | Invisible Container 293 | 294 | 295 | 2sic 296 | 2sic internet solutions gmbh 297 | https://www.2sic.com 298 | info@2sic.com 299 | 300 | MIT License 301 | 302 | Copyright (c) 2016 2sic Internet Solutions GmbH 303 | 304 | Permission is hereby granted, free of charge, to any person obtaining a copy 305 | of this software and associated documentation files (the "Software"), to deal 306 | in the Software without restriction, including without limitation the rights 307 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 308 | copies of the Software, and to permit persons to whom the Software is 309 | furnished to do so, subject to the following conditions: 310 | 311 | The above copyright notice and this permission notice shall be included in all 312 | copies or substantial portions of the Software. 313 | 314 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 315 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 316 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 317 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 318 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 319 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 320 | SOFTWARE. 321 | 322 | 323 | 324 | 325 | Portals\_default\Containers\Invisible Container 326 | 327 | InvisibleContainer.zip 328 | 329 | 330 | 331 | 332 | 333 | Invisible Container 334 | Portals\_default\Containers\Invisible Container 335 | 336 | 337 | 338 | 339 | 340 | -------------------------------------------------------------------------------- /dist/theme.min.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"theme.min.js","mappings":"wCAAO,IAAIA,ECCAC,ECDAC,E,mDFCX,SAAWF,GACPA,EAAQG,YAAc,SAAUC,EAAKC,GAEjC,YADW,IAAPA,IAAiBA,EAAK,KACtBD,EACOE,SAASF,GAEbC,GAAoB,iBAAPA,EAAkBC,SAASD,GAAM,GAN7D,CAQGL,IAAYA,EAAU,KCPzB,SAAWC,GACP,IAAIM,EAAY,SAAUC,GAAW,OAAOA,aAAmBC,aAC/DR,EAAQS,UAAY,SAAUF,EAASG,GACnCC,OAAOC,KAAKF,GAAQG,KAAI,SAAUC,GAC9BP,EAAQQ,MAAMD,GAAOJ,EAAOI,OAGpCd,EAAQgB,aAAe,SAAUT,GAC7B,IAAIU,EAAgBC,OAAOC,iBAAiBZ,GAC5C,MAAO,CACHa,OAAQrB,EAAQG,YAAYe,EAAcG,QAC1CC,QAAS,CACLC,IAAKvB,EAAQG,YAAYe,EAAcM,YACvCC,OAAQzB,EAAQG,YAAYe,EAAcQ,gBAE9CC,OAAQ,CACJJ,IAAKvB,EAAQG,YAAYe,EAAcU,gBACvCH,OAAQzB,EAAQG,YAAYe,EAAcW,sBAItD5B,EAAQ6B,WAAa,SAAUtB,GAC3B,GAAID,EAAUC,GACV,OAAOA,EAEX,IAAIuB,EAAsBC,SAASC,cAAczB,GACjD,GAAID,EAAUwB,GACV,OAAOA,EAEX,MAAM,IAAIG,MAAM,4CAEpBjC,EAAQkC,aAAe,SAAU3B,EAAS4B,EAAWC,GACjD7B,EAAQ2B,aAAaC,EAAWC,IAEpCpC,EAAQqC,aAAe,SAAU9B,EAAS4B,GACtC,OAAO5B,EAAQ8B,aAAaF,IAnCpC,CAqCGnC,IAAYA,EAAU,KCtCzB,SAAWC,GACPA,EAAOqC,GAAK,SAAU/B,EAASgC,EAAOC,GAElC,OADAjC,EAAQkC,iBAAiBF,EAAOC,GACzB,CACHE,QAAS,WAAc,OAAOnC,GAAWA,EAAQoC,oBAAoBJ,EAAOC,MAJxF,CAOGvC,IAAWA,EAAS,KCRvB,IAaW2C,ECZPC,EDDAC,EAAkC,SAAUC,EAAGC,GAC/C,IAAIC,EAAI,GACR,IAAK,IAAIC,KAAKH,EAAOpC,OAAOwC,UAAUC,eAAeC,KAAKN,EAAGG,IAAMF,EAAEM,QAAQJ,GAAK,IAC9ED,EAAEC,GAAKH,EAAEG,IACb,GAAS,MAALH,GAAqD,mBAAjCpC,OAAO4C,sBACtB,KAAIC,EAAI,EAAb,IAAgBN,EAAIvC,OAAO4C,sBAAsBR,GAAIS,EAAIN,EAAEO,OAAQD,IAC3DR,EAAEM,QAAQJ,EAAEM,IAAM,GAAK7C,OAAOwC,UAAUO,qBAAqBL,KAAKN,EAAGG,EAAEM,MACvEP,EAAEC,EAAEM,IAAMT,EAAEG,EAAEM,KAE1B,OAAOP,IAKX,SAAWL,GACP,IAAIe,EAAuB,oBACvBC,EAA0B,SAAUpB,GACpCqB,sBAAsBrB,IAEtBsB,EAAgB,SAAUC,GAC1B,IAAIC,EAAKD,EAAQE,YAAaA,OAAqB,IAAPD,EAAgB,IAAMA,EAAIE,EAAKH,EAAQI,mBACnF,MAAO,OAASF,EAAc,YADqG,IAAPC,EAAgB,SAAWA,GAC5F,OAI/DtB,EAAQwB,eAAiB,SAAU7D,GAE/B,IADgBP,EAAQqC,aAAa9B,EAASoD,GAC9B,CACZ,IAAIvC,EAASpB,EAAQgB,aAAaT,GAASa,OAC3C,OAAOA,GAAUA,EAAS,EAE9B,MAA+D,SAAxDpB,EAAQqC,aAAa9B,EAASoD,IAEzCf,EAAQyB,KAAO,SAAU9D,EAASwD,GAC9B,IAAIC,EACJ,IAZW,SAAUzD,GAAW,MAA+D,UAAxDP,EAAQqC,aAAa9B,EAASoD,GAYjEW,CAAS/D,GAAb,CAGoC,QAAnCyD,EAAKD,EAAQQ,wBAAqC,IAAPP,GAAyBA,EAAGX,KAAKU,GAC7E,IAAIG,EAAKlE,EAAQgB,aAAaT,GAAUa,EAAS8C,EAAG9C,OAAQoD,EAAY1B,EAAOoB,EAAI,CAAC,WACpFlE,EAAQS,UAAUF,EAAS,CAAEkE,WAAY,KACzCb,GAAwB,WACpB5D,EAAQS,UAAUF,EAAS,CACvBmE,SAAU,SACVtD,OAAQA,EAAS,KACjBG,WAAYiD,EAAUnD,QAAQC,IAAM,KACpCG,cAAe+C,EAAUnD,QAAQG,OAAS,KAC1CG,eAAgB6C,EAAU9C,OAAOJ,IAAM,KACvCM,kBAAmB4C,EAAU9C,OAAOF,OAAS,KAC7CiD,WAAYX,EAAcC,KAE9BH,GAAwB,WACpB5D,EAAQS,UAAUF,EAAS,CACvBa,OAAQ,IACRG,WAAY,IACZE,cAAe,IACfE,eAAgB,IAChBC,kBAAmB,MAEvB,IAAIW,EAAQtC,EAAOqC,GAAG/B,EAAS,iBAAiB,WAC5C,IAAIyD,EACJzB,EAAMG,UAC4B,QAAjCsB,EAAKD,EAAQY,sBAAmC,IAAPX,GAAyBA,EAAGX,KAAKU,YAIvF/D,EAAQkC,aAAa3B,EAASoD,EAAsB,WAExDf,EAAQgC,KAAO,SAAUrE,EAASwD,GAC9B,IAAIC,EACJ,IA9CU,SAAUzD,GAAW,MAA+D,SAAxDP,EAAQqC,aAAa9B,EAASoD,GA8ChEkB,CAAQtE,GAAZ,CAGoC,QAAnCyD,EAAKD,EAAQQ,wBAAqC,IAAPP,GAAyBA,EAAGX,KAAKU,GAC7E/D,EAAQS,UAAUF,EAAS,CACvBkE,WAAY,GACZK,QAAS,QACT1D,OAAQ,OACRG,WAAY,GACZE,cAAe,GACfE,eAAgB,GAChBC,kBAAmB,KAEvB,IAAIsC,EAAKlE,EAAQgB,aAAaT,GAAUa,EAAS8C,EAAG9C,OAAQoD,EAAY1B,EAAOoB,EAAI,CAAC,WACpFlE,EAAQS,UAAUF,EAAS,CACvBuE,QAAS,SAEblB,GAAwB,WACpB5D,EAAQS,UAAUF,EAAS,CACvBuE,QAAS,QACTJ,SAAU,SACVtD,OAAQ,IACRG,WAAY,IACZE,cAAe,IACfE,eAAgB,IAChBC,kBAAmB,IACnB6C,WAAYX,EAAcC,KAE9BH,GAAwB,WACpB5D,EAAQS,UAAUF,EAAS,CACvBa,OAAQA,EAAS,KACjBG,WAAYiD,EAAUnD,QAAQC,IAAM,KACpCG,cAAe+C,EAAUnD,QAAQG,OAAS,KAC1CG,eAAgB6C,EAAU9C,OAAOJ,IAAM,KACvCM,kBAAmB4C,EAAU9C,OAAOF,OAAS,OAEjD,IAAIe,EAAQtC,EAAOqC,GAAG/B,EAAS,iBAAiB,WAC5C,IAAIyD,EACJhE,EAAQS,UAAUF,EAAS,CACvBa,OAAQ,GACRsD,SAAU,GACVnD,WAAY,GACZE,cAAe,GACfE,eAAgB,GAChBC,kBAAmB,KAEvBW,EAAMG,UAC4B,QAAjCsB,EAAKD,EAAQY,sBAAmC,IAAPX,GAAyBA,EAAGX,KAAKU,YAIvF/D,EAAQkC,aAAa3B,EAASoD,EAAsB,UA3G5D,CA6GGf,IAAYA,EAAU,KCzHzB,SAAWC,GACPA,EAAKP,GAAK,SAAU/B,EAASwD,GACzBnB,EAAQyB,KAAK9D,EAASwD,IAF9B,CAIGlB,IAASA,EAAO,KACZ,ICNHkC,EDMOV,EAAO,SAAU9D,EAASwD,GACjClB,EAAKP,GAAGtC,EAAQ6B,WAAWtB,GAAUwD,KCNzC,SAAWgB,GACPA,EAAKzC,GAAK,SAAU/B,EAASwD,GACzBnB,EAAQgC,KAAKrE,EAASwD,IAF9B,CAIGgB,IAASA,EAAO,KACZ,ICNHC,EDMOJ,EAAO,SAAUrE,EAASwD,GACjCgB,EAAKzC,GAAGtC,EAAQ6B,WAAWtB,GAAUwD,KCNzC,SAAWiB,GACPA,EAAO1C,GAAK,SAAU/B,EAASwD,GACvBnB,EAAQwB,eAAe7D,GACvBqC,EAAQyB,KAAK9D,EAASwD,GAGtBnB,EAAQgC,KAAKrE,EAASwD,IANlC,CASGiB,IAAWA,EAAS,KAChB,IAAIC,EAAS,SAAU1E,EAASwD,GACnCiB,EAAO1C,GAAGtC,EAAQ6B,WAAWtB,GAAUwD,MCZvCmB,EAA2B,GAG/B,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqBE,IAAjBD,EACH,OAAOA,EAAaE,QAGrB,IAAIC,EAASN,EAAyBE,GAAY,CAGjDG,QAAS,IAOV,OAHAE,EAAoBL,GAAUI,EAAQA,EAAOD,QAASJ,GAG/CK,EAAOD,QCpBfJ,EAAoBO,EAAI,CAACH,EAASI,KACjC,IAAI,IAAI7E,KAAO6E,EACXR,EAAoBS,EAAED,EAAY7E,KAASqE,EAAoBS,EAAEL,EAASzE,IAC5EH,OAAOkF,eAAeN,EAASzE,EAAK,CAAEgF,YAAY,EAAMC,IAAKJ,EAAW7E,MCJ3EqE,EAAoBS,EAAI,CAACI,EAAKC,IAAUtF,OAAOwC,UAAUC,eAAeC,KAAK2C,EAAKC,GCClFd,EAAoBe,EAAKX,IACH,oBAAXY,QAA0BA,OAAOC,aAC1CzF,OAAOkF,eAAeN,EAASY,OAAOC,YAAa,CAAEhE,MAAO,WAE7DzB,OAAOkF,eAAeN,EAAS,aAAc,CAAEnD,OAAO,K,MCLvD,aAGAL,SAASsE,iBAAiB,KAAKC,SAAQ,SAACC,EAAmBC,GACvDD,EAASE,aAAa,SAAWF,EAASlE,aAAa,QAAQqE,SAAS,SAC1EH,EAASrE,aAAa,SAAU,aAKlCH,SAASC,cAAc,iBAAiBS,iBAAiB,SAAS,WACjEV,SAASC,cAAc,iBAAiB2E,UAAU1B,OAAO,QACzDlD,SAASC,cAAc,eAAe2E,UAAU1B,OAAO,QACvDlD,SAASC,cAAc,QAAQ2E,UAAU1B,OAAO,uBAIjD2B,YAAW,WACQ7E,SAASsE,iBAAiB,gCAEhCC,SAAQ,SAACO,EAAmBL,GACvC,IAAMM,EAAQD,EAAKxE,aAAa,cAAgB,IAAMwE,EAAKxE,aAAa,cAAgB,IAAMwE,EAAKxE,aAAa,cAC1G0E,EAAWF,EAAKxE,aAAa,iBAAmBwE,EAAKxE,aAAa,iBAAmByE,EAErFE,EAAIjF,SAASkF,cAAc,KACjCD,EAAE9E,aAAa,OAAQ,UAAU4E,GACjCE,EAAEE,UAAYH,EAEdF,EAAKM,cAAcC,YAAYJ,GAC/BH,EAAKF,UAAUU,IAAI,aACnBR,EAAK9F,MAAM+D,QAAU,YAEpB,KAGH/C,SAASC,cAAc,WAAWS,iBAAiB,SAAS,SAACO,GAC5DA,EAAEsE,iBAEFpG,OAAOqG,SAAS,CACfjG,IAAK,EACLkG,KAAM,EACNC,SAAU,cAKT1F,SAAS2F,qBAAqB,mBAAmBjE,OAAS,GAAK1B,SAAS4F,uBAAuB,wBAAwBlE,OAAS,IAClI1B,SAASC,cAAc,UAAUjB,MAAM6G,UAAY,KAGpD,IAAMC,EAAY9F,SAASC,cAAc,UACnC8F,EAAYD,EAAUE,aAC5B7G,OAAOuB,iBAAiB,UAAU,SAAUF,GAEvCrB,OAAO8G,QAAU,IACpBjG,SAASC,cAAc,WAAW2E,UAAUU,IAAI,kBAEhDtF,SAASC,cAAc,WAAW2E,UAAUsB,OAAO,kBAIhD/G,OAAO8G,SAAWF,GACrBD,EAAUlB,UAAUU,IAAI,gBACxBtF,SAASC,cAAc,QAAQjB,MAAMQ,WAAgBuG,EAAS,KAC3D/F,SAASC,cAAc,QAAQ2E,UAAUuB,SAAS,2BACnDnG,SAASC,cAAc,8BAA8CjB,MAAMQ,WAAa,OAGtFL,OAAO8G,SAAWF,EAAY,GACjCD,EAAUlB,UAAUU,IAAI,eAGzBQ,EAAUlB,UAAUsB,OAAO,eAAe,aAC1ClG,SAASC,cAAc,QAAQjB,MAAMQ,WAAa,UAEjD,GAGHQ,SAASsE,iBAAiB,iBAAiBC,SAAQ,SAAC6B,EAAyB3B,GAC5E2B,EAAW1F,iBAAiB,SAAS,SAACO,GACrC,IAAMoF,EAAapF,EAAEqF,cACfC,EAAeF,EAAWjB,cAAcA,cAE1CmB,EAAa3B,UAAUuB,SAAS,cAQnCI,EAAa3B,UAAU1B,OAAO,cAC9B,IAAAZ,MAAKiE,EAAatG,cAAc,MAAsB,MARnDoG,EAAWG,QAAQ,cAAc5B,UAAUuB,SAAS,eACtDnG,SAASC,cAAc,cAAc2E,UAAUsB,OAAO,cACtD,IAAA5D,MAAKtC,SAASC,cAAc,iBAAiC,KAE9DsG,EAAa3B,UAAU1B,OAAO,cAC9B,IAAAL,MAAK0D,EAAatG,cAAc,MAAsB,Y","sources":["webpack://2sic-standard-skin-template/./node_modules/slidetoggle/dist/utils/Numbers.js","webpack://2sic-standard-skin-template/./node_modules/slidetoggle/dist/utils/Element.js","webpack://2sic-standard-skin-template/./node_modules/slidetoggle/dist/utils/Event.js","webpack://2sic-standard-skin-template/./node_modules/slidetoggle/dist/utils/Animate.js","webpack://2sic-standard-skin-template/./node_modules/slidetoggle/dist/common/hide.js","webpack://2sic-standard-skin-template/./node_modules/slidetoggle/dist/common/show.js","webpack://2sic-standard-skin-template/./node_modules/slidetoggle/dist/common/toggle.js","webpack://2sic-standard-skin-template/webpack/bootstrap","webpack://2sic-standard-skin-template/webpack/runtime/define property getters","webpack://2sic-standard-skin-template/webpack/runtime/hasOwnProperty shorthand","webpack://2sic-standard-skin-template/webpack/runtime/make namespace object","webpack://2sic-standard-skin-template/./src/ts/theme.ts"],"sourcesContent":["export var Numbers;\n(function (Numbers) {\n Numbers.parseOrElse = function (str, or) {\n if (or === void 0) { or = '0'; }\n if (str) {\n return parseInt(str);\n }\n return or && typeof or === 'string' ? parseInt(or) : 0;\n };\n})(Numbers || (Numbers = {}));\n//# sourceMappingURL=Numbers.js.map","import { Numbers } from './Numbers';\nexport var Element;\n(function (Element) {\n var isElement = function (element) { return element instanceof HTMLElement; };\n Element.setStyles = function (element, styles) {\n Object.keys(styles).map(function (key) {\n element.style[key] = styles[key];\n });\n };\n Element.getBoxStyles = function (element) {\n var computedValue = window.getComputedStyle(element);\n return {\n height: Numbers.parseOrElse(computedValue.height),\n padding: {\n top: Numbers.parseOrElse(computedValue.paddingTop),\n bottom: Numbers.parseOrElse(computedValue.paddingBottom),\n },\n border: {\n top: Numbers.parseOrElse(computedValue.borderTopWidth),\n bottom: Numbers.parseOrElse(computedValue.borderBottomWidth),\n },\n };\n };\n Element.getElement = function (element) {\n if (isElement(element)) {\n return element;\n }\n var elementFromSelector = document.querySelector(element);\n if (isElement(elementFromSelector)) {\n return elementFromSelector;\n }\n throw new Error('Your element does not exist in the DOM.');\n };\n Element.setAttribute = function (element, attribute, value) {\n element.setAttribute(attribute, value);\n };\n Element.getAttribute = function (element, attribute) {\n return element.getAttribute(attribute);\n };\n})(Element || (Element = {}));\n//# sourceMappingURL=Element.js.map","export var Events;\n(function (Events) {\n Events.on = function (element, event, callback) {\n element.addEventListener(event, callback);\n return {\n destroy: function () { return element && element.removeEventListener(event, callback); },\n };\n };\n})(Events || (Events = {}));\n//# sourceMappingURL=Event.js.map","var __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nimport { Element } from './Element';\nimport { Events } from './Event';\nexport var Animate;\n(function (Animate) {\n var slideToggleAttribute = 'data-slide-toggle';\n var onRequestAnimationFrame = function (callback) {\n requestAnimationFrame(callback);\n };\n var getTransition = function (options) {\n var _a = options.miliseconds, miliseconds = _a === void 0 ? 200 : _a, _b = options.transitionFunction, transitionFunction = _b === void 0 ? 'linear' : _b;\n return \"all \" + miliseconds + \"ms \" + transitionFunction + \" 0s\";\n };\n var isHidden = function (element) { return Element.getAttribute(element, slideToggleAttribute) === 'false'; };\n var isShown = function (element) { return Element.getAttribute(element, slideToggleAttribute) === 'true'; };\n Animate.shouldCollapse = function (element) {\n var attribute = Element.getAttribute(element, slideToggleAttribute);\n if (!attribute) {\n var height = Element.getBoxStyles(element).height;\n return height && height > 0;\n }\n return Element.getAttribute(element, slideToggleAttribute) === 'true';\n };\n Animate.hide = function (element, options) {\n var _a;\n if (isHidden(element)) {\n return;\n }\n (_a = options.onAnimationStart) === null || _a === void 0 ? void 0 : _a.call(options);\n var _b = Element.getBoxStyles(element), height = _b.height, boxStyles = __rest(_b, [\"height\"]);\n Element.setStyles(element, { transition: '' });\n onRequestAnimationFrame(function () {\n Element.setStyles(element, {\n overflow: 'hidden',\n height: height + \"px\",\n paddingTop: boxStyles.padding.top + \"px\",\n paddingBottom: boxStyles.padding.bottom + \"px\",\n borderTopWidth: boxStyles.border.top + \"px\",\n borderBottomWidth: boxStyles.border.bottom + \"px\",\n transition: getTransition(options),\n });\n onRequestAnimationFrame(function () {\n Element.setStyles(element, {\n height: '0',\n paddingTop: '0',\n paddingBottom: '0',\n borderTopWidth: '0',\n borderBottomWidth: '0',\n });\n var event = Events.on(element, 'transitionend', function () {\n var _a;\n event.destroy();\n (_a = options.onAnimationEnd) === null || _a === void 0 ? void 0 : _a.call(options);\n });\n });\n });\n Element.setAttribute(element, slideToggleAttribute, 'false');\n };\n Animate.show = function (element, options) {\n var _a;\n if (isShown(element)) {\n return;\n }\n (_a = options.onAnimationStart) === null || _a === void 0 ? void 0 : _a.call(options);\n Element.setStyles(element, {\n transition: '',\n display: 'block',\n height: 'auto',\n paddingTop: '',\n paddingBottom: '',\n borderTopWidth: '',\n borderBottomWidth: '',\n });\n var _b = Element.getBoxStyles(element), height = _b.height, boxStyles = __rest(_b, [\"height\"]);\n Element.setStyles(element, {\n display: 'none',\n });\n onRequestAnimationFrame(function () {\n Element.setStyles(element, {\n display: 'block',\n overflow: 'hidden',\n height: '0',\n paddingTop: '0',\n paddingBottom: '0',\n borderTopWidth: '0',\n borderBottomWidth: '0',\n transition: getTransition(options),\n });\n onRequestAnimationFrame(function () {\n Element.setStyles(element, {\n height: height + \"px\",\n paddingTop: boxStyles.padding.top + \"px\",\n paddingBottom: boxStyles.padding.bottom + \"px\",\n borderTopWidth: boxStyles.border.top + \"px\",\n borderBottomWidth: boxStyles.border.bottom + \"px\",\n });\n var event = Events.on(element, 'transitionend', function () {\n var _a;\n Element.setStyles(element, {\n height: '',\n overflow: '',\n paddingTop: '',\n paddingBottom: '',\n borderTopWidth: '',\n borderBottomWidth: '',\n });\n event.destroy();\n (_a = options.onAnimationEnd) === null || _a === void 0 ? void 0 : _a.call(options);\n });\n });\n });\n Element.setAttribute(element, slideToggleAttribute, 'true');\n };\n})(Animate || (Animate = {}));\n//# sourceMappingURL=Animate.js.map","import { Animate, Element } from '../utils';\nvar Hide;\n(function (Hide) {\n Hide.on = function (element, options) {\n Animate.hide(element, options);\n };\n})(Hide || (Hide = {}));\nexport var hide = function (element, options) {\n Hide.on(Element.getElement(element), options);\n};\n//# sourceMappingURL=hide.js.map","import { Animate, Element } from '../utils';\nvar Show;\n(function (Show) {\n Show.on = function (element, options) {\n Animate.show(element, options);\n };\n})(Show || (Show = {}));\nexport var show = function (element, options) {\n Show.on(Element.getElement(element), options);\n};\n//# sourceMappingURL=show.js.map","import { Animate, Element } from '../utils';\nvar Toggle;\n(function (Toggle) {\n Toggle.on = function (element, options) {\n if (Animate.shouldCollapse(element)) {\n Animate.hide(element, options);\n }\n else {\n Animate.show(element, options);\n }\n };\n})(Toggle || (Toggle = {}));\nexport var toggle = function (element, options) {\n Toggle.on(Element.getElement(element), options);\n};\n//# sourceMappingURL=toggle.js.map","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { hide, show, toggle } from 'slidetoggle';\r\n\r\n/* Open all PDF links in a new window */\r\ndocument.querySelectorAll('a').forEach((linkElem: Element, index) => {\r\n\tif(linkElem.hasAttribute('href') && linkElem.getAttribute('href').endsWith('.pdf')) {\r\n\t\tlinkElem.setAttribute('target', '_blank');\r\n\t}\r\n});\r\n\r\n/* Mobile Navigation */\r\ndocument.querySelector('.ly-hamburger').addEventListener('click', () => {\r\n\tdocument.querySelector('.ly-hamburger').classList.toggle('open');\r\n\tdocument.querySelector('#nav-mobile').classList.toggle('open');\r\n\tdocument.querySelector('body').classList.toggle('ly-disablescroll');\r\n});\r\n\r\n/* mailencrypting */\r\nsetTimeout(function () {\r\n\tlet mailElement = document.querySelectorAll('[data-madr1]:not(.madr-done)');\r\n\r\n\tmailElement.forEach((mail: HTMLElement, index) => {\r\n\t\tconst maddr = mail.getAttribute('data-madr1') + '@' + mail.getAttribute('data-madr2') + '.' + mail.getAttribute('data-madr3');\r\n\t\tconst linktext = mail.getAttribute('data-linktext') ? mail.getAttribute('data-linktext') : maddr;\r\n\r\n\t\tconst a = document.createElement('a')\r\n\t\ta.setAttribute('href', `mailto:${maddr}`)\r\n\t\ta.innerHTML = linktext;\r\n\r\n\t\tmail.parentElement.appendChild(a);\r\n\t\tmail.classList.add('madr-done');\r\n\t\tmail.style.display = 'none';\r\n\t});\r\n}, 500);\r\n\r\n/* Go to top button */\r\ndocument.querySelector('.ly-top').addEventListener('click', (e) => {\r\n\te.preventDefault();\r\n\r\n\twindow.scrollTo({\r\n\t\ttop: 0,\r\n\t\tleft: 0,\r\n\t\tbehavior: 'smooth'\r\n\t});\r\n})\r\n\r\n/* Check if DNN < 9 */\r\nif(document.getElementsByTagName('body.role-admin').length > 0 && document.getElementsByClassName('personalBarContainer').length > 0) {\r\n\tdocument.querySelector('header').style.marginTop = \"0\";\r\n}\r\n\r\nconst navheader = document.querySelector('header');\r\nconst navheight = navheader.offsetHeight;\r\nwindow.addEventListener('scroll', function (event) {\r\n\t/* show / hide scroll to top button */\r\n\tif (window.scrollY > 200) {\r\n\t\tdocument.querySelector('.ly-top').classList.add('ly-top-visible');\r\n\t} else {\r\n\t\tdocument.querySelector('.ly-top').classList.remove('ly-top-visible');\r\n\t}\r\n\r\n\t/* sticky header */\r\n\tif (window.scrollY >= navheight) {\r\n\t\tnavheader.classList.add('fixed-header');\r\n\t\tdocument.querySelector('body').style.paddingTop = `${navheight}px`;\r\n\t\tif(document.querySelector('body').classList.contains('va-layout-landingpage')) {\r\n\t\t\t(document.querySelector('body.va-layout-landingpage') as HTMLElement).style.paddingTop = `0px`;\r\n\t\t}\r\n\r\n\t\tif (window.scrollY >= navheight + 1) {\r\n\t\t\tnavheader.classList.add('fixed-top');\r\n\t\t}\r\n\t} else {\r\n\t\tnavheader.classList.remove('fixed-header','fixed-top');\r\n\t\tdocument.querySelector('body').style.paddingTop = `0px`;\r\n\t}\r\n}, false);\r\n\r\n/* opens sub navs and mobile navs */\r\ndocument.querySelectorAll('.ly-navopener').forEach((openerElem: HTMLElement, index) => {\r\n\topenerElem.addEventListener('click', (e) => {\r\n\t\tconst targetElem = e.currentTarget as HTMLElement;\r\n\t\tconst targetParent = targetElem.parentElement.parentElement;\r\n\r\n\t\tif(!targetParent.classList.contains('ly-active')) {\r\n\t\t\tif(targetElem.closest('.has-child').classList.contains('ly-active')) {\r\n\t\t\t\tdocument.querySelector('.ly-active').classList.remove('ly-active')\r\n\t\t\t\thide(document.querySelector('.ly-active ul') as HTMLElement, {});\r\n\t\t\t}\r\n\t\t\ttargetParent.classList.toggle('ly-active');\r\n\t\t\tshow(targetParent.querySelector('ul') as HTMLElement, {});\r\n\t\t} else {\r\n\t\t\ttargetParent.classList.toggle('ly-active');\r\n\t\t\thide(targetParent.querySelector('ul') as HTMLElement, {});\r\n\t\t}\r\n\t})\r\n})"],"names":["Numbers","Element","Events","parseOrElse","str","or","parseInt","isElement","element","HTMLElement","setStyles","styles","Object","keys","map","key","style","getBoxStyles","computedValue","window","getComputedStyle","height","padding","top","paddingTop","bottom","paddingBottom","border","borderTopWidth","borderBottomWidth","getElement","elementFromSelector","document","querySelector","Error","setAttribute","attribute","value","getAttribute","on","event","callback","addEventListener","destroy","removeEventListener","Animate","Hide","__rest","s","e","t","p","prototype","hasOwnProperty","call","indexOf","getOwnPropertySymbols","i","length","propertyIsEnumerable","slideToggleAttribute","onRequestAnimationFrame","requestAnimationFrame","getTransition","options","_a","miliseconds","_b","transitionFunction","shouldCollapse","hide","isHidden","onAnimationStart","boxStyles","transition","overflow","onAnimationEnd","show","isShown","display","Show","Toggle","toggle","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","d","definition","o","defineProperty","enumerable","get","obj","prop","r","Symbol","toStringTag","querySelectorAll","forEach","linkElem","index","hasAttribute","endsWith","classList","setTimeout","mail","maddr","linktext","a","createElement","innerHTML","parentElement","appendChild","add","preventDefault","scrollTo","left","behavior","getElementsByTagName","getElementsByClassName","marginTop","navheader","navheight","offsetHeight","scrollY","remove","contains","openerElem","targetElem","currentTarget","targetParent","closest"],"sourceRoot":""} --------------------------------------------------------------------------------