├── .editorconfig ├── .forestry └── settings.yml ├── .gitignore ├── LICENSE ├── README.md ├── archetypes └── default.md ├── assets ├── js │ ├── bootstrap.js │ └── script.js ├── plugins │ ├── search │ │ ├── fuse.js │ │ └── search.js │ └── webfont │ │ └── webfont-loader-2.js └── scss │ ├── _buttons.scss │ ├── _common.scss │ ├── _mixins.scss │ ├── _typography.scss │ ├── bootstrap │ ├── _accordion.scss │ ├── _alert.scss │ ├── _badge.scss │ ├── _bootstrap-grid.scss │ ├── _bootstrap-reboot.scss │ ├── _bootstrap-utilities.scss │ ├── _bootstrap.scss │ ├── _breadcrumb.scss │ ├── _button-group.scss │ ├── _buttons.scss │ ├── _card.scss │ ├── _carousel.scss │ ├── _close.scss │ ├── _containers.scss │ ├── _dropdown.scss │ ├── _forms.scss │ ├── _functions.scss │ ├── _grid.scss │ ├── _helpers.scss │ ├── _images.scss │ ├── _list-group.scss │ ├── _mixins.scss │ ├── _modal.scss │ ├── _nav.scss │ ├── _navbar.scss │ ├── _offcanvas.scss │ ├── _pagination.scss │ ├── _popover.scss │ ├── _progress.scss │ ├── _reboot.scss │ ├── _root.scss │ ├── _spinners.scss │ ├── _tables.scss │ ├── _toasts.scss │ ├── _tooltip.scss │ ├── _transitions.scss │ ├── _type.scss │ ├── _utilities.scss │ ├── _variables.scss │ ├── forms │ │ ├── _floating-labels.scss │ │ ├── _form-check.scss │ │ ├── _form-control.scss │ │ ├── _form-range.scss │ │ ├── _form-select.scss │ │ ├── _form-text.scss │ │ ├── _input-group.scss │ │ ├── _labels.scss │ │ └── _validation.scss │ ├── helpers │ │ ├── _clearfix.scss │ │ ├── _colored-links.scss │ │ ├── _position.scss │ │ ├── _ratio.scss │ │ ├── _stretched-link.scss │ │ ├── _text-truncation.scss │ │ └── _visually-hidden.scss │ ├── mixins │ │ ├── _alert.scss │ │ ├── _border-radius.scss │ │ ├── _box-shadow.scss │ │ ├── _breakpoints.scss │ │ ├── _buttons.scss │ │ ├── _caret.scss │ │ ├── _clearfix.scss │ │ ├── _color-scheme.scss │ │ ├── _container.scss │ │ ├── _deprecate.scss │ │ ├── _forms.scss │ │ ├── _gradients.scss │ │ ├── _grid.scss │ │ ├── _image.scss │ │ ├── _list-group.scss │ │ ├── _lists.scss │ │ ├── _pagination.scss │ │ ├── _reset-text.scss │ │ ├── _resize.scss │ │ ├── _table-variants.scss │ │ ├── _text-truncate.scss │ │ ├── _transition.scss │ │ ├── _utilities.scss │ │ └── _visually-hidden.scss │ ├── utilities │ │ └── _api.scss │ └── vendor │ │ └── _rfs.scss │ ├── style.scss │ └── templates │ ├── _main.scss │ └── _navigation.scss ├── config.toml ├── exampleSite ├── .hugo_build.lock ├── assets │ ├── images │ │ ├── author.png │ │ ├── banner-bg-shape.svg │ │ ├── banner.png │ │ ├── favicon.png │ │ ├── footer-bg-shape.svg │ │ ├── logo.png │ │ ├── map.png │ │ ├── post │ │ │ ├── how-to-use-geeky.jpeg │ │ │ ├── post-1.png │ │ │ ├── post-1 │ │ │ │ ├── Screenshot from 2024-03-25 09-46-54.png │ │ │ │ ├── pic-3.png │ │ │ │ ├── pic1.png │ │ │ │ ├── pic2.png │ │ │ │ ├── pic3.png │ │ │ │ ├── pic4.png │ │ │ │ └── pic5.png │ │ │ ├── post-2.png │ │ │ ├── post-3.png │ │ │ ├── post-4.png │ │ │ ├── post-5.png │ │ │ ├── post-6.png │ │ │ ├── post-7.png │ │ │ └── post-8.png │ │ └── promotion.png │ ├── jsconfig.json │ └── scss │ │ └── custom.scss ├── config │ └── _default │ │ ├── config.toml │ │ ├── menus.toml │ │ ├── module.toml │ │ └── params.toml ├── content │ ├── about.md │ ├── blog │ │ ├── _index.md │ │ ├── how-to-use-geeky.md │ │ ├── post-2.md │ │ ├── post-3.md │ │ ├── post-4.md │ │ ├── post-5.md │ │ ├── post-6.md │ │ ├── post-7.md │ │ └── post-8.md │ ├── contact.md │ ├── privacy-policy.md │ └── search.md ├── go.mod ├── netlify.toml └── static │ └── .htaccess ├── layouts ├── 404.html ├── _default │ ├── about.html │ ├── baseof.html │ ├── contact.html │ ├── index.json │ ├── list.html │ ├── post.html │ ├── robots.txt │ ├── search.html │ ├── single.html │ ├── sitemap.xml │ └── terms.html ├── index.html └── partials │ ├── footer.html │ ├── head.html │ ├── header.html │ ├── page-header.html │ ├── script.html │ ├── style.html │ └── widgets │ ├── about.html │ ├── categories.html │ ├── newsletter.html │ ├── recent-post.html │ └── widget-wrapper.html ├── netlify.toml ├── package.json └── yarn.lock /.editorconfig: -------------------------------------------------------------------------------- 1 | ; https://editorconfig.org 2 | 3 | root = true 4 | 5 | [*] 6 | charset = utf-8 7 | end_of_line = lf 8 | indent_size = 2 9 | indent_style = space 10 | trim_trailing_whitespace = true 11 | insert_final_newline = true 12 | 13 | [*.md] 14 | trim_trailing_whitespace = false 15 | -------------------------------------------------------------------------------- /.forestry/settings.yml: -------------------------------------------------------------------------------- 1 | --- 2 | new_page_extension: md 3 | auto_deploy: false 4 | admin_path: '' 5 | webhook_url: 6 | sections: 7 | - type: heading 8 | label: Homepage 9 | - type: document 10 | path: exampleSite/content/english/_index.md 11 | label: Homepage (en) 12 | - type: document 13 | path: exampleSite/content/deutsch/_index.md 14 | label: Homepage (de) 15 | - type: heading 16 | label: Blog 17 | - type: document 18 | path: exampleSite/content/english/blog/_index.md 19 | label: Blog Page (en) 20 | - type: document 21 | path: exampleSite/content/deutsch/blog/_index.md 22 | label: Blog Page (de) 23 | - type: directory 24 | path: exampleSite/content/english/blog 25 | label: Blog Post (en) 26 | create: documents 27 | match: "**/*" 28 | exclude: _index.md 29 | templates: 30 | - post 31 | - type: directory 32 | path: exampleSite/content/deutsch/blog 33 | label: Blog Post (de) 34 | create: documents 35 | match: "**/*" 36 | exclude: _index.md 37 | templates: 38 | - post 39 | - type: heading 40 | label: Others Page 41 | - type: document 42 | path: exampleSite/content/english/contact/_index.md 43 | label: Contact (en) 44 | - type: document 45 | path: exampleSite/content/deutsch/contact/_index.md 46 | label: Contact (de) 47 | - type: document 48 | path: exampleSite/content/english/pricing/_index.md 49 | label: Pricing (en) 50 | - type: document 51 | path: exampleSite/content/deutsch/pricing/_index.md 52 | label: Pricing (de) 53 | - type: document 54 | path: exampleSite/content/english/faq/_index.md 55 | label: FAQ (en) 56 | - type: document 57 | path: exampleSite/content/deutsch/faq/_index.md 58 | label: FAQ (de) 59 | - type: heading 60 | label: All Pages 61 | - type: directory 62 | path: exampleSite/content 63 | label: All Pages 64 | create: all 65 | match: "**/*" 66 | exclude: _index.md 67 | templates: 68 | - new-page 69 | - type: heading 70 | label: Configuration 71 | - type: document 72 | path: exampleSite/config/_default/config.toml 73 | label: Configuration 74 | - type: document 75 | path: exampleSite/config/_default/params.toml 76 | label: Parameters 77 | - type: document 78 | path: config.toml 79 | label: Variables & Plugins 80 | match: "**/*" 81 | - type: document 82 | path: exampleSite/config/_default/languages.toml 83 | label: Languages 84 | - type: document 85 | path: exampleSite/config/_default/menus.en.toml 86 | label: Menu (en) 87 | - type: document 88 | path: exampleSite/config/_default/menus.de.toml 89 | label: Menu (de) 90 | match: "**/*" 91 | upload_dir: exampleSite/static/images 92 | public_path: "/images" 93 | front_matter_path: '' 94 | use_front_matter_path: false 95 | file_template: ":filename:" 96 | build: 97 | preview_env: 98 | - HUGO_ENV=staging 99 | - HUGO_VERSION=0.81.0 100 | preview_output_directory: public 101 | preview_docker_image: forestryio/hugo:latest 102 | mount_path: "/srv" 103 | working_dir: "/srv" 104 | instant_preview_command: hugo server -D -E -F --port 8080 --bind 0.0.0.0 --renderToDisk 105 | -d public 106 | version: 0.81.0 -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | Thumbs.db 2 | .DS_Store 3 | .dist 4 | .tmp 5 | .sass-cache 6 | npm-debug.log 7 | node_modules 8 | builds 9 | package-lock.json 10 | public 11 | resources 12 | .hugo_build.lock 13 | jsconfig.json 14 | hugo_stats.json 15 | go.sum -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2019 - Present, Statichunt 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | 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, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 |

