From 14eff8e9ce31c7d9d55f580bc597f4ed26ba94ff Mon Sep 17 00:00:00 2001 From: "louismaxime.piton" Date: Wed, 23 Oct 2024 08:27:46 +0200 Subject: [PATCH] tmp --- hugo.yml | 1 + scss/_maps.scss | 138 +++++++++ scss/_reboot.scss | 63 ++-- scss/_root.scss | 108 +++++++ scss/_title-bars.scss | 10 - scss/_type.scss | 208 ++----------- scss/_variables.scss | 145 ++++----- scss/tokens/_composite.scss | 5 + scss/tokens/_raw.scss | 37 +-- scss/tokens/_semantic.scss | 13 +- site/assets/scss/_colors.scss | 1 + site/assets/scss/_component-examples.scss | 3 +- site/assets/scss/_content.scss | 4 +- site/assets/scss/_masthead.scss | 4 +- site/assets/scss/_ouds-web.scss | 2 +- site/assets/scss/_placeholder-img.scss | 2 +- site/assets/scss/_sidebar.scss | 2 +- site/assets/scss/_tarteaucitron.scss | 10 +- site/assets/scss/_toc.scss | 2 +- site/content/docs/0.0/content/typography.md | 279 +++++++++++++++++- .../content/docs/0.0/examples/font/index.html | 9 + site/data/examples.yml | 2 + site/data/sidebar.yml | 4 - .../docs/0.0/assets/img/examples/font.png | Bin 0 -> 8557 bytes .../docs/0.0/assets/img/examples/font@2x.png | Bin 0 -> 28562 bytes 25 files changed, 707 insertions(+), 345 deletions(-) create mode 100644 site/content/docs/0.0/examples/font/index.html create mode 100644 site/static/docs/0.0/assets/img/examples/font.png create mode 100644 site/static/docs/0.0/assets/img/examples/font@2x.png diff --git a/hugo.yml b/hugo.yml index 68e404cb66..0d9bf723ea 100644 --- a/hugo.yml +++ b/hugo.yml @@ -1,4 +1,5 @@ languageCode: "en" +timeout: 600000 title: "OUDS Web" baseURL: "https://web.unified-design-system.orange.com" diff --git a/scss/_maps.scss b/scss/_maps.scss index 55ea36c995..ada1c96dff 100644 --- a/scss/_maps.scss +++ b/scss/_maps.scss @@ -83,6 +83,144 @@ $ouds-elevations: ( ) !default; // scss-docs-end ouds-maps-elevations +// scss-docs-start ouds-maps-fonts +%display-large { + font-size: var(--#{$prefix}font-size-display-large); + line-height: var(--#{$prefix}font-line-height-display-large); + + /* rtl:remove */ + letter-spacing: var(--#{$prefix}font-letter-spacing-display-large); +} + +%display-medium { + font-size: var(--#{$prefix}font-size-display-medium); + line-height: var(--#{$prefix}font-line-height-display-medium); + + /* rtl:remove */ + letter-spacing: var(--#{$prefix}font-letter-spacing-display-medium); +} + +%display-small { + font-size: var(--#{$prefix}font-size-display-small); + line-height: var(--#{$prefix}font-line-height-display-small); + + /* rtl:remove */ + letter-spacing: var(--#{$prefix}font-letter-spacing-display-small); +} + +%heading-xlarge { + font-size: var(--#{$prefix}font-size-heading-xlarge); + line-height: var(--#{$prefix}font-line-height-heading-xlarge); + + /* rtl:remove */ + letter-spacing: var(--#{$prefix}font-letter-spacing-heading-xlarge); +} + +%heading-large { + font-size: var(--#{$prefix}font-size-heading-large); + line-height: var(--#{$prefix}font-line-height-heading-large); + + /* rtl:remove */ + letter-spacing: var(--#{$prefix}font-letter-spacing-heading-large); +} + +%heading-medium { + font-size: var(--#{$prefix}font-size-heading-medium); + line-height: var(--#{$prefix}font-line-height-heading-medium); + + /* rtl:remove */ + letter-spacing: var(--#{$prefix}font-letter-spacing-heading-medium); +} + +%heading-small { + font-size: var(--#{$prefix}font-size-heading-small); + line-height: var(--#{$prefix}font-line-height-heading-small); + + /* rtl:remove */ + letter-spacing: var(--#{$prefix}font-letter-spacing-heading-small); +} + +%heading-xsmall { + font-size: var(--#{$prefix}font-size-heading-xsmall); + line-height: var(--#{$prefix}font-line-height-heading-xsmall); + + /* rtl:remove */ + letter-spacing: var(--#{$prefix}font-letter-spacing-heading-xsmall); +} + +%body-large { + font-size: var(--#{$prefix}font-size-body-large); + line-height: var(--#{$prefix}font-line-height-body-large); + + /* rtl:remove */ + letter-spacing: var(--#{$prefix}font-letter-spacing-body-large); +} + +%body-medium { + font-size: var(--#{$prefix}font-size-body-medium); + line-height: var(--#{$prefix}font-line-height-body-medium); + + /* rtl:remove */ + letter-spacing: var(--#{$prefix}font-letter-spacing-body-medium); +} + +%body-small { + font-size: var(--#{$prefix}font-size-body-small); + line-height: var(--#{$prefix}font-line-height-body-small); + + /* rtl:remove */ + letter-spacing: var(--#{$prefix}font-letter-spacing-body-small); +} + +%label-xlarge { + font-size: $ouds-font-size-label-xlarge; + line-height: $ouds-font-line-height-label-xlarge; + + /* rtl:remove */ + letter-spacing: $ouds-font-letter-spacing-label-xlarge; +} + +%label-large { + font-size: $ouds-font-size-label-large; + line-height: $ouds-font-line-height-label-large; + + /* rtl:remove */ + letter-spacing: $ouds-font-letter-spacing-label-large; +} + +%label-medium { + font-size: $ouds-font-size-label-medium; + line-height: $ouds-font-line-height-label-medium; + + /* rtl:remove */ + letter-spacing: $ouds-font-letter-spacing-label-medium; +} + +%label-small { + font-size: $ouds-font-size-label-small; + line-height: $ouds-font-line-height-label-small; + + /* rtl:remove */ + letter-spacing: $ouds-font-letter-spacing-label-small; +} + +%code-medium { + font-size: $ouds-font-size-code-medium; + line-height: $ouds-font-line-height-code-medium; + + /* rtl:remove */ + letter-spacing: $ouds-font-letter-spacing-code-medium; +} + +%code-small { + font-size: $ouds-font-size-code-small; + line-height: $ouds-font-line-height-code-small; + + /* rtl:remove */ + letter-spacing: $ouds-font-letter-spacing-code-small; +} +// scss-docs-end ouds-maps-fonts + // scss-docs-start ouds-maps-opacities $ouds-opacities: ( "transparent": $ouds-opacity-transparent, diff --git a/scss/_reboot.scss b/scss/_reboot.scss index b1fdf59e4e..52c218c0c9 100644 --- a/scss/_reboot.scss +++ b/scss/_reboot.scss @@ -57,7 +57,7 @@ // 2. As a best practice, apply a default `background-color`. // 3. Prevent adjustments of font size after orientation changes in iOS. // 4. Change the default tap highlight to be completely transparent in iOS. -// 5. Prevent faux-bold/italic +// 5. Prevent faux-bold/italic maybe for some RTL fonts // See https://developer.mozilla.org/fr/docs/Web/CSS/font-synthesis // scss-docs-start reboot-body-rules @@ -69,11 +69,11 @@ body { @include font-size(var(--#{$prefix}body-font-size)); font-weight: var(--#{$prefix}body-font-weight); line-height: var(--#{$prefix}body-line-height); - // OUDS mod: no color + color: var(--#{$prefix}body-color); text-align: var(--#{$prefix}body-text-align); /* rtl:remove */ - letter-spacing: $letter-spacing-base; // OUDS mod + letter-spacing: var(--#{$prefix}body-letter-spacing); // OUDS mod background-color: var(--#{$prefix}body-bg); // 2 -webkit-text-size-adjust: 100%; // 3 -webkit-tap-highlight-color: rgba($black, 0); // 4 @@ -134,7 +134,6 @@ hr { %heading { margin-top: 0; // 1 margin-bottom: $headings-margin-bottom; - @include font-size($font-size-base); // OUDS mod font-family: $headings-font-family; font-style: $headings-font-style; font-weight: $headings-font-weight; @@ -142,7 +141,6 @@ hr { color: var(--#{$prefix}heading-color); /* rtl:remove */ - letter-spacing: $letter-spacing-base; // OUDS mod -webkit-font-smoothing: antialiased; // OUDS mod -moz-osx-font-smoothing: grayscale; // OUDS mod text-rendering: optimizelegibility; // OUDS mod @@ -150,27 +148,32 @@ hr { h1 { @extend %heading; - @include font-size($h4-font-size); - line-height: $h4-line-height; + @extend %heading-xlarge; // OUDS mod: instead of `@include font-size($h1-font-size)` +} - /* rtl:remove */ - letter-spacing: $h4-spacing; +h2 { + @extend %heading; + @extend %heading-large; // OUDS mod: instead of `@include font-size($h2-font-size)` } -h2, h3 { @extend %heading; - @include font-size($h5-font-size); - line-height: $h5-line-height; + @extend %heading-medium; // OUDS mod: instead of `@include font-size($h3-font-size)` +} - /* rtl:remove */ - letter-spacing: $h5-spacing; +h4 { + @extend %heading; + @extend %heading-small; // OUDS mod: instead of `@include font-size($h4-font-size)` +} + +h5 { + @extend %heading; + @extend %heading-xsmall; // OUDS mod: instead of `@include font-size($h5-font-size)` } -h4, -h5, h6 { @extend %heading; + @extend %body-large; // OUDS mod: instead of `@include font-size($h6-font-size)` // Makes sense for me to have the smallest title the same font-size as the largest body since it's Bold and spaced correctly } @@ -303,11 +306,8 @@ strong { // Add the correct font size in all browsers small { - @include font-size($small-font-size); - // OUDS mod - font-weight: $font-weight-normal; - line-height: $line-height-sm; - // End mod + @extend %body-small; // OUDS mod: instead of `@include font-size($small-font-size)` + font-weight: $small-font-weight; // OUDS mod } @@ -383,8 +383,7 @@ pre { margin-top: 0; // 1 margin-bottom: 1rem; // 2 overflow: auto; // 3 - @include font-size($code-font-size); - line-height: $pre-line-height; // OUDS mod + @extend %code-medium; // OUDS mod: instead of `@include font-size($code-font-size)` color: $pre-color; // Account for some code outputs that place code tags in pre tags @@ -397,9 +396,8 @@ pre { var, // OUDS mod code { - @include font-size($code-font-size); + @extend %code-medium; // OUDS mod: instead of `@include font-size($code-font-size)` font-style: normal; // OUDS mod: is italic in all browsers - line-height: $line-height-sm; // OUDS mod color: var(--#{$prefix}code-color); word-wrap: break-word; @@ -409,9 +407,9 @@ code { } } -kbd { +kbd { // TODO LM: Check the rendering padding: $kbd-padding-y $kbd-padding-x; - @include font-size($kbd-font-size); + @extend %code-medium; // OUDS mod: instead of `@include font-size($code-font-size)` color: $kbd-color; background-color: $kbd-bg; @include border-radius($border-radius-sm); @@ -460,13 +458,10 @@ table { caption { padding-top: $table-caption-padding-y; padding-bottom: $table-caption-padding-y; - @include font-size($h1-font-size); // OUDS mod - font-weight: $font-weight-bold; // OUDS mod + @extend %heading-xlarge; // OUDS mod + font-weight: $font-weight-bold; // OUDS mod color: $table-caption-color; text-align: left; - - /* rtl:remove */ - letter-spacing: $h1-spacing; // OUDS mod -webkit-font-smoothing: antialiased; // OUDS mod -moz-osx-font-smoothing: grayscale; // OUDS mod text-rendering: optimizelegibility; // OUDS mod @@ -500,7 +495,6 @@ th { label { display: inline-block; // 1 - font-weight: $form-label-font-weight; // OUDS mod } // Remove the default `border-radius` that macOS Chrome adds. @@ -626,9 +620,8 @@ legend { width: 100%; padding: 0; margin-bottom: $legend-margin-bottom; - @include font-size($legend-font-size); + @extend %body-large; // OUDS mod: instead of `@include font-size($legend-font-size)` font-weight: $legend-font-weight; - line-height: inherit; + * { clear: left; // 2 diff --git a/scss/_root.scss b/scss/_root.scss index a8338a2d04..0dcbb67bc9 100644 --- a/scss/_root.scss +++ b/scss/_root.scss @@ -63,8 +63,115 @@ --#{$prefix}font-monospace: #{inspect($font-family-monospace)}; --#{$prefix}gradient: #{$gradient}; + --#{$prefix}font-size-display-small: #{px-to-rem($ouds-font-size-display-small-mobile)}; + --#{$prefix}font-size-display-medium: #{px-to-rem($ouds-font-size-display-medium-mobile)}; + --#{$prefix}font-size-display-large: #{px-to-rem($ouds-font-size-display-large-mobile)}; + --#{$prefix}font-line-height-display-small: #{divide($ouds-font-line-height-display-small-mobile, $ouds-font-size-display-small-mobile)}; + --#{$prefix}font-line-height-display-medium: #{divide($ouds-font-line-height-display-medium-mobile, $ouds-font-size-display-medium-mobile)}; + --#{$prefix}font-line-height-display-large: #{divide($ouds-font-line-height-display-large-mobile, $ouds-font-size-display-large-mobile)}; + --#{$prefix}font-letter-spacing-display-small: #{px-to-rem($ouds-font-letter-spacing-display-small-mobile)}; + --#{$prefix}font-letter-spacing-display-medium: #{px-to-rem($ouds-font-letter-spacing-display-medium-mobile)}; + --#{$prefix}font-letter-spacing-display-large: #{px-to-rem($ouds-font-letter-spacing-display-large-mobile)}; + --#{$prefix}font-size-heading-small: #{px-to-rem($ouds-font-size-heading-small-mobile)}; + --#{$prefix}font-size-heading-medium: #{px-to-rem($ouds-font-size-heading-medium-mobile)}; + --#{$prefix}font-size-heading-large: #{px-to-rem($ouds-font-size-heading-large-mobile)}; + --#{$prefix}font-size-heading-xlarge: #{px-to-rem($ouds-font-size-heading-xlarge-mobile)}; + --#{$prefix}font-size-heading-xsmall: #{px-to-rem($ouds-font-size-heading-xsmall-mobile)}; + --#{$prefix}font-line-height-heading-small: #{divide($ouds-font-line-height-heading-small-mobile, $ouds-font-size-heading-small-mobile)}; + --#{$prefix}font-line-height-heading-medium: #{divide($ouds-font-line-height-heading-medium-mobile, $ouds-font-size-heading-medium-mobile)}; + --#{$prefix}font-line-height-heading-large: #{divide($ouds-font-line-height-heading-large-mobile, $ouds-font-size-heading-large-mobile)}; + --#{$prefix}font-line-height-heading-xlarge: #{divide($ouds-font-line-height-heading-xlarge-mobile, $ouds-font-size-heading-xlarge-mobile)}; + --#{$prefix}font-line-height-heading-xsmall: #{divide($ouds-font-line-height-heading-xsmall-mobile, $ouds-font-size-heading-xsmall-mobile)}; + --#{$prefix}font-letter-spacing-heading-small: #{px-to-rem($ouds-font-letter-spacing-heading-small-mobile)}; + --#{$prefix}font-letter-spacing-heading-medium: #{px-to-rem($ouds-font-letter-spacing-heading-medium-mobile)}; + --#{$prefix}font-letter-spacing-heading-large: #{px-to-rem($ouds-font-letter-spacing-heading-large-mobile)}; + --#{$prefix}font-letter-spacing-heading-xlarge: #{px-to-rem($ouds-font-letter-spacing-heading-xlarge-mobile)}; + --#{$prefix}font-letter-spacing-heading-xsmall: #{px-to-rem($ouds-font-letter-spacing-heading-xsmall-mobile)}; + --#{$prefix}font-size-body-small: #{px-to-rem($ouds-font-size-body-small-mobile)}; + --#{$prefix}font-size-body-medium: #{px-to-rem($ouds-font-size-body-medium-mobile)}; + --#{$prefix}font-size-body-large: #{px-to-rem($ouds-font-size-body-large-mobile)}; + --#{$prefix}font-line-height-body-small: #{divide($ouds-font-line-height-body-small-mobile, $ouds-font-size-body-small-mobile)}; + --#{$prefix}font-line-height-body-medium: #{divide($ouds-font-line-height-body-medium-mobile, $ouds-font-size-body-medium-mobile)}; + --#{$prefix}font-line-height-body-large: #{divide($ouds-font-line-height-body-large-mobile, $ouds-font-size-body-large-mobile)}; + --#{$prefix}font-letter-spacing-body-small: #{px-to-rem($ouds-font-letter-spacing-body-small-mobile)}; + --#{$prefix}font-letter-spacing-body-medium: #{px-to-rem($ouds-font-letter-spacing-body-medium-mobile)}; + --#{$prefix}font-letter-spacing-body-large: #{px-to-rem($ouds-font-letter-spacing-body-large-mobile)}; + + @include media-breakpoint-up(md) { + --#{$prefix}font-size-display-small: #{px-to-rem($ouds-font-size-display-small-tablet)}; + --#{$prefix}font-size-display-medium: #{px-to-rem($ouds-font-size-display-medium-tablet)}; + --#{$prefix}font-size-display-large: #{px-to-rem($ouds-font-size-display-large-tablet)}; + --#{$prefix}font-line-height-display-small: #{divide($ouds-font-line-height-display-small-tablet, $ouds-font-size-display-small-tablet)}; + --#{$prefix}font-line-height-display-medium: #{divide($ouds-font-line-height-display-medium-tablet, $ouds-font-size-display-medium-tablet)}; + --#{$prefix}font-line-height-display-large: #{divide($ouds-font-line-height-display-large-tablet, $ouds-font-size-display-large-tablet)}; + --#{$prefix}font-letter-spacing-display-small: #{px-to-rem($ouds-font-letter-spacing-display-small-tablet)}; + --#{$prefix}font-letter-spacing-display-medium: #{px-to-rem($ouds-font-letter-spacing-display-medium-tablet)}; + --#{$prefix}font-letter-spacing-display-large: #{px-to-rem($ouds-font-letter-spacing-display-large-tablet)}; + --#{$prefix}font-size-heading-small: #{px-to-rem($ouds-font-size-heading-small-tablet)}; + --#{$prefix}font-size-heading-medium: #{px-to-rem($ouds-font-size-heading-medium-tablet)}; + --#{$prefix}font-size-heading-large: #{px-to-rem($ouds-font-size-heading-large-tablet)}; + --#{$prefix}font-size-heading-xlarge: #{px-to-rem($ouds-font-size-heading-xlarge-tablet)}; + --#{$prefix}font-size-heading-xsmall: #{px-to-rem($ouds-font-size-heading-xsmall-tablet)}; + --#{$prefix}font-line-height-heading-small: #{divide($ouds-font-line-height-heading-small-tablet, $ouds-font-size-heading-small-tablet)}; + --#{$prefix}font-line-height-heading-medium: #{divide($ouds-font-line-height-heading-medium-tablet, $ouds-font-size-heading-medium-tablet)}; + --#{$prefix}font-line-height-heading-large: #{divide($ouds-font-line-height-heading-large-tablet, $ouds-font-size-heading-large-tablet)}; + --#{$prefix}font-line-height-heading-xlarge: #{divide($ouds-font-line-height-heading-xlarge-tablet, $ouds-font-size-heading-xlarge-tablet)}; + --#{$prefix}font-line-height-heading-xsmall: #{divide($ouds-font-line-height-heading-xsmall-tablet, $ouds-font-size-heading-xsmall-tablet)}; + --#{$prefix}font-letter-spacing-heading-small: #{px-to-rem($ouds-font-letter-spacing-heading-small-tablet)}; + --#{$prefix}font-letter-spacing-heading-medium: #{px-to-rem($ouds-font-letter-spacing-heading-medium-tablet)}; + --#{$prefix}font-letter-spacing-heading-large: #{px-to-rem($ouds-font-letter-spacing-heading-large-tablet)}; + --#{$prefix}font-letter-spacing-heading-xlarge: #{px-to-rem($ouds-font-letter-spacing-heading-xlarge-tablet)}; + --#{$prefix}font-letter-spacing-heading-xsmall: #{px-to-rem($ouds-font-letter-spacing-heading-xsmall-tablet)}; + --#{$prefix}font-size-body-small: #{px-to-rem($ouds-font-size-body-small-tablet)}; + --#{$prefix}font-size-body-medium: #{px-to-rem($ouds-font-size-body-medium-tablet)}; + --#{$prefix}font-size-body-large: #{px-to-rem($ouds-font-size-body-large-tablet)}; + --#{$prefix}font-line-height-body-small: #{divide($ouds-font-line-height-body-small-tablet, $ouds-font-size-body-small-tablet)}; + --#{$prefix}font-line-height-body-medium: #{divide($ouds-font-line-height-body-medium-tablet, $ouds-font-size-body-medium-tablet)}; + --#{$prefix}font-line-height-body-large: #{divide($ouds-font-line-height-body-large-tablet, $ouds-font-size-body-large-tablet)}; + --#{$prefix}font-letter-spacing-body-small: #{px-to-rem($ouds-font-letter-spacing-body-small-tablet)}; + --#{$prefix}font-letter-spacing-body-medium: #{px-to-rem($ouds-font-letter-spacing-body-medium-tablet)}; + --#{$prefix}font-letter-spacing-body-large: #{px-to-rem($ouds-font-letter-spacing-body-large-tablet)}; + } + + @include media-breakpoint-up(xl) { + --#{$prefix}font-size-display-small: #{px-to-rem($ouds-font-size-display-small-desktop)}; + --#{$prefix}font-size-display-medium: #{px-to-rem($ouds-font-size-display-medium-desktop)}; + --#{$prefix}font-size-display-large: #{px-to-rem($ouds-font-size-display-large-desktop)}; + --#{$prefix}font-line-height-display-small: #{divide($ouds-font-line-height-display-small-desktop, $ouds-font-size-display-small-desktop)}; + --#{$prefix}font-line-height-display-medium: #{divide($ouds-font-line-height-display-medium-desktop, $ouds-font-size-display-medium-desktop)}; + --#{$prefix}font-line-height-display-large: #{divide($ouds-font-line-height-display-large-desktop, $ouds-font-size-display-large-desktop)}; + --#{$prefix}font-letter-spacing-display-small: #{px-to-rem($ouds-font-letter-spacing-display-small-desktop)}; + --#{$prefix}font-letter-spacing-display-medium: #{px-to-rem($ouds-font-letter-spacing-display-medium-desktop)}; + --#{$prefix}font-letter-spacing-display-large: #{px-to-rem($ouds-font-letter-spacing-display-large-desktop)}; + --#{$prefix}font-size-heading-small: #{px-to-rem($ouds-font-size-heading-small-desktop)}; + --#{$prefix}font-size-heading-medium: #{px-to-rem($ouds-font-size-heading-medium-desktop)}; + --#{$prefix}font-size-heading-large: #{px-to-rem($ouds-font-size-heading-large-desktop)}; + --#{$prefix}font-size-heading-xlarge: #{px-to-rem($ouds-font-size-heading-xlarge-desktop)}; + --#{$prefix}font-size-heading-xsmall: #{px-to-rem($ouds-font-size-heading-xsmall-desktop)}; + --#{$prefix}font-line-height-heading-small: #{divide($ouds-font-line-height-heading-small-desktop, $ouds-font-size-heading-small-desktop)}; + --#{$prefix}font-line-height-heading-medium: #{divide($ouds-font-line-height-heading-medium-desktop, $ouds-font-size-heading-medium-desktop)}; + --#{$prefix}font-line-height-heading-large: #{divide($ouds-font-line-height-heading-large-desktop, $ouds-font-size-heading-large-desktop)}; + --#{$prefix}font-line-height-heading-xlarge: #{divide($ouds-font-line-height-heading-xlarge-desktop, $ouds-font-size-heading-xlarge-desktop)}; + --#{$prefix}font-line-height-heading-xsmall: #{divide($ouds-font-line-height-heading-xsmall-desktop, $ouds-font-size-heading-xsmall-desktop)}; + --#{$prefix}font-letter-spacing-heading-small: #{px-to-rem($ouds-font-letter-spacing-heading-small-desktop)}; + --#{$prefix}font-letter-spacing-heading-medium: #{px-to-rem($ouds-font-letter-spacing-heading-medium-desktop)}; + --#{$prefix}font-letter-spacing-heading-large: #{px-to-rem($ouds-font-letter-spacing-heading-large-desktop)}; + --#{$prefix}font-letter-spacing-heading-xlarge: #{px-to-rem($ouds-font-letter-spacing-heading-xlarge-desktop)}; + --#{$prefix}font-letter-spacing-heading-xsmall: #{px-to-rem($ouds-font-letter-spacing-heading-xsmall-desktop)}; + --#{$prefix}font-size-body-small: #{px-to-rem($ouds-font-size-body-small-desktop)}; + --#{$prefix}font-size-body-medium: #{px-to-rem($ouds-font-size-body-medium-desktop)}; + --#{$prefix}font-size-body-large: #{px-to-rem($ouds-font-size-body-large-desktop)}; + --#{$prefix}font-line-height-body-small: #{divide($ouds-font-line-height-body-small-desktop, $ouds-font-size-body-small-desktop)}; + --#{$prefix}font-line-height-body-medium: #{divide($ouds-font-line-height-body-medium-desktop, $ouds-font-size-body-medium-desktop)}; + --#{$prefix}font-line-height-body-large: #{divide($ouds-font-line-height-body-large-desktop, $ouds-font-size-body-large-desktop)}; + --#{$prefix}font-letter-spacing-body-small: #{px-to-rem($ouds-font-letter-spacing-body-small-desktop)}; + --#{$prefix}font-letter-spacing-body-medium: #{px-to-rem($ouds-font-letter-spacing-body-medium-desktop)}; + --#{$prefix}font-letter-spacing-body-large: #{px-to-rem($ouds-font-letter-spacing-body-large-desktop)}; + } + // Root and body // scss-docs-start root-body-variables + // TODO LM @if $font-size-root != null { --#{$prefix}root-font-size: #{$font-size-root}; } @@ -72,6 +179,7 @@ @include rfs($font-size-base, --#{$prefix}body-font-size); --#{$prefix}body-font-weight: #{$font-weight-base}; --#{$prefix}body-line-height: #{$line-height-base}; + --#{$prefix}body-letter-spacing: #{$letter-spacing-base}; @if $body-text-align != null { --#{$prefix}body-text-align: #{$body-text-align}; } diff --git a/scss/_title-bars.scss b/scss/_title-bars.scss index 5b90722cab..3774390a0f 100644 --- a/scss/_title-bars.scss +++ b/scss/_title-bars.scss @@ -15,16 +15,6 @@ background-color: var(--#{$prefix}title-bar-bg); border-bottom: var(--#{$prefix}title-bar-border-width) solid var(--#{$prefix}title-bar-border-color); - @include media-breakpoint-up(md) { - --#{$prefix}title-bar-font-size: #{$title-bar-font-size-md}; - --#{$prefix}title-bar-letter-spacing: #{$title-bar-letter-spacing-md}; - } - - @include media-breakpoint-up(xl) { - --#{$prefix}title-bar-font-size: #{$title-bar-font-size-xl}; - --#{$prefix}title-bar-letter-spacing: #{$title-bar-letter-spacing-xl}; - } - > [class*="container"] { display: flex; align-items: flex-end; diff --git a/scss/_type.scss b/scss/_type.scss index 8217542491..4e50612178 100644 --- a/scss/_type.scss +++ b/scss/_type.scss @@ -26,185 +26,41 @@ } -// OUDS mod -// Headings and displays together -// = Add letter-spacing and line-height -// = Reduce heading font-sizes for mobile (mobile first, obviously) -[class*="display-"] { - @extend %heading; -} - -.display-1 { - @include font-size($h2-font-size); - line-height: $h2-line-height; - - /* rtl:remove */ - letter-spacing: $h2-spacing; -} - -h1, -.display-2, -.display-3 { - @include font-size($h3-font-size); - line-height: $h3-line-height; - - /* rtl:remove */ - letter-spacing: $mid-spacing; -} - -/* rtl:begin:remove */ -.display-2 { - letter-spacing: $h3-spacing; -} - -/* rtl:end:remove */ - -h2, -.display-4 { - @include font-size($h5-font-size); - line-height: $h5-line-height; - - /* rtl:remove */ - letter-spacing: $h5-spacing; -} - .lead { - @include font-size($h6-font-size); + @extend %body-large; // OUDS mod: instead of `@include font-size($lead-font-size)` font-weight: $lead-font-weight; - line-height: $lead-line-height; - - /* rtl:remove */ - letter-spacing: $h6-spacing; } -@include media-breakpoint-up(sm) { - h1, - .display-1, - .display-2, - .display-3 { +// OUDS mod: no @each +// Type display classes +@each $display, $font-size in $display-font-sizes { // TODO LM Check + .display-#{$display} { + @extend %heading; // OUDS mod + font-family: $display-font-family; + font-style: $display-font-style; + font-weight: $display-font-weight; line-height: $display-line-height; - } - - .display-1 { - @include font-size($display2-size); - - /* rtl:remove */ - letter-spacing: $display2-spacing; - } - - .display-2 { - @include font-size($display3-size); - - /* rtl:remove */ - letter-spacing: $display3-spacing; - } - - h1, - .display-3 { - @include font-size($display4-size); - - /* rtl:remove */ - letter-spacing: $display4-spacing; - } - - h2, - h3, - .display-4 { - @include font-size($h3-font-size); - line-height: $h3-line-height; - - /* rtl:remove */ - letter-spacing: $h3-spacing; - } - - h4, - h5, - h6 { - @include font-size($h5-font-size); - line-height: $h5-line-height; - - /* rtl:remove */ - letter-spacing: $h5-spacing; - } - - .lead { - @include font-size($h5-font-size); - - /* rtl:remove */ - letter-spacing: $h5-spacing; + @extend %#{$font-size}; // OUDS mod: instead of `@include font-size($font-size)` } } -@include media-breakpoint-up(lg) { - .display-1 { - @include font-size($display1-size); - - /* rtl:remove */ - letter-spacing: $display1-spacing; - } - - .display-2 { - @include font-size($display2-size); - - /* rtl:remove */ - letter-spacing: $display2-spacing; - } - - .display-3 { - @include font-size($display3-size); - - /* rtl:remove */ - letter-spacing: $display3-spacing; - } - - .display-4 { - @include font-size($display4-size); - line-height: $display-line-height; - - /* rtl:remove */ - letter-spacing: $display4-spacing; - } - - h2 { - @include font-size($h2-font-size); - line-height: $h2-line-height; +// .display-1 { +// @extend %heading; +// font-weight: $display-font-weight; +// @extend %display-large; +// } - /* rtl:remove */ - letter-spacing: $h2-spacing; - } - - h3 { - @include font-size($h3-font-size); - line-height: $h3-line-height; - - /* rtl:remove */ - letter-spacing: $h3-spacing; - } - - h4 { - @include font-size($h4-font-size); - line-height: $h4-line-height; - - /* rtl:remove */ - letter-spacing: $h4-spacing; - } - - h5, - h6 { - @include font-size($h5-font-size); - line-height: $h5-line-height; +// .display-2 { +// @extend %heading; +// font-weight: $display-font-weight; +// @extend %display-medium; +// } - /* rtl:remove */ - letter-spacing: $h5-spacing; - } - - .lead { - @include font-size($lead-font-size); - - /* rtl:remove */ - letter-spacing: $lead-letter-spacing; - } -} +// .display-3 { +// @extend %heading; +// font-weight: $display-font-weight; +// @extend %display-small; +// } // End mod @@ -245,18 +101,14 @@ h2, // Builds on `abbr` .initialism { - @include font-size($initialism-font-size); + @extend %body-small; // OUDS mod: instead of `@include font-size($initialism-font-size)` text-transform: uppercase; } // Blockquotes .blockquote { margin-bottom: $blockquote-margin-y; - @include font-size($blockquote-font-size); - line-height: $blockquote-line-height; // OUDS mod - - /* rtl:remove */ - letter-spacing: $blockquote-letter-spacing; // OUDS mod + @extend %body-large; // OUDS mod: instead of `@include font-size($blockquote-font-size)` > :last-child { margin-bottom: 0; @@ -266,13 +118,9 @@ h2, .blockquote-footer { margin-top: -$blockquote-margin-y; margin-bottom: $blockquote-margin-y; - @include font-size($blockquote-footer-font-size); - line-height: $line-height-sm; // OUDS mod + @extend %body-small; // OUDS mod: instead of `@include font-size($blockquote-footer-font-size)` color: $blockquote-footer-color; - /* rtl:remove */ - letter-spacing: $letter-spacing-base; // OUDS mod - &::before { content: "\2014\00A0"; // em dash, nbsp } diff --git a/scss/_variables.scss b/scss/_variables.scss index af0e1634c4..1ca18167bf 100644 --- a/scss/_variables.scss +++ b/scss/_variables.scss @@ -716,52 +716,50 @@ $aspect-ratios: ( // Font, line-height, and color for body text, headings, and more. // scss-docs-start font-variables -// stylelint-disable value-keyword-case -$font-family-sans-serif: "Helvetica Neue", Helvetica, "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji" !default; -$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !default; -// stylelint-enable value-keyword-case +$font-family-sans-serif: $ouds-font-family-sans-serif-stack !default; +$font-family-monospace: $ouds-font-family-monospace-stack !default; $font-family-base: var(--#{$prefix}font-sans-serif) !default; $font-family-code: var(--#{$prefix}font-monospace) !default; // OUDS mod //// Type scale & vertical rhythm completely revamped to match Orange Web Guidelines - +// TODO LM: Check for spacings and colors // $font-size-root affects the value of `rem`, which is used for as well font sizes, paddings and margins // $font-size-base affects the font size of the body text $font-size-root: null !default; -$font-size-base: 1rem !default; // Assumes the browser default, typically `16px` -$font-size-sm: $font-size-base * .875 !default; // 14px -$font-size-lg: $font-size-base * 1.125 !default; // 18px -$font-size-xlg: $font-size-base * 1.25 !default; // 20px +$font-size-base: var(--#{$prefix}font-size-body-medium) !default; // Assumes the browser default, typically `16px` +$font-size-sm: var(--#{$prefix}font-size-body-small) !default; // 14px +$font-size-lg: var(--#{$prefix}font-size-body-large) !default; // 18px +// $font-size-xlg: $ouds-font-size-label-xlarge !default; // 20px // TODO LM remove ? $font-weight-lighter: null !default; $font-weight-light: null !default; -$font-weight-normal: 400 !default; -$font-weight-medium: 500 !default; -$font-weight-semibold: 600 !default; -$font-weight-bold: 700 !default; +$font-weight-normal: $ouds-font-weight-web-default !default; +$font-weight-medium: null !default; +$font-weight-semibold: null !default; +$font-weight-bold: $ouds-font-weight-web-strong !default; $font-weight-bolder: null !default; $font-weight-base: $font-weight-normal !default; -// stylelint-disable function-disallowed-list -$line-height-base: calc(18 / 16) !default; -$line-height-sm: calc(16 / 14) !default; -$line-height-lg: calc(30 / 16) !default; -// stylelint-enable function-disallowed-list +$line-height-base: var(--#{$prefix}font-line-height-body-medium) !default; +$line-height-sm: var(--#{$prefix}font-line-height-body-small) !default; +$line-height-lg: var(--#{$prefix}font-line-height-body-large) !default; $line-length-sm: 40ch !default; $line-length-md: 80ch !default; -$letter-spacing-base: $spacer * -.005 !default; // -0.1px +$letter-spacing-base: var(--#{$prefix}font-letter-spacing-body-medium) !default; +$letter-spacing-sm: var(--#{$prefix}font-letter-spacing-body-small) !default; +$letter-spacing-lg: var(--#{$prefix}font-letter-spacing-body-large) !default; -$h1-font-size: $font-size-base * 2.125 !default; // 34px -$h2-font-size: $font-size-base * 1.875 !default; // 30px -$h3-font-size: $font-size-base * 1.5 !default; // 24px -$h4-font-size: $font-size-xlg !default; // 20px -$h5-font-size: $font-size-lg !default; // 18px -$h6-font-size: $font-size-base !default; // 16px +$h1-font-size: var(--#{$prefix}font-size-heading-xlarge) !default; +$h2-font-size: var(--#{$prefix}font-size-heading-large) !default; +$h3-font-size: var(--#{$prefix}font-size-heading-medium) !default; +$h4-font-size: var(--#{$prefix}font-size-heading-small) !default; +$h5-font-size: var(--#{$prefix}font-size-heading-xsmall) !default; +$h6-font-size: var(--#{$prefix}font-size-body-large) !default; // scss-docs-end font-variables // scss-docs-start font-sizes @@ -774,71 +772,63 @@ $font-sizes: ( 6: $h6-font-size ) !default; // scss-docs-end font-sizes - +// TODO LM: Decide if we should have them or not // scss-docs-start letter-spacing -$h1-spacing: $letter-spacing-base * 10 !default; // -1px -$h2-spacing: $letter-spacing-base * 8 !default; // -0.8px -$mid-spacing: $letter-spacing-base * 6 !default; // -0.6px -$h3-spacing: $letter-spacing-base * 5 !default; // -0.5px -$h4-spacing: $letter-spacing-base * 4 !default; // -0.4px -$h5-spacing: $letter-spacing-base * 2 !default; // -0.2px -$h6-spacing: $letter-spacing-base !default; +$h2-spacing: var(--#{$prefix}font-letter-spacing-heading-large) !default; +$h3-spacing: var(--#{$prefix}font-letter-spacing-heading-medium) !default; +$h5-spacing: var(--#{$prefix}font-letter-spacing-heading-xsmall) !default; // scss-docs-end letter-spacing -// stylelint-disable function-disallowed-list // scss-docs-start line-height -$h1-line-height: 1 !default; -$h2-line-height: calc(32 / 30) !default; -$h3-line-height: calc(26 / 24) !default; -$h4-line-height: calc(22 / 20) !default; -$h5-line-height: calc(20 / 18) !default; -$h6-line-height: $line-height-base !default; +$h5-line-height: var(--#{$prefix}font-line-height-heading-xsmall) !default; // scss-docs-end line-height -// stylelint-enable function-disallowed-list // scss-docs-start headings-variables $headings-margin-bottom: $spacer !default; // OUDS mod $headings-font-family: null !default; $headings-font-style: null !default; -$headings-font-weight: 700 !default; -$headings-line-height: $h6-line-height !default; +$headings-font-weight: $ouds-font-weight-web-heading !default; +$headings-line-height: null !default; $headings-color: inherit !default; // scss-docs-end headings-variables +// TODO LM: Check + test other values in here // scss-docs-start display-headings -$display1-size: $font-size-xlg * 3 !default; // 60px -$display2-size: $font-size-xlg * 2.5 !default; // 50px -$display3-size: $font-size-xlg * 2 !default; // 40px -$display4-size: $h1-font-size !default; // 34px -$display1-spacing: $letter-spacing-base * 20 !default; // -2px -$display2-spacing: $letter-spacing-base * 16 !default; // -1.6px -$display3-spacing: $h1-spacing !default; // -1px -$display4-spacing: $h1-spacing !default; // -1px -$display-line-height: $h1-line-height !default; +$display-font-sizes: ( + 1: display-large, + 2: display-medium, + 3: display-small +) !default; + +$display-font-family: null !default; +$display-font-style: null !default; +$display-font-weight: $ouds-font-weight-web-display !default; +$display-line-height: $headings-line-height !default; // scss-docs-end display-headings // scss-docs-start type-variables -$lead-font-size: $font-size-xlg !default; -$lead-font-weight: 400 !default; -$lead-line-height: 1.5 !default; -$lead-letter-spacing: $letter-spacing-base * 4 !default; +$lead-font-size: $font-size-lg !default; +$lead-font-weight: $ouds-font-weight-web-body-default !default; +// $lead-line-height: $line-height-lg !default; +// $lead-letter-spacing: $letter-spacing-lg !default; -$small-font-size: .875rem !default; +$small-font-size: $font-size-sm !default; +$small-font-weight: $ouds-font-weight-web-body-default !default; +// $small-line-height: $line-height-sm !default; +// $small-letter-spacing: $letter-spacing-sm !default; -$sub-sup-font-size: .75em !default; +$sub-sup-font-size: .75em !default; // TODO LM: Ask designers for this use case // fusv-disable $text-muted: var(--#{$prefix}secondary-color) !default; // Deprecated in Bootstrap 5.3.0 // fusv-enable -$initialism-font-size: $small-font-size !default; +// $initialism-font-size: $small-font-size !default; $blockquote-margin-y: $spacer !default; -$blockquote-font-size: $font-size-xlg !default; +// $blockquote-font-size: $font-size-lg !default; $blockquote-footer-color: var(--#{$prefix}secondary-color) !default; // OUDS mod: instead of `$gray-600` -$blockquote-footer-font-size: $small-font-size !default; -$blockquote-line-height: 1.5 !default; // OUDS mod -$blockquote-letter-spacing: $letter-spacing-base * .25 !default; // OUDS mod +// $blockquote-footer-font-size: $small-font-size !default; $hr-margin-y: $spacer !default; $hr-color: inherit !default; @@ -857,7 +847,7 @@ $vr-border-width: 2px !default; // OUDS mod: instead of `var(--#{$pr // scss-docs-end vr-variables $legend-margin-bottom: $spacer * .25 !default; -$legend-font-size: $font-size-xlg !default; +// $legend-font-size: $font-size-lg !default; $legend-font-weight: $font-weight-bold !default; $dt-font-weight: $font-weight-bold !default; @@ -992,7 +982,7 @@ $btn-padding-y-lg: $input-btn-padding-y-lg !default; $btn-padding-x-lg: $input-btn-padding-x-lg !default; $btn-font-size-lg: $input-btn-font-size-lg !default; $btn-line-height-lg: $h5-line-height !default; // OUDS mod -$btn-letter-spacing-lg: $letter-spacing-base * 2 !default; // OUDS mod +$btn-letter-spacing-lg: calc($letter-spacing-base * 2) !default; // stylelint-disable-line function-disallowed-list $btn-border-width: $input-btn-border-width !default; @@ -1108,7 +1098,7 @@ $form-text-color: var(--#{$prefix}secondary-color) !defaul $form-label-margin-bottom: .5rem !default; // OUDS mod $form-label-font-size: null !default; $form-label-font-style: null !default; -$form-label-font-weight: $font-weight-bold !default; +$form-label-font-weight: null !default; $form-label-color: null !default; $form-label-disabled-color: var(--#{$prefix}disabled-color) !default; // OUDS mod $form-label-required-margin-left: .1875rem !default; // OUDS mod @@ -1120,7 +1110,7 @@ $form-helper-size: 1.25rem !default; // OUDS mod $form-helper-color: var(--#{$prefix}info) !default; // OUDS mod $form-helper-bg: var(--#{$prefix}highlight-color) !default; // OUDS mod $form-helper-icon: escape-svg($helper-icon) !default; // OUDS mod -$form-helper-label-margin-bottom: $form-label-margin-bottom - divide(($form-helper-size - $font-size-base), 2) !default; // OUDS mod +$form-helper-label-margin-bottom: $form-label-margin-bottom - divide(($form-helper-size - 1rem), 2) !default; // OUDS mod // scss-docs-end form-helper-variables // scss-docs-start form-input-variables @@ -1186,7 +1176,7 @@ $form-color-disabled-filter: brightness(0) invert(1) brightness(.8) ! // scss-docs-start form-check-variables $form-check-input-width: 1em !default; -$form-check-min-height: $font-size-base * $input-btn-line-height !default; +$form-check-min-height: calc($font-size-base * $input-btn-line-height) !default; // stylelint-disable-line function-disallowed-list $form-check-padding-start: $form-check-input-width + .5em !default; $form-check-margin-bottom: .125rem !default; $form-check-label-padding-top: .4375rem !default; // OUDS mod @@ -1540,15 +1530,15 @@ $navbar-border-color: var(--#{$prefix}border-color-subtle) $navbar-brand-margin-y-xs: $spacer * .5 !default; $navbar-brand-logo-size-xs: $spacer * 1.5 !default; $navbar-brand-font-size-xs: 1.3125rem !default; -$navbar-brand-letter-spacing-xs: $letter-spacing-base * 5 !default; +$navbar-brand-letter-spacing-xs: calc($letter-spacing-base * 5) !default; // stylelint-disable-line function-disallowed-list $navbar-brand-font-size-two-lined-xs: 1.0625rem !default; -$navbar-brand-letter-spacing-two-lined-xs: $letter-spacing-base * 4 !default; +$navbar-brand-letter-spacing-two-lined-xs: calc($letter-spacing-base * 4) !default; // stylelint-disable-line function-disallowed-list $navbar-brand-margin-y: $spacer * .95 !default; $navbar-brand-logo-size: $spacer * 2.5 !default; -$navbar-brand-letter-spacing: $letter-spacing-base * 10 !default; +$navbar-brand-letter-spacing: calc($letter-spacing-base * 10) !default; // stylelint-disable-line function-disallowed-list $navbar-brand-font-size-two-lined: 1.8125rem !default; -$navbar-brand-letter-spacing-two-lined: $letter-spacing-base * 8 !default; +$navbar-brand-letter-spacing-two-lined: calc($letter-spacing-base * 8) !default; // stylelint-disable-line function-disallowed-list $navbar-icon-size-xs: $spacer * 1.25 !default; $navbar-icon-size: $spacer * 1.5 !default; @@ -2096,12 +2086,6 @@ $title-bar-line-height: $display-line-height !default; $title-bar-letter-spacing: $h2-spacing !default; $title-bar-border-width: calc(var(--#{$prefix}border-width) * .5) !default; // stylelint-disable-line function-disallowed-list $title-bar-border-color: var(--#{$prefix}border-color-subtle) !default; - -$title-bar-font-size-md: $display2-size !default; -$title-bar-letter-spacing-md: $display2-spacing !default; - -$title-bar-font-size-xl: $display1-size !default; -$title-bar-letter-spacing-xl: $display1-spacing !default; // scss-docs-end title-bars-variables // End mod @@ -2254,18 +2238,17 @@ $offcanvas-backdrop-opacity: $modal-backdrop-opacity !default; // Code // OUDS mod -$code-font-size: .875em !default; +$code-font-size: $ouds-font-size-code-medium !default; // OUDS mod: instead of `.875rem` $code-color: $gray-700 !default; $kbd-padding-y: $spacer * .05 !default; $kbd-padding-x: $spacer * .05 !default; -$kbd-font-size: $code-font-size !default; +// $kbd-font-size: $code-font-size !default; $kbd-color: var(--#{$prefix}kbd-color, $black) !default; $kbd-bg: var(--#{$prefix}kbd-bg, $gray-300) !default; $nested-kbd-font-weight: null !default; // Deprecated in Bootstrap v5.2.0, removing in v6 $pre-color: var(--#{$prefix}code-color) !default; -$pre-line-height: 1.25 !default; // End mod // diff --git a/scss/tokens/_composite.scss b/scss/tokens/_composite.scss index 7750d7de9a..b731565b50 100644 --- a/scss/tokens/_composite.scss +++ b/scss/tokens/_composite.scss @@ -13,3 +13,8 @@ $ouds-elevation-sticky-default: $ouds-elevation-x-sticky-default $ouds-elevation $ouds-elevation-sticky-emphasized: $ouds-elevation-x-sticky-emphasized $ouds-elevation-y-sticky-emphasized $ouds-elevation-blur-sticky-emphasized $ouds-elevation-spread-sticky-emphasized $ouds-elevation-color-sticky-emphasized !default; $ouds-elevation-sticky-navigation-scrolled: $ouds-elevation-x-sticky-navigation-scrolled $ouds-elevation-y-sticky-navigation-scrolled $ouds-elevation-blur-sticky-navigation-scrolled $ouds-elevation-spread-sticky-navigation-scrolled $ouds-elevation-color-sticky-navigation-scrolled !default; // scss-docs-end ouds-composite-elevation + +// scss-docs-start ouds-composite-font +$ouds-font-family-sans-serif-stack: "Helvetica Neue", Helvetica, Arial, "SF Pro", Roboto, sans-serif !default; // TODO LM: Do or check RTL as well +$ouds-font-family-monospace-stack: "SF Mono", Menlo, Monaco, Consolas, monospace !default; +// scss-docs-end ouds-composite-font diff --git a/scss/tokens/_raw.scss b/scss/tokens/_raw.scss index be8ac7bf39..c7a691ef3d 100644 --- a/scss/tokens/_raw.scss +++ b/scss/tokens/_raw.scss @@ -267,7 +267,8 @@ $ouds-elevation-y-500: 12px !default; // scss-docs-start ouds-raw-font $ouds-font-family-brand-default: "Helvetica Neue" !default; // $ouds-font-family-brand-tv: "Helvetica Neue LT" !default; -// $ouds-font-family-monospace-courier-new: "Courier New" !default; +// $ouds-font-family-monospace-consolas: "Consolas" !default; // TODO LM: Ask for this specific font +// $ouds-font-family-monospace-courier-new: "Courier New" !default; // TODO LM: Ask to remove this one (default monosapce font is better than this one imo) // $ouds-font-family-monospace-menlo: "Menlo" !default; // $ouds-font-family-monospace-monaco: "Monaco" !default; // $ouds-font-family-monospace-sf-mono: "SF Mono" !default; @@ -276,23 +277,23 @@ $ouds-font-family-brand-default: "Helvetica Neue" !default; // $ouds-font-family-system-noto-sans: "Noto Sans" !default; // $ouds-font-family-system-roboto: "Roboto" !default; // $ouds-font-family-system-sf-pro: "SF Pro" !default; -$ouds-font-letter-spacing-150: .18 !default; -// $ouds-font-letter-spacing-175: .19 !default; -$ouds-font-letter-spacing-200: .17 !default; -$ouds-font-letter-spacing-250: .2 !default; -$ouds-font-letter-spacing-300: .18 !default; -$ouds-font-letter-spacing-350: 0 !default; -$ouds-font-letter-spacing-450: -.12 !default; -$ouds-font-letter-spacing-550: -.28 !default; -$ouds-font-letter-spacing-650: -.32 !default; -$ouds-font-letter-spacing-750: -.36 !default; -$ouds-font-letter-spacing-850: -.4 !default; -// $ouds-font-letter-spacing-950: -.55 !default; -$ouds-font-letter-spacing-1050: -.6 !default; -// $ouds-font-letter-spacing-1150: -.65 !default; -$ouds-font-letter-spacing-1250: -.7 !default; -$ouds-font-letter-spacing-1450: -.96 !default; -$ouds-font-letter-spacing-1850: -1.08 !default; +$ouds-font-letter-spacing-150: .18px !default; // TODO LM: Ask for px in tokenator. +// $ouds-font-letter-spacing-175: .19px !default; +$ouds-font-letter-spacing-200: .17px !default; // TODO LM: Weird value compared to the 5 positive ones. +$ouds-font-letter-spacing-250: .2px !default; +$ouds-font-letter-spacing-300: .18px !default; +$ouds-font-letter-spacing-350: 0px !default; +$ouds-font-letter-spacing-450: -.12px !default; +$ouds-font-letter-spacing-550: -.28px !default; +$ouds-font-letter-spacing-650: -.32px !default; +$ouds-font-letter-spacing-750: -.36px !default; +$ouds-font-letter-spacing-850: -.4px !default; +// $ouds-font-letter-spacing-950: -.55px !default; +$ouds-font-letter-spacing-1050: -.6px !default; +// $ouds-font-letter-spacing-1150: -.65px !default; +$ouds-font-letter-spacing-1250: -.7px !default; +$ouds-font-letter-spacing-1450: -.96px !default; +$ouds-font-letter-spacing-1850: -1.08px !default; $ouds-font-line-height-250: 16px !default; $ouds-font-line-height-350: 20px !default; $ouds-font-line-height-450: 24px !default; diff --git a/scss/tokens/_semantic.scss b/scss/tokens/_semantic.scss index d086a3297b..bffc07b322 100644 --- a/scss/tokens/_semantic.scss +++ b/scss/tokens/_semantic.scss @@ -333,6 +333,9 @@ $ouds-font-letter-spacing-heading-small-tablet: $ouds-font-letter-spacing-350 !d $ouds-font-letter-spacing-heading-xlarge-desktop: $ouds-font-letter-spacing-850 !default; $ouds-font-letter-spacing-heading-xlarge-mobile: $ouds-font-letter-spacing-550 !default; $ouds-font-letter-spacing-heading-xlarge-tablet: $ouds-font-letter-spacing-750 !default; +$ouds-font-letter-spacing-heading-xsmall-desktop: $ouds-font-letter-spacing-350 !default; // TODO LM: Ask designer about these tokens +$ouds-font-letter-spacing-heading-xsmall-mobile: $ouds-font-letter-spacing-250 !default; +$ouds-font-letter-spacing-heading-xsmall-tablet: $ouds-font-letter-spacing-300 !default; // TODO LM: Until there $ouds-font-letter-spacing-label-large: $ouds-font-letter-spacing-250 !default; $ouds-font-letter-spacing-label-medium: $ouds-font-letter-spacing-200 !default; $ouds-font-letter-spacing-label-small: $ouds-font-letter-spacing-150 !default; @@ -369,6 +372,9 @@ $ouds-font-line-height-heading-small-tablet: $ouds-font-line-height-550 !default $ouds-font-line-height-heading-xlarge-desktop: $ouds-font-line-height-1050 !default; $ouds-font-line-height-heading-xlarge-mobile: $ouds-font-line-height-750 !default; $ouds-font-line-height-heading-xlarge-tablet: $ouds-font-line-height-950 !default; +$ouds-font-line-height-heading-xsmall-desktop: $ouds-font-line-height-550 !default; // TODO LM: Ask designer about these tokens +$ouds-font-line-height-heading-xsmall-mobile: $ouds-font-line-height-450 !default; +$ouds-font-line-height-heading-xsmall-tablet: $ouds-font-line-height-450 !default; // TODO LM: Until there $ouds-font-line-height-label-large: $ouds-font-line-height-450 !default; $ouds-font-line-height-label-medium: $ouds-font-line-height-350 !default; $ouds-font-line-height-label-small: $ouds-font-line-height-250 !default; @@ -382,7 +388,7 @@ $ouds-font-size-body-medium-tablet: $ouds-font-size-200 !default; $ouds-font-size-body-small-desktop: $ouds-font-size-200 !default; $ouds-font-size-body-small-mobile: $ouds-font-size-150 !default; $ouds-font-size-body-small-tablet: $ouds-font-size-150 !default; -$ouds-font-size-code-medium: $ouds-font-size-200 !default; +$ouds-font-size-code-medium: $ouds-font-size-200 !default; // TODO LM: Decide whether it should be em or rem and apply it $ouds-font-size-code-small: $ouds-font-size-150 !default; $ouds-font-size-display-large-desktop: $ouds-font-size-1850 !default; $ouds-font-size-display-large-mobile: $ouds-font-size-850 !default; @@ -405,6 +411,9 @@ $ouds-font-size-heading-small-tablet: $ouds-font-size-350 !default; $ouds-font-size-heading-xlarge-desktop: $ouds-font-size-850 !default; $ouds-font-size-heading-xlarge-mobile: $ouds-font-size-550 !default; $ouds-font-size-heading-xlarge-tablet: $ouds-font-size-750 !default; +$ouds-font-size-heading-xsmall-desktop: $ouds-font-size-350 !default; // TODO LM: Ask designer about these tokens +$ouds-font-size-heading-xsmall-mobile: $ouds-font-size-250 !default; +$ouds-font-size-heading-xsmall-tablet: $ouds-font-size-300 !default; // TODO LM: Until there $ouds-font-size-label-large: $ouds-font-size-250 !default; $ouds-font-size-label-medium: $ouds-font-size-200 !default; $ouds-font-size-label-small: $ouds-font-size-150 !default; @@ -414,7 +423,7 @@ $ouds-font-weight-web-default: $ouds-font-weight-400 !default; $ouds-font-weight-web-strong: $ouds-font-weight-700 !default; $ouds-font-weight-web-body-default: $ouds-font-weight-web-default !default; $ouds-font-weight-web-body-strong: $ouds-font-weight-web-strong !default; -$ouds-font-weight-web-display: $ouds-font-weight-web-strong !default; +$ouds-font-weight-web-display: $ouds-font-weight-web-strong !default; // TODO LM: Ask for a color field for code, headings, body, etc $ouds-font-weight-web-heading: $ouds-font-weight-web-strong !default; $ouds-font-weight-web-label-default: $ouds-font-weight-web-default !default; $ouds-font-weight-web-label-strong: $ouds-font-weight-web-strong !default; diff --git a/site/assets/scss/_colors.scss b/site/assets/scss/_colors.scss index 9ee7abbd13..c9c932e4a9 100644 --- a/site/assets/scss/_colors.scss +++ b/site/assets/scss/_colors.scss @@ -1,6 +1,7 @@ // // Docs color palette classes // +// TODO LM @each $color, $value in map-merge($colors, ("gray-500": $gray-500)) { .swatch-#{$color} { diff --git a/site/assets/scss/_component-examples.scss b/site/assets/scss/_component-examples.scss index 12e83f4c84..26edb39ac9 100644 --- a/site/assets/scss/_component-examples.scss +++ b/site/assets/scss/_component-examples.scss @@ -373,7 +373,7 @@ background-color: transparent; border: 0; } - + // TODO LM pre code { @include font-size(inherit); color: var(--bs-body-color); // Effectively the base text color @@ -405,6 +405,7 @@ margin-bottom: 1rem; } +// TODO LM // OUDS mod // scss-docs-start sticker-fs-4xl .sticker-fs-4xl { diff --git a/site/assets/scss/_content.scss b/site/assets/scss/_content.scss index d4e4e1f189..d0ea3fff74 100644 --- a/site/assets/scss/_content.scss +++ b/site/assets/scss/_content.scss @@ -51,7 +51,7 @@ line-height: $line-height-base; } } - +// TODO LM > details { padding: 0 10px; // static even when zoomed font-size: 1rem; @@ -109,7 +109,7 @@ } } } - +// TODO LM .bd-title { --bs-heading-color: var(--bs-emphasis-color); @include font-size(3rem); diff --git a/site/assets/scss/_masthead.scss b/site/assets/scss/_masthead.scss index 560b9a4059..916c37a404 100644 --- a/site/assets/scss/_masthead.scss +++ b/site/assets/scss/_masthead.scss @@ -9,7 +9,7 @@ } .lead { - @include font-size(1rem); + @extend %label-large; font-weight: 400; color: var(--bs-secondary-color); } @@ -55,7 +55,7 @@ } } } - +// TODO LM .masthead-followup { h2, h3, diff --git a/site/assets/scss/_ouds-web.scss b/site/assets/scss/_ouds-web.scss index b3ec661888..6d3234d96b 100644 --- a/site/assets/scss/_ouds-web.scss +++ b/site/assets/scss/_ouds-web.scss @@ -11,7 +11,7 @@ html, body { min-height: 100vh; } - +// TODO LM .display-0 { font-size: 5.25em; backface-visibility: hidden; diff --git a/site/assets/scss/_placeholder-img.scss b/site/assets/scss/_placeholder-img.scss index 6f5bbe4189..81bd15eedb 100644 --- a/site/assets/scss/_placeholder-img.scss +++ b/site/assets/scss/_placeholder-img.scss @@ -9,7 +9,7 @@ user-select: none; text-anchor: middle; } - +// TODO LM .bd-placeholder-img-lg { @include font-size(3.5rem); } diff --git a/site/assets/scss/_sidebar.scss b/site/assets/scss/_sidebar.scss index 6ce66af533..8e11e3226f 100644 --- a/site/assets/scss/_sidebar.scss +++ b/site/assets/scss/_sidebar.scss @@ -29,7 +29,7 @@ } // End mod } - +// TODO LM .bd-links-nav { @include media-breakpoint-down(lg) { font-size: .875rem; diff --git a/site/assets/scss/_tarteaucitron.scss b/site/assets/scss/_tarteaucitron.scss index c76ac9743c..58dc040c8d 100644 --- a/site/assets/scss/_tarteaucitron.scss +++ b/site/assets/scss/_tarteaucitron.scss @@ -52,7 +52,7 @@ } } } - +// TODO LM @include tac("DisclaimerAlert") { font-size: $font-size-sm; } @@ -79,7 +79,7 @@ border: 0; opacity: $modal-backdrop-opacity; } - +// TODO LM @include tac("H1", true) { margin-bottom: $spacer; font-size: $h2-font-size; @@ -89,12 +89,12 @@ @include tac("H2", true) { padding-top: $spacer / 10; font-size: $h4-font-size; - letter-spacing: $h4-spacing; + letter-spacing: -0.4px; } @include tac("H3", true) { font-size: $h6-font-size; - letter-spacing: $h6-spacing; + letter-spacing: -0.1px; } @include tac("Info") { @@ -147,7 +147,7 @@ color: $white; background-color: $black; } - +// TODO LM @include tac("Allow", true) { @include button-icon($form-switch-checked-bg-image, $btn-font-size-sm); diff --git a/site/assets/scss/_toc.scss b/site/assets/scss/_toc.scss index 8dbfcb473e..eea5804f3b 100644 --- a/site/assets/scss/_toc.scss +++ b/site/assets/scss/_toc.scss @@ -10,7 +10,7 @@ overflow-y: auto; } - nav { + nav { // TODO LM @include font-size(.875rem); ul { diff --git a/site/content/docs/0.0/content/typography.md b/site/content/docs/0.0/content/typography.md index 89df4d2f79..53aa181e89 100644 --- a/site/content/docs/0.0/content/typography.md +++ b/site/content/docs/0.0/content/typography.md @@ -8,4 +8,281 @@ aliases: toc: true --- -{{< callout-soon "page" >}} +## Global settings + +Bootstrap sets basic global display, typography, and link styles. When more control is needed, check out the [textual utility classes]({{< docsref "/utilities/text" >}}). + +- Use a [native font stack]({{< docsref "/content/reboot#native-font-stack" >}}) that selects the best `font-family` for each OS and device. +- For a more inclusive and accessible type scale, we use the browser's default root `font-size` (typically 16px) so visitors can customize their browser defaults as needed. +- Use the `$font-family-base`, `$font-size-base`, and `$line-height-base` attributes as our typographic base applied to the ``. +- Set the global link color via `$link-color`. +- Use `$body-bg` to set a `background-color` on the `` (`#fff` by default). + +These styles can be found within `_reboot.scss`, and the global variables are defined in `_variables.scss`. Make sure to set `$font-size-base` in `rem`. + +## Headings + +All HTML headings, `

