diff --git a/.cfignore b/.cfignore
new file mode 100644
index 000000000000..ab4a5d7aade6
--- /dev/null
+++ b/.cfignore
@@ -0,0 +1,4 @@
+*
+
+!Staticfile
+!build
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index 289530fd7293..865b904bcd36 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,4 @@
-# Build folders
+ # Build folders
/build
packages/*/build/
packages/*/examples/*/build/
@@ -53,3 +53,6 @@ results/
# Directories generated by Next.js
.next
+
+# Contains Github personal access token
+.env.local
diff --git a/Staticfile b/Staticfile
new file mode 100644
index 000000000000..78ab427d0e8d
--- /dev/null
+++ b/Staticfile
@@ -0,0 +1 @@
+root: build
\ No newline at end of file
diff --git a/manifest.yml b/manifest.yml
new file mode 100644
index 000000000000..3bdd00cadae1
--- /dev/null
+++ b/manifest.yml
@@ -0,0 +1,5 @@
+---
+applications:
+ - name: input-validation-animation
+ memory: 64M
+ buildpack: https://github.com/cloudfoundry/staticfile-buildpack.git
\ No newline at end of file
diff --git a/packages/components/src/components/multi-select/_multi-select.scss b/packages/components/src/components/multi-select/_multi-select.scss
index 5f11bd2464db..9632beeb4d2d 100644
--- a/packages/components/src/components/multi-select/_multi-select.scss
+++ b/packages/components/src/components/multi-select/_multi-select.scss
@@ -103,6 +103,33 @@
}
}
+.bx--multi-select--invalid {
+ animation: shake $duration--slow-02 motion(standard, productive) both;
+}
+
+@keyframes shake {
+ 10%,
+ 90% {
+ transform: translate3d(-1px, 0, 0);
+ }
+
+ 20%,
+ 80% {
+ transform: translate3d(2px, 0, 0);
+ }
+
+ 30%,
+ 50%,
+ 70% {
+ transform: translate3d(-4px, 0, 0);
+ }
+
+ 40%,
+ 60% {
+ transform: translate3d(4px, 0, 0);
+ }
+}
+
@include exports('multi-select') {
@include multiselect;
}
diff --git a/packages/components/src/components/progress-indicator/_progress-indicator.scss b/packages/components/src/components/progress-indicator/_progress-indicator.scss
index 8564c19342db..99ea46b5c593 100644
--- a/packages/components/src/components/progress-indicator/_progress-indicator.scss
+++ b/packages/components/src/components/progress-indicator/_progress-indicator.scss
@@ -16,6 +16,7 @@
/// Progress indicator styles
/// @access private
/// @group progress-indicator
+
@mixin progress-indicator {
.#{$prefix}--progress {
@include reset;
@@ -31,6 +32,7 @@
width: rem(128px);
min-width: 7rem;
flex-direction: row;
+ border-top: 2px solid $ui-03;
.#{$prefix}--tooltip__label {
display: block;
@@ -45,14 +47,15 @@
.#{$prefix}--progress-line {
position: absolute;
left: 0;
- width: rem(128px);
- height: 1px;
- border: $progress-indicator-bar-width;
+ width: 0;
+ height: 2px;
+ transform: translateY(-2px);
+ transition: width $duration--moderate-01 motion(standard, productive)
+ $duration--moderate-01;
}
.#{$prefix}--progress--space-equal .#{$prefix}--progress-line {
- width: 100%;
- min-width: rem(128px);
+ width: 0;
}
.#{$prefix}--progress-step svg {
@@ -130,7 +133,6 @@
display: block;
width: rem(125px);
-
min-width: rem(115px);
min-height: $carbon--spacing-06;
padding: $carbon--spacing-03 $carbon--spacing-05;
@@ -157,8 +159,12 @@
left: 0;
margin-top: rem(28px);
margin-left: $carbon--spacing-06;
+ animation: $duration--moderate-01 optional-text-entrance
+ $duration--moderate-01 motion(standard, productive) forwards;
color: $text-02;
+ opacity: 0;
text-align: start;
+ transform: translateY(-10px);
}
//CURRENT STYLING
@@ -166,6 +172,12 @@
.#{$prefix}--progress-line {
background-color: $interactive-04;
}
+
+ svg circle {
+ animation: $duration--moderate-01 progress-indicator-icon-fade
+ $duration--moderate-01 motion(standard, productive) forwards;
+ opacity: 0;
+ }
}
//INCOMPLETE STYLING
@@ -182,8 +194,15 @@
//COMPLETED STYLING
.#{$prefix}--progress-step--complete {
.#{$prefix}--progress-line {
+ width: 100%;
background-color: $interactive-04;
}
+
+ svg {
+ animation: $duration--moderate-01 progress-indicator-icon-fade
+ motion(standard, productive) forwards;
+ opacity: 0;
+ }
}
//interactive button
@@ -224,6 +243,12 @@
fill: $disabled;
}
+ svg circle {
+ animation: $duration--moderate-01 progress-indicator-icon-fade
+ $duration--moderate-01 motion(standard, productive) forwards;
+ opacity: 0;
+ }
+
.#{$prefix}--progress-label,
.#{$prefix}--progress-label:hover {
box-shadow: none;
@@ -263,10 +288,20 @@
}
// Vertical Variant
+ .#{$prefix}--progress--vertical .#{$prefix}--progress-step {
+ border-top: none;
+ }
.#{$prefix}--progress--vertical {
display: flex;
flex-direction: column;
+ border-left: 2px solid $ui-03;
+
+ .#{$prefix}--progress-step--complete {
+ .#{$prefix}--progress-line {
+ height: 100%;
+ }
+ }
}
.#{$prefix}--progress--vertical,
@@ -315,8 +350,81 @@
position: absolute;
top: 0;
left: 0;
- width: 1px;
- height: 100%;
+ width: 2px;
+ height: 0;
+ background-color: $interactive;
+ transform: translateX(-2px);
+ transition: height $duration--moderate-01 cubic-bezier(0.2, 0, 0.38, 0.9);
+ }
+
+ // No animations or transitions if user prefers reduced motion
+ @media (prefers-reduced-motion) {
+ .#{$prefix}--progress,
+ .#{$prefix}--progress-step {
+ border-top: none;
+ }
+
+ .#{$prefix}--progress-line {
+ width: rem(128px);
+ height: 2px;
+ transform: none;
+ transition: none;
+ }
+
+ .#{$prefix}--progress--space-equal .#{$prefix}--progress-line {
+ width: 100%;
+ min-width: rem(128px);
+ }
+
+ .#{$prefix}--progress-step svg {
+ animation: none;
+ opacity: 1;
+ transform: none;
+ }
+
+ .#{$prefix}--progress-step--current {
+ svg circle {
+ animation: none;
+ opacity: 1;
+ }
+ }
+
+ .#{$prefix}--progress-step--complete {
+ svg {
+ animation: none;
+ opacity: 1;
+ }
+ }
+
+ .#{$prefix}--progress-step--disabled {
+ svg circle {
+ animation: none;
+ opacity: 1;
+ }
+ }
+
+ .#{$prefix}--progress--vertical {
+ border-left: none;
+ }
+
+ .#{$prefix}--progress--vertical .#{$prefix}--progress-line {
+ transform: none;
+ transition: none;
+ }
+ }
+}
+
+// Animations
+@keyframes optional-text-entrance {
+ to {
+ opacity: 1;
+ transform: none;
+ }
+}
+
+@keyframes progress-indicator-icon-fade {
+ to {
+ opacity: 1;
}
}
diff --git a/packages/components/src/components/select/_select.scss b/packages/components/src/components/select/_select.scss
index ebc21d7bb7a1..b69e24893c5b 100644
--- a/packages/components/src/components/select/_select.scss
+++ b/packages/components/src/components/select/_select.scss
@@ -264,6 +264,33 @@
}
}
+.bx--select--invalid .bx--select-input__wrapper {
+ animation: shake 820ms cubic-bezier(0.36, 0.07, 0.19, 0.97) both;
+}
+
+@keyframes shake {
+ 10%,
+ 90% {
+ transform: translate3d(-1px, 0, 0);
+ }
+
+ 20%,
+ 80% {
+ transform: translate3d(2px, 0, 0);
+ }
+
+ 30%,
+ 50%,
+ 70% {
+ transform: translate3d(-4px, 0, 0);
+ }
+
+ 40%,
+ 60% {
+ transform: translate3d(4px, 0, 0);
+ }
+}
+
@include exports('select') {
@include select;
}
diff --git a/packages/components/src/components/text-area/_text-area.scss b/packages/components/src/components/text-area/_text-area.scss
index aa35058b5330..4dc42e0413cd 100644
--- a/packages/components/src/components/text-area/_text-area.scss
+++ b/packages/components/src/components/text-area/_text-area.scss
@@ -101,6 +101,33 @@
}
}
+.bx--text-area--invalid {
+ animation: shake 820ms cubic-bezier(0.36, 0.07, 0.19, 0.97) both;
+}
+
+@keyframes shake {
+ 10%,
+ 90% {
+ transform: translate3d(-1px, 0, 0);
+ }
+
+ 20%,
+ 80% {
+ transform: translate3d(2px, 0, 0);
+ }
+
+ 30%,
+ 50%,
+ 70% {
+ transform: translate3d(-4px, 0, 0);
+ }
+
+ 40%,
+ 60% {
+ transform: translate3d(4px, 0, 0);
+ }
+}
+
@include exports('text-area') {
@include text-area;
}
diff --git a/packages/components/src/components/time-picker/_time-picker.scss b/packages/components/src/components/time-picker/_time-picker.scss
index 09377d37b2ef..42ab3b7bcaea 100644
--- a/packages/components/src/components/time-picker/_time-picker.scss
+++ b/packages/components/src/components/time-picker/_time-picker.scss
@@ -93,6 +93,34 @@
}
}
+.bx--time-picker--invalid .bx--time-picker__input {
+ z-index: 10;
+ animation: shake 820ms cubic-bezier(0.36, 0.07, 0.19, 0.97) both;
+}
+
+@keyframes shake {
+ 10%,
+ 90% {
+ transform: translate3d(-1px, 0, 0);
+ }
+
+ 20%,
+ 80% {
+ transform: translate3d(2px, 0, 0);
+ }
+
+ 30%,
+ 50%,
+ 70% {
+ transform: translate3d(-4px, 0, 0);
+ }
+
+ 40%,
+ 60% {
+ transform: translate3d(4px, 0, 0);
+ }
+}
+
@include exports('time-picker') {
@include time-picker;
}
diff --git a/packages/react/manifest.yml b/packages/react/manifest.yml
index 05b6ae612d29..d8b925d6deae 100644
--- a/packages/react/manifest.yml
+++ b/packages/react/manifest.yml
@@ -1,8 +1,15 @@
+# ---
+# applications:
+# - name: carbon-storybook
+# memory: 64M
+# buildpack: https://github.com/cloudfoundry/staticfile-buildpack.git
+# routes:
+# - route: react.carbondesignsystem.com
+# - route: carbon-react-storybook.mybluemix.net
+
+
---
applications:
-- name: carbon-storybook
- memory: 64M
- buildpack: https://github.com/cloudfoundry/staticfile-buildpack.git
- routes:
- - route: react.carbondesignsystem.com
- - route: carbon-react-storybook.mybluemix.net
+ - name: input-validation-animation
+ memory: 64M
+ buildpack: https://github.com/cloudfoundry/staticfile-buildpack.git
\ No newline at end of file
diff --git a/packages/react/src/components/ProgressIndicator/ProgressIndicator-story.js b/packages/react/src/components/ProgressIndicator/ProgressIndicator-story.js
index 702911855a52..dba375973787 100644
--- a/packages/react/src/components/ProgressIndicator/ProgressIndicator-story.js
+++ b/packages/react/src/components/ProgressIndicator/ProgressIndicator-story.js
@@ -6,7 +6,7 @@
*/
import React from 'react';
-import { withKnobs, number, boolean, text } from '@storybook/addon-knobs';
+import { withKnobs, number, boolean } from '@storybook/addon-knobs';
import { action } from '@storybook/addon-actions';
import { ProgressIndicator, ProgressStep } from '../ProgressIndicator';
import ProgressIndicatorSkeleton from '../ProgressIndicator/ProgressIndicator.Skeleton';
@@ -28,65 +28,77 @@ export default {
subcomponents: {
ProgressStep,
+ Tooltip,
},
},
};
+const tooltipTwo = () => {
+ return (
+ Overflow tooltip content.
+ Lorem ipsum dolor, sit amet consectetur adipisicing elit. Animi
+ consequuntur hic ratione aliquid cupiditate, nesciunt saepe iste
+ blanditiis cumque maxime tenetur veniam est illo deserunt sint quae
+ pariatur. Laboriosam, consequatur.
+ Overflow tooltip content.
- Lorem ipsum dolor, sit amet consectetur adipisicing elit. Animi
- consequuntur hic ratione aliquid cupiditate, nesciunt saepe iste
- blanditiis cumque maxime tenetur veniam est illo deserunt sint quae
- pariatur. Laboriosam, consequatur.
-
- Lorem ipsum dolor, sit amet consectetur adipisicing elit. Animi
- consequuntur hic ratione aliquid cupiditate, nesciunt saepe iste
- blanditiis cumque maxime tenetur veniam est illo deserunt sint quae
- pariatur. Laboriosam, consequatur.
-