diff --git a/sass/components/forms/_form-field.scss b/sass/components/forms/_form-field.scss new file mode 100644 index 0000000000..fdd474638a --- /dev/null +++ b/sass/components/forms/_form-field.scss @@ -0,0 +1,139 @@ +/** +new approach for floating labels aka "form-fields" (css only) +// TODO: Adapt docs first and then ship with next version +- also use for selects, autocomplete, etc. + +
+
+ + +
+
+ + +
+
+ + +
+
+ +*/ + +fieldset.form-field { + --idle-color: gray; + --hover-color: darkgoldenrod; + --focus-color: var(--md-sys-color-primary); + --disabled-bg: gray; + --font-size: 16px; + --animation-duration: 0.5s; + --border-radius: 4px; + --border-width: 1px; + --focused-border-width: 2px; + --input-height: 56px; + + position: relative; + border: var(--border-width) solid var(--idle-color); + padding: 0; + margin-left: var(--border-width); + margin-right: var(--border-width); + margin-bottom: var(--border-width); + border-radius: var(--border-radius); +} +fieldset.form-field legend { + margin-left: 0.5rem; +} +fieldset.form-field legend label { + padding: 0 0.5rem; + font-size: calc(var(--font-size) * 0.75); +} +fieldset.form-field input { + border: none; + padding: 0 1rem; + margin-top: -0.5rem; +} + +/* start state for animations */ +fieldset.form-field.animated legend::before { + content: ""; + position: absolute; + display: block; + width: 100%; + right: 0; + height: 0; + border-top: var(--border-width) solid var(--idle-color); + align-self: center; + transition: width calc(var(--animation-duration) * 0.8); +} +fieldset.form-field.animated legend { + position: relative; + display: flex; + white-space: nowrap; + align-items: center; + height: var(--font-size); +} +fieldset.form-field.animated legend label { + transform: translateY(calc(var(--input-height) * 0.5)); + font-size: var(--font-size); + opacity: 0; + transition: font-size var(--animation-duration), transform var(--animation-duration), opacity 0.5s step-end; +} +fieldset.form-field.animated input::placeholder { + opacity: 1; + transition: opacity var(--animation-duration) step-end; +} + +/* hovered state */ +fieldset.form-field:hover { + border-color: var(--hover-color); +} +/* hovered animated */ +fieldset.form-field.animated:hover legend::before { + /* background-color: var(--hover-color); */ + border-top: var(--border-width) solid var(--hover-color); +} + +/* focused animated */ +fieldset.form-field.animated input:not(:placeholder-shown) ~ legend::before { + width: 0; +} +fieldset.form-field.animated input:not(:placeholder-shown) ~ legend label { + font-size: calc(var(--font-size) * 0.75); + transform: translateY(0); + opacity: 1; +} +fieldset.form-field.animated:focus-within legend::before { + border-top: var(--focused-border-width) solid var(--focus-color); + /* background-color: var(--focus-color); */ + width: 0; +} +fieldset.form-field.animated:focus-within input::placeholder { + opacity: 0; + transition: opacity 0s; +} + +/* focused state */ +fieldset.form-field:focus-within { + border: var(--focused-border-width) solid var(--focus-color); + margin: 0; +} +fieldset.form-field:focus-within legend label { + opacity: 1; + color: var(--focus-color); + font-size: calc(var(--font-size) * 0.75); + transform: translateY(0); + transition: font-size var(--animation-duration), transform var(--animation-duration), opacity 0s; +} + +/* disabled */ +fieldset.form-field[disabled] { + background-color: var(--disabled-bg); +} +fieldset.form-field[disabled]:hover { + border-color: transparent; +} + +/* required (special) */ +fieldset.form-field:has([required]) label::after { + content: " *"; +} \ No newline at end of file diff --git a/sass/components/forms/_forms.scss b/sass/components/forms/_forms.scss index d293f06f96..3ff117e41b 100644 --- a/sass/components/forms/_forms.scss +++ b/sass/components/forms/_forms.scss @@ -5,6 +5,7 @@ @forward 'select'; @forward 'file-input'; @forward 'range'; +@forward 'form-field'; // Remove Focus Boxes select:focus {