@ch-post-common/common-web-frontend 0.0.1-security → 1.934.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of @ch-post-common/common-web-frontend might be problematic. Click here for more details.

Files changed (97) hide show
  1. package/components/accordion.scss +177 -0
  2. package/components/alert.scss +217 -0
  3. package/components/badge.scss +95 -0
  4. package/components/breadcrumb.scss +43 -0
  5. package/components/button.scss +168 -0
  6. package/components/card.scss +227 -0
  7. package/components/carousel.scss +161 -0
  8. package/components/custom-choice-control.scss +217 -0
  9. package/components/custom-range-input.scss +51 -0
  10. package/components/custom-select.scss +60 -0
  11. package/components/datatable.scss +147 -0
  12. package/components/datepicker.scss +220 -0
  13. package/components/detail-summary.scss +72 -0
  14. package/components/dropdown.scss +71 -0
  15. package/components/floating-label.scss +65 -0
  16. package/components/fonts.scss +35 -0
  17. package/components/form-feedback.scss +70 -0
  18. package/components/forms.scss +31 -0
  19. package/components/grid.scss +103 -0
  20. package/components/icons.scss +62 -0
  21. package/components/intranet-header/_icon.scss +6 -0
  22. package/components/intranet-header/_language-chooser.scss +40 -0
  23. package/components/intranet-header/_logo.scss +74 -0
  24. package/components/intranet-header/_nav-overflow.scss +56 -0
  25. package/components/intranet-header/_scaffolding.scss +96 -0
  26. package/components/intranet-header/_searchbox.scss +56 -0
  27. package/components/intranet-header/_settings.scss +23 -0
  28. package/components/intranet-header/_sidebar.scss +118 -0
  29. package/components/intranet-header/_top-navigation.scss +83 -0
  30. package/components/list-group.scss +156 -0
  31. package/components/modal.scss +87 -0
  32. package/components/pagination.scss +67 -0
  33. package/components/popover.scss +21 -0
  34. package/components/product-card.scss +74 -0
  35. package/components/progress.scss +15 -0
  36. package/components/reboot.scss +17 -0
  37. package/components/root.scss +10 -0
  38. package/components/sizing.scss +90 -0
  39. package/components/spinner.scss +58 -0
  40. package/components/stepper.scss +158 -0
  41. package/components/subnavigation.scss +131 -0
  42. package/components/switch.scss +132 -0
  43. package/components/tabs.scss +122 -0
  44. package/components/timepicker.scss +110 -0
  45. package/components/toast.scss +172 -0
  46. package/components/tooltip.scss +23 -0
  47. package/components/topic-teaser.scss +133 -0
  48. package/components/type.scss +106 -0
  49. package/components/utilities.scss +93 -0
  50. package/index.js +28 -0
  51. package/layouts/portal/_type.scss +83 -0
  52. package/lic/_bootstrap-license.scss +29 -0
  53. package/lic/_cwf-license.scss +7 -0
  54. package/mixins/_animation.scss +39 -0
  55. package/mixins/_button.scss +232 -0
  56. package/mixins/_forms.scss +188 -0
  57. package/mixins/_icons.scss +27 -0
  58. package/mixins/_scroll-shadows.scss +13 -0
  59. package/mixins/_size.scss +69 -0
  60. package/mixins/_type.scss +187 -0
  61. package/mixins/_utilities.scss +73 -0
  62. package/package.json +11 -3
  63. package/placeholders/_dropdown.scss +11 -0
  64. package/placeholders/_floating-label.scss +143 -0
  65. package/placeholders/_notifications.scss +160 -0
  66. package/placeholders/_text.scss +187 -0
  67. package/variables/_animation.scss +36 -0
  68. package/variables/_color.scss +240 -0
  69. package/variables/_commons.scss +57 -0
  70. package/variables/_icons.scss +2071 -0
  71. package/variables/_spacing.scss +180 -0
  72. package/variables/_type.scss +157 -0
  73. package/variables/components/_accordion.scss +22 -0
  74. package/variables/components/_alert.scss +50 -0
  75. package/variables/components/_badge.scss +29 -0
  76. package/variables/components/_breadcrumbs.scss +21 -0
  77. package/variables/components/_button.scss +152 -0
  78. package/variables/components/_card.scss +29 -0
  79. package/variables/components/_carousel.scss +27 -0
  80. package/variables/components/_close.scss +9 -0
  81. package/variables/components/_datatable.scss +49 -0
  82. package/variables/components/_datepicker.scss +14 -0
  83. package/variables/components/_dropdowns.scss +30 -0
  84. package/variables/components/_forms.scss +256 -0
  85. package/variables/components/_intranet-header.scss +9 -0
  86. package/variables/components/_modals.scss +68 -0
  87. package/variables/components/_nav.scss +82 -0
  88. package/variables/components/_pagination.scss +41 -0
  89. package/variables/components/_paragraph.scss +6 -0
  90. package/variables/components/_popovers.scss +28 -0
  91. package/variables/components/_progress-bars.scss +16 -0
  92. package/variables/components/_stepper.scss +26 -0
  93. package/variables/components/_subnavigation.scss +36 -0
  94. package/variables/components/_switch.scss +3 -0
  95. package/variables/components/_tables.scss +31 -0
  96. package/variables/components/_tooltips.scss +26 -0
  97. package/README.md +0 -5
