From 4b4666cd685f11796a9c4ab39607502d59e932f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Le=20Diouron?= Date: Wed, 1 Dec 2021 12:52:32 +0100 Subject: [PATCH] feat(orange navbar): supra bar (#795) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Supra bar standard — WEB-GLH-SUB-001 * Supra bar with language options — WEB-GLH-SUB-002 * Supra bar with actions — WEB-GLH-SUB-003 --- .bundlewatch.config.json | 4 +- .cspell.json | 1 + scss/_orange-navbar.scss | 63 ++++++++++++++ scss/_variables.scss | 23 ++++- scss/boosted.scss | 1 + site/content/docs/5.1/about/overview.md | 1 + .../docs/5.1/components/orange-navbar.md | 79 ++++++++++++++++++ .../docs/5.1/guidelines/global-headers.md | 66 ++++++++++++++- site/content/docs/5.1/migration.md | 4 + site/data/sidebar.yml | 1 + site/layouts/shortcodes/orange-supra.html | 15 ++++ .../docs/5.1/assets/img/boosted-sprite.svg | 3 + .../docs/5.1/assets/img/navbar-contact.png | Bin 0 -> 8508 bytes 13 files changed, 255 insertions(+), 6 deletions(-) create mode 100644 scss/_orange-navbar.scss create mode 100644 site/content/docs/5.1/components/orange-navbar.md create mode 100644 site/layouts/shortcodes/orange-supra.html create mode 100644 site/static/docs/5.1/assets/img/navbar-contact.png diff --git a/.bundlewatch.config.json b/.bundlewatch.config.json index 8aadfa898b..ff7e1ade5c 100644 --- a/.bundlewatch.config.json +++ b/.bundlewatch.config.json @@ -26,11 +26,11 @@ }, { "path": "./dist/css/boosted.css", - "maxSize": "27.6 kB" + "maxSize": "27.8 kB" }, { "path": "./dist/css/boosted.min.css", - "maxSize": "25.3 kB" + "maxSize": "25.4 kB" }, { "path": "./dist/js/boosted.bundle.js", diff --git a/.cspell.json b/.cspell.json index 8013429e06..cc81a82f59 100644 --- a/.cspell.json +++ b/.cspell.json @@ -46,6 +46,7 @@ "favicons", "fieldsets", "flexbox", + "française", "fullscreen", "fusv", "getbootstrap", diff --git a/scss/_orange-navbar.scss b/scss/_orange-navbar.scss new file mode 100644 index 0000000000..b90bbfe412 --- /dev/null +++ b/scss/_orange-navbar.scss @@ -0,0 +1,63 @@ +// Contents +// +// Supra bar + + +// Supra bar +// +// Brand exclusive thin navbar that can be used with orange navbar +.supra { + display: none; + padding-top: 0; + padding-bottom: 0; + border-bottom: $navbar-orange-supra-border-bottom-width solid $gray-700; + + .container { + padding-right: $navbar-orange-supra-padding-x; + padding-left: $navbar-orange-supra-padding-x; + } + + @include media-breakpoint-up(md) { + display: flex; + } + + .navbar-nav .nav-link { + padding: $navbar-orange-supra-link-padding-top $navbar-orange-supra-link-padding-x $navbar-orange-supra-link-padding-bottom; + font-size: $font-size-sm; + line-height: $line-height-sm; + + &.active::before { + right: $navbar-orange-supra-link-padding-x; + bottom: -$navbar-orange-supra-border-bottom-width; + left: $navbar-orange-supra-link-padding-x; + } + + &.nav-icon { + padding: $navbar-orange-supra-icon-padding-top $navbar-orange-supra-icon-padding-x $navbar-orange-supra-icon-padding-bottom; + + svg, + img { + width: $navbar-orange-supra-icon-size; + height: $navbar-orange-supra-icon-size; + } + } + + .badge { + @extend .position-absolute; + @extend .top-0; + @extend .bg-info; + @extend .text-white; + @extend .translate-middle; + @extend .rounded-pill; + padding: $navbar-orange-supra-badge-padding-y $navbar-orange-supra-badge-padding-x; + margin-top: $navbar-orange-supra-badge-margin-top; + font-size: $font-size-base; + } + } + + .nav-item:last-of-type { + .nav-icon { + padding-right: $navbar-orange-supra-link-padding-x; + } + } +} diff --git a/scss/_variables.scss b/scss/_variables.scss index 64a6aefbca..7b2f83671e 100644 --- a/scss/_variables.scss +++ b/scss/_variables.scss @@ -1190,11 +1190,8 @@ $navbar-nav-link-padding-x: $nav-link-padding-x * .5 !default; // Boosted mod: Orange master logo & minimizing behavior $navbar-icon-size: $spacer * 1.5 !default; -//$navbar-height: 6.25rem !default; $navbar-brand-logo-height: add($spacer * 1.5, $spacer) !default; $navbar-brand-logo-minimized-height: $spacer * 1.5 !default; -//$navbar-supra-padding-y: $navbar-brand-logo-height / 10 !default; -//$navbar-supra-padding-x: $spacer * .25 * 1.5 !default; $navbar-transition-duration: $transition-duration !default; $navbar-transition-timing-function: $transition-timing !default; $navbar-transition: padding-top $navbar-transition-duration $navbar-transition-timing-function, padding-bottom $navbar-transition-duration $navbar-transition-timing-function, $transition-focus !default; @@ -1203,6 +1200,26 @@ $navbar-brand-logo-transition: width $navbar-transition-duration $navbar $navbar-active-transition: bottom $navbar-transition-duration $navbar-transition-timing-function !default; // End mod +// Boosted mod: Orange navbar +// scss-docs-start orange-navbar-variables +$navbar-orange-supra-padding-x: .125rem !default; +$navbar-orange-supra-border-bottom-width: 1px !default; + +$navbar-orange-supra-badge-padding-y: .125rem !default; +$navbar-orange-supra-badge-padding-x: .375rem !default; +$navbar-orange-supra-badge-margin-top: map-get($spacers, 4) * .1 !default; + +$navbar-orange-supra-icon-padding-top: divide($spacer, 2) !default; +$navbar-orange-supra-icon-padding-x: .9375rem !default; +$navbar-orange-supra-icon-padding-bottom: .25rem !default; +$navbar-orange-supra-icon-size: 1.5625rem !default; + +$navbar-orange-supra-link-padding-top: .75rem !default; +$navbar-orange-supra-link-padding-x: map-get($spacers, 1) * 1.5 !default; +$navbar-orange-supra-link-padding-bottom: .6875rem !default; +// scss-docs-end orange-navbar-variables +// End mod + $navbar-brand-font-size: $font-size-base !default; // Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link $navbar-brand-padding-y: null !default; diff --git a/scss/boosted.scss b/scss/boosted.scss index 6ea687872b..143c8fd2b4 100644 --- a/scss/boosted.scss +++ b/scss/boosted.scss @@ -55,6 +55,7 @@ // Boosted @import "back-to-top"; @import "stepped-process"; +@import "orange-navbar"; // Helpers @import "helpers"; diff --git a/site/content/docs/5.1/about/overview.md b/site/content/docs/5.1/about/overview.md index 8b9bf950f5..8fb22ff577 100644 --- a/site/content/docs/5.1/about/overview.md +++ b/site/content/docs/5.1/about/overview.md @@ -23,6 +23,7 @@ Boosted can be used for all **responsive web projects** for Orange group —&nbs Boosted ships with custom accessible components to suit specific needs: - [Back to top]({{< docsref "/components/back-to-top" >}}) +- [Orange Navbars]({{< docsref "/components/orange-navbar" >}}) - [Stepped process]({{< docsref "/components/stepped-process" >}}) diff --git a/site/content/docs/5.1/components/orange-navbar.md b/site/content/docs/5.1/components/orange-navbar.md new file mode 100644 index 0000000000..94b0fdc807 --- /dev/null +++ b/site/content/docs/5.1/components/orange-navbar.md @@ -0,0 +1,79 @@ +--- +layout: docs +title: Orange Navbar +description: Documentation and examples for Boosted's exclusive Brand responsive navbars. +group: components +toc: true +--- + +## How it works + +Orange navbar is based on the [navbar]({{}}) component. It adds some display management and introduces the supra bar component. +You may refer to its documentation in order to properly create and use navbars. + +## Example + +### Supra bar + +A simple navigation can be added on top of Orange navbar, it is called supra bar. Simply add the `.supra` class in your navbar declaration. + +{{< callout warning >}} +This navbar is visible only on desktop view. +{{< /callout >}} + +{{< example >}} +{{< orange-supra >}} + +{{< /orange-supra >}} +{{< /example >}} + +You can also use icons as navigation items as followed: + +{{< example >}} +{{< orange-supra >}} + +{{< /orange-supra >}} +{{< /example >}} + +You can have a complete overview of how to use supra bars in the dedicated [Design Guidelines page]({{}}) + +## Sass + +### Variables + +For more details, please have a look at the exhaustive list of available variables: + +{{< scss-docs name="orange-navbar-variables" file="scss/_variables.scss" >}} \ No newline at end of file diff --git a/site/content/docs/5.1/guidelines/global-headers.md b/site/content/docs/5.1/guidelines/global-headers.md index 8cf2c9331d..0018f1ffad 100644 --- a/site/content/docs/5.1/guidelines/global-headers.md +++ b/site/content/docs/5.1/guidelines/global-headers.md @@ -7,6 +7,70 @@ subgroup: Modules toc: true --- +## Supra bars {{< callout info >}} -The feature will be delivered with [#525]({{< param repo >}}/issues/525). +Supra bars are hidden on tablet and mobile devices.
+Based on viewport size, supra bar is hidden under 768px. {{< /callout >}} + +### Supra bar standard + +{{< anchor web-glh-sub-001 >}} + +{{< example show_markup="true" class="p-0">}} +{{< orange-supra >}} +{{< /orange-supra >}} +{{< /example >}} + +### Supra bar with language options + +{{< anchor web-glh-sub-002 >}} + +{{< example show_markup="true" class="p-0">}} +{{< orange-supra >}} + +{{< /orange-supra >}} +{{< /example >}} + +### Supra bar with actions + +{{< anchor web-glh-sub-003 >}} + +{{< example show_markup="true" class="p-0">}} +{{< orange-supra >}} + +{{< /orange-supra >}} +{{< /example >}} \ No newline at end of file diff --git a/site/content/docs/5.1/migration.md b/site/content/docs/5.1/migration.md index c4cc98fb04..67c4d23ad6 100644 --- a/site/content/docs/5.1/migration.md +++ b/site/content/docs/5.1/migration.md @@ -333,6 +333,10 @@ Your custom Boosted CSS builds should now look something like this with a separa - Added the new [offcanvas component]({{< docsref "/components/offcanvas" >}}). +### Orange navbar + +- Breaking Supra bars now require a `.bg-dark` class. + ### Pagination - Pagination links now have customizable `margin-left` that are dynamically rounded on all corners when separated from one another. diff --git a/site/data/sidebar.yml b/site/data/sidebar.yml index 9df614d7fe..e3c4d8ac37 100644 --- a/site/data/sidebar.yml +++ b/site/data/sidebar.yml @@ -74,6 +74,7 @@ - title: Navs & tabs - title: Navbar - title: Offcanvas + - title: Orange navbar - title: Pagination - title: Placeholders - title: Popovers diff --git a/site/layouts/shortcodes/orange-supra.html b/site/layouts/shortcodes/orange-supra.html new file mode 100644 index 0000000000..bae2753bbb --- /dev/null +++ b/site/layouts/shortcodes/orange-supra.html @@ -0,0 +1,15 @@ +{{- /* + Usage: `orange-supra` +*/ -}} + +{{- $input := .Inner -}} + + diff --git a/site/static/docs/5.1/assets/img/boosted-sprite.svg b/site/static/docs/5.1/assets/img/boosted-sprite.svg index fd2092a7eb..691ca60162 100644 --- a/site/static/docs/5.1/assets/img/boosted-sprite.svg +++ b/site/static/docs/5.1/assets/img/boosted-sprite.svg @@ -14,6 +14,9 @@ + + + diff --git a/site/static/docs/5.1/assets/img/navbar-contact.png b/site/static/docs/5.1/assets/img/navbar-contact.png new file mode 100644 index 0000000000000000000000000000000000000000..79f109d9413ff1ccc0d874fa02f42153b969593d GIT binary patch literal 8508 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 qrCQn#z4MP~F8