` through `

`, are available. + +{{< bs-table >}} +| Heading | Example | +| --- | --- | +| `

` | h1. Bootstrap heading | +| `

` | h2. Bootstrap heading | +| `

` | h3. Bootstrap heading | +| `

` | h4. Bootstrap heading | +| `
` | h5. Bootstrap heading | +| `
` | h6. Bootstrap heading | +{{< /bs-table >}} + +```html +

h1. Bootstrap heading

+

h2. Bootstrap heading

+

h3. Bootstrap heading

+

h4. Bootstrap heading

+
h5. Bootstrap heading
+
h6. Bootstrap heading
+``` + +`.h1` through `.h6` classes are also available, for when you want to match the font styling of a heading but cannot use the associated HTML element. + +{{< example >}} +

h1. Bootstrap heading

+

h2. Bootstrap heading

+

h3. Bootstrap heading

+

h4. Bootstrap heading

+

h5. Bootstrap heading

+

h6. Bootstrap heading

+{{< /example >}} + +### Customizing headings + +Use the included utility classes to recreate the small secondary heading text from Bootstrap 3. + +{{< example >}} +

+ Fancy display heading + With faded secondary text +

+{{< /example >}} + +## Display headings + +Traditional heading elements are designed to work best in the meat of your page content. When you need a heading to stand out, consider using a **display heading**—a larger, slightly more opinionated heading style. + +
+
Display 1
+
Display 2
+
Display 3
+
Display 4
+
Display 5
+
Display 6
+
+ +```html +

Display 1

+

Display 2

+

Display 3

+

Display 4

+

Display 5

+

Display 6

+``` + +Display headings are configured via the `$display-font-sizes` Sass map and two variables, `$display-font-weight` and `$display-line-height`. + +Display headings are customizable via two variables, `$display-font-family` and `$display-font-style`. + +{{< scss-docs name="display-headings" file="scss/_variables.scss" >}} + +## Lead + +Make a paragraph stand out by adding `.lead`. + +{{< example >}} +

+ This is a lead paragraph. It stands out from regular paragraphs. +

+{{< /example >}} + +## Inline text elements + +Styling for common inline HTML5 elements. + +{{< example >}} +

You can use the mark tag to highlight text.

+

This line of text is meant to be treated as deleted text.

+

This line of text is meant to be treated as no longer accurate.

+

This line of text is meant to be treated as an addition to the document.

+

This line of text will render as underlined.

+

This line of text is meant to be treated as fine print.

+

This line rendered as bold text.

+

This line rendered as italicized text.

+{{< /example >}} + +Beware that those tags should be used for semantic purpose: + +- `` represents text which is marked or highlighted for reference or notation purposes. +- `` represents side-comments and small print, like copyright and legal text. +- `` represents element that are no longer relevant or no longer accurate. +- `` represents a span of inline text which should be rendered in a way that indicates that it has a non-textual annotation. + +If you want to style your text, you should use the following classes instead: + +- `.mark` will apply the same styles as ``. +- `.small` will apply the same styles as ``. +- `.text-decoration-underline` will apply the same styles as ``. +- `.text-decoration-line-through` will apply the same styles as ``. + +While not shown above, feel free to use `` and `` in HTML5. `` is meant to highlight words or phrases without conveying additional importance, while `` is mostly for voice, technical terms, etc. + +## Text utilities + +Change text alignment, transform, style, weight, line-height, decoration and color with our [text utilities]({{< docsref "/utilities/text" >}}) and [color utilities]({{< docsref "/utilities/colors" >}}). + +## Abbreviations + +Stylized implementation of HTML's `` element for abbreviations and acronyms to show the expanded version on hover. Abbreviations have a default underline and gain a help cursor to provide additional context on hover and to users of assistive technologies. + +Add `.initialism` to an abbreviation for a slightly smaller font-size. + +{{< example >}} +

attr

+

HTML

+{{< /example >}} + +## Blockquotes + +For quoting blocks of content from another source within your document. Wrap `
` around any HTML as the quote. + +{{< example >}} +
+

A well-known quote, contained in a blockquote element.

+
+{{< /example >}} + +### Naming a source + +The HTML spec requires that blockquote attribution be placed outside the `
`. When providing attribution, wrap your `
` in a `
` and use a `
` or a block level element (e.g., `

