Skip to content

Commit 4a64fc6

Browse files
committed
feat: Email/Password control support icon definition.
1 parent dbbb3c6 commit 4a64fc6

File tree

9 files changed

+72
-31
lines changed

9 files changed

+72
-31
lines changed

pages/page2/README.md

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ const Demo = () => (
2929
<Login.Banner>
3030
<img src={defaultBannerImage} />
3131
</Login.Banner>
32+
<Login.Password>
33+
<div>xx</div>
34+
</Login.Password>
3235
</Login>
3336
);
3437

@@ -107,7 +110,9 @@ const Demo = () => (
107110
</Logo>
108111
<Email index={3} type="text" placeholder="Username" />
109112
<Password index={2} />
110-
<Input name="phone" index={1} placeholder="Phone number" />
113+
<Input name="phone" index={1} placeholder="Phone number">
114+
<div>xx</div>
115+
</Input>
111116
<Banner>
112117
<img src={defaultBannerImage} />
113118
</Banner>
@@ -239,7 +244,9 @@ import { Button, Input } from 'react-login-page';
239244
<Password visible={false} />
240245

241246
// Add input control
242-
<Input name="phone" index={1} placeholder="Phone number" />
247+
<Input name="phone" index={1} placeholder="Phone number">
248+
<svg>...</svg>
249+
</Input>
243250

244251
// Add content after the button
245252
<Login.ButtonAfter>
Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
import { PropsWithChildren } from 'react';
22
import { Block, BlockProps, BlockTagType } from 'react-login-page';
33

4-
type Div = BlockProps<'div'>
5-
6-
export const ButtonAfter = <Tag extends BlockTagType = 'div'>(props: PropsWithChildren<BlockProps<Tag | 'footer'>>) => {
4+
export const ButtonAfter = <Tag extends BlockTagType>(props: PropsWithChildren<BlockProps<Tag | 'aside'>>) => {
75
const { name, ...elmProps } = props;
8-
9-
return <Block {...elmProps} name="buttonAfter" />;
6+
return <Block {...elmProps} name="buttonAfter" tagName="aside" />;
107
};

pages/page2/src/control/Email.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
import { FC } from 'react';
22
import { Input, InputProps } from 'react-login-page';
3+
import { EmailIcon } from '../icons/email';
34

4-
export const Email: FC<InputProps> = (props) => {
5-
const { name, ...elmProps } = props;
5+
export interface EmailProps extends InputProps {};
6+
export const Email: FC<EmailProps> = (props) => {
7+
const { name, ...elmProps } = props;
8+
if (!elmProps.children) {
9+
elmProps.children = EmailIcon
10+
}
611
return <Input placeholder="Email" spellCheck={false} {...elmProps} type="email" name="email" rename={name} />;
712
};
Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
import { FC } from 'react';
22
import { Input, InputProps } from 'react-login-page';
3+
import { LockIcon } from '../icons/lock';
34

4-
export const Password: FC<InputProps> = (props) => {
5+
export interface PasswordProps extends InputProps {};
6+
export const Password: FC<PasswordProps> = (props) => {
57
const { name, ...elmProps } = props;
8+
if (!elmProps.children) {
9+
elmProps.children = LockIcon
10+
}
611
return <Input type="password" placeholder="Password" {...elmProps} name="password" rename={name} />;
712
};

pages/page2/src/icons/email.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export const EmailIcon = (
2+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="1em" width="1em">
3+
<path fill="currentColor" d="M20 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm-.4 4.25-7.07 4.42c-.32.2-.74.2-1.06 0L4.4 8.25a.85.85 0 1 1 .9-1.44L12 11l6.7-4.19a.85.85 0 1 1 .9 1.44z"/>
4+
</svg>
5+
);

pages/page2/src/icons/lock.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export const LockIcon = (
2+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="1em" width="1em" fill="currentColor">
3+
<path fill="currentColor" d="M18 8h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zm-6 9c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zM9 8V6c0-1.66 1.34-3 3-3s3 1.34 3 3v2H9z"/>
4+
</svg>
5+
);

pages/page2/src/index.css

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,14 @@
6363
background-color: transparent;
6464
}
6565

66-
.login-page2-inner > article {
66+
.login-page2-inner > main {
6767
display: flex;
6868
flex-direction: column;
6969
gap: var(--gap);
70+
position: relative;
7071
}
7172

72-
.login-page2-inner > article > header {
73+
.login-page2-inner > main > header {
7374
display: flex;
7475
flex-direction: row;
7576
align-items: center;
@@ -78,20 +79,24 @@
7879
padding-bottom: 2rem;
7980
}
8081

81-
.login-page2-inner > article > header svg {
82+
.login-page2-inner > main > header svg {
8283
display: block;
8384
}
84-
.login-page2-inner > article > header h1 {
85+
.login-page2-inner > main > header h1 {
8586
margin: 0;
8687
padding: 0;
8788
font-size: 24px;
8889
text-align: center;
8990
}
9091

91-
.login-page2-inner > article > label {
92+
.login-page2-inner > main > aside {
93+
text-align: center;
94+
font-size: 14px;
95+
}
96+
.login-page2-inner > main > label {
9297
display: block;
9398
}
94-
.login-page2-inner > article > label input {
99+
.login-page2-inner > main > label input {
95100
color: var(--login-input);
96101
display: block;
97102
width: 100%;
@@ -107,21 +112,21 @@
107112
.login-page2-inner input::placeholder {
108113
color: var(--login-input-placeholder);
109114
}
110-
.login-page2-inner > article > label input:focus {
115+
.login-page2-inner > main > label input:focus {
111116
border-color: transparent!important;
112117
}
113118

114-
.login-page2-inner > article > label input:-webkit-autofill {
119+
.login-page2-inner > main > label input:-webkit-autofill {
115120
box-shadow: 0 0 0 1000px #e6e6e6 inset;
116-
color: #57b846;
121+
color: var(--login-input);
117122
-webkit-text-fill-color: #333 !important;
118123
}
119124

120-
.login-page2-inner > article > section {
125+
.login-page2-inner > main > section {
121126
display: flex;
122127
gap: var(--gap);
123128
}
124-
.login-page2-inner > article > section > button {
129+
.login-page2-inner > main > section > button {
125130
font-weight: bold;
126131
color: var(--login-btn);
127132
text-transform: uppercase;
@@ -140,20 +145,32 @@
140145
touch-action: manipulation;
141146
}
142147

143-
.login-page2-inner > article > section > button:hover {
148+
.login-page2-inner > main > section > button:hover {
144149
background: var(--login-btn-bg-hover);
145150
}
146-
.login-page2-inner > article > section > button:active {
151+
.login-page2-inner > main > section > button:active {
147152
background: var(--login-btn-bg-active);
148153
}
149154

150-
.login-page2-inner > article > label input {
155+
.login-page2-inner > main > label {
156+
display: flex;
157+
align-items: center;
158+
color: var(--login-input);
159+
}
160+
.login-page2-inner > main > label :first-child:not(input) {
161+
color: var(--login-input);
162+
position: absolute;
163+
width: 23px;
164+
height: 23px;
165+
left: 29px;
166+
}
167+
.login-page2-inner > main > label input {
151168
box-shadow: 0 0;
152169
}
153-
.login-page2-inner > article > label input:focus {
170+
.login-page2-inner > main > label input:focus {
154171
box-shadow: 0 0;
155172
}
156-
.login-page2-inner > article > label input:focus {
173+
.login-page2-inner > main > label input:focus {
157174
box-shadow: 0 0 0 0 var(--login-btn-bg-focus);
158175
animation: anim-shadow .5s ease-in-out forwards
159176
}

pages/page2/src/index.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,21 +22,21 @@ export * from './control/Logo';
2222
export * from './control/Banner';
2323

2424
const RenderLogin = () => {
25-
const { blocks = {}, data } = useStore();
25+
const { blocks = {}, extra = {}, data } = useStore();
2626
const { fields, buttons } = data || { fields: [] };
2727
return (
2828
<Render>
2929
<div className="login-page2-inner">
3030
<aside>
3131
{blocks.banner}
3232
</aside>
33-
<article>
33+
<main>
3434
<header>
3535
{blocks.logo} {blocks.title}
3636
</header>
3737
{fields.sort((a, b) => a.index - b.index).map((item, idx) => {
3838
if (!item.children) return null;
39-
return <label key={item.name + idx}>{item.children}</label>
39+
return <label key={item.name + idx}>{extra[item.name]} {item.children}</label>
4040
})}
4141
<section>
4242
{buttons.sort((a, b) => a.index - b.index).map((item, idx) => {
@@ -49,7 +49,7 @@ const RenderLogin = () => {
4949
})}
5050
</section>
5151
{blocks.buttonAfter}
52-
</article>
52+
</main>
5353
</div>
5454
</Render>
5555
);

website/src/pages/Example.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import LoginBase from '@react-login-page/base';
2-
import LoginLogo from 'react-login-page/logo';
2+
import LoginLogo from 'react-login-page/logo-rect';
33
import LoginPage1 from '@react-login-page/page1';
44
import LoginPage2 from '@react-login-page/page2';
55
import bannerImage from '@react-login-page/page2/banner-image';

0 commit comments

Comments
 (0)