diff --git a/src/components/header-bar/header-bar.ts b/src/components/header-bar/header-bar.ts index c7572b8..d476d9d 100644 --- a/src/components/header-bar/header-bar.ts +++ b/src/components/header-bar/header-bar.ts @@ -18,7 +18,7 @@ export class HeaderBar extends LitElement { getTime(): HTMLTemplateResult { return html`
-
+
diff --git a/src/components/icon-control-bar/icon-control-bar.ts b/src/components/icon-control-bar/icon-control-bar.ts index 68d4ab7..bdf63d6 100644 --- a/src/components/icon-control-bar/icon-control-bar.ts +++ b/src/components/icon-control-bar/icon-control-bar.ts @@ -32,6 +32,7 @@ export class IconControlBar extends LitElement { @property({type: Boolean}) active = false @property({type: Boolean}) longPress = false @property({type: Boolean}) isNameShown = false + @property({type: String}) section = '' @state({}) timer!: number @query('.more-info-icon') moreInfoIcon!: HTMLDivElement diff --git a/src/components/icon-control-bar/iconstyle.ts b/src/components/icon-control-bar/iconstyle.ts index f2f2403..8543095 100644 --- a/src/components/icon-control-bar/iconstyle.ts +++ b/src/components/icon-control-bar/iconstyle.ts @@ -13,7 +13,25 @@ export const sharedStyles: CSSResult = css` .active { background-color: var(--background-active) !important; color: var(--text-color-active) !important; - transform: scale(0.9); + // transition: transform 0.2s cubic-bezier(0.25, 0.1, 0.25, 1); + // transform: scale(0.9); + animation: scaleAnimation 0.2s cubic-bezier(0.25, 0.1, 0.25, 1); + } + + @keyframes scaleAnimation { + 0% { + transform: scale(0.9); + } + + 100% { + transform: scale(1); + } + } + + .inactive { + // transition: transform 0.2s cubic-bezier(0.25, 0.1, 0.25, 1); + // transform: scale(0.9); + animation: scaleAnimation 0.2s cubic-bezier(0.25, 0.1, 0.25, 1); } .with-border { @@ -39,7 +57,7 @@ export const sharedStyles: CSSResult = css` text-align: center; vertical-align: middle; content: attr(data-icon); - font-family: gaia-icons; + font-family: 'gaia-icons'; font-style: normal; text-rendering: optimizelegibility; font-weight: 500; @@ -75,9 +93,9 @@ export const sharedStyles: CSSResult = css` font-style: normal; mix-blend-mode: normal; width: 8.3vw; - height: 1vh; + // height: 1vh; font-size: 1.75vw; - line-height: 1.7vw; + // line-height: 1.7vw; } .icon-name-shown, diff --git a/src/components/notification-group/notification-group.ts b/src/components/notification-group/notification-group.ts index 7fbf13f..febe22a 100644 --- a/src/components/notification-group/notification-group.ts +++ b/src/components/notification-group/notification-group.ts @@ -18,6 +18,7 @@ export class StarNotificationGroup extends LitElement { connectedCallback() { super.connectedCallback() window.addEventListener('notification-delete', this) + window.addEventListener('notification-touchmove', this) } firstUpdated() { @@ -59,6 +60,19 @@ export class StarNotificationGroup extends LitElement { } ) break + // 左滑通知时,对未闭合操作按钮的其它通知进行闭合 + case 'notification-touchmove': + let targetId = (event as any).detail.id + if (this.slotElements.length > 1) { + ;(this.slotElements as StarNotification[]).forEach( + (el: StarNotification) => { + if (el.id !== targetId && el.moveDirection == 'left') { + el.closeNotificationTools() + } + } + ) + } + break } } @@ -199,6 +213,33 @@ export class StarNotificationGroup extends LitElement { }) } + collapseNotifications() { + let firstChild = this.slotElements[0] as StarNotification + let isShow = this.getAttribute('show') == 'true' + ;(this.slotElements as StarNotification[]).forEach((element) => { + element.closeNotificationTools() + }) + if (isShow) { + // 当前是展开状态,点击需折叠 + let self = this + firstChild.setAttribute('radiusType', 'border-radius') + firstChild.withArrowUp = false + firstChild.setAttribute('notificationType', 'more-notifiactions-first') + this.slotElements.forEach((element, index) => { + if (element !== firstChild) { + ;(element as StarNotification).classList.add('animation-out') + element.addEventListener('animationend', function tEnd() { + if (index == self.slotElements.length - 1) { + self.setAttribute('show', 'false') + } + ;(element as StarNotification).classList.remove('animation-out') + element.removeEventListener('animationend', tEnd) + }) + } + }) + } + } + static styles = css` :host { display: block; @@ -241,7 +282,7 @@ export class StarNotificationGroup extends LitElement { 100% { opacity: 0; - scale(0.9); + transform: scale(0.9); } } diff --git a/src/components/notification/notification.ts b/src/components/notification/notification.ts index 3e1ea4d..9b57c09 100644 --- a/src/components/notification/notification.ts +++ b/src/components/notification/notification.ts @@ -7,7 +7,7 @@ import { state, } from 'lit/decorators.js' import {sharedStyles} from './notificationstyle.js' -import {StarBaseElement} from '../base' +import {StarBaseElement} from '@star-web-components/base' // ONE : 单条通知,notification-group展开时第一条notification类型 // MORE : notification-group中除第一条以外的notification类型 // MORE_FIRST: notification-group折叠时第一条notification类型 @@ -54,13 +54,14 @@ export class StarNotification extends StarBaseElement { // 消息通知toast @property({type: Boolean}) isToast = false @property({type: Boolean}) btnShown = false + @property({type: String}) moveDirection = '' @property({type: Number}) notificationPosition = 0 @property({type: Number}) width = 0 @property({type: Number}) widthleft = 0 @property({type: Number}) velocityThreshold = 0.8 @query('.notification') notification!: HTMLDivElement @query('.btn-tool') btnTool!: HTMLDivElement - @query('.arrow-up') arrowUp!: HTMLDivElement + @query('.arrow-up') arrowUp!: HTMLElement @state() touchAction = { // 触摸开始落点 start: { @@ -91,7 +92,11 @@ export class StarNotification extends StarBaseElement { constructor() { super() - this.startGestureDetector() + this.startGestureDetector({ + panThreshold: 0, + velocityThreshold: 0, + holdThreshold: 150, + }) } firstUpdated() { @@ -99,7 +104,6 @@ export class StarNotification extends StarBaseElement { this.addEventListener('swipeleft', this) this.addEventListener('swiperight', this) this.addEventListener('holdstart', this) - this.addEventListener('holdmove', this) this.addEventListener('holdend', this) }) this.notificationPosition = this.getBoundingClientRect().right @@ -190,7 +194,7 @@ export class StarNotification extends StarBaseElement {
${this.text}
- + ${arrowShow}
@@ -227,7 +231,7 @@ export class StarNotification extends StarBaseElement {
${this.text}
- + ${arrowShow}
@@ -315,7 +319,7 @@ export class StarNotification extends StarBaseElement {
${this.secondTitle}
${this.secondText}
- ${this.count} + ${this.count}
@@ -348,32 +352,8 @@ export class StarNotification extends StarBaseElement { let time = this.touchAction.last.timeStamp - this.touchAction.start.timeStamp let velocityThreshold = Math.abs(touchPosX) / time - // if (Math.abs(touchPosX) > 266) { - // touchPosX = 266; - // } - - // this.notification.style.transform = 'translateX(' + touchPosX + 'px)'; if (touchPosX < 0) { - // if (Math.abs(touchPosX) > 18) { - // (this.btnTool.children[1] as HTMLElement).style.visibility = "visible"; - // } - // if (Math.abs(touchPosX) > 142) { - // (this.btnTool.children[0] as HTMLElement).style.visibility = "visible"; - // } - - // if (Math.abs(touchPosX) > 222) { - // (this.btnTool.children[1] as HTMLElement).style.opacity = "1"; - // (this.btnTool.children[0] as HTMLElement).style.opacity = "1"; - // } - let translateX - if (screen.width >= 900) { - translateX = 266 - } else if (screen.width >= 600) { - translateX = 133 - } else { - translateX = 88 - } - + let translateX = this.notificationPosition * 0.309 let quickRemove = !this.btnShown && Math.abs(touchPosX) > 1.5 * translateX && @@ -404,8 +384,7 @@ export class StarNotification extends StarBaseElement { return } - this.notification.style.transform = - 'translateX(-' + translateX + 'px)' + this.notification.style.transform = 'translateX(-30.9%)' let self = this this.notification.addEventListener( 'transitionend', @@ -421,22 +400,8 @@ export class StarNotification extends StarBaseElement { } ) this.widthleft = this.width - translateX + this.moveDirection = 'left' } else if (touchPosX > 0) { - // if (touchPosX > 44) { - // (this.btnTool.children[0] as any).style.opacity = 0.6; - // } - - // if (touchPosX > 124) { - // (this.btnTool.children[0] as any).style.visibility = "hidden"; - // } - - // if (touchPosX > 168) { - // (this.btnTool.children[1] as any).style.opacity = 0.6; - // } - - // if (touchPosX > 248) { - // (this.btnTool.children[1] as any).style.visibility = "hidden"; - // } this.notification.style.transform = 'translateX(' + 0 + 'px)' let tranEnd = () => { this.notification.removeEventListener('transitionend', tranEnd) @@ -447,7 +412,18 @@ export class StarNotification extends StarBaseElement { this.btnShown = false } this.notification.addEventListener('transitionend', tranEnd) + this.moveDirection = 'right' } + this.dispatchEvent( + new CustomEvent('notification-touchmove', { + detail: { + id: this.id, + direction: this.moveDirection, + }, + bubbles: true, + composed: true, + }) + ) break case 'touchend': break @@ -495,16 +471,41 @@ export class StarNotification extends StarBaseElement { }) break default: - this.dispatchEvent( - new CustomEvent('notification-tap', { - detail: { - id: self.id, - notification: self, - }, - bubbles: true, - composed: true, - }) - ) + let boundary = this.getBoundingClientRect().right * 0.8 + if (boundary < (event as any).clientX) { + this.dispatchEvent( + new CustomEvent('notification-tap', { + detail: { + id: self.id, + notification: self, + }, + bubbles: true, + composed: true, + }) + ) + } else { + this.notification.classList.add('click') + this.notification.addEventListener( + 'animationend', + function tranEnd() { + self.notification.removeEventListener( + 'animationend', + tranEnd + ) + self.notification.classList.remove('click') + self.dispatchEvent( + new CustomEvent('notification-click', { + detail: { + id: self.id, + notification: self, + }, + bubbles: true, + composed: true, + }) + ) + } + ) + } break } break @@ -559,6 +560,26 @@ export class StarNotification extends StarBaseElement { } } + closeNotificationTools() { + if (this.moveDirection !== 'left') { + return + } + + this.notification.style.transform = 'translateX(0px)' + let deleteBtn = this.btnTool.children[0] as HTMLElement + let settingsBtn = this.btnTool.children[1] as HTMLElement + // let tranEnd = () => { + // this.notification.removeEventListener('transitionend', tranEnd) + if (!this.noclear) { + deleteBtn.style.visibility = 'hidden' + } + settingsBtn.style.visibility = 'hidden' + this.btnShown = false + this.moveDirection = 'right' + // } + // this.notification.addEventListener('transitionend', tranEnd) + } + public static override get styles(): CSSResultArray { return [sharedStyles] } diff --git a/src/components/notification/notificationstyle.ts b/src/components/notification/notificationstyle.ts index 1e17761..33e06ac 100644 --- a/src/components/notification/notificationstyle.ts +++ b/src/components/notification/notificationstyle.ts @@ -167,12 +167,12 @@ export const sharedStyles: CSSResult = css` width: 90.2%; left: 9.8%; - top: 55.3%; + top: 55%; } .notification > div.detail .detail-content { height: 22.4%; - line-height: 1; + // line-height: 1; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; @@ -397,7 +397,7 @@ export const sharedStyles: CSSResult = css` font-size: 2vw; } - .another-container .notificaiton-counts { + .another-container .notification-counts { position: absolute; text-align: center; vertical-align: middle; @@ -473,7 +473,7 @@ export const sharedStyles: CSSResult = css` color: var(--single-text-color-lm); } - .another-container .notificaiton-counts { + .another-container .notification-counts { color: var(--notification-counts-lm); background: var(--notification-counts-background-lm); } @@ -496,7 +496,7 @@ export const sharedStyles: CSSResult = css` color: var(--button-color-dm); } - .another-container .notificaiton-counts { + .another-container .notification-counts { color: var(--notification-counts-dm); background: var(--notification-counts-background-dm); } @@ -544,6 +544,22 @@ export const sharedStyles: CSSResult = css` transform: scale(1); } + .click { + animation: click 0.35s cubic-bezier(0.25, 0.1, 0.25, 1); + } + + @keyframes click { + 0% { + transform: scale(0.95); + background: var(--notification-background-active); + } + + 100% { + transform: scale(1); + background: var(--notification-background-lm); + } + } + :host(.animation-in) { animation: show 0.3s cubic-bezier(0.25, 0.1, 0.25, 1); }