vanilla-framework 4.14.0 → 4.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vanilla-framework",
3
- "version": "4.14.0",
3
+ "version": "4.15.0",
4
4
  "author": {
5
5
  "email": "webteam@canonical.com",
6
6
  "name": "Canonical Webteam"
@@ -31,7 +31,7 @@
31
31
  "build": "yarn build-scss && yarn build-js && yarn build-class-references",
32
32
  "build-scss": "sass --load-path=node_modules --embed-sources --style=compressed scss:build/css && postcss --use autoprefixer --replace 'build/css/**/*.css' --map",
33
33
  "build:essential": "yarn run build-js && sass --load-path=node_modules --embed-sources --style=compressed scss/build.scss:build/css/build.css scss/docs:build/css/docs && postcss --use autoprefixer --replace 'build/css/**/*.css' --map",
34
- "build-js": "mkdir -p build/js/modules && cp node_modules/@canonical/cookie-policy/build/js/cookie-policy.js build/js/modules && cp node_modules/@canonical/latest-news/dist/latest-news.js build/js/modules",
34
+ "build-js": "mkdir -p build/js/modules && cp node_modules/@canonical/cookie-policy/build/js/cookie-policy.js build/js/modules && cp node_modules/@canonical/latest-news/dist/latest-news.js build/js/modules && cp node_modules/js-beautify/js/lib/beautify.js node_modules/js-beautify/js/lib/beautify-html.js node_modules/js-beautify/js/lib/beautify-css.js build/js/modules",
35
35
  "build-class-references": "node scripts/create-class-references.js",
36
36
  "cypress:open": "cypress open",
37
37
  "cypress:run": "cypress run",
@@ -57,23 +57,24 @@
57
57
  "devDependencies": {
58
58
  "@canonical/cookie-policy": "3.6.4",
59
59
  "@canonical/latest-news": "1.5.0",
60
- "@percy/cli": "1.28.7",
60
+ "@percy/cli": "1.29.0",
61
61
  "@testing-library/cypress": "10.0.2",
62
62
  "autoprefixer": "10.4.19",
63
- "cypress": "13.10.0",
63
+ "cypress": "13.13.2",
64
64
  "jest": "29.7.0",
65
+ "js-beautify": "1.15.1",
65
66
  "markdown-spellcheck": "1.3.1",
66
67
  "parker": "0.0.10",
67
- "postcss": "8.4.38",
68
+ "postcss": "8.4.40",
68
69
  "postcss-cli": "11.0.0",
69
70
  "postcss-scss": "4.0.9",
70
- "prettier": "3.3.0",
71
- "sass": "1.77.4",
72
- "stylelint": "16.6.1",
73
- "stylelint-config-recommended-scss": "14.0.0",
71
+ "prettier": "3.3.3",
72
+ "sass": "1.77.8",
73
+ "stylelint": "16.8.1",
74
+ "stylelint-config-recommended-scss": "14.1.0",
74
75
  "stylelint-order": "6.0.4",
75
- "stylelint-prettier": "5.0.0",
76
+ "stylelint-prettier": "5.0.2",
76
77
  "svgo": "3.3.2",
77
- "yaml": "2.4.3"
78
+ "yaml": "2.5.0"
78
79
  }
79
80
  }
@@ -163,11 +163,6 @@
163
163
  &::-webkit-search-results-decoration {
164
164
  display: none;
165
165
  }
166
-
167
- &::-webkit-search-cancel-button {
168
- -webkit-appearance: searchfield-cancel-button; // stylelint-disable-line property-no-vendor-prefix
169
- cursor: pointer;
170
- }
171
166
  }
172
167
 
173
168
  input[list] {
@@ -17,10 +17,35 @@
17
17
  background-image: vf-icon-chevron-url($color);
18
18
  }
19
19
 
20
+ // Default chevron is the same as down chevron - points down, as in its usage
21
+ // in accordions/dropdowns
20
22
  @mixin vf-icon-chevron-themed {
21
23
  @include vf-themed-icon($light-value: vf-icon-chevron-url($colors--light-theme--icon), $dark-value: vf-icon-chevron-url($colors--dark-theme--icon));
22
24
  }
23
25
 
26
+ @mixin vf-icon-chevron-up-themed {
27
+ @include vf-themed-icon($light-value: vf-icon-chevron-url($colors--light-theme--icon), $dark-value: vf-icon-chevron-url($colors--dark-theme--icon));
28
+ transform: rotate(180deg);
29
+ }
30
+
31
+ @mixin vf-icon-chevron-right-themed {
32
+ @include vf-themed-icon($light-value: vf-icon-chevron-url($colors--light-theme--icon), $dark-value: vf-icon-chevron-url($colors--dark-theme--icon));
33
+ transform: rotate(-90deg);
34
+ }
35
+
36
+ @mixin vf-icon-chevron-down-themed {
37
+ @include vf-icon-chevron-themed;
38
+ }
39
+
40
+ @mixin vf-icon-chevron-left-themed {
41
+ @include vf-themed-icon($light-value: vf-icon-chevron-url($colors--light-theme--icon), $dark-value: vf-icon-chevron-url($colors--dark-theme--icon));
42
+ transform: rotate(90deg);
43
+ }
44
+
45
+ @mixin vf-icon-chevron-muted {
46
+ @include vf-themed-icon($light-value: vf-icon-chevron-url($colors--light-theme--text-muted), $dark-value: vf-icon-chevron-url($colors--dark-theme--text-muted));
47
+ }
48
+
24
49
  // anchor
