mirror of
https://github.com/oceanprotocol/commons.git
synced 2023-03-15 18:03:00 +01:00
port over first form components
This commit is contained in:
parent
5995d75709
commit
3fbebcad81
7
src/components/atoms/Form/FormHelp.module.scss
Normal file
7
src/components/atoms/Form/FormHelp.module.scss
Normal file
@ -0,0 +1,7 @@
|
||||
@import '../../../styles/variables';
|
||||
|
||||
.help {
|
||||
font-size: $font-size-small;
|
||||
color: darken($brand-grey-light, 10%);
|
||||
margin-top: $spacer / 4;
|
||||
}
|
13
src/components/atoms/Form/FormHelp.test.js
Normal file
13
src/components/atoms/Form/FormHelp.test.js
Normal file
@ -0,0 +1,13 @@
|
||||
import React from 'react'
|
||||
import ReactDOM from 'react-dom'
|
||||
|
||||
import FormHelp from './FormHelp'
|
||||
|
||||
it('FormHelp renders without crashing', () => {
|
||||
const div = document.createElement('div')
|
||||
ReactDOM.render(
|
||||
<FormHelp>Price of your data set asset in Ocean Tokens.</FormHelp>,
|
||||
div
|
||||
)
|
||||
ReactDOM.unmountComponentAtNode(div)
|
||||
})
|
8
src/components/atoms/Form/FormHelp.tsx
Normal file
8
src/components/atoms/Form/FormHelp.tsx
Normal file
@ -0,0 +1,8 @@
|
||||
import React from 'react'
|
||||
import styles from './FormHelp.module.scss'
|
||||
|
||||
const FormHelp = ({ children }: { children: string }) => (
|
||||
<div className={styles.help}>{children}</div>
|
||||
)
|
||||
|
||||
export default FormHelp
|
177
src/components/atoms/Form/FormInput.module.scss
Normal file
177
src/components/atoms/Form/FormInput.module.scss
Normal file
@ -0,0 +1,177 @@
|
||||
@import '../../styles/variables';
|
||||
|
||||
.formGroup {
|
||||
margin-bottom: $spacer;
|
||||
}
|
||||
|
||||
.input-wrap {
|
||||
background: $brand-gradient;
|
||||
border-radius: $border-radius;
|
||||
width: 100%;
|
||||
padding: 2px;
|
||||
display: flex;
|
||||
position: relative;
|
||||
|
||||
&.is-focused {
|
||||
background: $brand-black;
|
||||
}
|
||||
|
||||
.is-dimmed & {
|
||||
background: $brand-grey-lighter;
|
||||
|
||||
&.is-focused {
|
||||
background: $brand-grey-light;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.input-wrap-search {
|
||||
.input {
|
||||
padding-left: $spacer * 1.25;
|
||||
}
|
||||
|
||||
svg {
|
||||
position: absolute;
|
||||
left: $spacer / 3;
|
||||
width: 1.25rem;
|
||||
height: 1.25rem;
|
||||
top: 50%;
|
||||
margin-top: -.75rem;
|
||||
fill: rgba($brand-grey-light, .7);
|
||||
}
|
||||
}
|
||||
|
||||
.input {
|
||||
font-size: $font-size-base;
|
||||
font-family: $font-family-button;
|
||||
color: $brand-black;
|
||||
border: none;
|
||||
box-shadow: none;
|
||||
width: 100%;
|
||||
background: $brand-white;
|
||||
padding: $spacer / 3;
|
||||
margin: 0;
|
||||
border-radius: $border-radius;
|
||||
transition: .2s ease-out;
|
||||
min-height: 43px;
|
||||
appearance: none;
|
||||
|
||||
&:focus {
|
||||
border: none;
|
||||
box-shadow: none;
|
||||
outline: 0;
|
||||
}
|
||||
|
||||
&::placeholder {
|
||||
font-family: $font-family-base;
|
||||
font-size: $font-size-base;
|
||||
color: $brand-grey-light;
|
||||
font-weight: $font-weight-base;
|
||||
transition: .2s ease-out;
|
||||
opacity: .7;
|
||||
}
|
||||
|
||||
&[readonly],
|
||||
&[disabled] {
|
||||
background-color: $brand-grey-lighter;
|
||||
cursor: not-allowed;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
// &::-webkit-credentials-auto-fill-button,
|
||||
// &::-webkit-caps-lock-indicator {
|
||||
// background: $brand-white;
|
||||
// }
|
||||
|
||||
// &:-webkit-autofill,
|
||||
// &:-webkit-autofill:hover,
|
||||
// &:-webkit-autofill:focus {
|
||||
// -webkit-text-fill-color: $brand-white;
|
||||
// box-shadow: 0 0 0 1000px $brand-black inset;
|
||||
// transition: background-color 5000s ease-in-out 0s;
|
||||
// }
|
||||
}
|
||||
|
||||
// stylelint-disable-next-line
|
||||
select.input {
|
||||
height: 43px;
|
||||
padding-right: 3rem;
|
||||
border: 0;
|
||||
|
||||
// custom arrow
|
||||
// stylelint-disable
|
||||
background-image: linear-gradient(45deg, transparent 50%, $brand-purple 50%),
|
||||
linear-gradient(135deg, $brand-purple 50%, transparent 50%),
|
||||
linear-gradient(
|
||||
to right,
|
||||
$brand-pink 1px,
|
||||
lighten($brand-grey-lighter, 5%) 2px,
|
||||
lighten($brand-grey-lighter, 5%)
|
||||
);
|
||||
background-position: calc(100% - 18px) calc(1rem + 5px),
|
||||
calc(100% - 13px) calc(1rem + 5px), 100% 0;
|
||||
background-size: 5px 5px, 5px 5px, 2.5rem 3rem;
|
||||
// stylelint-enable
|
||||
background-repeat: no-repeat;
|
||||
|
||||
&:focus {
|
||||
outline: 0;
|
||||
font-family: $font-family-base;
|
||||
}
|
||||
// stylelint-disable
|
||||
.is-dimmed & {
|
||||
background-image: linear-gradient(
|
||||
45deg,
|
||||
transparent 50%,
|
||||
$brand-grey-light 50%
|
||||
),
|
||||
linear-gradient(135deg, $brand-grey-light 50%, transparent 50%),
|
||||
linear-gradient(
|
||||
to right,
|
||||
$brand-grey-lighter 1px,
|
||||
lighten($brand-grey-lighter, 5%) 2px,
|
||||
lighten($brand-grey-lighter, 5%)
|
||||
);
|
||||
}
|
||||
// stylelint-enable
|
||||
}
|
||||
|
||||
.label {
|
||||
color: $brand-grey;
|
||||
font-size: $font-size-base;
|
||||
font-family: $font-family-title;
|
||||
line-height: 1.2;
|
||||
display: block;
|
||||
margin-bottom: $spacer / 6;
|
||||
|
||||
&.is-required {
|
||||
&:after {
|
||||
content: '*';
|
||||
font-size: $font-size-base;
|
||||
color: $brand-grey-light;
|
||||
display: inline-block;
|
||||
margin-left: .1rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Size modifiers
|
||||
.input-sm {
|
||||
font-size: $font-size-small;
|
||||
min-height: 32px;
|
||||
padding: $spacer / 4;
|
||||
|
||||
&::placeholder {
|
||||
font-size: $font-size-small;
|
||||
}
|
||||
}
|
||||
|
||||
// stylelint-disable-next-line
|
||||
select.input-sm {
|
||||
height: 32px;
|
||||
padding-right: 2rem;
|
||||
|
||||
// custom arrow
|
||||
background-position: calc(100% - 14px) 1rem, calc(100% - 9px) 1rem, 100% 0;
|
||||
background-size: 5px 5px, 5px 5px, 2rem 3rem;
|
||||
}
|
88
src/components/atoms/Form/FormInput.tsx
Normal file
88
src/components/atoms/Form/FormInput.tsx
Normal file
@ -0,0 +1,88 @@
|
||||
import React, { PureComponent } from 'react'
|
||||
import { ReactComponent as SearchIcon } from '../../../svg/search.svg'
|
||||
import FormHelp from './FormHelp'
|
||||
import styles from './FormInput.module.scss'
|
||||
|
||||
interface IFormInputProps {
|
||||
name: string
|
||||
label: string
|
||||
placeholder: string
|
||||
required?: boolean
|
||||
help?: string
|
||||
tag?: string
|
||||
type: string
|
||||
small?: boolean
|
||||
additionalComponent?: void
|
||||
}
|
||||
|
||||
interface IFormInputState {
|
||||
isFocused: boolean
|
||||
}
|
||||
|
||||
export default class FormInput extends PureComponent<
|
||||
IFormInputProps,
|
||||
IFormInputState
|
||||
> {
|
||||
public state: IFormInputState = { isFocused: false }
|
||||
|
||||
public inputWrapClasses() {
|
||||
if (this.props.type === 'search') {
|
||||
return 'input-wrap input-wrap-search'
|
||||
} else if (this.props.type === 'search' && this.state.isFocused) {
|
||||
return 'input-wrap input-wrap-search is-focused'
|
||||
} else if (this.state.isFocused && this.props.type !== 'search') {
|
||||
return 'input-wrap is-focused'
|
||||
} else {
|
||||
return 'input-wrap'
|
||||
}
|
||||
}
|
||||
|
||||
public handleBlur() {
|
||||
this.setState({ isFocused: true })
|
||||
}
|
||||
|
||||
public handleFocus() {
|
||||
this.setState({ isFocused: false })
|
||||
}
|
||||
|
||||
public render() {
|
||||
const {
|
||||
name,
|
||||
label,
|
||||
required,
|
||||
type,
|
||||
help,
|
||||
small,
|
||||
additionalComponent,
|
||||
...props
|
||||
} = this.props
|
||||
|
||||
return (
|
||||
<div className={styles.formGroup}>
|
||||
<label
|
||||
htmlFor={name}
|
||||
className={styles.label}
|
||||
title={required ? 'Required' : ''}
|
||||
>
|
||||
{label}
|
||||
</label>
|
||||
<div className={this.inputWrapClasses()}>
|
||||
<input
|
||||
className={small ? 'input input-sm' : 'input'}
|
||||
id={name}
|
||||
name={name}
|
||||
required={required}
|
||||
type={type}
|
||||
{...props}
|
||||
onFocus={this.handleFocus}
|
||||
onBlur={this.handleBlur}
|
||||
/>
|
||||
{type === 'search' && <SearchIcon />}
|
||||
</div>
|
||||
{help && <FormHelp>{help}</FormHelp>}
|
||||
|
||||
{additionalComponent && additionalComponent}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user