`) with the `.blockquote-footer` class. Be sure to wrap the name of the source work in `` as well. + +{{< example >}} +

+
+

A well-known quote, contained in a blockquote element.

+
+ +
+{{< /example >}} + +### Alignment + +Use text utilities as needed to change the alignment of your blockquote. + +{{< example >}} +
+
+

A well-known quote, contained in a blockquote element.

+
+ +
+{{< /example >}} + +{{< example >}} +
+
+

A well-known quote, contained in a blockquote element.

+
+ +
+{{< /example >}} + +## Lists + +### Unstyled + +Remove the default `list-style` and left margin on list items (immediate children only). **This only applies to immediate children list items**, meaning you will need to add the class for any nested lists as well. + +{{< example >}} +
    +
  • This is a list.
  • +
  • It appears completely unstyled.
  • +
  • Structurally, it's still a list.
  • +
  • However, this style only applies to immediate child elements.
  • +
  • Nested lists: +
      +
    • are unaffected by this style
    • +
    • will still show a bullet
    • +
    • and have appropriate left margin
    • +
    +
  • +
  • This may still come in handy in some situations.
  • +
+{{< /example >}} + +### Inline + +Remove a list's bullets and apply some light `margin` with a combination of two classes, `.list-inline` and `.list-inline-item`. + +{{< example >}} +
    +
  • This is a list item.
  • +
  • And another one.
  • +
  • But they're displayed inline.
  • +
+{{< /example >}} + +### Description list alignment + +Align terms and descriptions horizontally by using our grid system's predefined classes (or semantic mixins). For longer terms, you can optionally add a `.text-truncate` class to truncate the text with an ellipsis. + +{{< example >}} +
+
Description lists
+
A description list is perfect for defining terms.
+ +
Term
+
+

Definition for the term.

+

And some more placeholder definition text.

+
+ +
Another term
+
This definition is short, so no extra paragraphs or anything.
+ +
Truncated term is truncated
+
This can be useful when space is tight. Adds an ellipsis at the end.
+ +
Nesting
+
+
+
Nested definition list
+
I heard you like definition lists. Let me put a definition list inside your definition list.
+
+
+
+{{< /example >}} + +## Responsive font sizes + +In Bootstrap 5, we've enabled responsive font sizes by default, allowing text to scale more naturally across device and viewport sizes. Have a look at the [RFS page]({{< docsref "/getting-started/rfs" >}}) to find out how this works. + +## CSS + +### Sass variables + +Headings have some dedicated variables for sizing and spacing. + +{{< scss-docs name="headings-variables" file="scss/_variables.scss" >}} + +Miscellaneous typography elements covered here and in [Reboot]({{< docsref "/content/reboot" >}}) also have dedicated variables. + +{{< scss-docs name="type-variables" file="scss/_variables.scss" >}} + +### Sass mixins + +There are no dedicated mixins for typography, but Bootstrap does use [Responsive Font Sizing (RFS)]({{< docsref "/getting-started/rfs" >}}). diff --git a/site/content/docs/0.0/examples/font/index.html b/site/content/docs/0.0/examples/font/index.html new file mode 100644 index 0000000000..28e1be87e0 --- /dev/null +++ b/site/content/docs/0.0/examples/font/index.html @@ -0,0 +1,9 @@ +--- +layout: examples +title: Font +aliases: +- "/examples/font" +- "/docs/examples/font" +--- + +
diff --git a/site/data/examples.yml b/site/data/examples.yml index b777dab722..cd25a173b0 100644 --- a/site/data/examples.yml +++ b/site/data/examples.yml @@ -40,6 +40,8 @@ - category: Framework description: "Examples that focus on implementing uses of built-in components provided by OUDS Web." examples: + - name: Font + description: "Multiple examples of fonts to see them in action." - name: Grid description: "Multiple examples of grid layouts with all four tiers, nesting, and more." - name: Grid system diff --git a/site/data/sidebar.yml b/site/data/sidebar.yml index ddc9cccc1e..103498fbfa 100644 --- a/site/data/sidebar.yml +++ b/site/data/sidebar.yml @@ -66,9 +66,7 @@ icon_color: body-color pages: - title: Reboot - draft: true - title: Typography - draft: true - title: Images draft: true - title: Tables @@ -205,7 +203,6 @@ - title: Float - title: Interactions - title: Link - draft: true - title: Object fit - title: Opacity - title: Overflow @@ -214,7 +211,6 @@ - title: Sizing - title: Spacing - title: Text - draft: true - title: Vertical align - title: Visibility - title: Z-index diff --git a/site/static/docs/0.0/assets/img/examples/font.png b/site/static/docs/0.0/assets/img/examples/font.png new file mode 100644 index 0000000000000000000000000000000000000000..0ccfd5674abe02a632aeba1498cce8923bcda83b GIT binary patch literal 8557 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 literal 0 HcmV?d00001 diff --git a/site/static/docs/0.0/assets/img/examples/font@2x.png b/site/static/docs/0.0/assets/img/examples/font@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..95337d7110ac90cc6bb04bf301ad79a132e16ce3 GIT binary patch literal 28562 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 literal 0 HcmV?d00001