25
50
  @function vf-icon-anchor-url($color) {
26
51
  @return url("data:image/svg+xml,%3Csvg width='16' height='16' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M8 1a2.5 2.5 0 01.75 4.885v1.068h2.27v1.5H8.75v5.022c2.438-.161 4.172-1.077 4.172-1.669h1.5C14.422 13.57 11.547 15 8 15c-3.547 0-6.422-1.43-6.422-3.194h1.5c0 .592 1.734 1.508 4.172 1.67V8.452H4.904v-1.5H7.25V5.886A2.501 2.501 0 018 1zm0 1.5a1 1 0 100 2 1 1 0 000-2z' fill='#{vf-url-friendly-color($color)}' fill-rule='nonzero'/%3E%3C/svg%3E");
@@ -269,6 +294,10 @@
269
294
  @include vf-themed-icon($light-value: vf-icon-search-url($colors--light-theme--icon), $dark-value: vf-icon-search-url($colors--dark-theme--icon));
270
295
  }
271
296
 
297
+ @mixin vf-icon-search-muted {
298
+ @include vf-themed-icon($light-value: vf-icon-search-url($colors--light-theme--text-muted), $dark-value: vf-icon-search-url($colors--dark-theme--text-muted));
299
+ }
300
+
272
301
  // success
273
302
  @function vf-icon-success-url($color: $color-positive, $color-symbol: $color-x-light) {
274
303
  @return url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16'%3E%3Cg fill='none' fill-rule='nonzero'%3E%3Cpath fill='#{vf-url-friendly-color($color)}' d='M8 1a7 7 0 110 14A7 7 0 018 1zm2.83 3.502L6.863 9.884 5.174 8.096l-1.09 1.03 2.92 3.096 5.034-6.83-1.208-.89z'/%3E%3Cpath fill='#{vf-url-friendly-color($color-symbol)}' d='M10.83 4.502l1.208.89-5.033 6.83-2.922-3.096 1.091-1.03 1.689 1.789z'/%3E%3C/g%3E%3C/svg%3E");
@@ -43,7 +43,7 @@
43
43
  }
44
44
 
45
45
  %vf-card-padding {
46
- overflow: auto;
46
+ overflow: auto; // prevent overflow of child margins
47
47
  padding: $spv--large;
48
48
  }
49
49
 
@@ -52,8 +52,6 @@
52
52
  @extend %vf-card-padding;
53
53
 
54
54
  margin-bottom: $spv--x-large;
55
- overflow: auto; // prevent overflow of child margins
56
- padding: $spv--large;
57
55
  }
58
56
 
59
57
  //accordion, table
@@ -1,14 +1,9 @@
1
1
  @mixin vf-l-application-panels {
2
2
  .p-panel {
3
- background: $colors--light-theme--background-default;
4
- color: $colors--light-theme--text-default;
3
+ background: $colors--theme--background-default;
4
+ color: $colors--theme--text-default;
5
5
  max-width: 100%;
6
6
  min-height: 100%; // make sure it fills whole container even when has little content
7
-
8
- &.is-dark {
9
- background: $colors--dark-theme--background-default;
10
- color: $colors--dark-theme--text-default;
11
- }
12
7
  }
13
8
 
14
9
  .p-panel__header {
@@ -18,14 +13,10 @@
18
13
  }
19
14
 
20
15
  .p-panel__header.is-sticky {
21
- background: $colors--light-theme--background-default;
16
+ background: $colors--theme--background-default;
22
17
  position: sticky;
23
18
  top: 0;
24
19
  z-index: 5;
25
-
26
- .p-panel.is-dark & {
27
- background: $colors--dark-theme--background-default;
28
- }
29
20
  }
30
21
 
31
22
  .p-panel__content {
@@ -229,7 +229,7 @@ $application-layout--side-nav-width-expanded: 15rem !default;
229
229
  }
230
230
 
231
231
  .l-application .l-status {
232
- border-top: 1px solid $colors--light-theme--border-low-contrast;
232
+ border-top: 1px solid $colors--theme--border-default;
233
233
  grid-area: status;
234
234
  z-index: 102;
235
235
  }
@@ -265,7 +265,7 @@ $application-layout--side-nav-width-expanded: 15rem !default;
265
265
 
266
266
  @media (min-width: $application-layout--breakpoint-side-nav-collapsed) {
267
267
  &.is-pinned {
268
- border-left: 1px solid $colors--light-theme--border-low-contrast;
268
+ border-left: 1px solid $colors--theme--border-default;
269
269
  box-shadow: none;
270
270
  grid-area: aside;
271
271
  justify-self: auto;
@@ -3,7 +3,6 @@
3
3
  @mixin vf-p-article-pagination {
4
4
  %chevron-icon {
5
5
  @extend %icon;
6
- @include vf-icon-chevron-themed;
7
6
 
8
7
  content: '';
9
8
  position: absolute;
@@ -73,9 +72,9 @@
73
72
 
74
73
  &::before {
75
74
  @extend %chevron-icon;
75
+ @include vf-icon-chevron-left-themed;
76
76
 
77
77
  left: $sp-small;
78
- transform: rotate(90deg);
79
78
  }
80
79
  }
81
80
 
@@ -95,9 +94,9 @@
95
94
 
96
95
  &::after {
97
96
  @extend %chevron-icon;
97
+ @include vf-icon-chevron-right-themed;
98
98
 
99
99
  right: $sp-small;
100
- transform: rotate(-90deg);
101
100
  }
102
101
  }
103
102
  }
@@ -80,7 +80,7 @@
80
80
  $button-disabled-border-color: $colors--theme--button-positive-default,
81
81
  $button-text-color: $colors--theme--button-positive-text
82
82
  );
83
- @include vf-focus($color-focus-positive);
83
+ @include vf-focus($colors--theme--positive-focus);
84
84
  }