Geeky Hugo

3 |

Get Geeked out by Geeky, a personal Hugo blog theme that is fully responsive and super-fast.

4 |

Demo | Page Speed (85%)

5 | 6 | 7 |

8 | 9 | 10 | 11 | 12 | 13 | license 14 | 15 | code size 16 | 17 | 18 | contributors 19 | 20 | 21 | follow on Twitter 23 |

24 | 25 | --- 26 | 27 |

28 | 29 | ![geeky-hugo-startup-theme](https://user-images.githubusercontent.com/17677384/140605658-0c68cf6c-d15a-4f0d-8e66-1060ce636d20.png) 30 |

31 | 32 | --- 33 | ## Key Features 34 | - Hugo module support 35 | - Google analytics, AdSense support 36 | - Image optimize with hugo pipe 37 | - CSS and JS bundle with hugo pipe 38 | - Netlify settings predefine 39 | - Forestry cms pre-configured 40 | - Google font loads from webfont loader 41 | - Caching enable 42 | - Color and fonts variable in config file 43 | - Contact form Support 44 | - Search by fuse.js 45 | - Mailchimp integrate 46 | - GDPR consent enable 47 | - Google page speed optimized 48 | - Open graph meta tag 49 | - Twitter card meta tag 50 | 51 | 52 | ## Local development 53 | 54 | ```bash 55 | # clone the repository 56 | git clone git@github.com:statichunt/geeky-hugo.git 57 | 58 | # cd in the project directory 59 | $ cd geeky-hugo/exampleSite/ 60 | 61 | # Start local dev server 62 | $ hugo server --themesDir ../.. 63 | ``` 64 | 65 | ## Deployment and hosting 66 | 67 | ## Netlify 68 | 69 | [![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/statichunt/geeky-hugo) 70 | 71 | Follow these steps. 72 | 73 | 74 | ## Render 75 | 76 | ![Deploy to Render](https://www.render.com) 77 | 78 | To deploy your Hugo site on Render, follow these steps: 79 | 80 | 1. **Create a New Static Site** on Render's dashboard. 81 | 2. **Link the Git Repository** that contains your Hugo site. 82 | 3. Navigate to **Settings > Build & Deploy**. 83 | 84 | Configure the build settings as follows: 85 | 86 | - **Build Command**: 87 | 88 | ```bash 89 | mkdir geeky-hugo; mv * geeky-hugo/.; hugo -s geeky-hugo/exampleSite --minify --gc --themesDir ../.. 90 | ``` 91 | 92 | - **Publish Directory**: 93 | 94 | ```bash 95 | geeky-hugo/exampleSite/public 96 | ``` 97 | 98 | 99 | ## Reporting Issues 100 | We use GitHub Issues as the official bug tracker for the geeky Template. Please Search [existing 101 | issues](https://github.com/statichunt/geeky-hugo/issues). Someone may have already reported the same problem. 102 | If your problem or idea has not been addressed yet, feel free to [open a new 103 | issue](https://github.com/statichunt/geeky-hugo/issues). 104 | 105 | 108 | 109 | 110 | ## License 111 | Copyright © Designed and developed by [Statichunt](https://statichunt.com) 112 | 113 | **Code License:** Released under the [MIT](https://github.com/statichunt/geeky-hugo/blob/master/LICENSE) license. 114 | 115 | **Image license:** The images are only for demonstration purposes. They have their licenses. We don't have permission to 116 | share those images. 117 | 118 | 119 | ## Special Thanks 120 | - [Bootstrap](https://getbootstrap.com) 121 | - [Jquery](https://jquery.com) 122 | - [Font Awesome Icons](https://fontawesome.com) 123 | - [Fuse Js](https://fusejs.io) 124 | - [Google Fonts](https://fonts.google.com/) 125 | - [All Contributors](https://github.com/statichunt/geeky-hugo/graphs/contributors) 126 | -------------------------------------------------------------------------------- /archetypes/default.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "{{ replace .Name "-" " " | title }}" 3 | date: {{ .Date }} 4 | draft: true 5 | sitemapExclude: false 6 | # description 7 | description: "This is meta description" 8 | --- -------------------------------------------------------------------------------- /assets/js/bootstrap.js: -------------------------------------------------------------------------------- 1 | // bootstrap js components 2 | // import Alert from "js/bootstrap/src/alert"; 3 | // import Button from "js/bootstrap/src/button"; 4 | // import Carousel from "js/bootstrap/src/carousel"; 5 | import Collapse from "js/bootstrap/src/collapse"; 6 | import Dropdown from "js/bootstrap/src/dropdown"; 7 | import Modal from "js/bootstrap/src/modal"; 8 | import Offcanvas from "js/bootstrap/src/offcanvas"; 9 | // import Popover from "js/bootstrap/src/popover"; 10 | // import ScrollSpy from "js/bootstrap/src/scrollspy"; 11 | import Tab from "js/bootstrap/src/tab"; 12 | // import Toast from "js/bootstrap/src/toast"; 13 | // import Tooltip from "js/bootstrap/src/tooltip"; 14 | 15 | // bootstrap popover and toats 16 | // (function () { 17 | // "use strict"; 18 | // let toastElList = [].slice.call(document.querySelectorAll(".toast")); 19 | // let toastList = toastElList.map(function (toastEl) { 20 | // return new Toast(toastEl); 21 | // }); 22 | 23 | // toastList.forEach(function (toast) { 24 | // toast.show(); 25 | // }); 26 | 27 | // let popoverTriggerList = [].slice.call( 28 | // document.querySelectorAll('[data-bs-toggle="popover"]') 29 | // ); 30 | // popoverTriggerList.map(function (popoverTriggerEl) { 31 | // return new Popover(popoverTriggerEl); 32 | // }); 33 | // })(); 34 | -------------------------------------------------------------------------------- /assets/js/script.js: -------------------------------------------------------------------------------- 1 | // main script 2 | (function () { 3 | "use strict"; 4 | })(); 5 | -------------------------------------------------------------------------------- /assets/plugins/search/search.js: -------------------------------------------------------------------------------- 1 | summaryInclude = 100; 2 | var fuseOptions = { 3 | isCaseSensitive: false, 4 | includeScore: false, 5 | shouldSort: true, 6 | includeMatches: true, 7 | findAllMatches: false, 8 | minMatchCharLength: 3, 9 | location: 0, 10 | threshold: 0.6, 11 | distance: 50, 12 | useExtendedSearch: false, 13 | ignoreLocation: false, 14 | ignoreFieldNorm: false, 15 | keys: [ 16 | { 17 | name: "title", 18 | weight: 0.8, 19 | }, 20 | { 21 | name: "tags", 22 | weight: 0.5, 23 | }, 24 | { 25 | name: "categories", 26 | weight: 0.5, 27 | }, 28 | { 29 | name: "contents", 30 | weight: 0.3, 31 | }, 32 | ], 33 | }; 34 | 35 | var searchQuery = param("s"); 36 | if (searchQuery) { 37 | document.querySelector("#search-query").value = searchQuery; 38 | executeSearch(searchQuery); 39 | } 40 | 41 | function executeSearch(searchQuery) { 42 | fetch(indexURL) 43 | .then((res) => res.json()) 44 | .then((data) => { 45 | var pages = data; 46 | var fuse = new Fuse(pages, fuseOptions); 47 | var result = fuse.search(searchQuery); 48 | if (result.length > 0) { 49 | populateResults(result); 50 | } else { 51 | document.querySelector("#search-results").innerHTML = 52 | '

No Search Found

'; 53 | } 54 | }); 55 | } 56 | 57 | function populateResults(result) { 58 | result.forEach((value, key) => { 59 | var contents = value.item.contents; 60 | var snippet = ""; 61 | var snippetHighlights = []; 62 | const matchValue = value.matches; 63 | 64 | matchValue.forEach((mvalue, matchKey) => { 65 | if (mvalue.key === "tags" || mvalue.key === "categories") { 66 | snippetHighlights.push(mvalue.value); 67 | } else if (mvalue.key == "contents") { 68 | start = 69 | mvalue.indices[0][0] - summaryInclude > 0 70 | ? mvalue.indices[0][0] - summaryInclude 71 | : 0; 72 | end = 73 | mvalue.indices[0][1] + summaryInclude < contents.length 74 | ? mvalue.indices[0][1] + summaryInclude 75 | : contents.length; 76 | snippet += contents.substring(start, end); 77 | snippetHighlights.push( 78 | mvalue.value.substring( 79 | mvalue.indices[0][0], 80 | mvalue.indices[0][1] - mvalue.indices[0][0] + 1 81 | ) 82 | ); 83 | } 84 | }); 85 | 86 | if (snippet.length < 1) { 87 | snippet += contents.substring(0, summaryInclude * 2); 88 | } 89 | //pull template from hugo templarte definition 90 | var templateDefinition = document.querySelector( 91 | "#search-result-template" 92 | ).innerHTML; 93 | //replace values 94 | var output = render(templateDefinition, { 95 | key: key, 96 | title: value.item.title, 97 | image: value.item.image, 98 | date: value.item.date, 99 | link: value.item.permalink, 100 | tags: value.item.tags, 101 | categories: value.item.categories, 102 | snippet: snippet, 103 | }); 104 | // $('#search-results').append(output); 105 | const searchResults = document.querySelector("#search-results"); 106 | searchResults.insertAdjacentHTML("beforeend", output); 107 | }); 108 | } 109 | 110 | function param(name) { 111 | return decodeURIComponent( 112 | (location.search.split(name + "=")[1] || "").split("&")[0] 113 | ).replace(/\+/g, " "); 114 | } 115 | 116 | function render(templateString, data) { 117 | var conditionalMatches, conditionalPattern, copy; 118 | conditionalPattern = /\$\{\s*isset ([a-zA-Z]*) \s*\}(.*)\$\{\s*end\s*}/g; 119 | //since loop below depends on re.lastInxdex, we use a copy to capture any manipulations whilst inside the loop 120 | copy = templateString; 121 | while ( 122 | (conditionalMatches = conditionalPattern.exec(templateString)) !== null 123 | ) { 124 | if (data[conditionalMatches[1]]) { 125 | //valid key, remove conditionals, leave contents. 126 | copy = copy.replace(conditionalMatches[0], conditionalMatches[2]); 127 | } else { 128 | //not valid, remove entire section 129 | copy = copy.replace(conditionalMatches[0], ""); 130 | } 131 | } 132 | templateString = copy; 133 | //now any conditionals removed we can do simple substitution 134 | var key, find, re; 135 | for (key in data) { 136 | find = "\\$\\{\\s*" + key + "\\s*\\}"; 137 | re = new RegExp(find, "g"); 138 | templateString = templateString.replace(re, data[key]); 139 | } 140 | return templateString; 141 | } 142 | 143 | // Search Form Open 144 | let searchToggle = document.querySelectorAll(".toggle-search"); 145 | if (searchToggle) { 146 | searchToggle.forEach((ts) => { 147 | ts.addEventListener("click", function () { 148 | document.querySelector("#search-wrap").classList.toggle("open"); 149 | }); 150 | }); 151 | } 152 | -------------------------------------------------------------------------------- /assets/scss/_buttons.scss: -------------------------------------------------------------------------------- 1 | /* Button style */ 2 | .btn { 3 | font-size: 1rem; 4 | font-family: $font-secondary; 5 | text-transform: capitalize; 6 | padding: .8em 2em; 7 | border-radius: 0; 8 | border: 1px solid; 9 | position: relative; 10 | font-weight: 700; 11 | text-align: center; 12 | z-index: 1; 13 | transition: .2s ease; 14 | border-radius: 50px; 15 | overflow: hidden; 16 | 17 | &:hover{ 18 | color: $white; 19 | } 20 | 21 | &:hover, 22 | &:active, 23 | &.active, 24 | &:focus, 25 | &.focus { 26 | outline: 0; 27 | box-shadow: none !important; 28 | } 29 | &-sm{ 30 | padding: .6em 1.5em; 31 | } 32 | } 33 | 34 | .btn-primary { 35 | background: $color-primary; 36 | color: $white; 37 | border-color: $color-primary; 38 | 39 | &:hover, 40 | &:active, 41 | &.active, 42 | &:focus, 43 | &.focus { 44 | background: $color-primary !important; 45 | border-color: $color-primary !important; 46 | } 47 | } 48 | 49 | .btn-outline-primary { 50 | background: transparent; 51 | color: $color-primary; 52 | border-color: $color-primary; 53 | 54 | &:hover, 55 | &:active, 56 | &.active, 57 | &:focus, 58 | &.focus { 59 | background: $color-primary !important; 60 | border-color: $color-primary !important; 61 | } 62 | } 63 | 64 | 65 | /**! ----- Button Hover ---- **/ 66 | .btn:after, 67 | .btn:before { 68 | content: ''; 69 | display: block; 70 | position: absolute; 71 | top: 0px; 72 | right: 0px; 73 | height: 100%; 74 | width: 0px; 75 | z-index: -1; 76 | border-radius: 50px; 77 | content: ''; 78 | background: rgba(0, 0, 0, 0.05); 79 | transition: all 0.4s cubic-bezier(0.42, 0, 0.58, 1); 80 | } 81 | 82 | .btn:hover:before, .btn:hover:after { 83 | left: 0%; 84 | right: auto; 85 | width: 100%; 86 | } -------------------------------------------------------------------------------- /assets/scss/_mixins.scss: -------------------------------------------------------------------------------- 1 | // small mobile 2 | @mixin mobile-xs { 3 | @media(max-width:400px) { 4 | @content; 5 | } 6 | } 7 | 8 | // mobile 9 | @mixin mobile { 10 | @media(max-width:575px) { 11 | @content; 12 | } 13 | } 14 | 15 | // tablet 16 | @mixin tablet { 17 | @media(max-width:767px) { 18 | @content; 19 | } 20 | } 21 | 22 | // desktop 23 | @mixin desktop { 24 | @media(max-width:991px) { 25 | @content; 26 | } 27 | } 28 | 29 | // large desktop 30 | @mixin desktop-lg { 31 | @media(max-width:1199px) { 32 | @content; 33 | } 34 | } 35 | 36 | // xlarge desktop 37 | @mixin desktop-xl { 38 | @media(max-width:1399px) { 39 | @content; 40 | } 41 | } -------------------------------------------------------------------------------- /assets/scss/_typography.scss: -------------------------------------------------------------------------------- 1 | /* typography */ 2 | 3 | html { 4 | font-size: $font-size; 5 | } 6 | 7 | body { 8 | font-family: $font-primary; 9 | font-weight: 400; 10 | line-height: 1.75; 11 | color: $text-color; 12 | } 13 | 14 | p { 15 | margin-bottom: 1rem; 16 | } 17 | 18 | h1, 19 | h2, 20 | h3, 21 | h4, 22 | h5, 23 | h6 { 24 | font-family: $font-secondary; 25 | font-weight: 700; 26 | color: $text-dark; 27 | } 28 | 29 | small, 30 | .small { 31 | font-size: 0.8rem; 32 | } 33 | 34 | // List in descending order to prevent extra sort function 35 | $type-levels: 6, 5, 4, 3, 2, 1; 36 | 37 | // Create map with h[x] as key 38 | $level-size: $font-size; 39 | @each $level in $type-levels { 40 | $level-size: $level-size * $font-scale; 41 | // Output heading styles 42 | h#{$level}, 43 | .h#{$level} { 44 | font-size: $level-size; 45 | line-height: calc(2px + 2ex + 2px); 46 | margin-bottom: 0.65em; 47 | @include tablet { 48 | font-size: calc( #{$level-size} * .85); 49 | } 50 | @include mobile { 51 | font-size: calc( #{$level-size} * .65); 52 | } 53 | } 54 | } -------------------------------------------------------------------------------- /assets/scss/bootstrap/_accordion.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Base styles 3 | // 4 | 5 | .accordion-button { 6 | position: relative; 7 | display: flex; 8 | align-items: center; 9 | width: 100%; 10 | padding: $accordion-button-padding-y $accordion-button-padding-x; 11 | @include font-size($font-size-base); 12 | color: $accordion-button-color; 13 | text-align: left; // Reset button style 14 | background-color: $accordion-button-bg; 15 | border: 0; 16 | @include border-radius(0); 17 | overflow-anchor: none; 18 | @include transition($accordion-transition); 19 | 20 | &:not(.collapsed) { 21 | color: $accordion-button-active-color; 22 | background-color: $accordion-button-active-bg; 23 | box-shadow: inset 0 ($accordion-border-width * -1) 0 $accordion-border-color; 24 | 25 | &::after { 26 | background-image: escape-svg($accordion-button-active-icon); 27 | transform: $accordion-icon-transform; 28 | } 29 | } 30 | 31 | // Accordion icon 32 | &::after { 33 | flex-shrink: 0; 34 | width: $accordion-icon-width; 35 | height: $accordion-icon-width; 36 | margin-left: auto; 37 | content: ""; 38 | background-image: escape-svg($accordion-button-icon); 39 | background-repeat: no-repeat; 40 | background-size: $accordion-icon-width; 41 | @include transition($accordion-icon-transition); 42 | } 43 | 44 | &:hover { 45 | z-index: 2; 46 | } 47 | 48 | &:focus { 49 | z-index: 3; 50 | border-color: $accordion-button-focus-border-color; 51 | outline: 0; 52 | box-shadow: $accordion-button-focus-box-shadow; 53 | } 54 | } 55 | 56 | .accordion-header { 57 | margin-bottom: 0; 58 | } 59 | 60 | .accordion-item { 61 | background-color: $accordion-bg; 62 | border: $accordion-border-width solid $accordion-border-color; 63 | 64 | &:first-of-type { 65 | @include border-top-radius($accordion-border-radius); 66 | 67 | .accordion-button { 68 | @include border-top-radius($accordion-inner-border-radius); 69 | } 70 | } 71 | 72 | &:not(:first-of-type) { 73 | border-top: 0; 74 | } 75 | 76 | // Only set a border-radius on the last item if the accordion is collapsed 77 | &:last-of-type { 78 | @include border-bottom-radius($accordion-border-radius); 79 | 80 | .accordion-button { 81 | &.collapsed { 82 | @include border-bottom-radius($accordion-inner-border-radius); 83 | } 84 | } 85 | 86 | .accordion-collapse { 87 | @include border-bottom-radius($accordion-border-radius); 88 | } 89 | } 90 | } 91 | 92 | .accordion-body { 93 | padding: $accordion-body-padding-y $accordion-body-padding-x; 94 | } 95 | 96 | 97 | // Flush accordion items 98 | // 99 | // Remove borders and border-radius to keep accordion items edge-to-edge. 100 | 101 | .accordion-flush { 102 | .accordion-collapse { 103 | border-width: 0; 104 | } 105 | 106 | .accordion-item { 107 | border-right: 0; 108 | border-left: 0; 109 | @include border-radius(0); 110 | 111 | &:first-child { border-top: 0; } 112 | &:last-child { border-bottom: 0; } 113 | 114 | .accordion-button { 115 | @include border-radius(0); 116 | } 117 | } 118 | } 119 | -------------------------------------------------------------------------------- /assets/scss/bootstrap/_alert.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Base styles 3 | // 4 | 5 | .alert { 6 | position: relative; 7 | padding: $alert-padding-y $alert-padding-x; 8 | margin-bottom: $alert-margin-bottom; 9 | border: $alert-border-width solid transparent; 10 | @include border-radius($alert-border-radius); 11 | } 12 | 13 | // Headings for larger alerts 14 | .alert-heading { 15 | // Specified to prevent conflicts of changing $headings-color 16 | color: inherit; 17 | } 18 | 19 | // Provide class for links that match alerts 20 | .alert-link { 21 | font-weight: $alert-link-font-weight; 22 | } 23 | 24 | 25 | // Dismissible alerts 26 | // 27 | // Expand the right padding and account for the close button's positioning. 28 | 29 | .alert-dismissible { 30 | padding-right: $alert-dismissible-padding-r; 31 | 32 | // Adjust close link position 33 | .btn-close { 34 | position: absolute; 35 | top: 0; 36 | right: 0; 37 | z-index: $stretched-link-z-index + 1; 38 | padding: $alert-padding-y * 1.25 $alert-padding-x; 39 | } 40 | } 41 | 42 | 43 | // scss-docs-start alert-modifiers 44 | // Generate contextual modifier classes for colorizing the alert. 45 | 46 | @each $state, $value in $theme-colors { 47 | $alert-background: shift-color($value, $alert-bg-scale); 48 | $alert-border: shift-color($value, $alert-border-scale); 49 | $alert-color: shift-color($value, $alert-color-scale); 50 | @if (contrast-ratio($alert-background, $alert-color) < $min-contrast-ratio) { 51 | $alert-color: mix($value, color-contrast($alert-background), abs($alert-color-scale)); 52 | } 53 | .alert-#{$state} { 54 | @include alert-variant($alert-background, $alert-border, $alert-color); 55 | } 56 | } 57 | // scss-docs-end alert-modifiers 58 | -------------------------------------------------------------------------------- /assets/scss/bootstrap/_badge.scss: -------------------------------------------------------------------------------- 1 | // Base class 2 | // 3 | // Requires one of the contextual, color modifier classes for `color` and 4 | // `background-color`. 5 | 6 | .badge { 7 | display: inline-block; 8 | padding: $badge-padding-y $badge-padding-x; 9 | @include font-size($badge-font-size); 10 | font-weight: $badge-font-weight; 11 | line-height: 1; 12 | color: $badge-color; 13 | text-align: center; 14 | white-space: nowrap; 15 | vertical-align: baseline; 16 | @include border-radius($badge-border-radius); 17 | @include gradient-bg(); 18 | 19 | // Empty badges collapse automatically 20 | &:empty { 21 | display: none; 22 | } 23 | } 24 | 25 | // Quick fix for badges in buttons 26 | .btn .badge { 27 | position: relative; 28 | top: -1px; 29 | } 30 | -------------------------------------------------------------------------------- /assets/scss/bootstrap/_bootstrap-grid.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap Grid v5.0.2 (https://getbootstrap.com/) 3 | * Copyright 2011-2021 The Bootstrap Authors 4 | * Copyright 2011-2021 Twitter, Inc. 5 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 6 | */ 7 | 8 | $include-column-box-sizing: true !default; 9 | 10 | @import "functions"; 11 | @import "variables"; 12 | 13 | @import "mixins/lists"; 14 | @import "mixins/breakpoints"; 15 | @import "mixins/container"; 16 | @import "mixins/grid"; 17 | @import "mixins/utilities"; 18 | 19 | @import "vendor/rfs"; 20 | 21 | @import "containers"; 22 | @import "grid"; 23 | 24 | @import "utilities"; 25 | // Only use the utilities we need 26 | // stylelint-disable-next-line scss/dollar-variable-default 27 | $utilities: map-get-multiple( 28 | $utilities, 29 | ( 30 | "display", 31 | "order", 32 | "flex", 33 | "flex-direction", 34 | "flex-grow", 35 | "flex-shrink", 36 | "flex-wrap", 37 | "justify-content", 38 | "align-items", 39 | "align-content", 40 | "align-self", 41 | "margin", 42 | "margin-x", 43 | "margin-y", 44 | "margin-top", 45 | "margin-end", 46 | "margin-bottom", 47 | "margin-start", 48 | "negative-margin", 49 | "negative-margin-x", 50 | "negative-margin-y", 51 | "negative-margin-top", 52 | "negative-margin-end", 53 | "negative-margin-bottom", 54 | "negative-margin-start", 55 | "padding", 56 | "padding-x", 57 | "padding-y", 58 | "padding-top", 59 | "padding-end", 60 | "padding-bottom", 61 | "padding-start", 62 | ) 63 | ); 64 | 65 | @import "utilities/api"; 66 | -------------------------------------------------------------------------------- /assets/scss/bootstrap/_bootstrap-reboot.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap Reboot v5.0.2 (https://getbootstrap.com/) 3 | * Copyright 2011-2021 The Bootstrap Authors 4 | * Copyright 2011-2021 Twitter, Inc. 5 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 6 | * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) 7 | */ 8 | 9 | @import "functions"; 10 | @import "variables"; 11 | // Prevent the usage of custom properties since we don't add them to `:root` in reboot 12 | $font-family-base: $font-family-sans-serif; // stylelint-disable-line scss/dollar-variable-default 13 | $font-family-code: $font-family-monospace; // stylelint-disable-line scss/dollar-variable-default 14 | @import "mixins"; 15 | @import "reboot"; 16 | -------------------------------------------------------------------------------- /assets/scss/bootstrap/_bootstrap-utilities.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap Utilities v5.0.2 (https://getbootstrap.com/) 3 | * Copyright 2011-2021 The Bootstrap Authors 4 | * Copyright 2011-2021 Twitter, Inc. 5 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 6 | */ 7 | 8 | // Configuration 9 | @import "functions"; 10 | @import "variables"; 11 | @import "mixins"; 12 | @import "utilities"; 13 | 14 | // Helpers 15 | @import "helpers"; 16 | 17 | // Utilities 18 | @import "utilities/api"; 19 | -------------------------------------------------------------------------------- /assets/scss/bootstrap/_bootstrap.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v5.2 (https://getbootstrap.com/) 3 | */ 4 | 5 | // Configuration 6 | @import "functions"; 7 | @import "variables"; 8 | @import "maps"; 9 | @import "mixins"; 10 | @import "utilities"; 11 | 12 | // Layout & components 13 | @import "root"; 14 | @import "reboot"; 15 | @import "type"; 16 | @import "images"; 17 | @import "containers"; 18 | @import "grid"; 19 | @import "tables"; 20 | @import "forms"; 21 | @import "buttons"; 22 | @import "transitions"; 23 | @import "dropdown"; 24 | // @import "button-group"; 25 | @import "nav"; 26 | @import "navbar"; 27 | @import "card"; 28 | @import "accordion"; 29 | @import "breadcrumb"; 30 | @import "pagination"; 31 | // @import "badge"; 32 | // @import "alert"; 33 | // @import "progress"; 34 | // @import "list-group"; 35 | // @import "close"; 36 | // @import "toasts"; 37 | @import "modal"; 38 | // @import "tooltip"; 39 | // @import "popover"; 40 | // @import "carousel"; 41 | // @import "spinners"; 42 | @import "offcanvas"; 43 | // @import "placeholders"; 44 | 45 | // Helpers 46 | @import "helpers"; 47 | 48 | // Utilities 49 | @import "utilities/api"; 50 | // scss-docs-end import-stack 51 | -------------------------------------------------------------------------------- /assets/scss/bootstrap/_breadcrumb.scss: -------------------------------------------------------------------------------- 1 | .breadcrumb { 2 | display: flex; 3 | flex-wrap: wrap; 4 | padding: $breadcrumb-padding-y $breadcrumb-padding-x; 5 | margin-bottom: $breadcrumb-margin-bottom; 6 | @include font-size($breadcrumb-font-size); 7 | list-style: none; 8 | background-color: $breadcrumb-bg; 9 | @include border-radius($breadcrumb-border-radius); 10 | } 11 | 12 | .breadcrumb-item { 13 | // The separator between breadcrumbs (by default, a forward-slash: "/") 14 | + .breadcrumb-item { 15 | padding-left: $breadcrumb-item-padding-x; 16 | 17 | &::before { 18 | float: left; // Suppress inline spacings and underlining of the separator 19 | padding-right: $breadcrumb-item-padding-x; 20 | color: $breadcrumb-divider-color; 21 | content: var(--#{$variable-prefix}breadcrumb-divider, escape-svg($breadcrumb-divider)) #{"/* rtl:"} var(--#{$variable-prefix}breadcrumb-divider, escape-svg($breadcrumb-divider-flipped)) #{"*/"}; 22 | } 23 | } 24 | 25 | &.active { 26 | color: $breadcrumb-active-color; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /assets/scss/bootstrap/_button-group.scss: -------------------------------------------------------------------------------- 1 | // Make the div behave like a button 2 | .btn-group, 3 | .btn-group-vertical { 4 | position: relative; 5 | display: inline-flex; 6 | vertical-align: middle; // match .btn alignment given font-size hack above 7 | 8 | > .btn { 9 | position: relative; 10 | flex: 1 1 auto; 11 | } 12 | 13 | // Bring the hover, focused, and "active" buttons to the front to overlay 14 | // the borders properly 15 | > .btn-check:checked + .btn, 16 | > .btn-check:focus + .btn, 17 | > .btn:hover, 18 | > .btn:focus, 19 | > .btn:active, 20 | > .btn.active { 21 | z-index: 1; 22 | } 23 | } 24 | 25 | // Optional: Group multiple button groups together for a toolbar 26 | .btn-toolbar { 27 | display: flex; 28 | flex-wrap: wrap; 29 | justify-content: flex-start; 30 | 31 | .input-group { 32 | width: auto; 33 | } 34 | } 35 | 36 | .btn-group { 37 | // Prevent double borders when buttons are next to each other 38 | > .btn:not(:first-child), 39 | > .btn-group:not(:first-child) { 40 | margin-left: -$btn-border-width; 41 | } 42 | 43 | // Reset rounded corners 44 | > .btn:not(:last-child):not(.dropdown-toggle), 45 | > .btn-group:not(:last-child) > .btn { 46 | @include border-end-radius(0); 47 | } 48 | 49 | // The left radius should be 0 if the button is: 50 | // - the "third or more" child 51 | // - the second child and the previous element isn't `.btn-check` (making it the first child visually) 52 | // - part of a btn-group which isn't the first child 53 | > .btn:nth-child(n + 3), 54 | > :not(.btn-check) + .btn, 55 | > .btn-group:not(:first-child) > .btn { 56 | @include border-start-radius(0); 57 | } 58 | } 59 | 60 | // Sizing 61 | // 62 | // Remix the default button sizing classes into new ones for easier manipulation. 63 | 64 | .btn-group-sm > .btn { @extend .btn-sm; } 65 | .btn-group-lg > .btn { @extend .btn-lg; } 66 | 67 | 68 | // 69 | // Split button dropdowns 70 | // 71 | 72 | .dropdown-toggle-split { 73 | padding-right: $btn-padding-x * .75; 74 | padding-left: $btn-padding-x * .75; 75 | 76 | &::after, 77 | .dropup &::after, 78 | .dropend &::after { 79 | margin-left: 0; 80 | } 81 | 82 | .dropstart &::before { 83 | margin-right: 0; 84 | } 85 | } 86 | 87 | .btn-sm + .dropdown-toggle-split { 88 | padding-right: $btn-padding-x-sm * .75; 89 | padding-left: $btn-padding-x-sm * .75; 90 | } 91 | 92 | .btn-lg + .dropdown-toggle-split { 93 | padding-right: $btn-padding-x-lg * .75; 94 | padding-left: $btn-padding-x-lg * .75; 95 | } 96 | 97 | 98 | // The clickable button for toggling the menu 99 | // Set the same inset shadow as the :active state 100 | .btn-group.show .dropdown-toggle { 101 | @include box-shadow($btn-active-box-shadow); 102 | 103 | // Show no shadow for `.btn-link` since it has no other button styles. 104 | &.btn-link { 105 | @include box-shadow(none); 106 | } 107 | } 108 | 109 | 110 | // 111 | // Vertical button groups 112 | // 113 | 114 | .btn-group-vertical { 115 | flex-direction: column; 116 | align-items: flex-start; 117 | justify-content: center; 118 | 119 | > .btn, 120 | > .btn-group { 121 | width: 100%; 122 | } 123 | 124 | > .btn:not(:first-child), 125 | > .btn-group:not(:first-child) { 126 | margin-top: -$btn-border-width; 127 | } 128 | 129 | // Reset rounded corners 130 | > .btn:not(:last-child):not(.dropdown-toggle), 131 | > .btn-group:not(:last-child) > .btn { 132 | @include border-bottom-radius(0); 133 | } 134 | 135 | > .btn ~ .btn, 136 | > .btn-group:not(:first-child) > .btn { 137 | @include border-top-radius(0); 138 | } 139 | } 140 | -------------------------------------------------------------------------------- /assets/scss/bootstrap/_buttons.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Base styles 3 | // 4 | 5 | .btn { 6 | display: inline-block; 7 | font-family: $btn-font-family; 8 | font-weight: $btn-font-weight; 9 | line-height: $btn-line-height; 10 | color: $body-color; 11 | text-align: center; 12 | text-decoration: if($link-decoration == none, null, none); 13 | white-space: $btn-white-space; 14 | vertical-align: middle; 15 | cursor: if($enable-button-pointers, pointer, null); 16 | user-select: none; 17 | background-color: transparent; 18 | border: $btn-border-width solid transparent; 19 | @include button-size($btn-padding-y, $btn-padding-x, $btn-font-size, $btn-border-radius); 20 | @include transition($btn-transition); 21 | 22 | &:hover { 23 | color: $body-color; 24 | text-decoration: if($link-hover-decoration == underline, none, null); 25 | } 26 | 27 | .btn-check:focus + &, 28 | &:focus { 29 | outline: 0; 30 | box-shadow: $btn-focus-box-shadow; 31 | } 32 | 33 | .btn-check:checked + &, 34 | .btn-check:active + &, 35 | &:active, 36 | &.active { 37 | @include box-shadow($btn-active-box-shadow); 38 | 39 | &:focus { 40 | @include box-shadow($btn-focus-box-shadow, $btn-active-box-shadow); 41 | } 42 | } 43 | 44 | &:disabled, 45 | &.disabled, 46 | fieldset:disabled & { 47 | pointer-events: none; 48 | opacity: $btn-disabled-opacity; 49 | @include box-shadow(none); 50 | } 51 | } 52 | 53 | 54 | // 55 | // Alternate buttons 56 | // 57 | 58 | // scss-docs-start btn-variant-loops 59 | @each $color, $value in $theme-colors { 60 | .btn-#{$color} { 61 | @include button-variant($value, $value); 62 | } 63 | } 64 | 65 | @each $color, $value in $theme-colors { 66 | .btn-outline-#{$color} { 67 | @include button-outline-variant($value); 68 | } 69 | } 70 | // scss-docs-end btn-variant-loops 71 | 72 | 73 | // 74 | // Link buttons 75 | // 76 | 77 | // Make a button look and behave like a link 78 | .btn-link { 79 | font-weight: $font-weight-normal; 80 | color: $btn-link-color; 81 | text-decoration: $link-decoration; 82 | 83 | &:hover { 84 | color: $btn-link-hover-color; 85 | text-decoration: $link-hover-decoration; 86 | } 87 | 88 | &:focus { 89 | text-decoration: $link-hover-decoration; 90 | } 91 | 92 | &:disabled, 93 | &.disabled { 94 | color: $btn-link-disabled-color; 95 | } 96 | 97 | // No need for an active state here 98 | } 99 | 100 | 101 | // 102 | // Button Sizes 103 | // 104 | 105 | .btn-lg { 106 | @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-border-radius-lg); 107 | } 108 | 109 | .btn-sm { 110 | @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-border-radius-sm); 111 | } 112 | -------------------------------------------------------------------------------- /assets/scss/bootstrap/_close.scss: -------------------------------------------------------------------------------- 1 | // transparent background and border properties included for button version. 2 | // iOS requires the button element instead of an anchor tag. 3 | // If you want the anchor version, it requires `href="#"`. 4 | // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile 5 | 6 | .btn-close { 7 | box-sizing: content-box; 8 | width: $btn-close-width; 9 | height: $btn-close-height; 10 | padding: $btn-close-padding-y $btn-close-padding-x; 11 | color: $btn-close-color; 12 | background: transparent escape-svg($btn-close-bg) center / $btn-close-width auto no-repeat; // include transparent for button elements 13 | border: 0; // for button elements 14 | @include border-radius(); 15 | opacity: $btn-close-opacity; 16 | 17 | // Override 's hover style 18 | &:hover { 19 | color: $btn-close-color; 20 | text-decoration: none; 21 | opacity: $btn-close-hover-opacity; 22 | } 23 | 24 | &:focus { 25 | outline: 0; 26 | box-shadow: $btn-close-focus-shadow; 27 | opacity: $btn-close-focus-opacity; 28 | } 29 | 30 | &:disabled, 31 | &.disabled { 32 | pointer-events: none; 33 | user-select: none; 34 | opacity: $btn-close-disabled-opacity; 35 | } 36 | } 37 | 38 | .btn-close-white { 39 | filter: $btn-close-white-filter; 40 | } 41 | -------------------------------------------------------------------------------- /assets/scss/bootstrap/_containers.scss: -------------------------------------------------------------------------------- 1 | // Container widths 2 | // 3 | // Set the container width, and override it for fixed navbars in media queries. 4 | 5 | @if $enable-grid-classes { 6 | // Single container class with breakpoint max-widths 7 | .container, 8 | // 100% wide container at all breakpoints 9 | .container-fluid { 10 | @include make-container(); 11 | } 12 | 13 | // Responsive containers that are 100% wide until a breakpoint 14 | @each $breakpoint, $container-max-width in $container-max-widths { 15 | .container-#{$breakpoint} { 16 | @extend .container-fluid; 17 | } 18 | 19 | @include media-breakpoint-up($breakpoint, $grid-breakpoints) { 20 | %responsive-container-#{$breakpoint} { 21 | max-width: $container-max-width; 22 | } 23 | 24 | // Extend each breakpoint which is smaller or equal to the current breakpoint 25 | $extend-breakpoint: true; 26 | 27 | @each $name, $width in $grid-breakpoints { 28 | @if ($extend-breakpoint) { 29 | .container#{breakpoint-infix($name, $grid-breakpoints)} { 30 | @extend %responsive-container-#{$breakpoint}; 31 | } 32 | 33 | // Once the current breakpoint is reached, stop extending 34 | @if ($breakpoint == $name) { 35 | $extend-breakpoint: false; 36 | } 37 | } 38 | } 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /assets/scss/bootstrap/_forms.scss: -------------------------------------------------------------------------------- 1 | @import "forms/labels"; 2 | @import "forms/form-text"; 3 | @import "forms/form-control"; 4 | @import "forms/form-select"; 5 | @import "forms/form-check"; 6 | @import "forms/form-range"; 7 | @import "forms/floating-labels"; 8 | @import "forms/input-group"; 9 | @import "forms/validation"; 10 | -------------------------------------------------------------------------------- /assets/scss/bootstrap/_grid.scss: -------------------------------------------------------------------------------- 1 | // Row 2 | // 3 | // Rows contain your columns. 4 | 5 | @if $enable-grid-classes { 6 | .row { 7 | @include make-row(); 8 | 9 | > * { 10 | @include make-col-ready(); 11 | } 12 | } 13 | } 14 | 15 | 16 | // Columns 17 | // 18 | // Common styles for small and large grid columns 19 | 20 | @if $enable-grid-classes { 21 | @include make-grid-columns(); 22 | } 23 | -------------------------------------------------------------------------------- /assets/scss/bootstrap/_helpers.scss: -------------------------------------------------------------------------------- 1 | @import "helpers/clearfix"; 2 | @import "helpers/colored-links"; 3 | @import "helpers/ratio"; 4 | @import "helpers/position"; 5 | @import "helpers/visually-hidden"; 6 | @import "helpers/stretched-link"; 7 | @import "helpers/text-truncation"; 8 | -------------------------------------------------------------------------------- /assets/scss/bootstrap/_images.scss: -------------------------------------------------------------------------------- 1 | // Responsive images (ensure images don't scale beyond their parents) 2 | // 3 | // This is purposefully opt-in via an explicit class rather than being the default for all ``s. 4 | // We previously tried the "images are responsive by default" approach in Bootstrap v2, 5 | // and abandoned it in Bootstrap v3 because it breaks lots of third-party widgets (including Google Maps) 6 | // which weren't expecting the images within themselves to be involuntarily resized. 7 | // See also https://github.com/twbs/bootstrap/issues/18178 8 | .img-fluid { 9 | @include img-fluid(); 10 | } 11 | 12 | 13 | // Image thumbnails 14 | .img-thumbnail { 15 | padding: $thumbnail-padding; 16 | background-color: $thumbnail-bg; 17 | border: $thumbnail-border-width solid $thumbnail-border-color; 18 | @include border-radius($thumbnail-border-radius); 19 | @include box-shadow($thumbnail-box-shadow); 20 | 21 | // Keep them at most 100% wide 22 | @include img-fluid(); 23 | } 24 | 25 | // 26 | // Figures 27 | // 28 | 29 | .figure { 30 | // Ensures the caption's text aligns with the image. 31 | display: inline-block; 32 | } 33 | 34 | .figure-img { 35 | margin-bottom: $spacer * .5; 36 | line-height: 1; 37 | } 38 | 39 | .figure-caption { 40 | @include font-size($figure-caption-font-size); 41 | color: $figure-caption-color; 42 | } 43 | -------------------------------------------------------------------------------- /assets/scss/bootstrap/_mixins.scss: -------------------------------------------------------------------------------- 1 | // Toggles 2 | // 3 | // Used in conjunction with global variables to enable certain theme features. 4 | 5 | // Vendor 6 | @import "vendor/rfs"; 7 | 8 | // Deprecate 9 | @import "mixins/deprecate"; 10 | 11 | // Helpers 12 | @import "mixins/breakpoints"; 13 | @import "mixins/color-scheme"; 14 | @import "mixins/image"; 15 | @import "mixins/resize"; 16 | @import "mixins/visually-hidden"; 17 | @import "mixins/reset-text"; 18 | @import "mixins/text-truncate"; 19 | 20 | // Utilities 21 | @import "mixins/utilities"; 22 | 23 | // Components 24 | @import "mixins/alert"; 25 | @import "mixins/buttons"; 26 | @import "mixins/caret"; 27 | @import "mixins/pagination"; 28 | @import "mixins/lists"; 29 | @import "mixins/list-group"; 30 | @import "mixins/forms"; 31 | @import "mixins/table-variants"; 32 | 33 | // Skins 34 | @import "mixins/border-radius"; 35 | @import "mixins/box-shadow"; 36 | @import "mixins/gradients"; 37 | @import "mixins/transition"; 38 | 39 | // Layout 40 | @import "mixins/clearfix"; 41 | @import "mixins/container"; 42 | @import "mixins/grid"; 43 | -------------------------------------------------------------------------------- /assets/scss/bootstrap/_nav.scss: -------------------------------------------------------------------------------- 1 | // Base class 2 | // 3 | // Kickstart any navigation component with a set of style resets. Works with 4 | // `