Merge branch 'master' of github.com:9th-js/wcui

master
yutent 2023-05-09 17:52:28 +08:00
commit b12df6ed69
8 changed files with 81 additions and 58 deletions

View File

@ -15,7 +15,7 @@ class Badge extends Component {
default: null default: null
}, },
hidden: false, hidden: false,
'is-dot': false isDot: false
} }
static styles = [ static styles = [
@ -85,7 +85,7 @@ class Badge extends Component {
return html` return html`
<div class="badge" ref="bad"> <div class="badge" ref="bad">
<slot></slot> <slot></slot>
${!this['is-dot'] && !this.hidden ${!this.isDot && !this.hidden
? html`<div class="num"> ? html`<div class="num">
${this.max && this.value >= this.max ${this.max && this.value >= this.max
? this.max + '+' ? this.max + '+'

View File

@ -23,7 +23,7 @@ class TextArea extends Component {
minheight: null, minheight: null,
maxlength: null, maxlength: null,
minlength: null, minlength: null,
'show-limit': false, showLimit: false,
lazy: 0 // 并发拦截时间, 单位毫秒 lazy: 0 // 并发拦截时间, 单位毫秒
} }
@ -228,7 +228,7 @@ class TextArea extends Component {
@keydown=${this.onKeydown} @keydown=${this.onKeydown}
@change=${this.onChange} @change=${this.onChange}
></textarea> ></textarea>
${this['show-limit'] ${this.showLimit
? html`<div class="input-stat"> ? html`<div class="input-stat">
${this.value.length}/${this.maxlength || '∞'} ${this.value.length}/${this.maxlength || '∞'}
</div>` </div>`

View File

@ -15,8 +15,8 @@ class ImagePreview extends Component {
attribute: false attribute: false
}, },
visible: false, visible: false,
'max-zoom': 3, maxZoom: 3,
'min-zoom': 1 / 3 minZoom: 1 / 3
} }
static styles = css` static styles = css`
@ -138,8 +138,7 @@ class ImagePreview extends Component {
this.setZoom(this.#state.scale / 1.2) this.setZoom(this.#state.scale / 1.2)
} }
setZoom(val) { setZoom(val) {
const maxZoom = this['max-zoom'] const { maxZoom, minZoom } = this
const minZoom = this['min-zoom']
val = Math.max(val, minZoom) val = Math.max(val, minZoom)
val = Math.min(val, maxZoom) val = Math.min(val, maxZoom)
val = val.toFixed(2) val = val.toFixed(2)

View File

@ -12,7 +12,7 @@ class Image extends Component {
src: '', src: '',
fit: 'fill', fit: 'fill',
lazy: false, lazy: false,
'referrer-policy': null, referrerPolicy: null,
alt: { alt: {
type: String, type: String,
default: null default: null
@ -56,15 +56,7 @@ class Image extends Component {
} }
render() { render() {
let { let { lazy, src, status, fit, alt, referrerPolicy } = this
lazy,
src,
status,
fit,
alt,
'referrer-policy': referrerPolicy
} = this
let styles = styleMap({ let styles = styleMap({
'object-fit': fit 'object-fit': fit
}) })

View File

@ -14,22 +14,22 @@ class Popconfirm extends Component {
default: '', default: '',
attribute: false attribute: false
}, },
'confirm-button-text': { confirmButtonText: {
type: String, type: String,
default: '确定', default: '确定',
attribute: false attribute: false
}, },
'cancel-button-text': { cancelButtonText: {
type: String, type: String,
default: '取消', default: '取消',
attribute: false attribute: false
}, },
'confirm-button-type': { confirmButtonType: {
type: String, type: String,
default: 'primary', default: 'primary',
attribute: false attribute: false
}, },
'cancel-button-type': { cancelButtonType: {
type: String, type: String,
default: '', default: '',
attribute: false attribute: false
@ -39,15 +39,14 @@ class Popconfirm extends Component {
default: 'info', default: 'info',
attribute: false attribute: false
}, },
'icon-color': { iconColor: {
type: String, type: String,
default: '#ff9900', default: '#ff9900',
attribute: false attribute: false
}, },
'hide-icon': { hideIcon: {
type: Boolean, type: Boolean,
default: false, default: false
attribute: false
}, },
show: { show: {
@ -187,34 +186,34 @@ class Popconfirm extends Component {
ref="popover" ref="popover"
> >
<p class="content"> <p class="content">
${this['hide-icon'] ${this.hideIcon
? '' ? ''
: html`<wc-icon : html`<wc-icon
name=${this.icon} name=${this.icon}
style=${`color:${this['icon-color']}`} style=${`color:${this.iconColor}`}
></wc-icon>`} ></wc-icon>`}
${this.title} ${this.title}
</p> </p>
<div class="btns"> <div class="btns">
${!this['cancel-button-type'] ${!this.cancelButtonType
? html`<span class="cancel" @click=${this.hide} ? html`<span class="cancel" @click=${this.hide}
>${this['cancel-button-text']}</span >${this.cancelButtonText}</span
>` >`
: html`<wc-button : html`<wc-button
type=${this['cancel-button-type']} type=${this[cancelButtonType]}
class="cancel" class="cancel"
size="s" size="s"
@click=${this.hide} @click=${this.hide}
>${this['cancel-button-text']}</wc-button >${this[cancelButtonText]}</wc-button
>`} >`}
<wc-button <wc-button
type=${this['confirm-button-type']} type=${this.confirmButtonType}
size="s" size="s"
solid solid
@click=${this.hide} @click=${this.hide}
>${this['confirm-button-text']}</wc-button >${this.confirmButtonText}</wc-button
> >
</div> </div>
</div> </div>

View File

@ -20,12 +20,12 @@ class Progress extends Component {
type: String, type: String,
default: 'line' // line/circle/dashboard default: 'line' // line/circle/dashboard
}, },
'stroke-width': { strokeWidth: {
type: Number, type: Number,
default: 6, default: 6,
attribute: false attribute: false
}, },
'text-inside': { textInside: {
type: Boolean, type: Boolean,
default: false, default: false,
attribute: true attribute: true
@ -52,22 +52,22 @@ class Progress extends Component {
default: 126, default: 126,
attribute: false attribute: false
}, },
'show-text': { showText: {
type: Boolean, type: Boolean,
default: false, default: false,
attribute: true attribute: true
}, },
'back-color': { backColor: {
type: String, type: String,
default: '#ebeef5', default: '#ebeef5',
attribute: false attribute: false
}, },
'text-color': { textColor: {
type: String, type: String,
default: '#606266', default: '#606266',
attribute: false attribute: false
}, },
'stroke-linecap': { strokeLinecap: {
type: String, type: String,
default: 'round', //butt/round/square default: 'round', //butt/round/square
attribute: false attribute: false
@ -125,7 +125,7 @@ class Progress extends Component {
#colors #colors
get relativeStrokeWidth() { get relativeStrokeWidth() {
return ((this['stroke-width'] / this.width) * 100).toFixed(1) return ((this.strokeWidth / this.width) * 100).toFixed(1)
} }
get radius() { get radius() {
if (this.type === 'circle' || this.type === 'dashboard') { if (this.type === 'circle' || this.type === 'dashboard') {
@ -199,7 +199,7 @@ class Progress extends Component {
get progressTextSize() { get progressTextSize() {
let size = let size =
this.type === 'line' this.type === 'line'
? 12 + this['stroke-width'] * 0.4 ? 12 + this.strokeWidth * 0.4
: this.width * 0.111111 + 2 : this.width * 0.111111 + 2
return size + 'px' return size + 'px'
} }
@ -230,7 +230,7 @@ class Progress extends Component {
<path <path
role="circle__track" role="circle__track"
d=${this.trackPath} d=${this.trackPath}
stroke=${this['back-color']} stroke=${this.backColor}
stroke-width=${this.relativeStrokeWidth} stroke-width=${this.relativeStrokeWidth}
fill="none" fill="none"
style=${this.trailPathStyle} style=${this.trailPathStyle}
@ -240,7 +240,7 @@ class Progress extends Component {
d=${this.trackPath} d=${this.trackPath}
stroke=${this.stroke} stroke=${this.stroke}
fill="none" fill="none"
stroke-linecap=${this['stroke-linecap']} stroke-linecap=${this.strokeLinecap}
stroke-width=${this.value ? this.relativeStrokeWidth : 0} stroke-width=${this.value ? this.relativeStrokeWidth : 0}
style=${this.circlePathStyle} style=${this.circlePathStyle}
></path> ></path>
@ -250,13 +250,13 @@ class Progress extends Component {
} }
renderLine() { renderLine() {
let $barInnerText = '' let $barInnerText = ''
if (this['text-inside'] && this['show-text']) { if (this.textInside && this.showText) {
$barInnerText = html` $barInnerText = html`
<div <div
class="bar-innerText" class="bar-innerText"
style=${styleMap({ style=${styleMap({
color: this['text-color'], color: this.textColor,
'line-height': this['stroke-width'] + 'px' 'line-height': this.strokeWidth + 'px'
})} })}
> >
${this.value + '%'} ${this.value + '%'}
@ -269,8 +269,8 @@ class Progress extends Component {
<div <div
class="bar-outer" class="bar-outer"
:style=${styleMap({ :style=${styleMap({
height: this['stroke-width'] + 'px', height: this.strokeWidth + 'px',
'background-color': this['back-color'] 'background-color': this.backColor
})} })}
> >
<div class="bar-inner" style=${this.barStyle}>${$barInnerText}</div> <div class="bar-inner" style=${this.barStyle}>${$barInnerText}</div>
@ -280,12 +280,12 @@ class Progress extends Component {
} }
render() { render() {
let $outSideText = '' let $outSideText = ''
if (this['show-text'] && !this['text-inside']) { if (this.showText && !this.textInside) {
$outSideText = html` $outSideText = html`
<div <div
class="progress-text" class="progress-text"
style=${styleMap({ style=${styleMap({
color: this['text-color'], color: this.textColor,
fontSize: this.progressTextSize fontSize: this.progressTextSize
})} })}
> >

View File

@ -14,7 +14,7 @@ class Result extends Component {
default: '', default: '',
attribute: false attribute: false
}, },
'sub-title': { type: String, default: '' }, subTitle: { type: String, default: '' },
type: { type: {
type: String, type: String,
default: 'success' default: 'success'
@ -117,7 +117,7 @@ class Result extends Component {
<div class="sub-title"> <div class="sub-title">
<slot name="sub-title"> <slot name="sub-title">
<span>${this['sub-title']}</span> <span>${this.subTitle}</span>
</slot> </slot>
</div> </div>

View File

@ -7,6 +7,7 @@
import { css, html, Component, nextTick, styleMap } from '@bd/core' import { css, html, Component, nextTick, styleMap } from '@bd/core'
import '../icon/index.js' import '../icon/index.js'
const CARD_SCALE = 0.83 const CARD_SCALE = 0.83
function createWatcher(object, key, effect) { function createWatcher(object, key, effect) {
let value let value
Object.defineProperty(object, key, { Object.defineProperty(object, key, {
@ -19,9 +20,10 @@ function createWatcher(object, key, effect) {
} }
}) })
} }
class Swipe extends Component { class Swipe extends Component {
static props = { static props = {
'initial-index': { initialIndex: {
type: Number, type: Number,
default: 0 default: 0
}, },
@ -68,11 +70,12 @@ class Swipe extends Component {
type: String, type: String,
default: 'horizontal' // horizontal or vertical default: 'horizontal' // horizontal or vertical
}, },
'pause-on-hover': { pauseOnHover: {
type: Boolean, type: Boolean,
default: true default: true
} }
} }
static styles = css` static styles = css`
:host { :host {
overflow: hidden; overflow: hidden;
@ -175,6 +178,7 @@ class Swipe extends Component {
} }
} }
` `
items = [] items = []
activeIndex = 0 activeIndex = 0
stamp = 0 stamp = 0
@ -222,16 +226,19 @@ class Swipe extends Component {
return return
} }
this.stamp = now this.stamp = now
if (typeof index === 'string') { if (typeof index === 'string') {
const filteredItems = this.items.filter(item => item.name === index) const filteredItems = this.items.filter(item => item.name === index)
if (filteredItems.length > 0) { if (filteredItems.length > 0) {
index = this.items.indexOf(filteredItems[0]) index = this.items.indexOf(filteredItems[0])
} }
} }
index = Number(index) index = Number(index)
if (isNaN(index) || index !== Math.floor(index)) { if (isNaN(index) || index !== Math.floor(index)) {
return return
} }
const length = this.items.length const length = this.items.length
const oldIndex = this.activeIndex const oldIndex = this.activeIndex
if (index < 0) { if (index < 0) {
@ -244,6 +251,7 @@ class Swipe extends Component {
if (oldIndex !== this.activeIndex) { if (oldIndex !== this.activeIndex) {
this.resetItemPosition(oldIndex) this.resetItemPosition(oldIndex)
} }
this.resetTimer() this.resetTimer()
nextTick(() => this.$requestUpdate()) nextTick(() => this.$requestUpdate())
} }
@ -277,10 +285,11 @@ class Swipe extends Component {
this.updateItems() this.updateItems()
this.resetItemPosition() this.resetItemPosition()
} }
mounted() { mounted() {
this.updateItems() this.updateItems()
nextTick(() => { nextTick(() => {
let initialIndex = this['initial-index'] let initialIndex = this.initialIndex
if (initialIndex >= 0 && initialIndex < this.items.length) { if (initialIndex >= 0 && initialIndex < this.items.length) {
this.activeIndex = initialIndex this.activeIndex = initialIndex
} }
@ -289,10 +298,11 @@ class Swipe extends Component {
this.startTimer() this.startTimer()
}) })
if (this['pause-on-hover']) { if (this.pauseOnHover) {
this.$on('mouseenter', () => this.pauseTimer()) this.$on('mouseenter', () => this.pauseTimer())
this.$on('mouseleave', () => this.startTimer()) this.$on('mouseleave', () => this.startTimer())
} }
if (this.arrow === 'hover') { if (this.arrow === 'hover') {
this.$on('mouseenter', () => this.showArrow()) this.$on('mouseenter', () => this.showArrow())
this.$on('mouseleave', () => this.hideArrow()) this.$on('mouseleave', () => this.hideArrow())
@ -300,15 +310,18 @@ class Swipe extends Component {
this.showArrow() this.showArrow()
} }
} }
unmounted() { unmounted() {
this.resizeObserve.disconnect() this.resizeObserve.disconnect()
this.resizeObserve = null this.resizeObserve = null
this.pauseTimer() this.pauseTimer()
} }
render() { render() {
let styles = styleMap({ let styles = styleMap({
opacity: this.showArrowBtn ? 0.6 : 0 opacity: this.showArrowBtn ? 0.6 : 0
}) })
let toggleBtns = let toggleBtns =
this.direction === 'horizontal' this.direction === 'horizontal'
? html` ? html`
@ -345,10 +358,12 @@ class Swipe extends Component {
` `
} }
} }
class SwipeItem extends Component { class SwipeItem extends Component {
static props = { static props = {
name: { String, attributes: false } name: { String, attributes: false }
} }
static styles = css` static styles = css`
:host { :host {
position: absolute; position: absolute;
@ -372,42 +387,51 @@ class SwipeItem extends Component {
cursor: pointer; cursor: pointer;
} }
` `
static watch = { static watch = {
translate(val) { translate(val) {
const translateType = const translateType =
this.$parent.direction === 'horizontal' ? 'translateX' : 'translateY' this.$parent.direction === 'horizontal' ? 'translateX' : 'translateY'
this.style.transform = `${translateType}(${val}px) scale(${this.scale})` this.style.transform = `${translateType}(${val}px) scale(${this.scale})`
}, },
ready(val) { ready(val) {
val ? this.setAttribute('ready', '') : this.removeAttribute('ready') val ? this.setAttribute('ready', '') : this.removeAttribute('ready')
}, },
animating(val) { animating(val) {
val val
? this.setAttribute('animating', '') ? this.setAttribute('animating', '')
: this.removeAttribute('animating') : this.removeAttribute('animating')
}, },
active(val) { active(val) {
if (this.$parent.type !== 'card') { if (this.$parent.type !== 'card') {
return return
} }
let style = {
const style = {
opacity: 1, opacity: 1,
'z-index': 1, 'z-index': 1,
filter: 'brightness(0.8)' filter: 'brightness(0.8)'
} }
if (this.inStage) { if (this.inStage) {
style['z-index'] = 1 style['z-index'] = 1
} else { } else {
style['z-index'] = -1 style['z-index'] = -1
style.opacity = 0 style.opacity = 0
} }
if (val) { if (val) {
style['z-index'] = 2 style['z-index'] = 2
style.filter = 'brightness(1)' style.filter = 'brightness(1)'
} }
Object.assign(this.style, style) Object.assign(this.style, style)
} }
} }
processIndex(index, activeIndex, length) { processIndex(index, activeIndex, length) {
if (activeIndex === 0 && index === length - 1) { if (activeIndex === 0 && index === length - 1) {
return -1 return -1
@ -420,6 +444,7 @@ class SwipeItem extends Component {
} }
return index return index
} }
calcCardTranslate(index, activeIndex) { calcCardTranslate(index, activeIndex) {
const parentWidth = this.$parent.offsetWidth const parentWidth = this.$parent.offsetWidth
if (this.inStage) { if (this.inStage) {
@ -430,6 +455,7 @@ class SwipeItem extends Component {
return ((3 + CARD_SCALE) * parentWidth) / 4 return ((3 + CARD_SCALE) * parentWidth) / 4
} }
} }
calcTranslate(index, activeIndex, isVertical) { calcTranslate(index, activeIndex, isVertical) {
const distance = this.$parent[isVertical ? 'offsetHeight' : 'offsetWidth'] const distance = this.$parent[isVertical ? 'offsetHeight' : 'offsetWidth']
return distance * (index - activeIndex) return distance * (index - activeIndex)
@ -439,18 +465,22 @@ class SwipeItem extends Component {
const parentType = this.$parent.type const parentType = this.$parent.type
const parentDirection = this.$parent.direction const parentDirection = this.$parent.direction
const length = this.$parent.items.length const length = this.$parent.items.length
if (parentType !== 'card' && oldIndex !== undefined) { if (parentType !== 'card' && oldIndex !== undefined) {
this.animating = index === activeIndex || index === oldIndex this.animating = index === activeIndex || index === oldIndex
} }
if (index !== activeIndex && length > 2 && this.$parent.loop) { if (index !== activeIndex && length > 2 && this.$parent.loop) {
index = this.processIndex(index, activeIndex, length) index = this.processIndex(index, activeIndex, length)
} }
if (parentType === 'card') { if (parentType === 'card') {
if (parentDirection === 'vertical') { if (parentDirection === 'vertical') {
console.warn( console.warn(
'[Warn][Carousel]vertical direction is not supported in card mode' '[Warn][Carousel]vertical direction is not supported in card mode'
) )
} }
this.inStage = Math.round(Math.abs(index - activeIndex)) <= 1 this.inStage = Math.round(Math.abs(index - activeIndex)) <= 1
this.active = index === activeIndex this.active = index === activeIndex
this.scale = this.active ? 1 : CARD_SCALE this.scale = this.active ? 1 : CARD_SCALE
@ -462,14 +492,17 @@ class SwipeItem extends Component {
this.scale = 1 this.scale = 1
this.translate = this.calcTranslate(index, activeIndex, isVertical) this.translate = this.calcTranslate(index, activeIndex, isVertical)
} }
!this.ready && (this.ready = true) !this.ready && (this.ready = true)
} }
created() { created() {
const { watch } = this.constructor const { watch } = this.constructor
for (const key in watch) { for (const key in watch) {
createWatcher(this, key, watch[key]) createWatcher(this, key, watch[key])
} }
} }
mounted() { mounted() {
this.$parent = this.parentNode this.$parent = this.parentNode
if (this.$parent.type === 'card') { if (this.$parent.type === 'card') {