85
85
  }
86
86
 
@@ -0,0 +1,20 @@
1
+ /*
2
+ @classreference
3
+ cta-block:
4
+ CTA Block:
5
+ .p-cta-block:
6
+ Main element of the CTA block.
7
+ */
8
+
9
+ @import 'settings';
10
+
11
+ @mixin vf-p-cta-block {
12
+ .p-cta-block {
13
+ align-items: baseline;
14
+ border-top: 1px solid $colors--theme--border-low-contrast;
15
+ display: flex;
16
+ flex-wrap: wrap;
17
+ padding-bottom: $spv--x-large;
18
+ padding-top: $spv--small;
19
+ }
20
+ }
@@ -39,7 +39,7 @@
39
39
  // (see https://github.com/canonical/vanilla-framework/issues/3199)
40
40
  .grid-demo .col,
41
41
  .grid-demo [class*='#{$grid-column-prefix}'] {
42
- background: transparentize($color-negative, 0.9);
42
+ background: $colors--theme--background-negative-default;
43
43
  margin-bottom: $spv--small;
44
44
  }
45
45
 
@@ -167,11 +167,12 @@
167
167
 
168
168
  // variants
169
169
 
170
+ // deprecated, will be removed in v5
170
171
  .row.is-bordered {
171
172
  position: relative;
172
173
 
173
174
  &::before {
174
- background: $color-mid-light;
175
+ background: $colors--theme--border-low-contrast;
175
176
  content: '';
176
177
  height: 1px;
177
178
  left: map-get($grid-margin-widths, small);
@@ -319,6 +320,77 @@
319
320
  }
320
321
  }
321
322
 
323
+ // 75/25 split on medium and large screens
324
+ .row--75-25 {
325
+ @extend %vf-row;
326
+
327
+ > .col {
328
+ @include vf-grid-column($grid-columns-small);
329
+
330
+ @media (min-width: $threshold-4-6-col) {
331
+ &:nth-of-type(1) {
332
+ @include vf-grid-column(4);
333
+ }
334
+
335
+ &:nth-of-type(2) {
336
+ @include vf-grid-column(2);
337
+ }
338
+
339
+ // if there is only one column, use the whole width
340
+ &:only-of-type {
341
+ @include vf-grid-column(6);
342
+ }
343
+ }
344
+
345
+ @media (min-width: $threshold-6-12-col) {
346
+ &:nth-of-type(1) {
347
+ @include vf-grid-column($col-75);
348
+ }
349
+
350
+ &:nth-of-type(2) {
351
+ @include vf-grid-column($col-25);
352
+ }
353
+ }
354
+ }
355
+ }
356
+
357
+ .row--75-25-on-medium {
358
+ @extend %vf-row;
359
+
360
+ > .col {
361
+ @media ($threshold-4-6-col <= width < $threshold-6-12-col) {
362
+ &:nth-of-type(1) {
363
+ @include vf-grid-column(4);
364
+ }
365
+
366
+ &:nth-of-type(2) {
367
+ @include vf-grid-column(2);
368
+ }
369
+
370
+ // if there is only one column, use the whole width
371
+ &:only-of-type {
372
+ @include vf-grid-column(6);
373
+ }
374
+ }
375
+ }
376
+ }
377
+
378
+ .row--75-25-on-large {
379
+ @extend %vf-row;
380
+
381
+ > .col {
382
+ @media (min-width: $threshold-6-12-col) {
383
+ &:nth-of-type(1) {
384
+ @include vf-grid-column($col-75);
385
+ }
386
+
387
+ &:nth-of-type(2) {
388
+ @include vf-grid-column($col-25);
389
+ }
390
+ }
391
+ }
392
+ }
393
+
322
394
  .row--25-25-50 {
323
395
  @extend %vf-row;
324
396
 
@@ -130,21 +130,23 @@
130
130
 
131
131
  @mixin vf-p-icon-chevron {
132
132
  .p-icon--chevron-up {
133
- transform: rotate(180deg);
134
- }
135
- .p-icon--chevron-left {
136
- transform: rotate(90deg);
133
+ @include vf-icon-chevron-up-themed;
137
134
  }
138
135
  .p-icon--chevron-right {
139
- transform: rotate(-90deg);
136
+ @include vf-icon-chevron-right-themed;
137
+ }
138
+ .p-icon--chevron-down {
139
+ @include vf-icon-chevron-down-themed;
140
+ }
141
+ .p-icon--chevron-left {
142
+ @include vf-icon-chevron-left-themed;
140
143
  }
141
144
 
142
- .p-icon--chevron-left,
145
+ .p-icon--chevron-up,
143
146
  .p-icon--chevron-right,
144
147
  .p-icon--chevron-down,
145
- .p-icon--chevron-up {
148
+ .p-icon--chevron-left {
146
149
  @extend %icon;
147
- @include vf-icon-chevron-themed;
148
150
  }
149
151
  }
150
152
 
@@ -4,6 +4,8 @@
4
4
  Image container:
5
5
  .p-image-container:
6
6
  Main element of the image component.
7
+ "&.is-cover":
8
+ Cover variant, to be used to set the `.p-image-container__image` within to cover the container.
7
9
  "&.is-highlighted":
8
10
  Highlighted variant, to be used to highlight contents.
9
11
  .p-image-container--16-9:
@@ -4,17 +4,16 @@
4
4
  @extend %small-caps-text;
5
5
  }
6
6
 
7
- $logo-section-item-size: 8rem; // height of the logos on large screens
8
- $logo-section-item-size-medium: 6rem; // height of the logos on medium screens
7
+ $logo-section-item-size: 6.5rem; // height of the logos on large screens
9
8
  $logo-section-item-size-small: 4rem; // height of the logos on small screens
10
9
 
11
10
  $logo-section-offset: 1rem; // offset by which rows are pulled closer together
12
- $logo-section-offset-medium: 0.75rem; // height of the logos on medium screens
13
11
  $logo-section-offset-small: 0.5rem; // height of the logos on small screens
14
12
 
15
- $logo-section-item-gap: 3rem;
16
- $logo-section-item-gap-dense: calc(0.5 * $logo-section-item-gap);
13
+ $logo-section-item-gap: 2rem;
17
14
 
15
+ // TODO: Remove .p-logo-section--dense since it's been deprecated in favor
16
+ // of just using .p-logo-section instead
18
17
  .p-logo-section,
19
18
  .p-logo-section--dense {
20
19
  .p-logo-section__item {
@@ -25,11 +24,6 @@
25
24
  margin-top: calc(-1 * $logo-section-offset-small); // pull the previous row of logos down
26
25
 
27
26
  @media (min-width: $breakpoint-small) {
28
- margin-bottom: calc(-1 * $logo-section-offset-medium);
29
- margin-top: calc(-1 * $logo-section-offset-medium);
30
- }
31
-
32
- @media (min-width: $breakpoint-large) {
33
27
  margin-bottom: calc(-1 * $logo-section-offset);
34
28
  margin-top: calc(-1 * $logo-section-offset);
35
29
  }
@@ -42,10 +36,6 @@
42
36
  width: auto;
43
37
 
44
38
  @media (min-width: $breakpoint-small) {
45
- height: $logo-section-item-size-medium;
46
- }
47
-
48
- @media (min-width: $breakpoint-large) {
49
39
  height: $logo-section-item-size;
50
40
  }
51
41
  }
@@ -58,36 +48,12 @@
58
48
  padding-top: $logo-section-offset-small;
59
49
 
60
50
  @media (min-width: $breakpoint-small) {
61
- padding-bottom: $logo-section-offset-medium;
62
- padding-top: $logo-section-offset-medium;
63
- }
64
-
65
- @media (min-width: $breakpoint-large) {
66
51
  padding-bottom: $logo-section-offset;
67
52
  padding-top: $logo-section-offset;
68
53
  }
69
54
  }
70
55
  }