@@ -0,0 +1,158 @@
1
+ /*!
2
+ * Copyright 2021 by Swiss Post, Information Technology
3
+ */
4
+
5
+ @use "../functions/icons" as icon-functions;
6
+ @use "../mixins/size" as size-mixins;
7
+
8
+ @use "../variables/icons";
9
+ @use "../variables/color";
10
+ @use "../variables/spacing";
11
+ @use "../variables/type";
12
+ @use "../variables/components/stepper";
13
+
14
+ @use "../themes/bootstrap/overrides" as bs;
15
+
16
+ .stepper {
17
+ @include size-mixins.responsive-size("big", "margin-bottom");
18
+ padding: 0 stepper.$step-indicator-size / 2;
19
+ position: relative;
20
+ }
21
+
22
+ .stepper-bar {
23
+ height: stepper.$stepper-bar-size;
24
+ margin-top: stepper.$step-indicator-size / 2;
25
+ margin-bottom: -1 * (stepper.$stepper-bar-size + stepper.$step-indicator-size) / 2;
26
+ }
27
+
28
+ .steps {
29
+ display: flex;
30
+ justify-content: space-between;
31
+ }
32
+
33
+ .step {
34
+ flex: 1 1 100%;
35
+ display: flex;
36
+ flex-direction: column;
37
+ align-items: center;
38
+
39
+ &:first-child,
40
+ &:last-child {
41
+ flex-basis: 50%;
42
+ }
43
+
44
+ &:first-child {
45
+ align-items: flex-start;
46
+ }
47
+
48
+ &:last-child {
49
+ align-items: flex-end;
50
+ }
51
+
52
+ &,
53
+ &:hover {
54
+ text-decoration: none;
55
+ }
56
+ }
57
+
58
+ .step-indicator {
59
+ display: flex;
60
+ align-items: center;
61
+ justify-content: center;
62
+ width: stepper.$step-indicator-size;
63
+ height: stepper.$step-indicator-size;
64
+ margin: 0 auto;
65
+ border: spacing.$size-micro solid color.$white;
66
+ border-radius: 100%;
67
+ background-color: stepper.$step-indicator-default-bg;
68
+ color: stepper.$step-indicator-default-color;
69
+ font-weight: type.$font-weight-bold;
70
+
71
+ .step:first-child & {
72
+ margin-left: stepper.$step-indicator-size / -2;
73
+ }
74
+
75
+ .step:last-child & {
76
+ margin-right: stepper.$step-indicator-size / -2;
77
+ }
78
+
79
+ .step.current &,
80
+ .step.passed & {
81
+ color: stepper.$step-indicator-active-color;
82
+ background-color: stepper.$step-indicator-active-bg;
83
+ }
84
+
85
+ .step.passed & {
86
+ background-image: stepper.$step-indicator-passed-icon;
87
+ background-size: icons.$icon-size-default;
88
+ background-repeat: no-repeat;
89
+ background-position: center;
90
+ }
91
+
92
+ .step:not(.current):hover & {
93
+ color: stepper.$step-indicator-hover-color;
94
+ background-color: stepper.$step-indicator-hover-bg;
95
+ }
96
+
97
+ .step.passed:hover & {
98
+ background-image: stepper.$step-indicator-passed-icon-hover;
99
+ }
100
+ }
101
+
102
+ .step-index {
103
+ flex: 0 0 auto;
104
+
105
+ .step.current & {
106
+ cursor: default;
107
+ }
108
+
109
+ .step.passed & {
110
+ display: none;
111
+ }
112
+ }
113
+
114
+ .step-name {
115
+ color: stepper.$step-name-color;
116
+ text-align: center;
117
+ line-height: stepper.$step-name-height;
118
+ padding: spacing.$size-mini spacing.$size-micro 0;
119
+
120
+ .step:first-child & {
121
+ text-align: left;
122
+ margin-left: stepper.$step-indicator-size / -2;
123
+ }
124
+
125
+ .step:last-child & {
126
+ text-align: right;
127
+ margin-right: stepper.$step-indicator-size / -2;
128
+ }
129
+
130
+ .step.current & {
131
+ color: color.$black;
132
+ font-weight: type.$font-weight-bold;
133
+ }
134
+
135
+ .step:hover & {
136
+ color: color.$black;
137
+ }
138
+ }
139
+
140
+ @include bs.media-breakpoint-down(rg) {
141
+ .stepper {
142
+ padding-bottom: stepper.$step-name-height + spacing.$size-micro;
143
+ }
144
+
145
+ .step-name {
146
+ .step:not(.current) & {
147
+ display: none;
148
+ }
149
+
150
+ .step.current & {
151
+ text-align: left;
152
+ position: absolute;
153
+ right: 0;
154
+ left: 0;
155
+ bottom: 0;
156
+ }
157
+ }
158
+ }
@@ -0,0 +1,131 @@
1
+ @forward "../variables/options";
2
+
3
+ @use "../lic/bootstrap-license";
4
+ @use "../themes/bootstrap/overrides" as *;
5
+
6
+ @use "../mixins";
7
+ @use "../functions/utilities" as utility-functions;
8
+ @use "../variables/components/subnavigation";
9
+ @use "../variables/animation";
10
+ @use "../placeholders/text";
11
+
12
+ $module-name: "subnavigation";
13
+
14
+ .#{$module-name} {
15
+ background-color: subnavigation.$subnavigation-background-color;
16
+ position: relative;
17
+
18
+ &::after {
19
+ @include mixins.full-width-underscore(subnavigation.$subnavigation-border-bottom-color, subnavigation.$subnavigation-border-bottom-width);
20
+ z-index: utility-functions.z-index(subnavigation, underscore-root);
21
+ }
22
+
23
+ &-alternate {
24
+ background-color: subnavigation.$subnavigation-background-color-alternate;
25
+ }
26
+
27
+ &-inverted {
28
+ background-color: subnavigation.$subnavigation-background-color-inverted;
29
+
30
+ &::after {
31
+ background-color: subnavigation.$subnavigation-border-bottom-color-inverted;
32
+ }
33
+
34
+ & .#{$module-name}-link {
35
+ color: subnavigation.$subnavigation-link-color-inverted;
36
+ @include hover-focus {
37
+ color: subnavigation.$subnavigation-link-color-hover-inverted;
38
+ }
39
+
40
+ &:not(.active)::after {
41
+ background-color: subnavigation.$subnavigation-link-underscore-color-hover-inverted;
42
+ }
43
+
44
+ &.active {
45
+ color: subnavigation.$subnavigation-link-color-hover-inverted;
46
+ }
47
+ }
48
+ }
49
+
50
+ &-list {
51
+ display: flex;
52
+ padding: 0 $spacer;
53
+ margin: 0 (-($spacer));
54
+ list-style: none;
55
+ width: calc(100% + 2rem);
56
+ overflow-x: auto; // TODO: Remove when horizontal scrolling is implemented
57
+ }
58
+
59
+ &-item {
60
+ min-height: subnavigation.$subnavigation-height-xs;
61
+
62
+ & .badge {
63
+ margin-left: subnavigation.$subnavigation-result-margin-left;
64
+ color: inherit;
65
+ }
66
+
67
+ @include media-breakpoint-up(lg) {
68
+ min-height: subnavigation.$subnavigation-height-lg;
69
+ }
70
+ @include media-breakpoint-up(xl) {
71
+ min-height: subnavigation.$subnavigation-height-xl;
72
+ }
73
+ }
74
+
75
+ &-link {
76
+ @extend %font-curve-small;
77
+
78
+ @include transition(color animation.$transition-time-default animation.$transition-easing-default);
79
+ position: relative;
80
+ padding: subnavigation.$subnavigation-link-padding-xs;
81
+ width: 100%;
82
+ height: 100%;
83
+ display: flex;
84
+ justify-content: space-between;
85
+ align-items: center;
86
+ text-decoration: none;
87
+ color: subnavigation.$subnavigation-link-color;
88
+ white-space: nowrap;
89
+
90
+ @include hover-focus {
91
+ text-decoration: none;
92
+ color: subnavigation.$subnavigation-link-color-hover;
93
+
94
+ &:not(.active)::after {
95
+ left: 0;
96
+ right: 0;
97
+ opacity: 1;
98
+ }
99
+ }
100
+
101
+ &:not(.active)::after {
102
+ @include mixins.full-width-underscore(#{subnavigation.$subnavigation-link-underscore-color-hover}, #{subnavigation.$subnavigation-link-underscore-height});
103
+ @include transition(opacity animation.$transition-time-default animation.$transition-easing-default,
104
+ left animation.$transition-time-default animation.$transition-easing-decelerate,
105
+ right animation.$transition-time-default animation.$transition-easing-decelerate);
106
+ opacity: 0;
107
+ left: animation.$transition-distance-medium;
108
+ right: animation.$transition-distance-medium;
109
+ z-index: utility-functions.z-index(subnavigation, underscore-link);
110
+
111
+ @include media-breakpoint-up(lg) {
112
+ left: animation.$transition-distance-medium-md;
113
+ right: animation.$transition-distance-medium-md;
114
+ }
115
+ }
116
+
117
+ &.active {
118
+ color: subnavigation.$subnavigation-link-color-hover;
119
+ font-weight: $font-weight-bold;
120
+
121
+ &::after {
122
+ @include mixins.full-width-underscore(#{subnavigation.$subnavigation-link-underscore-color-active}, #{subnavigation.$subnavigation-link-underscore-height});
123
+ z-index: utility-functions.z-index(subnavigation, underscore-link);
124
+ }
125
+ }
126
+
127
+ @include media-breakpoint-up(lg) {
128
+ padding: subnavigation.$subnavigation-link-padding-lg;
129
+ }
130
+ }
131
+ }
@@ -0,0 +1,132 @@
1
+ @forward "../variables/options";
2
+ @forward "../variables/components/switch";
3
+
4
+ @use "../variables/color";
5
+ @use "../variables/components/switch";
6
+ @use "../variables/components/button";
7
+
8
+ .switch {
9
+ display: flex;
10
+ align-items: center;
11
+ position: relative;
12
+ // TODO: why? isn't there a better way to style this with inheritance or variables?
13
+ font-size: 1rem;
14
+
15
+ label {
16
+ margin-bottom: 0;
17
+ vertical-align: middle;
18
+
19
+ + label {
20
+ // TODO: use spacing variables
21
+ margin-left: 1rem;
22
+ }
23
+ }
24
+
25
+ input[type="checkbox"] {
26
+ // TODO: use visually hidden mixin
27
+ position: absolute;
28
+ height: 1px;
29
+ width: 1px;
30
+ background: none;
31
+ border: 0;
32
+ clip: rect(0 0 0 0);
33
+ clip-path: inset(50%);
34
+ overflow: hidden;
35
+ padding: 0;
36
+
37
+ // Handle label colors for all states
38
+ &:not(:checked) ~ label {
39
+ color: color.$gray-800;
40
+ }
41
+
42
+ &:disabled ~ label {
43
+ color: color.$gray-400;
44
+ }
45
+
46
+ &:disabled:checked ~ label {
47
+ color: color.$gray-600;
48
+ }
49
+ }
50
+
51
+ + .switch {
52
+ // TODO: use spacing
53
+ margin-left: 1.5rem;
54
+ }
55
+ }
56
+
57
+ .switch-toggler,
58
+ .switch > label:only-child {
59
+ position: relative;
60
+ width: switch.$switch-width;
61
+ height: switch.$switch-width / 2;
62
+ border-radius: switch.$switch-width / 4;
63
+ background-color: color.$black-alpha-20;
64
+ flex-shrink: 0;
65
+ cursor: pointer;
66
+ overflow: hidden;
67
+
68
+ // Fix broken overflow hidden on safari
69
+ // https://stackoverflow.com/questions/49066011/overflow-hidden-with-border-radius-not-working-on-safari
70
+ -webkit-mask-image: -webkit-radial-gradient(white, black);
71
+
72
+ &::before,
73
+ &::after {
74
+ content: "";
75
+ position: absolute;
76
+ top: 0;
77
+ left: 0;
78
+ display: block;
79
+ transition: all .33s;
80
+ transform: translateX(0);
81
+ }
82
+
83
+ // Green bg
84
+ &::before {
85
+ width: 100%;
86
+ height: 100%;
87
+ left: switch.$switch-width * -.75;
88
+ background-color: color.$green;
89
+ }
90
+
91
+ // Knob
92
+ &::after {
93
+ width: 50%;
94
+ height: 100%;
95
+ border-radius: switch.$switch-width / 2;
96
+ border: 2px solid color.$black-alpha-60;
97
+ background-color: color.$white;
98
+ }
99
+
100
+ // Focused/active state
101
+ input[type="checkbox"]:not(:disabled):focus ~ &,
102
+ input[type="checkbox"]:not(:disabled):active ~ & {
103
+ // TODO: this is used so often it should be in commons
104
+ box-shadow: button.$input-btn-focus-box-shadow;
105
+ }
106
+
107
+ // Checked state
108
+ input[type="checkbox"]:checked ~ & {
109
+ &::before,
110
+ &::after {
111
+ transform: translateX(switch.$switch-width / 2);
112
+ }
113
+
114
+ &::after {
115
+ border-color: color.$black;
116
+ }
117
+ }
118
+
119
+ input[disabled] ~ & {
120
+ background-color: color.$gray-100;
121
+ cursor: default;
122
+
123
+ &::before {
124
+ background-color: color.$gray-400;
125
+ }
126
+
127
+ &::after {
128
+ border-color: color.$gray-400 !important;
129
+ background-color: color.$gray-100;
130
+ }
131
+ }
132
+ }
@@ -0,0 +1,122 @@
1
+ @forward "../variables/options";
2
+
3
+ @use "../lic/bootstrap-license";
4
+ @use "../themes/bootstrap/overrides" as *;
5
+ @use "../themes/bootstrap/nav" as bn;
6
+
7
+ @use "../variables/components/nav";
8
+ @use "../variables/spacing";
9
+ @use "../variables/color";
10
+
11
+ .tabs-wrapper {
12
+ position: relative;
13
+ padding-top: spacing.$spacer;
14
+ background-color: color.$gray-pampas;
15
+ border: none;
16
+
17
+ // Create a line that lies below the active but above the passive elements
18
+ // This way hover works smoothly with the background color
19
+ &::after {
20
+ content: "";
21
+ position: absolute;
22
+ bottom: 0;
23
+ width: 100%;
24
+ height: 1px;
25
+ background-color: nav.$nav-tabs-border-color;
26
+ }
27
+
28
+ // Small hack to save a lot of code and provide a lot of flexibility to tabs coloring
29
+ .tabs {
30
+ background-color: transparent !important;
31
+ }
32
+ }
33
+
34
+ .tabs {
35
+ white-space: nowrap;
36
+ flex-wrap: nowrap;
37
+ overflow: auto hidden;
38
+
39
+ /* prevent scroll chaining on x scroll */
40
+ overscroll-behavior-x: contain;
41
+
42
+ // Scrolling fix, make the tabs scroll a little more so the right most tab is not
43
+ // flush with the window border
44
+ &::after {
45
+ content: "";
46
+ display: block;
47
+ width: 1rem;
48
+ flex: 1 0 auto;
49
+ }
50
+ }
51
+
52
+ .tab-title {
53
+ position: relative;
54
+ padding: nav.$nav-link-padding;
55
+ border-right: 1px solid transparent;
56
+ border-left: 1px solid transparent;
57
+ color: color.$black;
58
+ opacity: .7;
59
+ transition: background-color 100ms;
60
+ outline-color: currentColor;
61
+
62
+ &.active,
63
+ &:focus,
64
+ &:hover {
65
+ opacity: 1;
66
+ color: color.$black;
67
+ background-color: color.$white;
68
+ }
69
+
70
+ &.active {
71
+ border-right-color: nav.$nav-tabs-border-color;
72
+ border-left-color: nav.$nav-tabs-border-color;
73
+ background-color: color.$white;
74
+ color: inherit;
75
+ font-weight: 700;
76
+ z-index: 1; // Lift above the line and make focus visible all around
77
+
78
+ // Create a line that does not suffer from border corner mitering
79
+ &::before {
80
+ content: "";
81
+ display: block;
82
+ position: absolute;
83
+ top: 0;
84
+ right: -1px;
85
+ left: -1px;
86
+ height: 4px;
87
+ background-color: nav.$nav-tabs-link-active-border-color;
88
+ }
89
+ }
90
+ }
91
+
92
+ // Fix auto colored text on inactive tabs with high specificity
93
+ .text-auto {
94
+ .tab-title {
95
+ opacity: 1;
96
+
97
+ &:hover,
98
+ &:focus {
99
+ opacity: 1;
100
+ background-color: rgba(255,255,255,.2);
101
+ }
102
+ }
103
+ }
104
+
105
+ .tab-content {
106
+ padding-top: spacing.$spacer;
107
+ padding-bottom: spacing.$spacer;
108
+ }
109
+
110
+ // Careful, this generates a lot of code
111
+ @each $key, $color in color.$theme-colors {
112
+ .bg-#{$key} {
113
+ .tabs-wrapper,
114
+ .tab-title.active {
115
+ background-color: $color;
116
+ }
117
+
118
+ .nav-item {
119
+ background-color: transparentize($color: $color, $amount: .2);
120
+ }
121
+ }
122
+ }
@@ -0,0 +1,110 @@
1
+ @forward "../variables/options";
2
+
3
+ @use "sass:map";
4
+
5
+ @use "../mixins/icons" as icon-mixins;
6
+ @use "../mixins/forms" as form-mixins;
7
+ @use "../mixins/button" as button-mixins;
8
+
9
+ @use "../variables/color";
10
+ @use "../variables/components/forms";
11
+ @use "../variables/components/button";
12
+
13
+ // Basic timepicker overrides
14
+ .ngb-tp {
15
+ .ngb-tp-input-container {
16
+ width: auto;
17
+ }
18
+
19
+ .form-control {
20
+ width: 4.5rem;
21
+ }
22
+
23
+ .form-control-sm,
24
+ .form-control-rg {
25
+ width: 4rem;
26
+ }
27
+
28
+ .form-control-lg {
29
+ padding: 1rem 1.375rem;
30
+ width: 6rem;
31
+ @include form-mixins.placeholder {
32
+ color: forms.$input-placeholder-color;
33
+ }
34
+ }
35
+
36
+ .ngb-tp-chevron {
37
+ &::before {
38
+ @include icon-mixins.pi("2051");
39
+ border: none;
40
+ transform: none;
41
+ width: map.get(button.$btn-icon-size-map, "md");
42
+ height: map.get(button.$btn-icon-size-map, "md");
43
+ background-size: contain;
44
+ background-repeat: no-repeat;
45
+ background-position: center center;
46
+ }
47
+
48
+ &.bottom::before {
49
+ transform: rotateZ(180deg);
50
+ }
51
+ }
52
+
53
+ @each $size in ("sm", "lg") {
54
+ .btn-#{$size} .ngb-tp-chevron::before {
55
+ width: map.get(button.$btn-icon-size-map, $size);
56
+ height: map.get(button.$btn-icon-size-map, $size);
57
+ }
58
+ }
59
+ }
60
+
61
+ // Regular-sized timepicker
62
+ .timepicker-rg {
63
+ .btn {
64
+ @include button-mixins.btn-rg;
65
+
66
+ .ngb-tp-chevron::before {
67
+ width: map.get(button.$btn-icon-size-map, "rg");
68
+ height: map.get(button.$btn-icon-size-map, "rg");
69
+ }
70
+ }
71
+
72
+ .form-control {
73
+ @include form-mixins.form-control-rg;
74
+ }
75
+ }
76
+
77
+ // Timepicker validation
78
+ ngb-timepicker {
79
+ &.is-invalid {
80
+ .form-control {
81
+ border-color: color.$danger;
82
+
83
+ &:focus {
84
+ border-color: color.$danger;
85
+ box-shadow: 0 0 0 forms.$input-focus-width rgba(color.$danger, .25);
86
+ }
87
+ }
88
+
89
+ ~ .invalid-feedback,
90
+ ~ .invalid-tooltip {
91
+ display: block;
92
+ }
93
+ }
94
+
95
+ &.is-valid {
96
+ .form-control {
97
+ border-color: color.$success;
98
+
99
+ &:focus {
100
+ border-color: color.$success;
101
+ box-shadow: 0 0 0 forms.$input-focus-width rgba(color.$success, .25);
102
+ }
103
+ }
104
+
105
+ ~ .valid-feedback,
106
+ ~ .valid-tooltip {
107
+ display: block;
108
+ }
109
+ }
110
+ }