@opentiny/vue-docs 3.17.4 → 3.18.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/demos/apis/button.js +2 -2
  2. package/demos/apis/dropdown.js +1 -1
  3. package/demos/apis/fluent-editor.js +2 -2
  4. package/demos/apis/link-menu.js +7 -7
  5. package/demos/apis/link.js +15 -1
  6. package/demos/apis/pager.js +3 -0
  7. package/demos/apis/pop-upload.js +15 -1
  8. package/demos/mobile-first/app/fluent-editor/basic-usage.vue +22 -0
  9. package/demos/mobile-first/app/fluent-editor/data-switch.vue +22 -0
  10. package/demos/mobile-first/app/fluent-editor/disabled.vue +22 -0
  11. package/demos/mobile-first/app/fluent-editor/image-upload.vue +46 -0
  12. package/demos/mobile-first/app/fluent-editor/options.vue +51 -0
  13. package/demos/mobile-first/app/fluent-editor/webdoc/fluent-editor.cn.md +9 -0
  14. package/demos/mobile-first/app/fluent-editor/webdoc/fluent-editor.en.md +9 -0
  15. package/demos/mobile-first/app/fluent-editor/webdoc/fluent-editor.js +68 -0
  16. package/demos/mobile-first/app/time-line-new/auto-slot.vue +50 -0
  17. package/demos/mobile-first/app/time-line-new/basic-usage.vue +23 -0
  18. package/demos/mobile-first/app/time-line-new/fold-time.vue +29 -0
  19. package/demos/mobile-first/app/time-line-new/limited-nodes.vue +29 -0
  20. package/demos/mobile-first/app/time-line-new/many-status.vue +24 -0
  21. package/demos/mobile-first/app/time-line-new/node-max.vue +26 -0
  22. package/demos/mobile-first/app/time-line-new/node-toset.vue +32 -0
  23. package/demos/mobile-first/app/time-line-new/single-status.vue +40 -0
  24. package/demos/mobile-first/app/time-line-new/sub-field.vue +23 -0
  25. package/demos/mobile-first/app/time-line-new/webdoc/time-line-new.cn.md +9 -0
  26. package/demos/mobile-first/app/time-line-new/webdoc/time-line-new.en.md +9 -0
  27. package/demos/mobile-first/app/time-line-new/webdoc/time-line-new.js +120 -0
  28. package/demos/mobile-first/menus.js +1 -0
  29. package/demos/pc/app/autocomplete/clearable.spec.ts +5 -3
  30. package/demos/pc/app/base-select/collapse-tags.spec.ts +3 -3
  31. package/demos/pc/app/base-select/size.spec.ts +1 -1
  32. package/demos/pc/app/carousel/autoplay.spec.ts +1 -1
  33. package/demos/pc/app/checkbox/checkbox-button-multiple.spec.ts +0 -10
  34. package/demos/pc/app/color-select-panel/alpha.spec.ts +6 -2
  35. package/demos/pc/app/color-select-panel/base.spec.ts +7 -3
  36. package/demos/pc/app/color-select-panel/event.spec.ts +5 -6
  37. package/demos/pc/app/color-select-panel/history.spec.ts +7 -9
  38. package/demos/pc/app/color-select-panel/predefine.spec.ts +4 -18
  39. package/demos/pc/app/config-provider/tag.spec.ts +5 -4
  40. package/demos/pc/app/date-picker/align.spec.ts +1 -0
  41. package/demos/pc/app/date-picker/clear.spec.ts +4 -4
  42. package/demos/pc/app/date-picker/custom-suffix-icon.spec.ts +1 -1
  43. package/demos/pc/app/dialog-box/custom-dialog-content.spec.ts +1 -1
  44. package/demos/pc/app/fluent-editor/basic-usage-composition-api.vue +14 -0
  45. package/demos/pc/app/fluent-editor/basic-usage.vue +22 -0
  46. package/demos/pc/app/fluent-editor/data-switch-composition-api.vue +14 -0
  47. package/demos/pc/app/fluent-editor/data-switch.vue +22 -0
  48. package/demos/pc/app/fluent-editor/disabled-composition-api.vue +12 -0
  49. package/demos/pc/app/fluent-editor/disabled.vue +20 -0
  50. package/demos/pc/app/fluent-editor/image-upload-composition-api.vue +39 -0
  51. package/demos/pc/app/fluent-editor/image-upload.vue +47 -0
  52. package/demos/pc/app/fluent-editor/options-composition-api.vue +63 -0
  53. package/demos/pc/app/fluent-editor/options.vue +71 -0
  54. package/demos/pc/app/fluent-editor/webdoc/fluent-editor.cn.md +7 -0
  55. package/demos/pc/app/fluent-editor/webdoc/fluent-editor.en.md +7 -0
  56. package/demos/pc/app/fluent-editor/webdoc/fluent-editor.js +69 -0
  57. package/demos/pc/app/form/form-disabled.spec.js +2 -2
  58. package/demos/pc/app/input/show-password.spec.ts +7 -8
  59. package/demos/pc/app/link/basic-usage-composition-api.vue +5 -1
  60. package/demos/pc/app/link/basic-usage.spec.ts +11 -0
  61. package/demos/pc/app/link/basic-usage.vue +6 -1
  62. package/demos/pc/app/link/webdoc/link.js +8 -2
  63. package/demos/pc/app/logout/basic-usage.spec.ts +4 -9
  64. package/demos/pc/app/logout/redirecturl.spec.ts +9 -0
  65. package/demos/pc/app/modal/basic-usage.spec.ts +1 -1
  66. package/demos/pc/app/modal/lock-view.spec.ts +5 -0
  67. package/demos/pc/app/modal/title-composition-api.vue +7 -2
  68. package/demos/pc/app/modal/title.spec.ts +10 -1
  69. package/demos/pc/app/modal/title.vue +7 -2
  70. package/demos/pc/app/nav-menu/slot-logo-composition-api.vue +0 -5
  71. package/demos/pc/app/nav-menu/slot-logo.vue +0 -5
  72. package/demos/pc/app/pop-upload/upload-tip-composition-api.vue +40 -0
  73. package/demos/pc/app/pop-upload/upload-tip.vue +50 -0
  74. package/demos/pc/app/pop-upload/webdoc/pop-upload.js +14 -2
  75. package/demos/pc/app/popeditor/clearable.spec.ts +2 -2
  76. package/demos/pc/app/popeditor/events.spec.ts +1 -4
  77. package/demos/pc/app/rate/not-selected-class.spec.js +1 -6
  78. package/demos/pc/app/rate/not-selected-color.spec.js +1 -1
  79. package/demos/pc/app/select/multiple.vue +49 -13
  80. package/demos/pc/app/split/moveend-event.spec.ts +3 -2
  81. package/demos/pc/app/split/movestart-event.spec.ts +1 -1
  82. package/demos/pc/app/split/trigger-slot-composition-api.vue +26 -3
  83. package/demos/pc/app/split/trigger-slot.spec.ts +1 -1
  84. package/demos/pc/app/split/trigger-slot.vue +27 -4
  85. package/demos/pc/app/tabs/basic-usage.spec.ts +2 -1
  86. package/demos/pc/app/tabs/before-leave.spec.ts +2 -1
  87. package/demos/pc/app/tabs/custom-more-icon.spec.ts +2 -1
  88. package/demos/pc/app/tabs/custom-tab-title.spec.ts +2 -1
  89. package/demos/pc/app/tabs/lazy.spec.ts +2 -1
  90. package/demos/pc/app/tabs/more-show-all.spec.ts +4 -4
  91. package/demos/pc/app/tabs/position.spec.ts +6 -5
  92. package/demos/pc/app/tabs/show-different-grid-data.spec.ts +4 -3
  93. package/demos/pc/app/tabs/size.spec.ts +4 -3
  94. package/demos/pc/app/tabs/stretch-wh.spec.ts +2 -1
  95. package/demos/pc/app/tabs/tab-style-bordercard.spec.ts +2 -1
  96. package/demos/pc/app/tabs/tab-style-card.spec.ts +2 -1
  97. package/demos/pc/app/tabs/tabs-draggable.spec.ts +5 -4
  98. package/demos/pc/app/tabs/tabs-events-click.spec.ts +3 -2
  99. package/demos/pc/app/tabs/tabs-events-close.spec.ts +2 -1
  100. package/demos/pc/app/tabs/tabs-second-layer.spec.ts +2 -1
  101. package/demos/pc/app/tabs/tabs-separator.spec.ts +2 -1
  102. package/demos/pc/app/tabs/tooltip.spec.ts +3 -2
  103. package/demos/pc/app/tabs/with-add.spec.ts +2 -1
  104. package/demos/pc/app/time-line-new/basic-usage.vue +32 -0
  105. package/demos/pc/app/time-line-new/custom-normal-step.vue +39 -0
  106. package/demos/pc/app/time-line-new/custom-vertical-step.vue +39 -0
  107. package/demos/pc/app/time-line-new/different-data1.vue +44 -0
  108. package/demos/pc/app/time-line-new/different-data2.vue +36 -0
  109. package/demos/pc/app/time-line-new/event.vue +29 -0
  110. package/demos/pc/app/time-line-new/node-toset1.vue +35 -0
  111. package/demos/pc/app/time-line-new/node-toset2.vue +36 -0
  112. package/demos/pc/app/time-line-new/set-start-value.vue +32 -0
  113. package/demos/pc/app/time-line-new/show-number.vue +28 -0
  114. package/demos/pc/app/time-line-new/show-status.vue +32 -0
  115. package/demos/pc/app/time-line-new/vertical1.vue +28 -0
  116. package/demos/pc/app/time-line-new/vertical2.vue +29 -0
  117. package/demos/pc/app/time-line-new/webdoc/time-line-new.cn.md +7 -0
  118. package/demos/pc/app/time-line-new/webdoc/time-line-new.en.md +7 -0
  119. package/demos/pc/app/time-line-new/webdoc/time-line-new.js +184 -0
  120. package/demos/pc/app/time-line-new/width.vue +28 -0
  121. package/demos/pc/app/time-picker/clearable.spec.ts +0 -3
  122. package/demos/pc/app/time-picker/editable.spec.ts +1 -6
  123. package/demos/pc/app/time-picker/format.spec.ts +4 -0
  124. package/demos/pc/app/time-picker/suffix-icon.spec.ts +4 -1
  125. package/demos/pc/app/tooltip/basic-usage.spec.js +1 -1
  126. package/demos/pc/app/tooltip/delay.spec.js +3 -3
  127. package/demos/pc/app/tooltip/pre.spec.js +7 -26
  128. package/demos/pc/app/user-contact/not-displayed-content.spec.ts +2 -1
  129. package/demos/pc/app/user-link/custom-service.spec.ts +4 -2
  130. package/demos/pc/menus.js +7 -1
  131. package/demos/pc/overviewimage/chart-radar.svg +2 -2
  132. package/demos/pc/webdoc/changelog.md +99 -0
  133. package/demos/pc/webdoc/theme.md +65 -230
  134. package/env/.env.innersaas +1 -2
  135. package/env/.env.saasopen +1 -2
  136. package/env/.env.saasprod +1 -2
  137. package/package.json +14 -14
  138. package/playground/App.vue +20 -4
  139. package/src/main.js +2 -2
  140. package/src/style.css +5 -0
@@ -0,0 +1,40 @@
1
+ <template>
2
+ <div style="display: flex; justify-content: space-between">
3
+ <tiny-time-line :data="data1" show-icon> </tiny-time-line>
4
+ <tiny-time-line :data="data2" show-icon>
5
+ <template #show-icon>
6
+ <icon-copy />
7
+ </template>
8
+ </tiny-time-line>
9
+ </div>
10
+ </template>
11
+
12
+ <script>
13
+ import { TimeLineNew } from '@opentiny/vue'
14
+ import { IconCopy, IconLoading } from '@opentiny/vue-icon'
15
+
16
+ export default {
17
+ components: {
18
+ TinyTimeLine: TimeLineNew,
19
+ IconCopy: IconCopy()
20
+ },
21
+ data() {
22
+ return {
23
+ data1: [
24
+ { name: '节点标题', time: '2022-11-11 00:01:30' },
25
+ { name: '节点标题', time: '2022-11-12 14:20:15' },
26
+ { name: '节点标题', time: '2022-11-14 20:45:50' },
27
+ { name: '节点标题', time: '2022-11-11 00:01:30' },
28
+ { name: '节点标题', time: '2022-11-14 20:45:50', autoColor: IconLoading() }
29
+ ],
30
+ data2: [
31
+ { name: '节点标题', time: '2022-11-11 00:01:30' },
32
+ { name: '节点标题', time: '2022-11-12 14:20:15' },
33
+ { name: '节点标题', time: '2022-11-14 20:45:50' },
34
+ { name: '节点标题', time: '2022-11-11 00:01:30' },
35
+ { name: '节点标题', time: '2022-11-14 20:45:50', autoColor: IconCopy() }
36
+ ]
37
+ }
38
+ }
39
+ }
40
+ </script>
@@ -0,0 +1,23 @@
1
+ <template>
2
+ <tiny-time-line :data="data" sub-field></tiny-time-line>
3
+ </template>
4
+
5
+ <script>
6
+ import { TimeLineNew } from '@opentiny/vue'
7
+
8
+ export default {
9
+ components: {
10
+ TinyTimeLine: TimeLineNew
11
+ },
12
+ data() {
13
+ return {
14
+ data: [
15
+ { name: '节点标题', time: '2022-11-11 00:01:30', tips: '这是节点内容描述' },
16
+ { name: '节点标题', time: '2022-11-12 14:20:15', tips: '这是节点内容描述' },
17
+ { name: '节点标题', time: '2022-11-14 20:45:50', tips: '这是节点内容描述' },
18
+ { name: '节点标题', time: '2022-11-14 20:45:50', tips: '这是节点内容描述' }
19
+ ]
20
+ }
21
+ }
22
+ }
23
+ </script>
@@ -0,0 +1,9 @@
1
+ ---
2
+ title: TimeLine 时间线
3
+ ---
4
+
5
+ # TimeLine 时间线
6
+
7
+ <div>
8
+
9
+ </div>
@@ -0,0 +1,9 @@
1
+ ---
2
+ title: TimeLine 时间线
3
+ ---
4
+
5
+ # TimeLine 时间线
6
+
7
+ <div>
8
+
9
+ </div>
@@ -0,0 +1,120 @@
1
+ export default {
2
+ column: '2',
3
+ owner: '',
4
+ demos: [
5
+ {
6
+ demoId: 'basic-usage',
7
+ name: {
8
+ 'zh-CN': '基本用法',
9
+ 'en-US': 'Basic Usage'
10
+ },
11
+ desc: {
12
+ 'zh-CN': '<p>通过 `data` 属性设置时间线步骤条数据</p>',
13
+ 'en-US': '<p>Set the timeline step bar data through the `data` property.</p>'
14
+ },
15
+ codeFiles: ['basic-usage.vue']
16
+ },
17
+ {
18
+ demoId: 'sub-field',
19
+ name: {
20
+ 'zh-CN': '两侧分布',
21
+ 'en-US': 'Bilateral distribution'
22
+ },
23
+ desc: {
24
+ 'zh-CN': '<p>通过 `sub-field` 属性设置时间线两侧展示。</p>',
25
+ 'en-US': '<p>Use the `sub-field` attribute to set the display on both sides of the timeline.</p>'
26
+ },
27
+ codeFiles: ['sub-field.vue']
28
+ },
29
+ {
30
+ demoId: 'single-status',
31
+ name: {
32
+ 'zh-CN': '单状态时间轴',
33
+ 'en-US': 'Single-state timeline'
34
+ },
35
+ desc: {
36
+ 'zh-CN': '<p>通过在`data`里面的属性`autoColor`设置自定义图标</p>',
37
+ 'en-US': '<p>Set the customized icon through the `autoColor` attribute in `data`.</p>'
38
+ },
39
+ codeFiles: ['single-status.vue']
40
+ },
41
+ {
42
+ demoId: 'many-status',
43
+ name: {
44
+ 'zh-CN': '多状态时间轴',
45
+ 'en-US': 'Multi-state timeline'
46
+ },
47
+ desc: {
48
+ 'zh-CN':
49
+ '<p>通过在`data`里面的属性`autoColor`设置自定义状态。对应场景: `success` :成功 `error` :失败 `info` :等待 </p>',
50
+ 'en-US':
51
+ '<p>Set the user-defined state through the `autoColor` attribute in `data`. Scenario: `success`: success; error`: failure; info`: waiting</p>'
52
+ },
53
+ codeFiles: ['many-status.vue']
54
+ },
55
+ {
56
+ demoId: 'node-toset',
57
+ name: {
58
+ 'zh-CN': '节点配置图标',
59
+ 'en-US': 'Node configuration icon'
60
+ },
61
+ desc: {
62
+ 'zh-CN': '<p>通过在`data`里面的属性`autoColor`设置自定义图标</p>',
63
+ 'en-US': '<p>Set the customized icon through the `autoColor` attribute in `data`.</p>'
64
+ },
65
+ codeFiles: ['node-toset.vue']
66
+ },
67
+ {
68
+ demoId: 'fold-time',
69
+ name: {
70
+ 'zh-CN': '折叠时间轴',
71
+ 'en-US': 'Collapse Timeline'
72
+ },
73
+ desc: {
74
+ 'zh-CN': '<p>当节点个数达到七项时,自动折叠节点,仅展示最近三项,点击后展开。</p>',
75
+ 'en-US':
76
+ '<p>When there are more than seven nodes, the system automatically collapses the nodes and displays only the latest three nodes.</p>'
77
+ },
78
+ codeFiles: ['fold-time.vue']
79
+ },
80
+ {
81
+ demoId: 'node-max',
82
+ name: {
83
+ 'zh-CN': '触发折叠节点数',
84
+ 'en-US': 'Number of Nodes Triggering Folding'
85
+ },
86
+ desc: {
87
+ 'zh-CN': '<p>通过 <code>node-max</code> 属性可以配置节点达到指定个数后自动折叠节点。</p>',
88
+ 'en-US':
89
+ '<p>Use <code>node-max</code> to automatically collapse nodes after reaching a specified number of nodes.</p>'
90
+ },
91
+ codeFiles: ['node-max.vue']
92
+ },
93
+ {
94
+ demoId: 'limited-nodes',
95
+ name: {
96
+ 'zh-CN': '折叠后节点数',
97
+ 'en-US': 'Number of Nodes After Folding'
98
+ },
99
+ desc: {
100
+ 'zh-CN': '<p>通过 <code>limited-nodes</code> 属性可以设置折叠后展示的节点个数。</p>',
101
+ 'en-US': '<p>Use <code>node-max</code> to set the number of nodes displayed after folding.</p>'
102
+ },
103
+ codeFiles: ['limited-nodes.vue']
104
+ },
105
+ {
106
+ demoId: 'auto-slot',
107
+ name: {
108
+ 'zh-CN': '自定义插槽',
109
+ 'en-US': 'Custom Slots'
110
+ },
111
+ desc: {
112
+ 'zh-CN':
113
+ '<p>通过 `slot` 为 `left` 可以自定义步骤条右侧内容。`data`中自定义属性名应避免`name`(正标题)、`tips`(副标题)、`time`(时间)属性</p>',
114
+ 'en-US':
115
+ '<p>You can set `slot` to `left` to customize the content on the right of the step bar. User-defined attribute names in `data` should avoid `name` (head title), `tips` (subtitle), and `time` (time) attributes.</p>'
116
+ },
117
+ codeFiles: ['auto-slot.vue']
118
+ }
119
+ ]
120
+ }
@@ -55,6 +55,7 @@ export const cmpMenus = [
55
55
  { name: 'TimePickerMobile', nameCn: '时间选择器', key: 'time-picker-mobile' },
56
56
  { name: 'Button', nameCn: '按钮', key: 'button' },
57
57
  { name: 'Checkbox', nameCn: '复选框', key: 'checkbox' },
58
+ { name: 'FluentEditor', nameCn: '富文本', key: 'fluent-editor' },
58
59
  { name: 'Form', nameCn: '表单', key: 'form' },
59
60
  { name: 'Input', nameCn: '输入框', key: 'input' },
60
61
  { name: 'Numeric', nameCn: '计数器', key: 'numeric' },
@@ -3,10 +3,12 @@ import { test, expect } from '@playwright/test'
3
3
  test('可清除', async ({ page }) => {
4
4
  page.on('pageerror', (exception) => expect(exception).toBeNull())
5
5
  await page.goto('autocomplete#clearable')
6
- await page.getByRole('textbox', { name: '请输入内容', exact: true }).click()
6
+
7
+ const demo = page.locator('#clearable')
8
+ await demo.getByRole('textbox', { name: '请输入内容', exact: true }).click()
7
9
  await page.getByRole('option', { name: 'WWWW科技YX公司' }).click()
8
- await page.getByRole('textbox', { name: '请输入内容', exact: true }).hover()
9
- await page.getByRole('combobox').locator('path').click()
10
+ await demo.getByRole('textbox', { name: '请输入内容', exact: true }).hover()
11
+ await demo.getByRole('combobox').locator('.tiny-input__clear').click()
10
12
 
11
13
  await expect(page.getByRole('textbox', { name: '请输入内容', exact: true })).toHaveValue('')
12
14
  })
@@ -20,13 +20,13 @@ test('collapse-tags', async ({ page }) => {
20
20
  await expect(option.filter({ hasText: '上海' })).toHaveClass(/selected/)
21
21
 
22
22
  // 取消选中一个
23
- await option.filter({ hasText: '北京' }).locator('span').nth(2).click()
23
+ await option.filter({ hasText: '北京' }).click()
24
24
  await expect(tag.filter({ hasText: '+ 1' })).toBeHidden()
25
25
  await expect(tag).toHaveCount(1)
26
26
 
27
27
  // 再选中2个
28
- await option.filter({ hasText: '天津' }).locator('span').nth(2).click()
29
- await option.filter({ hasText: '深圳' }).locator('span').nth(2).click()
28
+ await option.filter({ hasText: '天津' }).click()
29
+ await option.filter({ hasText: '深圳' }).click()
30
30
  await expect(tag.filter({ hasText: '+ 2' })).toBeVisible()
31
31
  await expect(tag).toHaveCount(2)
32
32
  })
@@ -9,7 +9,7 @@ test('默认尺寸', async ({ page }) => {
9
9
  const input = select.locator('.tiny-input')
10
10
  const tag = select.locator('.tiny-tag')
11
11
 
12
- await expect(input.locator('.tiny-input__inner')).toHaveCSS('height', '30px')
12
+ await expect(input.locator('.tiny-input__inner')).toHaveCSS('height', '28px')
13
13
  await expect(tag.nth(0)).toHaveClass(/tiny-tag--light/)
14
14
  })
15
15
 
@@ -7,7 +7,7 @@ test('自动切换', async ({ page }) => {
7
7
  await page.waitForTimeout(100)
8
8
  const preview = page.locator('#autoplay')
9
9
  const carousel = preview.locator('.tiny-carousel')
10
- const carouselItems = preview.locator('div.tiny-carousel__item')
10
+ const carouselItems = preview.locator('.tiny-carousel__item')
11
11
  // 默认显示第一张幻灯片
12
12
  await expect(carouselItems.first()).toHaveCSS('transform', 'matrix(1, 0, 0, 1, 0, 0)')
13
13
 
@@ -19,14 +19,4 @@ test('多行按钮', async ({ page }) => {
19
19
  let groupBox = await checkboxGroup.boundingBox()
20
20
  let checkboxButtonBox = await checkboxButton.boundingBox()
21
21
  expect(groupBox?.height).toBe(((checkboxButtonBox?.height || 0) + bottomSpace) * 2)
22
-
23
- // 测试三行场景
24
- page.setViewportSize({
25
- width: 500,
26
- height: 700
27
- })
28
- await page.waitForTimeout(200)
29
- groupBox = await checkboxGroup.boundingBox()
30
- checkboxButtonBox = await checkboxButton.boundingBox()
31
- expect(groupBox?.height).toBe(((checkboxButtonBox?.height || 0) + bottomSpace) * 3)
32
22
  })
@@ -3,7 +3,11 @@ import { test, expect } from '@playwright/test'
3
3
  test('测试Alpha', async ({ page }) => {
4
4
  page.on('pageerror', (exception) => expect(exception).toBeNull())
5
5
  await page.goto('color-select-panel#alpha')
6
- await page.getByRole('button', { name: 'Show Color select panel' }).click()
6
+ const demo = await page.locator('#alpha')
7
+ await demo.getByRole('button', { name: 'Show Color select panel' }).click()
7
8
  await page.locator('.black').click()
8
- await page.getByRole('button', { name: '选择' }).click()
9
+ const v1 = await page.evaluate('document.querySelector("input[type=text]").value = "#377820"')
10
+ await page.locator('.tiny-color-select-panel__alpha__slider').click()
11
+ const v2 = await page.evaluate('document.querySelector("input[type=text]").value = "#406a8080"')
12
+ expect(v1).not.toContainEqual(v2)
9
13
  })
@@ -2,8 +2,12 @@ import { test, expect } from '@playwright/test'
2
2
 
3
3
  test('基本用法', async ({ page }) => {
4
4
  page.on('pageerror', (exception) => expect(exception).toBeNull())
5
- await page.goto('color-select-panel#basic-usage')
6
- await page.getByRole('button', { name: 'Show Color select panel' }).click()
5
+ await page.goto('color-select-panel#alpha')
6
+ const demo = await page.locator('#alpha')
7
+ await demo.getByRole('button', { name: 'Show Color select panel' }).click()
8
+ await page.locator('.black').click()
9
+ const v1 = await page.evaluate('document.querySelector("input[type=text]").value = "#377820"')
7
10
  await page.locator('.tiny-color-select-panel__inner__hue-select').click()
8
- await page.getByRole('button', { name: '选择' }).click()
11
+ const v2 = await page.evaluate('document.querySelector("input[type=text]").value = "#206578"')
12
+ expect(v1).not.toContainEqual(v2)
9
13
  })
@@ -3,10 +3,9 @@ import { test, expect } from '@playwright/test'
3
3
  test('事件触发', async ({ page }) => {
4
4
  page.on('pageerror', (exception) => expect(exception).toBeNull())
5
5
  await page.goto('color-select-panel#event')
6
- await page.getByRole('button', { name: 'Show Color select panel' }).click()
7
- await page.locator('.black').click()
8
- await page.locator('.tiny-color-select-panel__inner__hue-select').click()
9
- await page.getByRole('button', { name: '选择' }).click()
10
- await page.getByRole('button', { name: 'Show Color select panel' }).click()
11
- await page.getByRole('button', { name: '取消' }).click()
6
+ const demo = await page.locator('#event')
7
+ await demo.getByRole('button', { name: 'Show Color select panel' }).click()
8
+ await demo.getByRole('button', { name: '取消' }).click()
9
+ expect(page.locator('.tiny-notify')).toHaveText('用户点击了取消')
10
+ await page.locator('.tiny-notify__icon-close > .tiny-svg').click()
12
11
  })
@@ -3,13 +3,11 @@ import { test, expect } from '@playwright/test'
3
3
  test('历史记录', async ({ page }) => {
4
4
  page.on('pageerror', (exception) => expect(exception).toBeNull())
5
5
  await page.goto('color-select-panel#history')
6
- await page.getByRole('button', { name: 'Show Color select panel' }).click()
7
- await page.locator('.black').click()
8
- await page.getByRole('button', { name: '选择' }).click()
9
- await page.getByRole('button', { name: 'Append history color' }).click()
10
- await page.getByRole('button', { name: 'Show Color select panel' }).click()
11
- await page.getByRole('button', { name: '历史记录' }).click()
12
- await page.getByRole('button', { name: 'Pop history color' }).click()
13
- await page.getByRole('button', { name: 'Show Color select panel' }).click()
14
- await page.getByRole('button', { name: '历史记录' }).click()
6
+ const demo = await page.locator('#history')
7
+ await demo.getByRole('button', { name: 'Show Color select panel' }).click()
8
+ await demo.locator('.tiny-color-select-panel__inner__hue-select > div').dblclick()
9
+ await demo.getByRole('button', { name: '选择' }).click()
10
+ await demo.getByRole('button', { name: 'Show Color select panel' }).click()
11
+ await demo.getByRole('button', { name: '历史记录' }).click()
12
+ expect(page.locator('.tiny-color-select-panel__history__color-block')).toHaveCount(2)
15
13
  })
@@ -3,23 +3,9 @@ import { test, expect } from '@playwright/test'
3
3
  test('预定义颜色', async ({ page }) => {
4
4
  page.on('pageerror', (exception) => expect(exception).toBeNull())
5
5
  await page.goto('color-select-panel#predefine')
6
- await page.getByRole('button', { name: 'Show Color select panel' }).click()
7
- await page.locator('.black').click()
8
- await page.locator('.tiny-color-select-panel__inner__hue-select').click()
9
- await page.getByRole('button', { name: '选择' }).click()
10
- await page.getByRole('button', { name: 'Append predefine color' }).click()
11
- await page.getByRole('button', { name: 'Show Color select panel' }).click()
12
- await page.getByRole('button', { name: '预定义颜色' }).click()
13
- await page.locator('.tiny-color-select-panel__predefine > div:nth-child(8)').click()
6
+ const demo = await page.locator('#predefine')
14
7
  await page.getByRole('button', { name: 'Pop predefine color' }).click()
15
- await page.getByRole('button', { name: 'Show Color select panel' }).click()
16
- await page.getByRole('button', { name: '预定义颜色' }).click()
17
- await page.locator('.tiny-color-select-panel__inner__hue-select').click()
18
- await page.locator('.tiny-color-select-panel__inner__hue-select').click()
19
- await page.getByRole('button', { name: '选择' }).click()
20
- await page.getByRole('button', { name: 'Show Color select panel' }).click()
21
- await page.getByRole('button', { name: '预定义颜色' }).click()
22
- await page.getByRole('button', { name: 'Append predefine color' }).click()
23
- await page.getByRole('button', { name: 'Show Color select panel' }).click()
24
- await page.getByRole('button', { name: '预定义颜色' }).click()
8
+ await demo.getByRole('button', { name: 'Show Color select panel' }).click()
9
+ await demo.getByRole('button', { name: '预定义颜色' }).click()
10
+ expect(page.locator('.tiny-color-select-panel__predefine__color-block')).toHaveCount(7)
25
11
  })
@@ -3,10 +3,11 @@ import { test, expect } from '@playwright/test'
3
3
  test('测试自定义标签', async ({ page }) => {
4
4
  page.on('pageerror', (exception) => expect(exception).toBeNull())
5
5
  await page.goto('config-provider#tag')
6
- await page.getByText('这是一个Tag被DOM包裹').click()
7
- await page.locator('#tag span').nth(2).click()
6
+ const demo = await page.locator('#tag span')
7
+ await demo.nth(2).click()
8
8
  await page.waitForTimeout(300)
9
- await page.locator('#tag span').nth(2).click()
9
+ await demo.nth(2).click()
10
10
  await page.waitForTimeout(300)
11
- await expect(page.locator('.tiny-switch').nth(2)).toHaveCSS('background-color', 'rgb(94, 124, 224)')
11
+ const elements = await page.locator('.tiny-config-provider')
12
+ await expect(elements.nth(1)).toHaveCSS('padding', '16px')
12
13
  })
@@ -8,6 +8,7 @@ test('[DatePicker] 测试对齐方式', async ({ page }) => {
8
8
  const leftDateInputDom = page.getByRole('textbox').nth(1)
9
9
  const leftDatePanelDom = page.locator('.tiny-picker-panel').nth(2)
10
10
  const leftClosePanel = page.getByText('左对齐:')
11
+ await page.waitForTimeout(200)
11
12
 
12
13
  await leftDateInputDom.click()
13
14
  await page.waitForTimeout(200)
@@ -12,9 +12,9 @@ test('[DatePicker] 测试清除输入', async ({ page }) => {
12
12
  // 默认显示清除按钮
13
13
  await datePickerDefaultClearIcon.hover()
14
14
  await expect(clearIcon).toBeVisible()
15
- await expect(clearIcon.locator('path')).toHaveAttribute(
15
+ await expect(clearIcon.locator('path').nth(1)).toHaveAttribute(
16
16
  'd',
17
- 'm13.4 12 6.3-6.3c.4-.4.4-1 0-1.4-.4-.4-1-.4-1.4 0L12 10.6 5.7 4.3c-.4-.4-1-.4-1.4 0-.4.4-.4 1 0 1.4l6.3 6.3-6.3 6.3c-.4.4-.4 1 0 1.4.2.2.4.3.7.3.3 0 .5-.1.7-.3l6.3-6.3 6.3 6.3c.2.2.4.3.7.3s.5-.1.7-.3c.4-.4.4-1 0-1.4L13.4 12z'
17
+ 'M4.25 3.4 8 7.15l3.75-3.75a.61.61 0 0 1 .85 0c.23.23.23.62 0 .85L8.85 8l3.75 3.75c.23.24.23.62 0 .85a.61.61 0 0 1-.85 0L8 8.85 4.25 12.6a.61.61 0 0 1-.85 0 .592.592 0 0 1 0-.85L7.15 8 3.4 4.25a.61.61 0 0 1 0-.85.61.61 0 0 1 .85 0z'
18
18
  )
19
19
 
20
20
  // 隐藏清除按钮
@@ -24,9 +24,9 @@ test('[DatePicker] 测试清除输入', async ({ page }) => {
24
24
  // 自定义清除图标
25
25
  await datePickerCustomClearIcon.hover()
26
26
  await expect(clearIcon).toBeVisible()
27
- await expect(clearIcon.locator('path')).toHaveAttribute(
27
+ await expect(clearIcon.locator('path').nth(1)).toHaveAttribute(
28
28
  'd',
29
- 'm13.4 12 6.3-6.3c.4-.4.4-1 0-1.4-.4-.4-1-.4-1.4 0L12 10.6 5.7 4.3c-.4-.4-1-.4-1.4 0-.4.4-.4 1 0 1.4l6.3 6.3-6.3 6.3c-.4.4-.4 1 0 1.4.2.2.4.3.7.3.3 0 .5-.1.7-.3l6.3-6.3 6.3 6.3c.2.2.4.3.7.3s.5-.1.7-.3c.4-.4.4-1 0-1.4L13.4 12z'
29
+ 'M4.25 3.4 8 7.15l3.75-3.75a.61.61 0 0 1 .85 0c.23.23.23.62 0 .85L8.85 8l3.75 3.75c.23.24.23.62 0 .85a.61.61 0 0 1-.85 0L8 8.85 4.25 12.6a.61.61 0 0 1-.85 0 .592.592 0 0 1 0-.85L7.15 8 3.4 4.25a.61.61 0 0 1 0-.85.61.61 0 0 1 .85 0z'
30
30
  )
31
31
 
32
32
  // 测试清除功能
@@ -6,6 +6,6 @@ test('[DatePicker] 测试自定义后置图标', async ({ page }) => {
6
6
  const svgPathDom = page.locator('i path')
7
7
  await expect(svgPathDom).toHaveAttribute(
8
8
  'd',
9
- 'M19.1 13H4.9c-.5 0-.9-.4-.9-1s.4-1 .9-1h14.2c.5 0 .9.4.9 1s-.4 1-.9 1z'
9
+ 'M12.99 7.5c.28 0 .5.22.5.5s-.22.5-.5.5H3.01c-.28 0-.5-.22-.5-.5s.22-.5.5-.5h9.98z'
10
10
  )
11
11
  })
@@ -7,7 +7,7 @@ test('dialogBox 自定义内容', async ({ page }) => {
7
7
  const dialogBox = page.locator('.tiny-dialog-box')
8
8
  await button.click()
9
9
  await expect(dialogBox).toBeVisible()
10
- await page.locator('#custom-dialog-content path').nth(2).click()
10
+ await page.locator('.tiny-alert > .tiny-alert__close').click()
11
11
  await page.waitForTimeout(300)
12
12
  await page.getByRole('button', { name: /确 定/ }).click()
13
13
  await expect(dialogBox).toBeHidden()
@@ -0,0 +1,14 @@
1
+ <template>
2
+ <div>
3
+ <tiny-fluent-editor v-model="content"></tiny-fluent-editor>
4
+ 内容:<br />
5
+ {{ content }}
6
+ </div>
7
+ </template>
8
+
9
+ <script setup>
10
+ import { ref } from 'vue'
11
+ import { TinyFluentEditor } from '@opentiny/vue'
12
+
13
+ const content = ref('{"ops":[{"insert":"Hello "},{"attributes":{"bold":true},"insert":"FluentEditor"},{"insert":"!"}]}')
14
+ </script>
@@ -0,0 +1,22 @@
1
+ <template>
2
+ <div>
3
+ <tiny-fluent-editor v-model="content"></tiny-fluent-editor>
4
+ 内容:<br />
5
+ {{ content }}
6
+ </div>
7
+ </template>
8
+
9
+ <script>
10
+ import { TinyFluentEditor } from '@opentiny/vue'
11
+
12
+ export default {
13
+ components: {
14
+ TinyFluentEditor
15
+ },
16
+ data() {
17
+ return {
18
+ content: '{"ops":[{"insert":"Hello "},{"attributes":{"bold":true},"insert":"FluentEditor"},{"insert":"!"}]}'
19
+ }
20
+ }
21
+ }
22
+ </script>
@@ -0,0 +1,14 @@
1
+ <template>
2
+ <div>
3
+ <tiny-fluent-editor v-model="value" :data-type="false" :data-upgrade="false"></tiny-fluent-editor>
4
+ 内容:<br />
5
+ {{ value }}
6
+ </div>
7
+ </template>
8
+
9
+ <script setup>
10
+ import { ref } from 'vue'
11
+ import { TinyFluentEditor } from '@opentiny/vue'
12
+
13
+ const value = ref('<p>Hello <strong>FluentEditor</strong>!</p>')
14
+ </script>
@@ -0,0 +1,22 @@
1
+ <template>
2
+ <div>
3
+ <tiny-fluent-editor v-model="value" :data-type="false" :data-upgrade="false"></tiny-fluent-editor>
4
+ 内容:<br />
5
+ {{ value }}
6
+ </div>
7
+ </template>
8
+
9
+ <script>
10
+ import { TinyFluentEditor } from '@opentiny/vue'
11
+
12
+ export default {
13
+ components: {
14
+ TinyFluentEditor
15
+ },
16
+ data() {
17
+ return {
18
+ value: '<p>Hello <strong>FluentEditor</strong>!</p>'
19
+ }
20
+ }
21
+ }
22
+ </script>
@@ -0,0 +1,12 @@
1
+ <template>
2
+ <div>
3
+ <tiny-fluent-editor v-model="content" disabled></tiny-fluent-editor>
4
+ </div>
5
+ </template>
6
+
7
+ <script setup>
8
+ import { ref } from 'vue'
9
+ import { TinyFluentEditor } from '@opentiny/vue'
10
+
11
+ const content = ref('{"ops":[{"insert":"Hello "},{"attributes":{"bold":true},"insert":"FluentEditor"},{"insert":"!"}]}')
12
+ </script>
@@ -0,0 +1,20 @@
1
+ <template>
2
+ <div>
3
+ <tiny-fluent-editor v-model="content" disabled></tiny-fluent-editor>
4
+ </div>
5
+ </template>
6
+
7
+ <script>
8
+ import { TinyFluentEditor } from '@opentiny/vue'
9
+
10
+ export default {
11
+ components: {
12
+ TinyFluentEditor
13
+ },
14
+ data() {
15
+ return {
16
+ content: '{"ops":[{"insert":"Hello "},{"attributes":{"bold":true},"insert":"FluentEditor"},{"insert":"!"}]}'
17
+ }
18
+ }
19
+ }
20
+ </script>
@@ -0,0 +1,39 @@
1
+ <template>
2
+ <div>
3
+ <tiny-fluent-editor v-model="content" :image-upload="imageUpload"></tiny-fluent-editor>
4
+ 内容:<br />
5
+ {{ content }}
6
+ </div>
7
+ </template>
8
+
9
+ <script setup>
10
+ import { ref } from 'vue'
11
+ import { Modal } from '@opentiny/vue'
12
+ import { TinyFluentEditor } from '@opentiny/vue'
13
+
14
+ const content = ref('{"ops":[{"insert":"Hello "},{"attributes":{"bold":true},"insert":"FluentEditor"},{"insert":"!"}]}')
15
+ const imageUpload = {
16
+ url: 'https://run.mocky.io/v3/f34365b4-679d-4e8f-8313-ddb11d6750be',
17
+ method: 'POST',
18
+ name: 'image',
19
+ withCredentials: true,
20
+ headers: {},
21
+ success: (serverResponse, next) => {
22
+ let file = {}
23
+
24
+ // eslint-disable-next-line no-unreachable-loop
25
+ for (const key in serverResponse) {
26
+ file = serverResponse[key]
27
+ break
28
+ }
29
+
30
+ next(file.downloadUrl)
31
+ },
32
+ fail: (serverError) => {
33
+ Modal.message({
34
+ message: `上传失败回调事件:${serverError}`,
35
+ status: 'info'
36
+ })
37
+ }
38
+ }
39
+ </script>