diff --git a/CHANGELOG.md b/CHANGELOG.md index cec68802..f9319978 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## [1.4.11] - 2026-02-03 +- popup ali fix 滚动穿透问题 + +## [1.4.10] - 2026-02-03 +- popup rn fix 动画时调用 initContentRect,导致动画卡顿 + +## [1.4.9] - 2026-01-29 +- toast 增加动画配置,可关闭 toast 显、隐动画 + +## [1.4.8] - 2026-01-20 +- popup rn 增加 zIndex 配置 + ## [1.4.7] - 2026-01-13 - icon、button 组件 css 编译问题修复(React Native) @@ -25,6 +37,9 @@ ## [1.4.0] - 2025-11-06 - RN 组件适配鸿蒙 +## [1.3.17] - 2026-01-15 +- popup ali fix 滚动穿透问题 + ## [1.3.16] - 2025-12-05 - button 支持阴影(React Native) - dialog 对齐小程序、web、RN 关闭按钮样式 diff --git a/docs/config/sidebar.js b/docs/config/sidebar.js index b1234fc8..fdb435b7 100644 --- a/docs/config/sidebar.js +++ b/docs/config/sidebar.js @@ -128,6 +128,10 @@ module.exports = [ { title: 'Switch 滑动开关', path: '/components/base/switch' + }, + { + title: 'Slider 滑动选择器', + path: '/components/base/slider' } ] }, diff --git a/docs/guide/changelog.md b/docs/guide/changelog.md index cec68802..f9319978 100644 --- a/docs/guide/changelog.md +++ b/docs/guide/changelog.md @@ -1,5 +1,17 @@ # Changelog +## [1.4.11] - 2026-02-03 +- popup ali fix 滚动穿透问题 + +## [1.4.10] - 2026-02-03 +- popup rn fix 动画时调用 initContentRect,导致动画卡顿 + +## [1.4.9] - 2026-01-29 +- toast 增加动画配置,可关闭 toast 显、隐动画 + +## [1.4.8] - 2026-01-20 +- popup rn 增加 zIndex 配置 + ## [1.4.7] - 2026-01-13 - icon、button 组件 css 编译问题修复(React Native) @@ -25,6 +37,9 @@ ## [1.4.0] - 2025-11-06 - RN 组件适配鸿蒙 +## [1.3.17] - 2026-01-15 +- popup ali fix 滚动穿透问题 + ## [1.3.16] - 2025-12-05 - button 支持阴影(React Native) - dialog 对齐小程序、web、RN 关闭按钮样式 diff --git a/example/app.mpx b/example/app.mpx index ebe8c4d7..db187b2f 100644 --- a/example/app.mpx +++ b/example/app.mpx @@ -52,7 +52,8 @@ "./pages/loading/index", "./pages/input/index", "./pages/action-sheet/index", - "./pages/tab-bar/index" + "./pages/tab-bar/index", + "./pages/slider/index" ] if (__mpx_mode__ === 'ios' || __mpx_mode__ === 'android') { pages = [ diff --git a/example/common/config.ts b/example/common/config.ts index 8d827562..3ff8b142 100644 --- a/example/common/config.ts +++ b/example/common/config.ts @@ -63,7 +63,8 @@ export default { 'date-picker', 'time-picker', 'rate', - 'switch' + 'switch', + 'slider' ] }, { diff --git a/example/pages/slider/README.md b/example/pages/slider/README.md new file mode 100644 index 00000000..f7e4801d --- /dev/null +++ b/example/pages/slider/README.md @@ -0,0 +1,61 @@ +## Cube-Slider + + + +## 介绍 已适配RN + +滑动选择器(基于touch事件拖动滑块儿,请在移动端环境下体验)。 + +**注意:RN模式下如果组件使用在[scroll-view](https://www.mpxjs.cn/guide/rn/component.html#scroll-view)中,那么change事件可能因为上下滚动不会触发** +- scroll-view 组件在滚动过程中,不会触发其自身或子组件的 touchend 事件响应,这是 RN 底层实现导致的问题,手势系统识别当前是 scroll-view 的滚动,就会取消掉 touchend 事件的响应。 +- 安卓上如果触发了 scroll-view 组件默认的下拉刷新,binddragend可能不触发,只会触发 binddragstart + + + +### 示例 + + + +### 基本用法 + + + + + + + +### 设置step + + + + + + + +### 显示当前value + + + + + + + +### 设置最小值/最大值 + + + + + + + +### 自定义滑块儿 + +设置 +```vue +custom-content="{{true}}" +``` +并添加自定义插槽。 + + + + diff --git a/example/pages/slider/index-ios.mpx b/example/pages/slider/index-ios.mpx new file mode 100644 index 00000000..c253ebfd --- /dev/null +++ b/example/pages/slider/index-ios.mpx @@ -0,0 +1,58 @@ + + + + + + + + diff --git a/example/pages/slider/index.mpx b/example/pages/slider/index.mpx new file mode 100644 index 00000000..5fa0d3d7 --- /dev/null +++ b/example/pages/slider/index.mpx @@ -0,0 +1,59 @@ + + + + + + + diff --git a/example/pages/slider/slider-default.mpx b/example/pages/slider/slider-default.mpx new file mode 100644 index 00000000..b956323e --- /dev/null +++ b/example/pages/slider/slider-default.mpx @@ -0,0 +1,36 @@ + + + + + + diff --git a/example/pages/slider/slider-min-max.mpx b/example/pages/slider/slider-min-max.mpx new file mode 100644 index 00000000..f592aed7 --- /dev/null +++ b/example/pages/slider/slider-min-max.mpx @@ -0,0 +1,41 @@ + + + + + + + + diff --git a/example/pages/slider/slider-slot.mpx b/example/pages/slider/slider-slot.mpx new file mode 100644 index 00000000..6e732115 --- /dev/null +++ b/example/pages/slider/slider-slot.mpx @@ -0,0 +1,49 @@ + + + + + + + + diff --git a/example/pages/slider/slider-step.mpx b/example/pages/slider/slider-step.mpx new file mode 100644 index 00000000..eb9edcae --- /dev/null +++ b/example/pages/slider/slider-step.mpx @@ -0,0 +1,37 @@ + + + + + + diff --git a/example/pages/slider/slider-value.mpx b/example/pages/slider/slider-value.mpx new file mode 100644 index 00000000..555a5e9d --- /dev/null +++ b/example/pages/slider/slider-value.mpx @@ -0,0 +1,37 @@ + + + + + + diff --git a/package.json b/package.json index 35ac256c..ea94c79c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mpx-cube-ui", - "version": "1.4.8", + "version": "1.4.11", "private": true, "description": "mpx components library", "author": "xiaolei ", diff --git a/packages/extract-theme-var/package.json b/packages/extract-theme-var/package.json index d4e25c56..6d9aee58 100644 --- a/packages/extract-theme-var/package.json +++ b/packages/extract-theme-var/package.json @@ -1,6 +1,6 @@ { "name": "@mpxjs/extract-theme-var", - "version": "1.4.8", + "version": "1.4.11", "description": "mpx-cube-ui theme variable extractor", "publishConfig": { "registry": "https://registry.npmjs.org", diff --git a/packages/mpx-cube-ui/__tests__/components/action-sheet/__snapshots__/action-sheet.spec.js.snap b/packages/mpx-cube-ui/__tests__/components/action-sheet/__snapshots__/action-sheet.spec.js.snap index c45dbb9c..6b4b7580 100644 --- a/packages/mpx-cube-ui/__tests__/components/action-sheet/__snapshots__/action-sheet.spec.js.snap +++ b/packages/mpx-cube-ui/__tests__/components/action-sheet/__snapshots__/action-sheet.spec.js.snap @@ -1,5 +1,5 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`component action-sheet unit test correct props check matchSnapshot 1`] = `"我是标题align-centeralign-leftalign-right取消按钮"`; +exports[`component action-sheet unit test correct props check matchSnapshot 1`] = `"我是标题align-centeralign-leftalign-right取消按钮"`; -exports[`component action-sheet unit test event trigger check matchSnapshot 1`] = `"我是标题~~~舒适型七座商务豪华型取消"`; +exports[`component action-sheet unit test event trigger check matchSnapshot 1`] = `"我是标题~~~舒适型七座商务豪华型取消"`; diff --git a/packages/mpx-cube-ui/__tests__/components/cascade-picker-modal/__snapshots__/cascade-picker-modal.spec.js.snap b/packages/mpx-cube-ui/__tests__/components/cascade-picker-modal/__snapshots__/cascade-picker-modal.spec.js.snap index 93f8d2f2..cba13196 100644 --- a/packages/mpx-cube-ui/__tests__/components/cascade-picker-modal/__snapshots__/cascade-picker-modal.spec.js.snap +++ b/packages/mpx-cube-ui/__tests__/components/cascade-picker-modal/__snapshots__/cascade-picker-modal.spec.js.snap @@ -1,9 +1,9 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`component cascade-picker unit test base props check matchSnapshot 1`] = `"Fruit textDrinkDessertCoffeeTeaJuiceOneTwoThreeFour确定"`; +exports[`component cascade-picker unit test base props check matchSnapshot 1`] = `"Fruit textDrinkDessertCoffeeTeaJuiceOneTwoThreeFour确定"`; -exports[`component cascade-picker unit test base props check matchSnapshot 2`] = `"Fruit textDrinkDessertCoffeeTeaJuiceOneTwoThreeFour确定"`; +exports[`component cascade-picker unit test base props check matchSnapshot 2`] = `"Fruit textDrinkDessertCoffeeTeaJuiceOneTwoThreeFour确定"`; -exports[`component cascade-picker unit test base set props check matchSnapshot 1`] = `"选择器内容Fruit textDrinkDessertCoffeeTeaJuiceOneTwoThreeFour确定"`; +exports[`component cascade-picker unit test base set props check matchSnapshot 1`] = `"选择器内容Fruit textDrinkDessertCoffeeTeaJuiceOneTwoThreeFour确定"`; -exports[`component cascade-picker unit test slot check matchSnapshot 1`] = `"
head确定footer
"`; +exports[`component cascade-picker unit test slot check matchSnapshot 1`] = `"
head确定footer
"`; diff --git a/packages/mpx-cube-ui/__tests__/components/cascade-picker-popup/__snapshots__/cascade-picker-popup.spec.js.snap b/packages/mpx-cube-ui/__tests__/components/cascade-picker-popup/__snapshots__/cascade-picker-popup.spec.js.snap index b6b99137..ae28eccb 100644 --- a/packages/mpx-cube-ui/__tests__/components/cascade-picker-popup/__snapshots__/cascade-picker-popup.spec.js.snap +++ b/packages/mpx-cube-ui/__tests__/components/cascade-picker-popup/__snapshots__/cascade-picker-popup.spec.js.snap @@ -1,9 +1,9 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`component cascade-picker unit test base props check matchSnapshot 1`] = `"取消确认Fruit textDrinkDessertCoffeeTeaJuiceOneTwoThreeFour"`; +exports[`component cascade-picker unit test base props check matchSnapshot 1`] = `"取消确认Fruit textDrinkDessertCoffeeTeaJuiceOneTwoThreeFour"`; -exports[`component cascade-picker unit test base props check matchSnapshot 2`] = `"取消确认Fruit textDrinkDessertCoffeeTeaJuiceOneTwoThreeFour"`; +exports[`component cascade-picker unit test base props check matchSnapshot 2`] = `"取消确认Fruit textDrinkDessertCoffeeTeaJuiceOneTwoThreeFour"`; -exports[`component cascade-picker unit test base set props check matchSnapshot 1`] = `"cancel选择器okFruit textDrinkDessertCoffeeTeaJuiceOneTwoThreeFour"`; +exports[`component cascade-picker unit test base set props check matchSnapshot 1`] = `"cancel选择器okFruit textDrinkDessertCoffeeTeaJuiceOneTwoThreeFour"`; -exports[`component cascade-picker unit test slot check matchSnapshot 1`] = `"
取消确认
"`; +exports[`component cascade-picker unit test slot check matchSnapshot 1`] = `"
取消确认
"`; diff --git a/packages/mpx-cube-ui/__tests__/components/checkbox-modal/__snapshots__/checkbox-modal.spec.js.snap b/packages/mpx-cube-ui/__tests__/components/checkbox-modal/__snapshots__/checkbox-modal.spec.js.snap index 685d5201..83b4b0b0 100644 --- a/packages/mpx-cube-ui/__tests__/components/checkbox-modal/__snapshots__/checkbox-modal.spec.js.snap +++ b/packages/mpx-cube-ui/__tests__/components/checkbox-modal/__snapshots__/checkbox-modal.spec.js.snap @@ -1,15 +1,15 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`component checkbox-modal unit test render check render 1`] = `"苹果desc橘子desc香蕉desc桃子desc确定"`; +exports[`component checkbox-modal unit test render check render 1`] = `"苹果desc橘子desc香蕉desc桃子desc确定"`; -exports[`component checkbox-modal unit test render check render 2`] = `"苹果desc橘子desc香蕉desc桃子desc确定"`; +exports[`component checkbox-modal unit test render check render 2`] = `"苹果desc橘子desc香蕉desc桃子desc确定"`; -exports[`component checkbox-modal unit test render check render 3`] = `"苹果desc橘子desc香蕉desc桃子desc确定"`; +exports[`component checkbox-modal unit test render check render 3`] = `"苹果desc橘子desc香蕉desc桃子desc确定"`; -exports[`component checkbox-modal unit test render check render 4`] = `"苹果desc橘子desc香蕉desc桃子desc确定"`; +exports[`component checkbox-modal unit test render check render 4`] = `"苹果desc橘子desc香蕉desc桃子desc确定"`; -exports[`component checkbox-modal unit test render check render 5`] = `"苹果desc橘子desc香蕉desc桃子desc确定"`; +exports[`component checkbox-modal unit test render check render 5`] = `"苹果desc橘子desc香蕉desc桃子desc确定"`; -exports[`component checkbox-modal unit test render check render 6`] = `"苹果desc橘子desc香蕉desc桃子desc确定"`; +exports[`component checkbox-modal unit test render check render 6`] = `"苹果desc橘子desc香蕉desc桃子desc确定"`; -exports[`component checkbox-modal unit test slot check render correct 1`] = `"
确定
"`; +exports[`component checkbox-modal unit test slot check render correct 1`] = `"
确定
"`; diff --git a/packages/mpx-cube-ui/__tests__/components/checkbox-modal/checkbox-modal.spec.js b/packages/mpx-cube-ui/__tests__/components/checkbox-modal/checkbox-modal.spec.js index a7b6d151..61782b9d 100644 --- a/packages/mpx-cube-ui/__tests__/components/checkbox-modal/checkbox-modal.spec.js +++ b/packages/mpx-cube-ui/__tests__/components/checkbox-modal/checkbox-modal.spec.js @@ -133,7 +133,7 @@ describe('component checkbox-modal unit test', function() { const popup = component.querySelector('cube-modal').querySelector('cube-popup') const showDom = popup.querySelector('.cube-popup').dom const maskDom = popup.querySelector('.cube-popup-mask') - maskDom.dispatchEvent('touchend') + maskDom.dispatchEvent('tap') await simulate.sleep(10) expect(showDom.className).not.toMatch('show') }) @@ -241,7 +241,7 @@ describe('component checkbox-modal unit test', function() { component.addEventListener('close', maskFn) const popup = component.querySelector('cube-modal').querySelector('cube-popup') const maskDom = popup.querySelector('.cube-popup-mask') - maskDom.dispatchEvent('touchend') + maskDom.dispatchEvent('tap') await simulate.sleep(10) expect(maskFn).toHaveBeenCalled() }) diff --git a/packages/mpx-cube-ui/__tests__/components/date-picker-modal/__snapshots__/date-picker-modal.spec.js.snap b/packages/mpx-cube-ui/__tests__/components/date-picker-modal/__snapshots__/date-picker-modal.spec.js.snap index 227962f6..2c75ba20 100644 --- a/packages/mpx-cube-ui/__tests__/components/date-picker-modal/__snapshots__/date-picker-modal.spec.js.snap +++ b/packages/mpx-cube-ui/__tests__/components/date-picker-modal/__snapshots__/date-picker-modal.spec.js.snap @@ -1,7 +1,7 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`component picker unit test base defaul props check matchSnapshot 1`] = `"日期选择器2010201120122013201420152016201720182019202020212022891011128910111213141516171819202122232425262728293031确定"`; +exports[`component picker unit test base defaul props check matchSnapshot 1`] = `"日期选择器2010201120122013201420152016201720182019202020212022891011128910111213141516171819202122232425262728293031确定"`; -exports[`component picker unit test base set props check matchSnapshot 1`] = `"这是取消文案日期选择器10年11年12年13年14年15年16年17年18年19年20年21年22年08月09月10月11月12月"`; +exports[`component picker unit test base set props check matchSnapshot 1`] = `"这是取消文案日期选择器10年11年12年13年14年15年16年17年18年19年20年21年22年08月09月10月11月12月"`; -exports[`component picker unit test slot check matchSnapshot 1`] = `"
head20102011201220132014201520162017201820192020202120222023202412345678910111212345678910111213141516171819202122232425262728确定footer
"`; +exports[`component picker unit test slot check matchSnapshot 1`] = `"
head20102011201220132014201520162017201820192020202120222023202412345678910111212345678910111213141516171819202122232425262728确定footer
"`; diff --git a/packages/mpx-cube-ui/__tests__/components/date-picker-popup/__snapshots__/date-picker-popup.spec.js.snap b/packages/mpx-cube-ui/__tests__/components/date-picker-popup/__snapshots__/date-picker-popup.spec.js.snap index cda51cd4..5abf83e4 100644 --- a/packages/mpx-cube-ui/__tests__/components/date-picker-popup/__snapshots__/date-picker-popup.spec.js.snap +++ b/packages/mpx-cube-ui/__tests__/components/date-picker-popup/__snapshots__/date-picker-popup.spec.js.snap @@ -1,5 +1,5 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`component picker unit test base defaul props check matchSnapshot 1`] = `"取消日期选择器子标题确认2010201120122013201420152016201720182019202020212022891011128910111213141516171819202122232425262728293031"`; +exports[`component picker unit test base defaul props check matchSnapshot 1`] = `"取消日期选择器子标题确认2010201120122013201420152016201720182019202020212022891011128910111213141516171819202122232425262728293031"`; -exports[`component picker unit test base set props check matchSnapshot 1`] = `"这是取消文案日期选择器子标题这是确认文案10年11年12年13年14年15年16年17年18年19年20年21年22年08月09月10月11月12月第 8 日第 9 日第 10 日第 11 日第 12 日第 13 日第 14 日第 15 日第 16 日第 17 日第 18 日第 19 日第 20 日第 21 日第 22 日第 23 日第 24 日第 25 日第 26 日第 27 日第 28 日第 29 日第 30 日第 31 日"`; +exports[`component picker unit test base set props check matchSnapshot 1`] = `"这是取消文案日期选择器子标题这是确认文案10年11年12年13年14年15年16年17年18年19年20年21年22年08月09月10月11月12月第 8 日第 9 日第 10 日第 11 日第 12 日第 13 日第 14 日第 15 日第 16 日第 17 日第 18 日第 19 日第 20 日第 21 日第 22 日第 23 日第 24 日第 25 日第 26 日第 27 日第 28 日第 29 日第 30 日第 31 日"`; diff --git a/packages/mpx-cube-ui/__tests__/components/dialog/__snapshots__/dialog.spec.js.snap b/packages/mpx-cube-ui/__tests__/components/dialog/__snapshots__/dialog.spec.js.snap index f5d826ee..edda9e97 100644 --- a/packages/mpx-cube-ui/__tests__/components/dialog/__snapshots__/dialog.spec.js.snap +++ b/packages/mpx-cube-ui/__tests__/components/dialog/__snapshots__/dialog.spec.js.snap @@ -1,17 +1,17 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`component dialog unit test base props check matchSnapshot 1`] = `"我是标题正文行文符合话术规范,表意清晰可多行展示,单行居中对齐,多行居左取消按钮确认按钮"`; +exports[`component dialog unit test base props check matchSnapshot 1`] = `"我是标题正文行文符合话术规范,表意清晰可多行展示,单行居中对齐,多行居左取消按钮确认按钮"`; -exports[`component dialog unit test props :headIcon="url" check matchSnapshot 1`] = `"https://dpubstatic.udache.com/static/dpubimg/5b36f778-2f98-4c0e-ac31-d2d7ee6d29a3.png我是标题正文行文符合话术规范,表意清晰可多行展示,单行居中对齐,多行居左取消按钮确认按钮"`; +exports[`component dialog unit test props :headIcon="url" check matchSnapshot 1`] = `"https://dpubstatic.udache.com/static/dpubimg/5b36f778-2f98-4c0e-ac31-d2d7ee6d29a3.png我是标题正文行文符合话术规范,表意清晰可多行展示,单行居中对齐,多行居左取消按钮确认按钮"`; -exports[`component dialog unit test props :icon="hot" check matchSnapshot 1`] = `"我是标题正文行文符合话术规范,表意清晰可多行展示,单行居中对齐,多行居左取消按钮确认按钮"`; +exports[`component dialog unit test props :icon="hot" check matchSnapshot 1`] = `"我是标题正文行文符合话术规范,表意清晰可多行展示,单行居中对齐,多行居左取消按钮确认按钮"`; -exports[`component dialog unit test props :showClose="true" check matchSnapshot 1`] = `"我是标题正文行文符合话术规范,表意清晰可多行展示,单行居中对齐,多行居左取消按钮确认按钮"`; +exports[`component dialog unit test props :showClose="true" check matchSnapshot 1`] = `"我是标题正文行文符合话术规范,表意清晰可多行展示,单行居中对齐,多行居左取消按钮确认按钮"`; -exports[`component dialog unit test props :type="alert" check matchSnapshot 1`] = `"我是标题正文行文符合话术规范,表意清晰可多行展示,单行居中对齐,多行居左确认按钮"`; +exports[`component dialog unit test props :type="alert" check matchSnapshot 1`] = `"我是标题正文行文符合话术规范,表意清晰可多行展示,单行居中对齐,多行居左确认按钮"`; -exports[`component dialog unit test props :type="confirm" check matchSnapshot 1`] = `"我是标题正文行文符合话术规范,表意清晰可多行展示,单行居中对齐,多行居左取消按钮确认按钮"`; +exports[`component dialog unit test props :type="confirm" check matchSnapshot 1`] = `"我是标题正文行文符合话术规范,表意清晰可多行展示,单行居中对齐,多行居左取消按钮确认按钮"`; -exports[`component dialog unit test should not trigger events when btn is disabled matchSnapshot 1`] = `"我是标题正文行文符合话术规范,表意清晰可多行展示,单行居中对齐,多行居左取消按钮确认按钮"`; +exports[`component dialog unit test should not trigger events when btn is disabled matchSnapshot 1`] = `"我是标题正文行文符合话术规范,表意清晰可多行展示,单行居中对齐,多行居左取消按钮确认按钮"`; -exports[`component dialog unit test slot check matchSnapshot 1`] = `"
我是标题正文行文符合话术规范,表意清晰可多行展示,单行居中对齐,多行居左确认按钮
"`; +exports[`component dialog unit test slot check matchSnapshot 1`] = `"
我是标题正文行文符合话术规范,表意清晰可多行展示,单行居中对齐,多行居左确认按钮
"`; diff --git a/packages/mpx-cube-ui/__tests__/components/modal/__snapshots__/modal.spec.js.snap b/packages/mpx-cube-ui/__tests__/components/modal/__snapshots__/modal.spec.js.snap index 904d1bc1..2998d262 100644 --- a/packages/mpx-cube-ui/__tests__/components/modal/__snapshots__/modal.spec.js.snap +++ b/packages/mpx-cube-ui/__tests__/components/modal/__snapshots__/modal.spec.js.snap @@ -1,27 +1,27 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[` 1`] = `"标题正文取消确定"`; +exports[` 1`] = `"标题正文取消确定"`; -exports[` 2`] = `"标题正文取消按钮确认按钮"`; +exports[` 2`] = `"标题正文取消按钮确认按钮"`; -exports[` 3`] = `"标题正文取消确定"`; +exports[` 3`] = `"标题正文取消确定"`; -exports[` 4`] = `"标题正文确认按钮"`; +exports[` 4`] = `"标题正文确认按钮"`; -exports[` 5`] = `"标题正文确认按钮"`; +exports[` 5`] = `"标题正文确认按钮"`; -exports[` 6`] = `"标题正文取消确定"`; +exports[` 6`] = `"标题正文取消确定"`; -exports[` 7`] = `"标题正文取消确定"`; +exports[` 7`] = `"标题正文取消确定"`; -exports[` 8`] = `"标题正文取消确定"`; +exports[` 8`] = `"标题正文取消确定"`; -exports[` 9`] = `"标题正文"`; +exports[` 9`] = `"标题正文"`; -exports[` 10`] = `"标题正文取消确定"`; +exports[` 10`] = `"标题正文取消确定"`; -exports[` 11`] = `"标题正文取消按钮确认按钮"`; +exports[` 11`] = `"标题正文取消按钮确认按钮"`; -exports[` 12`] = `"确认取消标题正文取消确定"`; +exports[` 12`] = `"确认取消标题正文取消确定"`; -exports[` 13`] = `"
我是slot header我是slot title我是slot content取消确定我是slot footer
"`; +exports[` 13`] = `"
我是slot header我是slot title我是slot content取消确定我是slot footer
"`; diff --git a/packages/mpx-cube-ui/__tests__/components/popup/__snapshots__/popup.spec.js.snap b/packages/mpx-cube-ui/__tests__/components/popup/__snapshots__/popup.spec.js.snap index e21057bc..8dd2056f 100644 --- a/packages/mpx-cube-ui/__tests__/components/popup/__snapshots__/popup.spec.js.snap +++ b/packages/mpx-cube-ui/__tests__/components/popup/__snapshots__/popup.spec.js.snap @@ -1,7 +1,7 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`component popup unit test base props check matchSnapshot 1`] = `"<i style=\\"color:#fc9153\\">Hello World</i>"`; +exports[`component popup unit test base props check matchSnapshot 1`] = `"<i style=\\"color:#fc9153\\">Hello World</i>"`; -exports[`component popup unit test event check matchSnapshot 1`] = `"<i style=\\"color:#fc9153\\">Hello World</i>"`; +exports[`component popup unit test event check matchSnapshot 1`] = `"<i style=\\"color:#fc9153\\">Hello World</i>"`; -exports[`component popup unit test slot check matchSnapshot 1`] = `"
"`; +exports[`component popup unit test slot check matchSnapshot 1`] = `"
"`; diff --git a/packages/mpx-cube-ui/__tests__/components/popup/popup.spec.js b/packages/mpx-cube-ui/__tests__/components/popup/popup.spec.js index d9b91537..0a814669 100644 --- a/packages/mpx-cube-ui/__tests__/components/popup/popup.spec.js +++ b/packages/mpx-cube-ui/__tests__/components/popup/popup.spec.js @@ -79,7 +79,7 @@ describe('component popup unit test', function() { test @@ -107,7 +107,7 @@ describe('component popup unit test', function() { const slotMaskDom = component.querySelector('.my-mask') expect(slotMaskDom).toBeTruthy() - slotMaskDom.dispatchEvent('touchend') + slotMaskDom.dispatchEvent('tap') await simulate.sleep(10) expect(onMaskClick).toHaveBeenCalled() @@ -132,7 +132,7 @@ describe('component popup unit test', function() { component.addEventListener('toggle', onToggleFn) const mask = component.querySelector('.cube-popup-mask') - mask.dispatchEvent('touchend') + mask.dispatchEvent('tap') await simulate.sleep(10) expect(component.instance.isVisible).toBe(false) diff --git a/packages/mpx-cube-ui/__tests__/components/radio-modal/__snapshots__/radio-modal.spec.js.snap b/packages/mpx-cube-ui/__tests__/components/radio-modal/__snapshots__/radio-modal.spec.js.snap index 212f42fd..df181709 100644 --- a/packages/mpx-cube-ui/__tests__/components/radio-modal/__snapshots__/radio-modal.spec.js.snap +++ b/packages/mpx-cube-ui/__tests__/components/radio-modal/__snapshots__/radio-modal.spec.js.snap @@ -1,13 +1,13 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`component checkbox-modal unit test render check render 1`] = `"text1text2text3"`; +exports[`component checkbox-modal unit test render check render 1`] = `"text1text2text3"`; -exports[`component checkbox-modal unit test render check render 2`] = `"text1text2text3"`; +exports[`component checkbox-modal unit test render check render 2`] = `"text1text2text3"`; -exports[`component checkbox-modal unit test render check render 3`] = `"text1text2text3"`; +exports[`component checkbox-modal unit test render check render 3`] = `"text1text2text3"`; -exports[`component checkbox-modal unit test render check render 4`] = `"text1text2text3"`; +exports[`component checkbox-modal unit test render check render 4`] = `"text1text2text3"`; -exports[`component checkbox-modal unit test render check render 5`] = `"text1text2text3"`; +exports[`component checkbox-modal unit test render check render 5`] = `"text1text2text3"`; -exports[`component checkbox-modal unit test slot check render correct 1`] = `"
subtitle-slot
"`; +exports[`component checkbox-modal unit test slot check render correct 1`] = `"
subtitle-slot
"`; diff --git a/packages/mpx-cube-ui/__tests__/components/radio-modal/radio-modal.spec.js b/packages/mpx-cube-ui/__tests__/components/radio-modal/radio-modal.spec.js index df0d0fca..77861489 100644 --- a/packages/mpx-cube-ui/__tests__/components/radio-modal/radio-modal.spec.js +++ b/packages/mpx-cube-ui/__tests__/components/radio-modal/radio-modal.spec.js @@ -119,7 +119,7 @@ describe('component checkbox-modal unit test', function () { const popup = component.querySelector('cube-modal').querySelector('cube-popup') const showDom = popup.querySelector('.cube-popup').dom const maskDom = popup.querySelector('.cube-popup-mask') - maskDom.dispatchEvent('touchend') + maskDom.dispatchEvent('tap') await simulate.sleep(10) expect(showDom.className).not.toMatch('show') }) @@ -227,7 +227,7 @@ describe('component checkbox-modal unit test', function () { component.addEventListener('close', maskFn) const popup = component.querySelector('cube-modal').querySelector('cube-popup') const maskDom = popup.querySelector('.cube-popup-mask') - maskDom.dispatchEvent('touchend') + maskDom.dispatchEvent('tap') await simulate.sleep(10) expect(maskFn).toHaveBeenCalled() }) diff --git a/packages/mpx-cube-ui/__tests__/components/slider/__snapshots__/slider.spec.js.snap b/packages/mpx-cube-ui/__tests__/components/slider/__snapshots__/slider.spec.js.snap new file mode 100644 index 00000000..423a1365 --- /dev/null +++ b/packages/mpx-cube-ui/__tests__/components/slider/__snapshots__/slider.spec.js.snap @@ -0,0 +1,17 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`component slider unit test event check change event 1`] = `""`; + +exports[`component slider unit test event check changing event 1`] = `""`; + +exports[`component slider unit test event check disabled event check 1`] = `""`; + +exports[`component slider unit test props check props 1`] = `"50"`; + +exports[`component slider unit test render check render 1`] = `""`; + +exports[`component slider unit test render check render 2`] = `"0"`; + +exports[`component slider unit test render check render 3`] = `""`; + +exports[`component slider unit test slot check matchSnapshot 1`] = `"
123
"`; diff --git a/packages/mpx-cube-ui/__tests__/components/slider/slider.spec.js b/packages/mpx-cube-ui/__tests__/components/slider/slider.spec.js new file mode 100644 index 00000000..cb9ffce9 --- /dev/null +++ b/packages/mpx-cube-ui/__tests__/components/slider/slider.spec.js @@ -0,0 +1,169 @@ +const simulate = require('@mpxjs/miniprogram-simulate') + +describe('component slider unit test', function () { + const componentId = simulate.loadMpx('src/components/slider/index.mpx') + + function newComponent(props) { + const component = simulate.render(componentId, props) + const parent = document.createElement('parent') + component.attach(parent) // 会触发 attach 生命周期 + return component + } + + async function snapTest(props) { + const component = newComponent(props) + await simulate.sleep(10) + expect(component.dom.innerHTML).toMatchSnapshot() + } + + describe('render check', () => { + it('render', async () => { + await snapTest() + await snapTest({ + showValue: true + }) + await snapTest({ + customContent: true + }) + }) + }) + + describe('event check', () => { + it('change event', async () => { + const component = newComponent() + expect(component.dom.innerHTML).toMatchSnapshot() + const change = jest.fn() + // 触发组件树中的节点自定义事件 + component.addEventListener('change', change) + const tabArea = component.querySelector('.cube-slider-tab-area') + tabArea.dispatchEvent('tap') + await simulate.sleep(10) + expect(change).toHaveBeenCalled() + }) + + it('changing event', async () => { + const component = newComponent() + expect(component.dom.innerHTML).toMatchSnapshot() + const change = jest.fn() + const changing = jest.fn() + // 触发组件树中的节点自定义事件 + component.addEventListener('change', change) + component.addEventListener('changing', changing) + const sliderHandle = component.querySelector('.cube-slider-handle') + sliderHandle.dispatchEvent('touchstart') + sliderHandle.dispatchEvent('touchmove') + sliderHandle.dispatchEvent('touchend') + await simulate.sleep(10) + expect(change).toHaveBeenCalled() + expect(changing).toHaveBeenCalled() + }) + + // disabled情况下不触发事件 + it('disabled event check', async () => { + const component = newComponent({ disabled: true }) + expect(component.dom.innerHTML).toMatchSnapshot() + const change = jest.fn() + const change2 = jest.fn() + const changing = jest.fn() + // 触发组件树中的节点自定义事件 + component.addEventListener('change', change) + component.addEventListener('changing', changing) + const tabArea = component.querySelector('.cube-slider-tab-area') + const sliderHandle = component.querySelector('.cube-slider-handle') + tabArea.dispatchEvent('tap') + sliderHandle.dispatchEvent('touchstart') + sliderHandle.dispatchEvent('touchmove') + sliderHandle.dispatchEvent('touchend') + await simulate.sleep(10) + expect(change).not.toHaveBeenCalled() + expect(change2).not.toHaveBeenCalled() + expect(changing).not.toHaveBeenCalled() + }) + }) + + describe('props check', () => { + it('prop default', async () => { + const DEFAULT_PROPS = { + min: 0, + max: 100, + step: 1, + disabled: false, + value: 0, + backgroundColor: '', + activeColor: '', + 'block-size': 28, + 'block-color': '', + showValue: false, + customContent: false + } + const component = newComponent() + const data = component.instance.data + expect(data.min).toBe(DEFAULT_PROPS.min) + expect(data.max).toBe(DEFAULT_PROPS.max) + expect(data.step).toBe(DEFAULT_PROPS.step) + expect(data.disabled).toBe(DEFAULT_PROPS.disabled) + expect(data.currentValue).toBe(DEFAULT_PROPS.value) + expect(data.backgroundColor).toBe(DEFAULT_PROPS.backgroundColor) + expect(data.activeColor).toBe(DEFAULT_PROPS.activeColor) + expect(data['block-size']).toBe(DEFAULT_PROPS['block-size']) + expect(data['block-color']).toBe(DEFAULT_PROPS['block-color']) + expect(data.showValue).toBe(DEFAULT_PROPS.showValue) + expect(data.customContent).toBe(DEFAULT_PROPS.customContent) + }) + + it('props', async () => { + // 中横线的props不支持(实际上没问题),暂时没测,比如'block-size'、'block-color' + const PROPS = { + min: 50, + max: 200, + step: 2, + disabled: true, + value: 50, + backgroundColor: '#fff', + activeColor: '#ff7e33', + showValue: true, + customContent: true + } + const component = newComponent(PROPS) + const data = component.instance.data + await simulate.sleep(10) + expect(component.dom.innerHTML).toMatchSnapshot() + expect(data.min).toBe(PROPS.min) + expect(data.max).toBe(PROPS.max) + expect(data.step).toBe(PROPS.step) + expect(data.disabled).toBe(PROPS.disabled) + expect(data.currentValue).toBe(PROPS.value) + expect(data.backgroundColor).toBe(PROPS.backgroundColor) + expect(data.activeColor).toBe(PROPS.activeColor) + expect(data.showValue).toBe(PROPS.showValue) + expect(data.customContent).toBe(PROPS.customContent) + }) + }) + + describe('slot check', () => { + const text = '123' + const component = simulate.render(simulate.load({ + usingComponents: { + 'cube-slider': componentId + }, + template: ` + + ${text} + + ` + })) + component.attach(document.createElement('parent')) + + it('matchSnapshot', () => { + expect(component.dom.innerHTML).toMatchSnapshot() + }) + + it('check render correct contents', () => { + const text = component.querySelector('.slider-thumb').dom.innerHTML + expect(text).toBe(text) + }) + }) +}) diff --git a/packages/mpx-cube-ui/__tests__/components/time-picker-modal/__snapshots__/time-picker-modal.spec.js.snap b/packages/mpx-cube-ui/__tests__/components/time-picker-modal/__snapshots__/time-picker-modal.spec.js.snap index 600d3fed..97d4ec28 100644 --- a/packages/mpx-cube-ui/__tests__/components/time-picker-modal/__snapshots__/time-picker-modal.spec.js.snap +++ b/packages/mpx-cube-ui/__tests__/components/time-picker-modal/__snapshots__/time-picker-modal.spec.js.snap @@ -1,13 +1,13 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`component picker unit test props:day check matchSnapshot 1`] = `"12月份11号12月份12号12月份13号12月份14号12点13点14点15点16点17点18点19点20点21点22点23点30分40分50分确定"`; +exports[`component picker unit test props:day check matchSnapshot 1`] = `"12月份11号12月份12号12月份13号12月份14号12点13点14点15点16点17点18点19点20点21点22点23点30分40分50分确定"`; -exports[`component picker unit test props:delay check matchSnapshot 1`] = `"12月11日12月12日12月13日12点13点14点15点16点17点18点19点20点21点22点23点30分40分50分确定"`; +exports[`component picker unit test props:delay check matchSnapshot 1`] = `"12月11日12月12日12月13日12点13点14点15点16点17点18点19点20点21点22点23点30分40分50分确定"`; -exports[`component picker unit test props:showNow check matchSnapshot 1`] = `"12月11日12月12日12月13日12点13点14点15点16点17点18点19点20点21点22点23点30分40分50分确定"`; +exports[`component picker unit test props:showNow check matchSnapshot 1`] = `"12月11日12月12日12月13日12点13点14点15点16点17点18点19点20点21点22点23点30分40分50分确定"`; -exports[`component picker unit test base props check matchSnapshot 1`] = `"我是标题内容12月11日12月12日12月13日12点13点14点15点16点17点18点19点20点21点22点23点30分40分50分确定"`; +exports[`component picker unit test base props check matchSnapshot 1`] = `"我是标题内容12月11日12月12日12月13日12点13点14点15点16点17点18点19点20点21点22点23点30分40分50分确定"`; -exports[`component picker unit test props: min check matchSnapshot 1`] = `"12月11日12月12日12月13日12点13点14点15点16点17点18点19点20点21点22点23点30分40分50分确定"`; +exports[`component picker unit test props: min check matchSnapshot 1`] = `"12月11日12月12日12月13日12点13点14点15点16点17点18点19点20点21点22点23点30分40分50分确定"`; -exports[`component picker unit test props:minuteStep check matchSnapshot 1`] = `"12月11日12月12日12月13日12点13点14点15点16点17点18点19点20点21点22点23点35分40分45分50分55分确定"`; +exports[`component picker unit test props:minuteStep check matchSnapshot 1`] = `"12月11日12月12日12月13日12点13点14点15点16点17点18点19点20点21点22点23点35分40分45分50分55分确定"`; diff --git a/packages/mpx-cube-ui/__tests__/components/time-picker-popup/__snapshots__/time-picker-popup.spec.js.snap b/packages/mpx-cube-ui/__tests__/components/time-picker-popup/__snapshots__/time-picker-popup.spec.js.snap index c994b048..54d792e7 100644 --- a/packages/mpx-cube-ui/__tests__/components/time-picker-popup/__snapshots__/time-picker-popup.spec.js.snap +++ b/packages/mpx-cube-ui/__tests__/components/time-picker-popup/__snapshots__/time-picker-popup.spec.js.snap @@ -1,15 +1,15 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`component picker unit test props:day check matchSnapshot 1`] = `"取消确认12月份11号12月份12号12月份13号12月份14号12点13点14点15点16点17点18点19点20点21点22点23点30分40分50分"`; +exports[`component picker unit test props:day check matchSnapshot 1`] = `"取消确认12月份11号12月份12号12月份13号12月份14号12点13点14点15点16点17点18点19点20点21点22点23点30分40分50分"`; -exports[`component picker unit test props:delay check matchSnapshot 1`] = `"取消确认12月11日12月12日12月13日12点13点14点15点16点17点18点19点20点21点22点23点00分10分20分30分40分50分"`; +exports[`component picker unit test props:delay check matchSnapshot 1`] = `"取消确认12月11日12月12日12月13日12点13点14点15点16点17点18点19点20点21点22点23点00分10分20分30分40分50分"`; -exports[`component picker unit test props:showNow check matchSnapshot 1`] = `"取消确认12月11日12月12日12月13日12点13点14点15点16点17点18点19点20点21点22点23点00分10分20分30分40分50分"`; +exports[`component picker unit test props:showNow check matchSnapshot 1`] = `"取消确认12月11日12月12日12月13日12点13点14点15点16点17点18点19点20点21点22点23点00分10分20分30分40分50分"`; -exports[`component picker unit test base props check matchSnapshot 1`] = `"取消文案我是标题副标题确认文案12月11日12月12日12月13日12点13点14点15点16点17点18点19点20点21点22点23点30分40分50分"`; +exports[`component picker unit test base props check matchSnapshot 1`] = `"取消文案我是标题副标题确认文案12月11日12月12日12月13日12点13点14点15点16点17点18点19点20点21点22点23点30分40分50分"`; -exports[`component picker unit test props: max check matchSnapshot 1`] = `"取消确认12月7日12月8日12月9日12月10日12月11日12点13点14点15点16点17点18点19点20点21点22点23点30分40分50分"`; +exports[`component picker unit test props: max check matchSnapshot 1`] = `"取消确认12月7日12月8日12月9日12月10日12月11日12点13点14点15点16点17点18点19点20点21点22点23点30分40分50分"`; -exports[`component picker unit test props: min check matchSnapshot 1`] = `"取消确认12月11日12月12日12月13日12点13点14点15点16点17点18点19点20点21点22点23点30分40分50分"`; +exports[`component picker unit test props: min check matchSnapshot 1`] = `"取消确认12月11日12月12日12月13日12点13点14点15点16点17点18点19点20点21点22点23点30分40分50分"`; -exports[`component picker unit test props:minuteStep check matchSnapshot 1`] = `"取消确认12月11日12月12日12月13日12点13点14点15点16点17点18点19点20点21点22点23点35分40分45分50分55分"`; +exports[`component picker unit test props:minuteStep check matchSnapshot 1`] = `"取消确认12月11日12月12日12月13日12点13点14点15点16点17点18点19点20点21点22点23点35分40分45分50分55分"`; diff --git a/packages/mpx-cube-ui/__tests__/components/toast/__snapshots__/toast.spec.js.snap b/packages/mpx-cube-ui/__tests__/components/toast/__snapshots__/toast.spec.js.snap index b0d1c8de..a4040aad 100644 --- a/packages/mpx-cube-ui/__tests__/components/toast/__snapshots__/toast.spec.js.snap +++ b/packages/mpx-cube-ui/__tests__/components/toast/__snapshots__/toast.spec.js.snap @@ -1,7 +1,7 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`component toast unit test base props check matchSnapshot 1`] = `"hello toast"`; +exports[`component toast unit test base props check matchSnapshot 1`] = `"hello toast"`; -exports[`component toast unit test event check matchSnapshot 1`] = `"hello toast"`; +exports[`component toast unit test event check matchSnapshot 1`] = `"hello toast"`; -exports[`component toast unit test slot check matchSnapshot 1`] = `"
https://dpubstatic.udache.com/static/dpubimg/c40384a2-25ef-4781-8e08-44447823d861.png请输入乘车人手机号
"`; +exports[`component toast unit test slot check matchSnapshot 1`] = `"
https://dpubstatic.udache.com/static/dpubimg/c40384a2-25ef-4781-8e08-44447823d861.png请输入乘车人手机号
"`; diff --git a/packages/mpx-cube-ui/__tests__/components/toast/toast.spec.js b/packages/mpx-cube-ui/__tests__/components/toast/toast.spec.js index b3f5121f..7111d81c 100644 --- a/packages/mpx-cube-ui/__tests__/components/toast/toast.spec.js +++ b/packages/mpx-cube-ui/__tests__/components/toast/toast.spec.js @@ -65,7 +65,7 @@ describe('component toast unit test', function() { component.addEventListener('toggle', onToggleFn) expect(component.instance.data.isVisible).toBe(true) const mask = component.querySelector('.cube-toast').querySelector('.cube-popup-mask') - mask.dispatchEvent('touchend') + mask.dispatchEvent('tap') await simulate.sleep(5) expect(component.instance.data.isVisible).toBe(false) diff --git a/packages/mpx-cube-ui/lib/common/stylus/theme/components/slider.styl b/packages/mpx-cube-ui/lib/common/stylus/theme/components/slider.styl new file mode 100644 index 00000000..195363a0 --- /dev/null +++ b/packages/mpx-cube-ui/lib/common/stylus/theme/components/slider.styl @@ -0,0 +1,5 @@ +// @type slider +$slider-active-color := $var(color-primary) // 已选择的颜色 +$slider-background-color := #e9e9e9 // 背景条的颜色 +$slider-block-color := #ffffff // 滑块的颜色 +$slider-track-height := 2px // 轨道高度 \ No newline at end of file diff --git a/packages/mpx-cube-ui/lib/components/button/button.js b/packages/mpx-cube-ui/lib/components/button/button.js index e720b694..92acd2bc 100644 --- a/packages/mpx-cube-ui/lib/components/button/button.js +++ b/packages/mpx-cube-ui/lib/components/button/button.js @@ -221,6 +221,13 @@ createComponent({ return res; } return {}; + }, + hiddenStyle() { + // RN 端使用 opacity 控制显示隐藏 + if (__mpx_mode__ === 'ios' || __mpx_mode__ === 'android' || __mpx_mode__ === 'harmony') { + return this.loading ? { opacity: 0 } : null; + } + return null; } }, methods: { diff --git a/packages/mpx-cube-ui/lib/components/button/index.mpx b/packages/mpx-cube-ui/lib/components/button/index.mpx index 3b854833..bd3de1d8 100644 --- a/packages/mpx-cube-ui/lib/components/button/index.mpx +++ b/packages/mpx-cube-ui/lib/components/button/index.mpx @@ -35,11 +35,12 @@ size="{{ iconSize }}" wx:if="{{ icon }}" type="{{ icon }}" + wx:style="{{ hiddenStyle }}" /> - + - + {{tip}} diff --git a/packages/mpx-cube-ui/lib/components/button/loading/css.rn.styl b/packages/mpx-cube-ui/lib/components/button/loading/css.rn.styl index 36971f9f..b5c6c2ba 100644 --- a/packages/mpx-cube-ui/lib/components/button/loading/css.rn.styl +++ b/packages/mpx-cube-ui/lib/components/button/loading/css.rn.styl @@ -34,7 +34,7 @@ left (- $btn-loading-dot-spacing-size - $btn-loading-dot-size) .cube-loading-origin-after right (- $btn-loading-dot-spacing-size - $btn-loading-dot-size) - animation-delay ($btn-loading-duration / 2) + // animation-delay ($btn-loading-duration / 2) .cube-loading-middle-dot width 100% diff --git a/packages/mpx-cube-ui/lib/components/button/loading/index.mpx b/packages/mpx-cube-ui/lib/components/button/loading/index.mpx index f63196bb..f9a10f24 100644 --- a/packages/mpx-cube-ui/lib/components/button/loading/index.mpx +++ b/packages/mpx-cube-ui/lib/components/button/loading/index.mpx @@ -1,11 +1,11 @@ diff --git a/packages/mpx-cube-ui/lib/components/button/loading/loading.js b/packages/mpx-cube-ui/lib/components/button/loading/loading.js index 8b8aea71..65349f67 100644 --- a/packages/mpx-cube-ui/lib/components/button/loading/loading.js +++ b/packages/mpx-cube-ui/lib/components/button/loading/loading.js @@ -1,2 +1,5 @@ -import { createComponent } from '../../../common/helper/create-component'; -createComponent({}); +import { createComponent } from '@mpxjs/core'; +import rnMixin from './rn-mixin'; +createComponent({ + mixins: [rnMixin] +}); diff --git a/packages/mpx-cube-ui/lib/components/button/loading/rn-mixin.js b/packages/mpx-cube-ui/lib/components/button/loading/rn-mixin.js new file mode 100644 index 00000000..ac36130a --- /dev/null +++ b/packages/mpx-cube-ui/lib/components/button/loading/rn-mixin.js @@ -0,0 +1,71 @@ +import mpx, { getMixin } from '@mpxjs/core'; +let mixin = {}; +if (__mpx_mode__ === 'ios' || __mpx_mode__ === 'android' || __mpx_mode__ === 'harmony') { + const DURATION = 2000; + const NORMAL_COLOR = '#ccc'; + const SECONDARY_COLOR = 'rgba(204, 204, 204, 0.4)'; + const ACTIVE_COLOR = '#fff'; + mixin = { + data: { + beforeAnim: {}, + middleAnim: {}, + afterAnim: {} + }, + lifetimes: { + ready() { + this.timer = null; + this.count = 0; + this.time = 0; + this.startAnim(); + }, + detached() { + if (this.timer) { + clearInterval(this.timer); + this.timer = null; + } + } + }, + methods: { + startAnim() { + if ((this.count - 1) % 3 === 0 || (this.count - 2) % 3 === 0) { + this.time = 500; + } + else if (this.count !== 0 && this.count % 3 === 0) { + this.time = 1000; + } + this.timer = setTimeout(() => { + if (this.count % 3 === 0) { + this.executeAnim('beforeAnim'); + } + else if ((this.count - 1) % 3 === 0) { + this.executeAnim('middleAnim'); + } + else if ((this.count - 2) % 3 === 0) { + this.executeAnim('afterAnim'); + } + this.startAnim(); + }, this.time); + }, + executeAnim(animName) { + this.count++; + this[animName] = {}; + this.$nextTick(() => { + this[animName] = this.createDotAnimation(); + }); + }, + createDotAnimation() { + const duration = DURATION / 4; + const animation = mpx.createAnimation({ + duration: DURATION, + timingFunction: 'linear' + }); + animation.scale(1).backgroundColor(NORMAL_COLOR).step({ duration }); + animation.scale(1.3).backgroundColor(SECONDARY_COLOR).step({ duration }); + animation.scale(1).backgroundColor(ACTIVE_COLOR).step({ duration }); + animation.scale(1).backgroundColor(NORMAL_COLOR).step({ duration }); + return animation.export(); + } + } + }; +} +export default getMixin(mixin); diff --git a/packages/mpx-cube-ui/lib/components/modal/css.rn.styl b/packages/mpx-cube-ui/lib/components/modal/css.rn.styl index 5872f931..ddd78977 100644 --- a/packages/mpx-cube-ui/lib/components/modal/css.rn.styl +++ b/packages/mpx-cube-ui/lib/components/modal/css.rn.styl @@ -73,3 +73,16 @@ .cube-modal-footer padding-all($var(modal-footer-padding-top), $var(modal-footer-padding-right), $var(modal-footer-padding-bottom), $var(modal-footer-padding-left)) safe-area-mixin-extra(padding-bottom, bottom, $var(modal-footer-safe-padding), true) + +.cube-modal-line + position: absolute + top: 50% + left: 50% + transform: translate(-50%, -50%), rotate(45deg), scale(0.8) + background-color: $var(color-dark-grey) +.cube-modal-line-horizontal + width $var(font-size-lg) + height: 2px +.cube-modal-line-vertical + width: 2px + height $var(font-size-lg) diff --git a/packages/mpx-cube-ui/lib/components/modal/index.mpx b/packages/mpx-cube-ui/lib/components/modal/index.mpx index 506e4a51..0ef80800 100644 --- a/packages/mpx-cube-ui/lib/components/modal/index.mpx +++ b/packages/mpx-cube-ui/lib/components/modal/index.mpx @@ -34,6 +34,10 @@ bind:tap="onClose" > + + + + diff --git a/packages/mpx-cube-ui/lib/components/popup/css.styl b/packages/mpx-cube-ui/lib/components/popup/css.styl index 005c50a4..21ed5d8b 100644 --- a/packages/mpx-cube-ui/lib/components/popup/css.styl +++ b/packages/mpx-cube-ui/lib/components/popup/css.styl @@ -10,6 +10,7 @@ bottom 0 z-index $var(popup-z-index) display flex + pointer-events: none &.cube-popup-top align-items start .cube-popup-content @@ -33,8 +34,6 @@ position relative z-index 999 box-sizing border-box -.cube-popup-remove-touch - pointer-events: none .cube-popup_mask pointer-events: auto &.cube-popup_mask_fade_transition diff --git a/packages/mpx-cube-ui/lib/components/popup/index.mpx b/packages/mpx-cube-ui/lib/components/popup/index.mpx index 33109faf..9ad23fa8 100644 --- a/packages/mpx-cube-ui/lib/components/popup/index.mpx +++ b/packages/mpx-cube-ui/lib/components/popup/index.mpx @@ -5,11 +5,16 @@ wx:class="{{ [themeType ? 'cube-popup cube-popup-'+themeType : 'cube-popup', rootClass, visibleClass] }}" wx:style="{{ popupStyle }}" > - + - + @@ -18,21 +23,17 @@ + bindtouchmove@_web="preventTouchMove" + disable-scroll@_ali="{{true}}" + bindtap="onMaskClick"> @@ -40,7 +41,7 @@ class="cube-popup-content {{ transitionClass }}" wx:style="{{styleConfig.content}}" bindtouchmove="preventTouchMove" - bindanimationend@_wx|_ali|_web="contentHideAnimationend"> + bindanimationend@_web="contentHideAnimationend"> diff --git a/packages/mpx-cube-ui/lib/components/popup/rn-mixin.js b/packages/mpx-cube-ui/lib/components/popup/rn-mixin.js index 21ab0046..6b04b8d6 100644 --- a/packages/mpx-cube-ui/lib/components/popup/rn-mixin.js +++ b/packages/mpx-cube-ui/lib/components/popup/rn-mixin.js @@ -125,7 +125,14 @@ if (__mpx_mode__ === 'ios' || __mpx_mode__ === 'android' || __mpx_mode__ === 'ha return new Promise((resolve) => { this.$refs['popup-content'].boundingClientRect((res) => { if (res) { - this.contentRect = res; + const keys = Object.keys(res); + const contentRect = this.contentRect; + for (const key in keys) { + if (res[key] !== contentRect[key]) { + this.contentRect = res; + break; + } + } } else { this.boundingClientRectFaill = this.boundingClientRectFaill || 0; diff --git a/packages/mpx-cube-ui/lib/components/slider/css.rn.styl b/packages/mpx-cube-ui/lib/components/slider/css.rn.styl new file mode 100644 index 00000000..b85b281a --- /dev/null +++ b/packages/mpx-cube-ui/lib/components/slider/css.rn.styl @@ -0,0 +1,50 @@ +@require "../../common/stylus/variable.rn.styl" +@require "../../common/stylus/theme/components/slider.styl" + +.cube-slider + position: relative + display: flex + align-items: center + +.cube-slider-tab-area + flex: 1 0 auto + display: flex + align-items: center + min-height: $var(slider-track-height) + +.cube-slider-handle + position: absolute + transform: translateX(-50%) + z-index: 1 + +.cube-slider-thumb + background-color: $var(slider-block-color) + border-radius: 100% + box-shadow: 0 0 4px rgba(0, 0, 0, 0.2) + +.cube-slider-thumb-custom + position: relative + +.cube-slider-track + position: absolute + left: 0 + width: 100% + height: $var(slider-track-height) + background-color: $var(slider-background-color) + border-radius: ($slider-track-height / 2) + +.cube-slider-step + height: 100% + background-color: $var(slider-active-color) + border-radius: ($slider-track-height / 2) + +.cube-slider-value + position relative + z-index: 1 + color: #666 + width: 30px + overflow: visible + margin-left: 20px + margin-right: 10px + pointer-events: none + text-align: center \ No newline at end of file diff --git a/packages/mpx-cube-ui/lib/components/slider/css.styl b/packages/mpx-cube-ui/lib/components/slider/css.styl new file mode 100644 index 00000000..77887c3e --- /dev/null +++ b/packages/mpx-cube-ui/lib/components/slider/css.styl @@ -0,0 +1,50 @@ +@require "../../common/stylus/variable.styl" +@require "../../common/stylus/theme/components/slider.styl" + +.cube-slider + position: relative + display: flex + align-items: center + + .cube-slider-tab-area + position: relative + flex: 1 0 auto + display: flex + align-items: center + min-height: $var(slider-track-height) + + .cube-slider-handle + position: absolute + transform: translateX(-50%) + z-index: 1 + + .cube-slider-thumb + background-color: $var(slider-block-color) + border-radius: 100% + box-shadow: 0 0 4px rgba(0, 0, 0, 0.2) + .cube-slider-thumb-custom + position: relative + + .cube-slider-track + position: absolute + left: 0 + width: 100% + height: $var(slider-track-height) + background-color: $var(slider-background-color) + border-radius: ($slider-track-height / 2) + + .cube-slider-step + height: 100% + background-color: $var(slider-active-color) + border-radius: ($slider-track-height / 2) + + .cube-slider-value + position relative + z-index: 1 + color: #666 + width: 30px + overflow: visible + padding: 0 10px 0 20px + pointer-events: none + text-align: center + diff --git a/packages/mpx-cube-ui/lib/components/slider/index.mpx b/packages/mpx-cube-ui/lib/components/slider/index.mpx new file mode 100644 index 00000000..16540080 --- /dev/null +++ b/packages/mpx-cube-ui/lib/components/slider/index.mpx @@ -0,0 +1,61 @@ + + + + + + + + + \ No newline at end of file diff --git a/packages/mpx-cube-ui/lib/components/slider/slider.js b/packages/mpx-cube-ui/lib/components/slider/slider.js new file mode 100644 index 00000000..0064509b --- /dev/null +++ b/packages/mpx-cube-ui/lib/components/slider/slider.js @@ -0,0 +1,255 @@ +import { MOUNTED } from '@mpxjs/core'; +import { createComponent } from '../../common/helper/create-component'; +const EVENT_CHANGE = 'change'; // 完成一次拖动后触发的事件 +const EVENT_CHANGING = 'changing'; // 拖动过程中触发的事件 +createComponent({ + properties: { + /** + * @description 最小值 + */ + min: { + type: Number, + value: 0 + }, + /** + * @description 最大值 + */ + max: { + type: Number, + value: 100 + }, + /** + * @description 步长,取值必须大于 0,并且可被(max - min)整除 + */ + step: { + type: Number, + value: 1 + }, + /** + * @description 是否禁用 + */ + disabled: { + type: Boolean, + value: false + }, + /** + * @description 当前取值 + */ + value: { + type: Number, + value: 0 + }, + /** + * @description 背景条的颜色(请使用 backgroundColor) + */ + color: String, + /** + * @description 已选择的颜色(请使用 activeColor) + */ + 'selected-color': String, + /** + * @description 已选择的颜色 + */ + activeColor: String, + /** + * @description 背景条的颜色 + */ + backgroundColor: String, + /** + * @description 滑块的大小,取值范围为 12 - 28 + */ + 'block-size': { + type: Number, + value: 28 + }, + /** + * @description 滑块的颜色 + */ + 'block-color': String, + /** + * @description 是否显示当前 value + */ + 'show-value': { + type: Boolean, + value: false + }, + /** + * @description 是否显示当前 value + */ + showValue: { + type: Boolean, + value: false + }, + /** + * @description customContent + */ + customContent: { + type: Boolean, + value: false + } + }, + data: { + currentValue: 0, + percentage: 0, + startDragRect: null + }, + watch: { + value: { + handler(newVal) { + const val = Math.max(this.min, Math.min(this.max, newVal)); + if (newVal === this.currentValue && newVal === val) { + return; + } + const percentage = (val - this.min) / (this.max - this.min); + this.constrainValue(percentage); + }, + immediate: true + } + }, + [MOUNTED]() { + this.getRect().then(res => { + this.startDragRect = res; + }); + }, + computed: { + sliderClass() { + return { + 'cube-slider': true, + [`cube-slider-${this.themeType}`]: this.themeType + }; + }, + _blockSize() { + const blockSize = this['block-size'] || this.blockSize || 28; + return Math.max(12, Math.min(blockSize, 28)); + }, + showValueLable() { + return this['show-value'] || this.showValue; + }, + containerStyle() { + return { + marginLeft: `${this._blockSize / 2 + 4}px`, + marginRight: `${this._blockSize / 2 + 4}px` + }; + }, + tabAreaStyle() { + const minH = Math.max(12, this._blockSize) / 2; + return { + paddingTop: `${minH}px`, + paddingBottom: `${minH}px` + }; + }, + handleStyle() { + return { + left: `${this.percentage * 100}%` + }; + }, + thumbStyle() { + const style = { + width: `${this._blockSize}px`, + height: `${this._blockSize}px`, + backgroundColor: this['block-color'] || this.blockColor + }; + if (!style.backgroundColor) { + delete style.backgroundColor; + } + return style; + }, + trackStyle() { + const style = { + backgroundColor: this.backgroundColor || this.color + }; + if (!style.backgroundColor) { + delete style.backgroundColor; + } + return style; + }, + stepStyle() { + const style = { + width: `${this.percentage * 100}%`, + backgroundColor: this.activeColor || this.selectedColor + }; + if (!style.backgroundColor) { + delete style.backgroundColor; + } + return style; + }, + // 限制步长,确保 step 大于 0,并且可被 (max - min) 整除 + validStep() { + if (this.step <= 0) + return 1; + if ((this.max - this.min) % this.step !== 0) { + console.warn(`Step ${this.step} is not a divisor of range ${this.max - this.min}`); + } + return this.step; + } + }, + methods: { + getRect() { + return new Promise((resolve) => { + this.createSelectorQuery() + .select('.cube-slider-tab-area') + .boundingClientRect(res => { + resolve(res); + }) + .exec(); + }); + }, + constrainValue(originalPercentage) { + const minVal = this.min; + const maxVal = this.max; + const stepVal = this.validStep; + const totalSteps = (maxVal - minVal) / stepVal; + const val = minVal + originalPercentage * (maxVal - minVal); + const constrained = Math.max(minVal, Math.min(maxVal, val)); + const steps = Math.round((constrained - minVal) / stepVal); + this.percentage = steps / totalSteps; + this.currentValue = minVal + steps * stepVal; + }, + calcProgress(x, rect) { + const { left, width } = rect || {}; + if (left !== undefined && x !== undefined) { + const offsetX = Math.max(0, x - left); + this.constrainValue(offsetX / width); + } + }, + async onClick(e) { + if (this.disabled) + return; + const rect = await this.getRect(); + this.startDragRect = rect; + this.calcProgress(e.detail.x, rect); + // 完成一次拖动后触发的事件 + // @arg event.detail = {value} + this.triggerEvent(EVENT_CHANGE, { value: this.currentValue }); + }, + async startHandler(e) { + if (this.disabled) + return; + if (__mpx_mode__ === 'web') { + e && e.preventDefault(); + } + this.startDragRect = await this.getRect(); + }, + moveHandler(e) { + if (this.disabled || !this.startDragRect) { + return; + } + const x = e.touches[0].clientX; + this.calcProgress(x, this.startDragRect); + // 拖动过程中触发的事件 + // @arg event.detail = {value} + this.triggerEvent(EVENT_CHANGING, { value: this.currentValue }); + if (__mpx_mode__ === 'web') { + e && e.preventDefault(); + } + }, + endHandler() { + if (this.disabled) + return; + this.startDragRect = null; + // 完成一次拖动后触发的事件 + // @arg event.detail = {value} + this.triggerEvent(EVENT_CHANGE, { value: this.currentValue }); + } + } +}); diff --git a/packages/mpx-cube-ui/lib/components/toast/index.mpx b/packages/mpx-cube-ui/lib/components/toast/index.mpx index 2419ba35..2787ec9b 100644 --- a/packages/mpx-cube-ui/lib/components/toast/index.mpx +++ b/packages/mpx-cube-ui/lib/components/toast/index.mpx @@ -7,7 +7,7 @@ wx:model="{{isVisible}}" wx:model-prop="visible" wx:model-event="toggle" - transition="fade" + transition="{{ transition }}" mask="{{ mask }}" center="{{ true }}" maskClosable="{{ maskClosable }}" diff --git a/packages/mpx-cube-ui/lib/components/toast/toast.js b/packages/mpx-cube-ui/lib/components/toast/toast.js index 27e2540c..0ef22386 100644 --- a/packages/mpx-cube-ui/lib/components/toast/toast.js +++ b/packages/mpx-cube-ui/lib/components/toast/toast.js @@ -39,6 +39,10 @@ createComponent({ preventOutside: { type: Boolean, value: false + }, + transition: { + type: String, + value: 'fade' } }, lifetimes: { diff --git a/packages/mpx-cube-ui/package.json b/packages/mpx-cube-ui/package.json index 07409afe..123dc7b9 100644 --- a/packages/mpx-cube-ui/package.json +++ b/packages/mpx-cube-ui/package.json @@ -1,6 +1,6 @@ { "name": "@mpxjs/mpx-cube-ui", - "version": "1.4.8", + "version": "1.4.12-beta.0", "description": "mpx components library", "author": "xiaolei ", "publishConfig": { diff --git a/packages/mpx-cube-ui/src/common/stylus/theme/components/slider.styl b/packages/mpx-cube-ui/src/common/stylus/theme/components/slider.styl new file mode 100644 index 00000000..195363a0 --- /dev/null +++ b/packages/mpx-cube-ui/src/common/stylus/theme/components/slider.styl @@ -0,0 +1,5 @@ +// @type slider +$slider-active-color := $var(color-primary) // 已选择的颜色 +$slider-background-color := #e9e9e9 // 背景条的颜色 +$slider-block-color := #ffffff // 滑块的颜色 +$slider-track-height := 2px // 轨道高度 \ No newline at end of file diff --git a/packages/mpx-cube-ui/src/components/popup/css.styl b/packages/mpx-cube-ui/src/components/popup/css.styl index 005c50a4..21ed5d8b 100644 --- a/packages/mpx-cube-ui/src/components/popup/css.styl +++ b/packages/mpx-cube-ui/src/components/popup/css.styl @@ -10,6 +10,7 @@ bottom 0 z-index $var(popup-z-index) display flex + pointer-events: none &.cube-popup-top align-items start .cube-popup-content @@ -33,8 +34,6 @@ position relative z-index 999 box-sizing border-box -.cube-popup-remove-touch - pointer-events: none .cube-popup_mask pointer-events: auto &.cube-popup_mask_fade_transition diff --git a/packages/mpx-cube-ui/src/components/popup/index.mpx b/packages/mpx-cube-ui/src/components/popup/index.mpx index 316a4f3b..d4196436 100644 --- a/packages/mpx-cube-ui/src/components/popup/index.mpx +++ b/packages/mpx-cube-ui/src/components/popup/index.mpx @@ -5,11 +5,16 @@ wx:class="{{ [themeType ? 'cube-popup cube-popup-'+themeType : 'cube-popup', rootClass, visibleClass] }}" wx:style="{{ popupStyle }}" > - + - + @@ -18,21 +23,17 @@ + bindtouchmove@_web="preventTouchMove" + disable-scroll@_ali="{{true}}" + bindtap="onMaskClick"> @@ -40,7 +41,7 @@ class="cube-popup-content {{ transitionClass }}" wx:style="{{styleConfig.content}}" bindtouchmove="preventTouchMove" - bindanimationend@_wx|_ali|_web="contentHideAnimationend"> + bindanimationend@_web="contentHideAnimationend"> diff --git a/packages/mpx-cube-ui/src/components/popup/rn-mixin.ts b/packages/mpx-cube-ui/src/components/popup/rn-mixin.ts index 1e5a94c6..924dc4c2 100644 --- a/packages/mpx-cube-ui/src/components/popup/rn-mixin.ts +++ b/packages/mpx-cube-ui/src/components/popup/rn-mixin.ts @@ -131,7 +131,14 @@ if (__mpx_mode__ === 'ios' || __mpx_mode__ === 'android' || __mpx_mode__ === 'ha return new Promise((resolve) => { this.$refs['popup-content'].boundingClientRect((res) => { if (res) { - this.contentRect = res + const keys = Object.keys(res) + const contentRect = this.contentRect + for (const key in keys) { + if (res[key] !== contentRect[key]) { + this.contentRect = res + break + } + } } else { this.boundingClientRectFaill = this.boundingClientRectFaill || 0 this.boundingClientRectFaill++ diff --git a/packages/mpx-cube-ui/src/components/slider/css.rn.styl b/packages/mpx-cube-ui/src/components/slider/css.rn.styl new file mode 100644 index 00000000..b85b281a --- /dev/null +++ b/packages/mpx-cube-ui/src/components/slider/css.rn.styl @@ -0,0 +1,50 @@ +@require "../../common/stylus/variable.rn.styl" +@require "../../common/stylus/theme/components/slider.styl" + +.cube-slider + position: relative + display: flex + align-items: center + +.cube-slider-tab-area + flex: 1 0 auto + display: flex + align-items: center + min-height: $var(slider-track-height) + +.cube-slider-handle + position: absolute + transform: translateX(-50%) + z-index: 1 + +.cube-slider-thumb + background-color: $var(slider-block-color) + border-radius: 100% + box-shadow: 0 0 4px rgba(0, 0, 0, 0.2) + +.cube-slider-thumb-custom + position: relative + +.cube-slider-track + position: absolute + left: 0 + width: 100% + height: $var(slider-track-height) + background-color: $var(slider-background-color) + border-radius: ($slider-track-height / 2) + +.cube-slider-step + height: 100% + background-color: $var(slider-active-color) + border-radius: ($slider-track-height / 2) + +.cube-slider-value + position relative + z-index: 1 + color: #666 + width: 30px + overflow: visible + margin-left: 20px + margin-right: 10px + pointer-events: none + text-align: center \ No newline at end of file diff --git a/packages/mpx-cube-ui/src/components/slider/css.styl b/packages/mpx-cube-ui/src/components/slider/css.styl new file mode 100644 index 00000000..77887c3e --- /dev/null +++ b/packages/mpx-cube-ui/src/components/slider/css.styl @@ -0,0 +1,50 @@ +@require "../../common/stylus/variable.styl" +@require "../../common/stylus/theme/components/slider.styl" + +.cube-slider + position: relative + display: flex + align-items: center + + .cube-slider-tab-area + position: relative + flex: 1 0 auto + display: flex + align-items: center + min-height: $var(slider-track-height) + + .cube-slider-handle + position: absolute + transform: translateX(-50%) + z-index: 1 + + .cube-slider-thumb + background-color: $var(slider-block-color) + border-radius: 100% + box-shadow: 0 0 4px rgba(0, 0, 0, 0.2) + .cube-slider-thumb-custom + position: relative + + .cube-slider-track + position: absolute + left: 0 + width: 100% + height: $var(slider-track-height) + background-color: $var(slider-background-color) + border-radius: ($slider-track-height / 2) + + .cube-slider-step + height: 100% + background-color: $var(slider-active-color) + border-radius: ($slider-track-height / 2) + + .cube-slider-value + position relative + z-index: 1 + color: #666 + width: 30px + overflow: visible + padding: 0 10px 0 20px + pointer-events: none + text-align: center + diff --git a/packages/mpx-cube-ui/src/components/slider/index.mpx b/packages/mpx-cube-ui/src/components/slider/index.mpx new file mode 100644 index 00000000..649dfd1e --- /dev/null +++ b/packages/mpx-cube-ui/src/components/slider/index.mpx @@ -0,0 +1,59 @@ + + + + + + + diff --git a/packages/mpx-cube-ui/src/components/slider/slider.ts b/packages/mpx-cube-ui/src/components/slider/slider.ts new file mode 100644 index 00000000..b5439b20 --- /dev/null +++ b/packages/mpx-cube-ui/src/components/slider/slider.ts @@ -0,0 +1,267 @@ +import { createComponent } from '../../common/helper/create-component' + +const EVENT_CHANGE = 'change' // 完成一次拖动后触发的事件 +const EVENT_CHANGING = 'changing' // 拖动过程中触发的事件 + +interface Rect { + id: string + left: number + right: number + top: number + bottom: number + width: number + height: number +} + +createComponent({ + properties: { + /** + * @description 最小值 + */ + min: { + type: Number, + value: 0 + }, + /** + * @description 最大值 + */ + max: { + type: Number, + value: 100 + }, + /** + * @description 步长,取值必须大于 0,并且可被(max - min)整除 + */ + step: { + type: Number, + value: 1 + }, + /** + * @description 是否禁用 + */ + disabled: { + type: Boolean, + value: false + }, + /** + * @description 当前取值 + */ + value: { + type: Number, + value: 0 + }, + /** + * @description 背景条的颜色(请使用 backgroundColor) + */ + color: String, + /** + * @description 已选择的颜色(请使用 activeColor) + */ + 'selected-color': String, + /** + * @description 已选择的颜色 + */ + activeColor: String, + /** + * @description 背景条的颜色 + */ + backgroundColor: String, + /** + * @description 滑块的大小,取值范围为 12 - 28 + */ + 'block-size': { + type: Number, + value: 28 + }, + /** + * @description 滑块的颜色 + */ + 'block-color': String, + /** + * @description 是否显示当前 value + */ + 'show-value': { + type: Boolean, + value: false + }, + /** + * @description 是否显示当前 value + */ + showValue: { + type: Boolean, + value: false + }, + /** + * @description customContent + */ + customContent: { + type: Boolean, + value: false + } + }, + data: { + currentValue: 0, + percentage: 0, + startDragRect: null as null | Rect + }, + watch: { + value: { + handler(newVal) { + const val = Math.max(this.min, Math.min(this.max, newVal)) + if (newVal === this.currentValue && newVal === val) { + return + } + const percentage = (val - this.min) / (this.max - this.min) + this.constrainValue(percentage) + }, + immediate: true + } + }, + lifetimes: { + ready() { + this.getRect().then(res => { + this.startDragRect = res + }) + } + }, + computed: { + sliderClass() { + return { + 'cube-slider': true, + [`cube-slider-${this.themeType}`]: this.themeType + } + }, + _blockSize() { + const blockSize = this['block-size'] || this.blockSize || 28 + return Math.max(12, Math.min(blockSize, 28)) + }, + showValueLable() { + return this['show-value'] || this.showValue + }, + containerStyle() { + return { + marginLeft: `${this._blockSize / 2 + 4}px`, + marginRight: `${this._blockSize / 2 + 4}px` + } + }, + tabAreaStyle() { + const minH = Math.max(12, this._blockSize) / 2 + return { + paddingTop: `${minH}px`, + paddingBottom: `${minH}px` + } + }, + handleStyle() { + return { + left: `${this.percentage * 100}%` + } + }, + thumbStyle() { + const style = { + width: `${this._blockSize}px`, + height: `${this._blockSize}px`, + backgroundColor: this['block-color'] || this.blockColor + } + if (!style.backgroundColor) { + delete style.backgroundColor + } + return style + }, + thumbCustomStyle() { + return { display: this.customContent ? '' : 'none', ...this.thumbStyle } + }, + trackStyle() { + const style = { + backgroundColor: this.backgroundColor || this.color + } + if (!style.backgroundColor) { + delete style.backgroundColor + } + return style + }, + stepStyle() { + const style = { + width: `${this.percentage * 100}%`, + backgroundColor: this.activeColor || this.selectedColor + } + if (!style.backgroundColor) { + delete style.backgroundColor + } + return style + }, + // 限制步长,确保 step 大于 0,并且可被 (max - min) 整除 + validStep() { + if (this.step <= 0) return 1 + if ((this.max - this.min) % this.step !== 0) { + console.warn(`Step ${this.step} is not a divisor of range ${this.max - this.min}`) + } + return this.step + } + }, + methods: { + getRect() { + return new Promise((resolve) => { + this.createSelectorQuery() + .select('.cube-slider-tab-area') + .boundingClientRect(res => { + resolve(res) + }) + .exec() + }) + }, + constrainValue(originalPercentage) { + const minVal = this.min + const maxVal = this.max + const stepVal = this.validStep + const totalSteps = (maxVal - minVal) / stepVal + const val = minVal + originalPercentage * (maxVal - minVal) + const constrained = Math.max(minVal, Math.min(maxVal, val)) + const steps = Math.round((constrained - minVal) / stepVal) + this.percentage = steps / totalSteps + this.currentValue = minVal + steps * stepVal + }, + calcProgress(x: number, rect: Rect) { + const { left, width } = rect || {} + if (left !== undefined && x !== undefined) { + const offsetX = Math.max(0, x - left) + this.constrainValue(offsetX / width) + } + }, + async onClick(e) { + if (this.disabled) return + const rect = await this.getRect() + this.startDragRect = rect + this.calcProgress(e.detail.x, rect) + // 完成一次拖动后触发的事件 + // @arg event.detail = {value} + this.triggerEvent(EVENT_CHANGE, { value: this.currentValue }) + }, + async startHandler(e) { + if (this.disabled) return + if (__mpx_mode__ === 'web') { + e && e.preventDefault() + } + this.startDragRect = await this.getRect() + }, + moveHandler(e) { + if (this.disabled || !this.startDragRect) { + return + } + const x = e.touches[0].clientX + this.calcProgress(x, this.startDragRect) + // 拖动过程中触发的事件 + // @arg event.detail = {value} + this.triggerEvent(EVENT_CHANGING, { value: this.currentValue }) + if (__mpx_mode__ === 'web') { + e && e.preventDefault() + } + }, + endHandler() { + if (this.disabled) return + this.startDragRect = null + // 完成一次拖动后触发的事件 + // @arg event.detail = {value} + this.triggerEvent(EVENT_CHANGE, { value: this.currentValue }) + } + } +}) diff --git a/packages/mpx-cube-ui/src/components/toast/index.mpx b/packages/mpx-cube-ui/src/components/toast/index.mpx index c4c41f06..b3db75e3 100644 --- a/packages/mpx-cube-ui/src/components/toast/index.mpx +++ b/packages/mpx-cube-ui/src/components/toast/index.mpx @@ -7,7 +7,7 @@ wx:model="{{isVisible}}" wx:model-prop="visible" wx:model-event="toggle" - transition="fade" + transition="{{ transition }}" mask="{{ mask }}" center="{{ true }}" maskClosable="{{ maskClosable }}" diff --git a/packages/mpx-cube-ui/src/components/toast/toast.ts b/packages/mpx-cube-ui/src/components/toast/toast.ts index bfed7cfc..e279f139 100644 --- a/packages/mpx-cube-ui/src/components/toast/toast.ts +++ b/packages/mpx-cube-ui/src/components/toast/toast.ts @@ -41,6 +41,10 @@ createComponent({ preventOutside: { type: Boolean, value: false + }, + transition: { + type: String, + value: 'fade' } }, lifetimes: { diff --git a/packages/website-build/package.json b/packages/website-build/package.json index abfa005b..24aa028b 100644 --- a/packages/website-build/package.json +++ b/packages/website-build/package.json @@ -1,6 +1,6 @@ { "name": "@mpxjs/website-build", - "version": "1.4.8", + "version": "1.4.11", "description": "mpx-cube-ui website builder", "publishConfig": { "registry": "https://registry.npmjs.org",