71
56
 
72
- .p-logo-section--dense {
73
- .p-logo-section__item {
74
- display: inline-block;
75
- margin: 0;
76
- margin-bottom: calc(-1 * $logo-section-offset-small); // pull the next row of logos up
77
- margin-right: $logo-section-item-gap-dense;
78
- margin-top: calc(-1 * $logo-section-offset-small); // pull the previous row of logos down
79
- }
80
-
81
- .p-logo-section__logo {
82
- height: $logo-section-item-size-small;
83
- }
84
-
85
- .p-logo-section__items {
86
- padding-bottom: $logo-section-offset-small;
87
- padding-top: $logo-section-offset-small;
88
- }
89
- }
90
-
91
57
  // fallback for old logo sections that may have logos not properly aligned by design team
92
58
  .p-logo-section.has-misaligned-images,
93
59
  .p-logo-section--dense.has-misaligned-images {
@@ -98,10 +64,6 @@
98
64
  width: $logo-section-item-size-small;
99
65
 
100
66
  @media (min-width: $breakpoint-small) {
101
- width: $logo-section-item-size-medium;
102
- }
103
-
104
- @media (min-width: $breakpoint-large) {
105
67
  width: $logo-section-item-size;
106
68
  }
107
69
  }
@@ -1,5 +1,9 @@
1
1
  @mixin vf-p-navigation-reduced {
2
2
  .p-navigation--reduced {
3
+ // height of reduced navigation calculated from line height and padding
4
+ $reduced-nav-height: calc(map-get($line-heights, x-small) + 2 * $spv--small);
5
+
6
+ background-color: $colors--theme--background-alt;
3
7
  position: relative;
4
8
  z-index: 99; // display above sticky top navigation, but below modals/overlays
5
9
 
@@ -7,24 +11,38 @@
7
11
 
8
12
  // orange logo tag is hidden in reduced navigation
9
13
  .p-navigation__tagged-logo {
10
- .p-navigation__link {
11
- padding-left: 0;
12
- }
13
-
14
14
  .p-navigation__logo-tag {
15
15
  display: none;
16
16
  }
17
+
18
+ @media (min-width: $breakpoint-navigation-threshold) {
19
+ // on large screens align the logo with the grid start
20
+ .p-navigation__link {
21
+ padding-left: 0;
22
+ }
23
+ }
17
24
  }
18
25
 
19
26
  // reduced nav logo text uses default font size (on small screens)
20
27
  .p-navigation__logo-title {
28
+ color: $colors--theme--text-muted;
21
29
  font-size: #{map-get($font-sizes, default)}rem;
30
+ font-weight: $font-weight-regular-text;
31
+ }
32
+
33
+ // reduced padding on small screens
34
+ .p-navigation__link {
35
+ padding-bottom: $spv--medium;
36
+ padding-top: $spv--medium;
37
+ }
38
+
39
+ // links in the banner (Menu toggle, search toggle) use muted text colour
40
+ .p-navigation__banner .p-navigation__link {
41
+ color: $colors--theme--text-muted;
22
42
  }
23
43
 
24
44
  // REDUCED SIZE OF NAVIGATION ON LARGE SCREENS
25
45
  @media (min-width: $breakpoint-navigation-threshold) {
26
- background-color: $colors--theme--background-alt;
27
-
28
46
  // adjust font size for reduced nav on large screens
29
47
  .p-navigation__link,
30
48
  .p-navigation__logo-title {
@@ -40,18 +58,39 @@
40
58
 
41
59
  .p-navigation__item--dropdown-toggle .p-navigation__link {
42
60
  &::after {
61
+ @include vf-icon-chevron-muted;
43
62
  top: $spv--small;
44
63
  }
45
64
  }
46
65
 
47
66
  .p-navigation__item--dropdown-toggle.is-active {
48
67
  background-color: $colors--theme--background-default;
68
+
69
+ .p-navigation__link {
70
+ color: $colors--theme--text-default;
71
+ }
72
+
73
+ .p-navigation__link::after {
74
+ @include vf-icon-chevron-themed;
75
+ }
76
+ }
77
+
78
+ .p-navigation__link--search-toggle {
79
+ &::after {
80
+ @include vf-icon-search-muted;
81
+ }
49
82
  }
50
83
  }
51
84
 
52
85
  // SEARCH IN REDUCED NAVIGATION
53
86
 
54
87
  .p-navigation__link--search-toggle {
88
+ // use muted icon to align with text colour
89
+ &::after {
90
+ @include vf-icon-search-muted;
91
+ top: calc($spv--medium + map-get($nudges, x-small));
92
+ }
93
+
55
94
  // search label is always hidden in reduced navigation
56
95
  .p-navigation__search-label {
57
96
  display: none;
@@ -64,21 +103,18 @@
64
103
  }
65
104
  }
66
105
 
67
- // hide secondary navigation banner when search is open on mobile
68
- &.has-search-open + .has-search-open .p-navigation__banner {
69
- display: none;
70
- }
71
106
  @media (min-width: $breakpoint-navigation-threshold) {
72
- &.has-search-open + .has-search-open .p-navigation__banner {
73
- display: flex; // reset to value as defined in _patterns_navigation.scss
74
- }
75
-
76
107
  &.has-search-open {
77
108
  // make sure reduced navigation items remain visible when search is open
78
109
  // both classes needed for specificity
79
110
  .p-navigation__nav .p-navigation__items {
80
111
  display: inline-flex;
81
112
  }
113
+
114
+ // position the search under the reduced navigation
115
+ .p-navigation__search {
116
+ top: $reduced-nav-height;
117
+ }
82
118
  }
83
119
  }
84
120
  }
@@ -1,15 +1,14 @@
1
1
  @import 'settings';
2
2
 
3
3
  $lightness-threshold: 70;
4
- $navigation-logo-tag-width: 1.313rem; // 21px when 1rem is 16px
5
- $navigation-logo-tag-height: 2rem;
6
- $navigation-logo-tag-height-desktop: 2.3rem;
7
- $navigation-logo-banner-height: 3rem; // legacy logo height (small and medium screens)
8
- $navigation-logo-banner-height-desktop: 3.5rem; // legacy logo height (on large screens)
4
+ $navigation-logo-tag-width: 1.375rem; // 22px when 1rem is 16px
5
+ $navigation-logo-tag-height: 2.375rem; // 38px when 1rem is 16px
6
+ $navigation-logo-banner-height: 3.5rem; // legacy logo height (on large screens)
9
7
  $navigation-logo-size: 1rem;
10
- $navigation-logo-padding: calc(1.5rem + 0.19rem); // ~27px to align better with logos as originally designed in SVG
8
+ $navigation-logo-padding: calc(1.5rem + 0.1rem); // ~25.6px to align better with logos as originally designed in SVG
11
9
  $sph-navigation-link: 0.3rem;
12
- $spv-navigation-logo-bottom-position: 0.125rem; // 2px when 1rem is 16px
10
+ $spv-navigation-logo-bottom-position: 0.25rem; // 4px when 1rem is 16px
11
+ $navigation-height: calc(map-get($line-heights, default-text) + 2 * $spv--large); // navigation bar height based on line height and paddings
13
12
 
14
13
  @mixin vf-p-navigation {
15
14
  // placeholders
@@ -143,6 +142,7 @@ $spv-navigation-logo-bottom-position: 0.125rem; // 2px when 1rem is 16px
143
142
  .p-navigation--sliding,
144
143
  .p-navigation--reduced {
145
144
  background-color: $colors--theme--background-default;
145
+ color: $colors--theme--text-default;
146
146
  display: flex;
147
147
  flex-direction: column;
148
148
  flex-shrink: 0;
@@ -155,6 +155,7 @@ $spv-navigation-logo-bottom-position: 0.125rem; // 2px when 1rem is 16px
155
155
 
156
156
  // p-search-box overrides
157
157
  .p-search-box {
158
+ background-color: $colors--theme--background-default;
158
159
  flex: 1 0 auto;
159
160
  margin-left: map-get($grid-margin-widths, small);
160
161
  margin-right: map-get($grid-margin-widths, small);
@@ -303,7 +304,8 @@ $spv-navigation-logo-bottom-position: 0.125rem; // 2px when 1rem is 16px
303
304
  .p-navigation__link--menu-toggle {
304
305
  // reset padding for navigation links in the navigation banner
305
306
  @extend %navigation-link-responsive-padding-horizontal;
306
- @extend %navigation-link-responsive-padding-vertical;
307
+ padding-bottom: $spv--large;
308
+ padding-top: $spv--large;
307
309
 
308
310
  // remove navigation separator for navigation links in the navigation banner
309
311
  &::before {
@@ -324,10 +326,6 @@ $spv-navigation-logo-bottom-position: 0.125rem; // 2px when 1rem is 16px
324
326
  height: $navigation-logo-banner-height;
325
327
  margin: 0 $sph--large 0 0;
326
328
 
327
- @media (min-width: $breakpoint-navigation-threshold) {
328
- height: $navigation-logo-banner-height-desktop;
329
- }
330
-
331
329
  .p-navigation__item {
332
330
  @include vf-focus;
333
331
 
@@ -344,24 +342,20 @@ $spv-navigation-logo-bottom-position: 0.125rem; // 2px when 1rem is 16px
344
342
  }
345
343
 
346
344
  .p-navigation__logo-tag {
345
+ align-items: flex-end;
347
346
  background-color: $color-ubuntu;
347
+ display: flex;
348
348
  height: $navigation-logo-tag-height;
349
+ justify-content: center;
349
350
  left: 0;
351
+ padding-bottom: $spv-navigation-logo-bottom-position;
350
352
  position: absolute;
351
353
  top: 0;
352
354
  width: $navigation-logo-tag-width;
353
-
354
- @media (min-width: $breakpoint-navigation-threshold) {
355
- height: $navigation-logo-tag-height-desktop;
356
- }
357
355
  }
358
356
 
359
357
  .p-navigation__logo-icon {
360
- bottom: $spv-navigation-logo-bottom-position;
361
358
  height: $navigation-logo-size;
362
- left: 50%;
363
- position: absolute;
364
- transform: translate(-50%, 0);
365
359
  width: $navigation-logo-size;
366
360
  }
367
361
 
@@ -415,6 +409,7 @@ $spv-navigation-logo-bottom-position: 0.125rem; // 2px when 1rem is 16px
415
409
  display: flex;
416
410
  flex-wrap: wrap;
417
411
  margin-top: 0; // prevents bottom border of nav from moving 1px
412
+ position: static;
418
413
  }
419
414
  }
420
415
 
@@ -576,12 +571,8 @@ $spv-navigation-logo-bottom-position: 0.125rem; // 2px when 1rem is 16px
576
571
  position: absolute;
577
572
  right: calc($sph--large / 2);
578
573
  text-indent: calc(100% + 10rem);
579
- top: calc($spv--medium + map-get($nudges, x-small));
574
+ top: calc($spv--large + map-get($nudges, x-small));
580
575
  width: map-get($icon-sizes, default);
581
-
582
- @media (min-width: $breakpoint-navigation-threshold) {
583
- top: calc($spv--large + map-get($nudges, x-small));
584
- }
585
576
  }
586
577
  }
587
578
 
@@ -626,6 +617,7 @@ $spv-navigation-logo-bottom-position: 0.125rem; // 2px when 1rem is 16px
626
617
  // make sure search in navigation renders on top of the overlay
627
618
  .p-navigation__nav {
628
619
  display: flex;
620
+ position: relative;
629
621
  z-index: 60;
630
622
  }
631
623
 
@@ -636,7 +628,14 @@ $spv-navigation-logo-bottom-position: 0.125rem; // 2px when 1rem is 16px
636
628
 
637
629
  // show expanded search box
638
630
  .p-navigation__search {
631
+ background-color: $colors--theme--background-default;
639
632
  display: flex;
633
+ position: absolute;
634
+ width: 100%;
635
+
636
+ @media (min-width: $breakpoint-navigation-threshold) {
637
+ background-color: transparent;
638
+ }
640
639
  }
641
640
 
642
641
  // fade in search overlay
@@ -730,6 +729,8 @@ $spv-navigation-logo-bottom-position: 0.125rem; // 2px when 1rem is 16px
730
729
  }
731
730
 
732
731
  &.is-active {
732
+ background: $colors--theme--background-active;
733
+
733
734
  &::after {
734
735
  transform: rotate(0deg);
735
736
 
@@ -748,9 +749,56 @@ $spv-navigation-logo-bottom-position: 0.125rem; // 2px when 1rem is 16px
748
749
  // increase padding to accommodate chevron icon
749
750
  padding-right: calc(2 * $sph--small + map-get($icon-sizes, default));
750
751
  }
752
+ }
751
753
 
752
- &:first-child .p-navigation__link::before {
753
- content: none;
754
+ .p-navigation--reduced .p-navigation__dropdown.is-full-width,
755
+ .p-navigation--sliding .p-navigation__dropdown.is-full-width {
756
+ .p-navigation__dropdown-content--full-width {
757
+ @extend %vf-has-box-shadow;
758
+ @include vf-transition(transform, snap);
759
+ background-color: $colors--theme--background-default;
760
+ border-top: 1px solid $colors--theme--border-default;
761
+ display: none; // hide on small screens
762
+ }
763
+
764
+ // on desktop display full width meganav dropdowns
765
+ @media (min-width: $breakpoint-navigation-threshold) {
766
+ background-color: $color-transparent;
767
+ box-shadow: none;
768
+ left: 0;
769
+ overflow: hidden;
770
+ position: absolute;
771
+ right: 0;
772
+
773
+ // hide mobile sliding menu on full width view
774
+ .p-navigation__dropdown-content--sliding {
775
+ display: none;
776
+ }
777
+
778
+ .p-navigation__dropdown-content--full-width {
779
+ display: block;
780
+ transform: translateY(0);
781
+ }
782
+ }
783
+
784
+ // collapsed dropdowns are animated off-screen
785
+ &.is-collapsed .p-navigation__dropdown-content--full-width {
786
+ transform: translateY(-101%);
787
+ }
788
+
789
+ // rows think they are nested (because they are inside of navigation row)
790
+ // we need to reset them back to original state
791
+ .row,
792
+ [class*='row--'] {
793
+ @extend %fixed-width-container--common-properties;
794
+ }
795
+ }
796
+
797
+ .p-navigation__dropdown-container {
798
+ display: none;
799
+
800
+ .p-navigation__item--dropdown-toggle.is-active & {
801
+ display: block;
754
802
  }
755
803
  }
756
804
 
@@ -789,6 +837,7 @@ $spv-navigation-logo-bottom-position: 0.125rem; // 2px when 1rem is 16px
789
837
 
790
838
  .p-navigation--sliding.has-menu-open,
791
839
  .p-navigation--reduced.has-menu-open {
840
+ box-shadow: $colors--theme--background-overlay 0px 0px 0px 100vh;
792
841
  height: 100vh;
793
842
  overflow-y: hidden;
794
843
  position: fixed;
@@ -797,7 +846,7 @@ $spv-navigation-logo-bottom-position: 0.125rem; // 2px when 1rem is 16px
797
846
  @media (min-width: $breakpoint-navigation-threshold) {
798
847
  height: auto;
799
848
  overflow-y: visible;
800
- position: static;
849
+ position: relative;
801
850
  width: auto;
802
851
  }
803
852
 
@@ -811,7 +860,7 @@ $spv-navigation-logo-bottom-position: 0.125rem; // 2px when 1rem is 16px
811
860
  }
812
861
  .p-navigation__nav {
813
862
  display: block;
814
- height: 100vh;
863
+ height: calc(100vh - $navigation-height);
815
864
  overflow-x: hidden;
816
865
 
817
866
  .p-navigation__items {
@@ -838,12 +887,17 @@ $spv-navigation-logo-bottom-position: 0.125rem; // 2px when 1rem is 16px
838
887
  .p-navigation--sliding .p-navigation__dropdown,
839
888
  .p-navigation--reduced .p-navigation__dropdown {
840
889
  display: block;
841
- height: 100vh;
890
+ height: calc(100vh - $navigation-height);
842
891
  left: 100vw;
843
892
  position: absolute;
844
893
  top: 0;
845
894
  transition: transform $sliding-nav-animation-settings;
846
895
 
896
+ // set background of child elements to properly cover parent dropdown levels when scrolling
897
+ & > * {
898
+ background: $colors--theme--background-default;
899
+ }
900
+
847
901
  @media (min-width: $breakpoint-navigation-threshold) {
848
902
  display: none;
849
903
  height: auto;
@@ -852,8 +906,9 @@ $spv-navigation-logo-bottom-position: 0.125rem; // 2px when 1rem is 16px
852
906
  top: unset;
853
907
  }
854
908
 
909
+ // overlay to create fade out effect on parent level
855
910
  &::before {
856
- box-shadow: -100vw 15px 0 15px black;
911
+ box-shadow: -100vw 0 0 0 $colors--light-theme--background-overlay;
857
912
  content: '';
858
913
  height: 100%;
859
914
  opacity: 0;
@@ -866,10 +921,14 @@ $spv-navigation-logo-bottom-position: 0.125rem; // 2px when 1rem is 16px
866
921
  }
867
922
  }
868
923
 
924
+ &[aria-hidden='true'] {
925
+ overflow: hidden; // prevent scrolling when dropdown is off screen
926
+ }
927
+
869
928
  &[aria-hidden='false'],
870
929
  &:not([aria-hidden]) {
871
930
  &::before {
872
- @include vf-themed-property(opacity, 0.33, 0.75);
931
+ opacity: 1;
873
932
  }
874
933
 
875
934
  display: block;
@@ -925,6 +984,30 @@ $spv-navigation-logo-bottom-position: 0.125rem; // 2px when 1rem is 16px
925
984
 
926
985
  .p-navigation--sliding,
927
986
  .p-navigation--reduced {
987
+ // FIXME
988
+ // We want to add some additional spacing on the bottom of the sliding dropdowns
989
+ // so that the last item is not directly at the bottom of the screen when scrolling,
990
+ // but because of the way it's currently implemented, the only way to achieve this
991
+ // is to add padding to the last item in the dropdown.
992
+ // This is a temporary solution until we can find a better way to implement this, but
993
+ // it may require bigger restructuring of the sliding navigation.
994
+
995
+ // top (1st) level navigation dropdown
996
+ .p-navigation__nav .p-navigation__items,
997
+ // 2nd level navigation dropdown (that has separate mobile and desktop versions)
998
+ .p-navigation__dropdown-content--sliding,
999
+ // further nested levels
1000
+ // (because of some weird style combination we have to select last child instead of adding padding on dropdown container itself)
1001
+ .p-navigation__dropdown > :last-child {
1002
+ // should be enough to make some space at the bottom
1003
+ // and workaround the issues of 100vh not taking address toolbar into account
1004
+ padding-bottom: 3rem;
1005
+
1006
+ @media (min-width: $breakpoint-navigation-threshold) {
1007
+ padding-bottom: 0;
1008
+ }
1009
+ }
1010
+
928
1011
  // Default positioning for nested dropdown buttons. Overridden by subsequent styles.
929
1012
  .p-navigation__item--dropdown-toggle {
930
1013
  position: initial;
@@ -39,9 +39,9 @@ $color-link-visited-dark: #a679d2 !default;
39
39
  $color-focus-dark: #9cf !default;
40
40
 
41
41
  // Focus modifications to meet AA 3:1 contrast ratio against
42
- // button background for positive/negative buttons
42
+ // button background for positive buttons
43
43
  $color-focus-positive: #003008 !default;
44
- $color-focus-negative: #3b0006 !default;
44
+ $color-focus-positive-dark: #9cf !default;
45
45
 
46
46
  // Button background color changes
47
47
  $input-background-opacity-amount: 0.04;
@@ -93,6 +93,7 @@ $states: (
93
93
  // --link-default - default link color
94
94
  // --link-visited - visited link color
95
95
  // --focus - focus highlight/outline color
96
+ // --positive-focus - focus highlight/outline color for positive buttons
96
97
  //
97
98
  // Background colors:
98
99
  // --background - default background color
@@ -114,6 +115,7 @@ $colors--light-theme--text-inactive: rgba($color-x-dark, $inactive-text-opacity-
114
115
  $colors--light-theme--link-default: $color-link !default;
115
116
  $colors--light-theme--link-visited: $color-link-visited !default;
116
117
  $colors--light-theme--focus: $color-focus !default;
118
+ $colors--light-theme--positive-focus: $color-focus-positive !default;
117
119
 
118
120
  $colors--light-theme--background-default: #fff !default;
119
121
  $colors--light-theme--background-alt: #f7f7f7 !default;
@@ -174,6 +176,7 @@ $colors--dark-theme--text-inactive: rgba($colors--dark-theme--text-default, $ina
174
176
  $colors--dark-theme--link-default: $color-link-dark !default;
175
177
  $colors--dark-theme--link-visited: $color-link-visited-dark !default;
176
178
  $colors--dark-theme--focus: $color-focus-dark !default;
179
+ $colors--dark-theme--positive-focus: $color-focus-positive-dark !default;
177
180
 
178
181
  $colors--dark-theme--background-default: #262626 !default;
179
182
  $colors--dark-theme--background-alt: #202020 !default;
@@ -241,6 +244,7 @@ $colors--theme--text-inactive: var(--vf-color-text-inactive);
241
244
  $colors--theme--link-default: var(--vf-color-link-default);
242
245
  $colors--theme--link-visited: var(--vf-color-link-visited);
243
246
  $colors--theme--focus: var(--vf-color-focus);
247
+ $colors--theme--positive-focus: var(--vf-color-positive-focus);
244
248
 
245
249
  $colors--theme--background-default: var(--vf-color-background-default);
246
250
  $colors--theme--background-alt: var(--vf-color-background-alt);
@@ -296,6 +300,7 @@ $colors--theme--button-negative-text: var(--vf-color-button-negative-text);
296
300
  --vf-color-link-default: #{$colors--light-theme--link-default};
297
301
  --vf-color-link-visited: #{$colors--light-theme--link-visited};
298
302
  --vf-color-focus: #{$colors--light-theme--focus};
303
+ --vf-color-positive-focus: #{$colors--light-theme--positive-focus};
299
304
 
300
305
  --vf-color-background-default: #{$colors--light-theme--background-default};
301
306
  --vf-color-background-alt: #{$colors--light-theme--background-alt};
@@ -351,6 +356,7 @@ $colors--theme--button-negative-text: var(--vf-color-button-negative-text);
351
356
  --vf-color-link-default: #{$colors--dark-theme--link-default};
352
357
  --vf-color-link-visited: #{$colors--dark-theme--link-visited};
353
358
  --vf-color-focus: #{$colors--dark-theme--focus};
359
+ --vf-color-positive-focus: #{$colors--dark-theme--positive-focus};
354
360
 
355
361
  --vf-color-background-default: #{$colors--dark-theme--background-default};
356
362
  --vf-color-background-alt: #{$colors--dark-theme--background-alt};
@@ -11,6 +11,7 @@
11
11
  @import 'patterns_chip';
12
12
  @import 'patterns_code-snippet';
13
13
  @import 'patterns_contextual-menu';
14
+ @import 'patterns_cta';
14
15
  @import 'patterns_divider';
15
16
  @import 'patterns_equal-height-row';
16
17
  @import 'patterns_form-help-text';
@@ -104,6 +105,7 @@
104
105
  @include vf-p-chip;
105
106
  @include vf-p-code-snippet;
106
107
  @include vf-p-contextual-menu;
108
+ @include vf-p-cta-block;
107
109
  @include vf-p-divider;
108
110
  @include vf-p-equal-height-row;
109
111
  @include vf-p-form-help-text;