重构passwd组件
parent
7654fc8da7
commit
a10f3ccd63
|
@ -78,4 +78,9 @@ code, pre, samp {font-family: Menlo, Monaco, Consolas, 'Courier New', monospace;
|
||||||
--color-dark-1: #64748B;
|
--color-dark-1: #64748B;
|
||||||
--color-dark-2: #475569;
|
--color-dark-2: #475569;
|
||||||
--color-dark-3: #2c3441;
|
--color-dark-3: #2c3441;
|
||||||
|
|
||||||
|
|
||||||
|
--color-drag-background: #fdf6ec;
|
||||||
|
--color-readonly-background: #f7f8fb;
|
||||||
|
--color-disabled-background: #fef0f0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,15 +22,15 @@ class Passwd extends Component {
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
display: inline-flex;
|
display: inline-flex;
|
||||||
min-width: 188px;
|
min-width: 188px;
|
||||||
user-select: none;
|
|
||||||
-moz-user-select: none;
|
|
||||||
color: var(--color-dark-1);
|
color: var(--color-dark-1);
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
cursor: text;
|
cursor: text;
|
||||||
transition: box-shadow 0.15s linear;
|
transition: box-shadow 0.15s linear;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
user-select: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.label {
|
.container {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
|
@ -52,7 +52,8 @@ class Passwd extends Component {
|
||||||
border: 0;
|
border: 0;
|
||||||
border-radius: inherit;
|
border-radius: inherit;
|
||||||
color: inherit;
|
color: inherit;
|
||||||
font: inherit;
|
font-family: inherit;
|
||||||
|
font-size: inherit;
|
||||||
background: none;
|
background: none;
|
||||||
outline: none;
|
outline: none;
|
||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
|
@ -63,7 +64,7 @@ class Passwd extends Component {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
:host([round]) .label input {
|
:host([round]) .container input {
|
||||||
padding: 0 6px 0 20px;
|
padding: 0 6px 0 20px;
|
||||||
}
|
}
|
||||||
:host(:focus-within) {
|
:host(:focus-within) {
|
||||||
|
@ -71,7 +72,7 @@ class Passwd extends Component {
|
||||||
}
|
}
|
||||||
`,
|
`,
|
||||||
css`
|
css`
|
||||||
.label {
|
.container {
|
||||||
.icon {
|
.icon {
|
||||||
--wc-icon-size: 16px;
|
--wc-icon-size: 16px;
|
||||||
margin: 0 8px 0 4px;
|
margin: 0 8px 0 4px;
|
||||||
|
@ -82,39 +83,10 @@ class Passwd extends Component {
|
||||||
`,
|
`,
|
||||||
// 尺寸
|
// 尺寸
|
||||||
css`
|
css`
|
||||||
@use 'sass:map';
|
:host([size='small']) {
|
||||||
$sizes: (
|
min-width: 128px;
|
||||||
m: (
|
.container {
|
||||||
w: 128px,
|
height: 24px;
|
||||||
h: 24px,
|
|
||||||
f: 12px
|
|
||||||
),
|
|
||||||
// l default
|
|
||||||
xl:
|
|
||||||
(
|
|
||||||
w: 224px,
|
|
||||||
h: 36px,
|
|
||||||
f: 14px
|
|
||||||
),
|
|
||||||
xxl: (
|
|
||||||
w: 288px,
|
|
||||||
h: 44px,
|
|
||||||
f: 14px
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
@loop $s, $v in $sizes {
|
|
||||||
:host([size='#{$s}']) {
|
|
||||||
min-width: map.get($v, 'w');
|
|
||||||
.label {
|
|
||||||
height: map.get($v, 'h');
|
|
||||||
}
|
|
||||||
|
|
||||||
@if $s == 'xxl' {
|
|
||||||
.icon {
|
|
||||||
--wc-icon-size: 18px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
`,
|
`,
|
||||||
|
@ -122,56 +94,67 @@ class Passwd extends Component {
|
||||||
:host([disabled]),
|
:host([disabled]),
|
||||||
:host([readonly]) {
|
:host([readonly]) {
|
||||||
cursor: default;
|
cursor: default;
|
||||||
|
|
||||||
.icon {
|
.icon {
|
||||||
cursor: default;
|
cursor: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
.container {
|
||||||
|
background: var(--color-readonly-background);
|
||||||
|
opacity: 0.6;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
:host([disabled]) {
|
:host([disabled]) {
|
||||||
cursor: not-allowed;
|
cursor: not-allowed;
|
||||||
|
|
||||||
.label {
|
.container {
|
||||||
border-color: var(--color-grey-1);
|
background: var(--color-disabled-background);
|
||||||
background: var(--color-plain-1);
|
|
||||||
opacity: 0.6;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
`
|
`
|
||||||
]
|
]
|
||||||
|
|
||||||
#type = 'password'
|
#type = 'password'
|
||||||
|
#stamp = 0
|
||||||
|
|
||||||
mounted() {
|
mounted() {
|
||||||
if (this.autofocus) {
|
if (this.autofocus) {
|
||||||
nextTick(_ => this.$refs.input.focus())
|
this.$refs.input.focus()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
iconClick(ev) {
|
#toggleView(ev) {
|
||||||
if (this.readOnly || this.disabled) {
|
if (this.readOnly || this.disabled) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
this.#type = this.#type === 'password' ? '' : 'password'
|
this.#type = this.#type === 'password' ? 'text' : 'password'
|
||||||
this.$requestUpdate()
|
this.$requestUpdate()
|
||||||
}
|
}
|
||||||
|
|
||||||
handleInput(ev) {
|
#fetch(ev) {
|
||||||
|
let now = Date.now()
|
||||||
|
let { lazy } = this
|
||||||
this.value = ev.target.value
|
this.value = ev.target.value
|
||||||
}
|
|
||||||
|
|
||||||
handleChange() {
|
// 并发拦截
|
||||||
this.$emit('change')
|
if (lazy && now - this.#stamp < lazy) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
this.#stamp = now
|
||||||
|
this.$emit(ev.type)
|
||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
return html`
|
return html`
|
||||||
<div class="label">
|
<main class="container">
|
||||||
<slot class="prepend" name="prepend"></slot>
|
<slot class="prepend" name="prepend"></slot>
|
||||||
<input
|
<input
|
||||||
spellcheck="false"
|
spellcheck="false"
|
||||||
ref="input"
|
ref="input"
|
||||||
placeholder=${this.placeholder}
|
placeholder=${this.placeholder}
|
||||||
@input=${this.handleInput}
|
@input.stop=${this.#fetch}
|
||||||
@change=${this.handleChange}
|
@change=${this.#fetch}
|
||||||
:readOnly=${this.readOnly}
|
:readOnly=${this.readOnly}
|
||||||
:disabled=${this.disabled}
|
:disabled=${this.disabled}
|
||||||
:type=${this.#type}
|
:type=${this.#type}
|
||||||
|
@ -179,10 +162,10 @@ class Passwd extends Component {
|
||||||
/>
|
/>
|
||||||
<wc-icon
|
<wc-icon
|
||||||
class="icon"
|
class="icon"
|
||||||
@click=${this.iconClick}
|
@click=${this.#toggleView}
|
||||||
:name=${this.#type === 'password' ? 'eye' : 'eye-off'}
|
:name=${this.#type === 'password' ? 'eye' : 'eye-off'}
|
||||||
></wc-icon>
|
></wc-icon>
|
||||||
</div>
|
</main>
|
||||||
`
|
`
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue