@opentiny/vue-docs 3.28.1 → 3.30.0

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 (285) hide show
  1. package/demos/apis/action-menu.js +22 -0
  2. package/demos/apis/alert.js +19 -22
  3. package/demos/apis/button-group.js +15 -0
  4. package/demos/apis/calendar-view.js +5 -5
  5. package/demos/apis/cascader-view.js +5 -5
  6. package/demos/apis/dialog-box.js +39 -38
  7. package/demos/apis/drawer.js +31 -0
  8. package/demos/apis/dropdown.js +39 -1
  9. package/demos/apis/filter-panel.js +21 -1
  10. package/demos/apis/fluent-editor.js +30 -0
  11. package/demos/apis/form.js +11 -0
  12. package/demos/apis/fullscreen.js +10 -11
  13. package/demos/apis/grid.js +131 -16
  14. package/demos/apis/guide.js +14 -0
  15. package/demos/apis/link.js +11 -0
  16. package/demos/apis/message.js +48 -22
  17. package/demos/apis/modal.js +34 -31
  18. package/demos/apis/notify.js +13 -13
  19. package/demos/apis/rate.js +15 -0
  20. package/demos/apis/search-box.js +343 -0
  21. package/demos/apis/select.js +14 -2
  22. package/demos/apis/tag-input.js +182 -0
  23. package/demos/apis/tree.js +23 -23
  24. package/demos/mobile-first/app/button-group/display-mode.vue +31 -0
  25. package/demos/mobile-first/app/button-group/webdoc/button-group.js +13 -0
  26. package/demos/mobile-first/app/calendar-view/webdoc/calendar-view.js +5 -4
  27. package/demos/mobile-first/app/modal/webdoc/modal.js +2 -1
  28. package/demos/pc/app/alert/center.spec.ts +8 -0
  29. package/demos/pc/app/alert/custom-close.spec.ts +39 -9
  30. package/demos/pc/app/alert/icon.spec.ts +18 -7
  31. package/demos/pc/app/alert/show-icon.spec.ts +1 -1
  32. package/demos/pc/app/anchor/webdoc/anchor.js +1 -0
  33. package/demos/pc/app/base-select/copy-multi.spec.ts +1 -1
  34. package/demos/pc/app/button-group/display-mode-composition-api.vue +23 -0
  35. package/demos/pc/app/button-group/display-mode.spec.ts +0 -0
  36. package/demos/pc/app/button-group/display-mode.vue +31 -0
  37. package/demos/pc/app/button-group/sup-composition-api.vue +1 -0
  38. package/demos/pc/app/button-group/sup.vue +1 -0
  39. package/demos/pc/app/button-group/webdoc/button-group.js +14 -0
  40. package/demos/pc/app/calendar-view/calendar-event.spec.ts +1 -1
  41. package/demos/pc/app/calendar-view/custom-day-bg-color.vue +10 -0
  42. package/demos/pc/app/calendar-view/webdoc/calendar-view.js +4 -4
  43. package/demos/pc/app/cascader/filter-mode-composition-api.vue +2 -3
  44. package/demos/pc/app/checkbox/checked-composition-api.vue +3 -3
  45. package/demos/pc/app/checkbox/checked.vue +3 -3
  46. package/demos/pc/app/date-picker/align.spec.ts +10 -13
  47. package/demos/pc/app/date-picker/clear.spec.ts +3 -3
  48. package/demos/pc/app/date-picker/default-value.spec.ts +4 -4
  49. package/demos/pc/app/date-picker/events.spec.ts +2 -2
  50. package/demos/pc/app/date-picker/format.spec.ts +3 -3
  51. package/demos/pc/app/date-picker/now.spec.ts +4 -4
  52. package/demos/pc/app/date-picker/shortcuts.spec.ts +1 -1
  53. package/demos/pc/app/date-picker/slot.spec.ts +5 -5
  54. package/demos/pc/app/dialog-box/basic-usage.spec.ts +5 -5
  55. package/demos/pc/app/dialog-box/form-in-dialog.spec.ts +1 -2
  56. package/demos/pc/app/drawer/basic-usage.spec.ts +4 -3
  57. package/demos/pc/app/drawer/close-on-press-escape.spec.ts +4 -2
  58. package/demos/pc/app/drawer/placement.spec.ts +4 -4
  59. package/demos/pc/app/drawer/show-header.spec.ts +3 -2
  60. package/demos/pc/app/drawer/webdoc/drawer.js +3 -2
  61. package/demos/pc/app/dropdown/show-icon-composition-api.vue +1 -1
  62. package/demos/pc/app/dropdown/show-icon.vue +1 -1
  63. package/demos/pc/app/dropdown/tip-composition-api.vue +5 -2
  64. package/demos/pc/app/dropdown/tip.vue +5 -2
  65. package/demos/pc/app/dropdown/webdoc/dropdown.js +2 -2
  66. package/demos/pc/app/filter-panel/size-composition-api.vue +58 -0
  67. package/demos/pc/app/filter-panel/size.spec.ts +23 -0
  68. package/demos/pc/app/filter-panel/size.vue +68 -0
  69. package/demos/pc/app/filter-panel/webdoc/filter-panel.js +13 -0
  70. package/demos/pc/app/flowchart/basic-usage-composition-api.vue +10 -260
  71. package/demos/pc/app/flowchart/basic-usage.spec.ts +2 -1
  72. package/demos/pc/app/flowchart/basic-usage.vue +4 -249
  73. package/demos/pc/app/flowchart/slots-composition-api.vue +182 -0
  74. package/demos/pc/app/flowchart/slots.spec.ts +24 -0
  75. package/demos/pc/app/flowchart/slots.vue +193 -0
  76. package/demos/pc/app/flowchart/webdoc/flowchart.js +14 -2
  77. package/demos/pc/app/form/basic-usage.spec.ts +6 -4
  78. package/demos/pc/app/form/custom-validation-string-length-composition-api.vue +38 -0
  79. package/demos/pc/app/form/custom-validation-string-length.spec.ts +18 -0
  80. package/demos/pc/app/form/custom-validation-string-length.vue +28 -13
  81. package/demos/pc/app/form/group-form-composition-api.vue +2 -2
  82. package/demos/pc/app/form/group-form.vue +2 -2
  83. package/demos/pc/app/grid/filter/advanced-filter-composition-api.vue +1 -1
  84. package/demos/pc/app/grid/filter/advanced-filter.spec.js +1 -0
  85. package/demos/pc/app/grid/filter/advanced-filter.vue +1 -1
  86. package/demos/pc/app/grid/filter/custom-filter-composition-api.vue +46 -23
  87. package/demos/pc/app/grid/filter/custom-filter.spec.js +1 -1
  88. package/demos/pc/app/grid/filter/custom-filter.vue +47 -24
  89. package/demos/pc/app/grid/filter/default-filter-composition-api.vue +5 -1
  90. package/demos/pc/app/grid/filter/default-filter.spec.ts +1 -0
  91. package/demos/pc/app/grid/filter/default-filter.vue +4 -1
  92. package/demos/pc/app/grid/filter/filter-label-value-composition-api.vue +71 -0
  93. package/demos/pc/app/grid/filter/filter-label-value.spec.ts +27 -0
  94. package/demos/pc/app/grid/filter/filter-label-value.vue +78 -0
  95. package/demos/pc/app/grid/filter/input-filter-custom-component-composition-api.vue +116 -0
  96. package/demos/pc/app/grid/filter/input-filter-custom-component.spec.ts +20 -0
  97. package/demos/pc/app/grid/filter/input-filter-custom-component.vue +126 -0
  98. package/demos/pc/app/grid/filter/layout-order-filter-composition-api.vue +114 -0
  99. package/demos/pc/app/grid/filter/layout-order-filter.spec.ts +31 -0
  100. package/demos/pc/app/grid/filter/layout-order-filter.vue +123 -0
  101. package/demos/pc/app/grid/toolbar/custom-toolbar.spec.js +1 -1
  102. package/demos/pc/app/grid/webdoc/grid-filter.js +89 -40
  103. package/demos/pc/app/guide/show-close-composition-api.vue +77 -0
  104. package/demos/pc/app/guide/show-close.spec.ts +37 -0
  105. package/demos/pc/app/guide/show-close.vue +84 -0
  106. package/demos/pc/app/guide/webdoc/guide.js +12 -0
  107. package/demos/pc/app/icon/advance-icons.js +108 -2
  108. package/demos/pc/app/icon/advance-usage-composition-api.vue +26 -1
  109. package/demos/pc/app/icon/advance-usage.vue +27 -1
  110. package/demos/pc/app/icon/webdoc/icon.js +5 -3
  111. package/demos/pc/app/input/resize.spec.ts +2 -2
  112. package/demos/pc/app/link/custom-icon-composition-api.vue +1 -1
  113. package/demos/pc/app/link/custom-icon.vue +1 -1
  114. package/demos/pc/app/link/target-composition-api.vue +24 -0
  115. package/demos/pc/app/link/target.spec.ts +41 -0
  116. package/demos/pc/app/link/target.vue +30 -0
  117. package/demos/pc/app/link/webdoc/link.js +14 -0
  118. package/demos/pc/app/message/basic-usage-composition-api.vue +48 -0
  119. package/demos/pc/app/message/basic-usage.spec.ts +27 -0
  120. package/demos/pc/app/message/basic-usage.vue +50 -0
  121. package/demos/pc/app/message/message-close-composition-api.vue +25 -0
  122. package/demos/pc/app/message/message-close.spec.ts +9 -0
  123. package/demos/pc/app/message/message-close.vue +32 -0
  124. package/demos/pc/app/message/message-duration-composition-api.vue +25 -0
  125. package/demos/pc/app/message/message-duration.spec.ts +9 -0
  126. package/demos/pc/app/message/message-duration.vue +32 -0
  127. package/demos/pc/app/message/prevent-duplicate-composition-api.vue +25 -0
  128. package/demos/pc/app/message/prevent-duplicate.spec.ts +9 -0
  129. package/demos/pc/app/message/prevent-duplicate.vue +32 -0
  130. package/demos/pc/app/message/webdoc/message.cn.md +7 -0
  131. package/demos/pc/app/message/webdoc/message.en.md +7 -0
  132. package/demos/pc/app/message/webdoc/message.js +56 -0
  133. package/demos/pc/app/modal/basic-usage.spec.ts +3 -3
  134. package/demos/pc/app/modal/modal-footer-composition-api.vue +3 -3
  135. package/demos/pc/app/modal/modal-footer.spec.ts +9 -4
  136. package/demos/pc/app/modal/modal-footer.vue +3 -3
  137. package/demos/pc/app/modal/modal-header.spec.ts +2 -2
  138. package/demos/pc/app/modal/modal-size.spec.ts +2 -2
  139. package/demos/pc/app/modal/status.spec.ts +22 -15
  140. package/demos/pc/app/nav-menu/overflow.spec.ts +1 -1
  141. package/demos/pc/app/popconfirm/custom-class.spec.ts +0 -1
  142. package/demos/pc/app/popconfirm/slot-message.spec.ts +10 -2
  143. package/demos/pc/app/popconfirm/trigger.spec.ts +16 -12
  144. package/demos/pc/app/popover/basic-usage.spec.js +3 -8
  145. package/demos/pc/app/popover/custom-popper.spec.js +2 -2
  146. package/demos/pc/app/popover/delay.spec.js +2 -2
  147. package/demos/pc/app/popover/disabled.spec.js +2 -2
  148. package/demos/pc/app/popover/events.spec.js +1 -1
  149. package/demos/pc/app/popover/ignore-boundaries.spec.js +2 -3
  150. package/demos/pc/app/popover/offset.spec.js +17 -31
  151. package/demos/pc/app/radio/dynamic-disable-composition-api.vue +3 -3
  152. package/demos/pc/app/radio/dynamic-disable.vue +2 -2
  153. package/demos/pc/app/rate/clearable-composition-api.vue +20 -0
  154. package/demos/pc/app/rate/clearable.spec.js +74 -0
  155. package/demos/pc/app/rate/clearable.vue +28 -0
  156. package/demos/pc/app/rate/webdoc/rate.js +12 -0
  157. package/demos/pc/app/search/events.spec.ts +1 -1
  158. package/demos/pc/app/search-box/append-to-body-composition-api.vue +300 -0
  159. package/demos/pc/app/search-box/append-to-body.vue +308 -0
  160. package/demos/pc/app/search-box/auto-match-composition-api.vue +162 -0
  161. package/demos/pc/app/search-box/auto-match.vue +170 -0
  162. package/demos/pc/app/search-box/basic-usage-composition-api.vue +269 -0
  163. package/demos/pc/app/search-box/basic-usage.vue +277 -0
  164. package/demos/pc/app/search-box/custom-panel-composition-api.vue +63 -0
  165. package/demos/pc/app/search-box/custom-panel.vue +72 -0
  166. package/demos/pc/app/search-box/default-field-composition-api.vue +163 -0
  167. package/demos/pc/app/search-box/default-field.vue +171 -0
  168. package/demos/pc/app/search-box/editable-composition-api.vue +311 -0
  169. package/demos/pc/app/search-box/editable.vue +320 -0
  170. package/demos/pc/app/search-box/empty-placeholder-composition-api.vue +162 -0
  171. package/demos/pc/app/search-box/empty-placeholder.vue +170 -0
  172. package/demos/pc/app/search-box/events-composition-api.vue +169 -0
  173. package/demos/pc/app/search-box/events.vue +173 -0
  174. package/demos/pc/app/search-box/group-key-composition-api.vue +257 -0
  175. package/demos/pc/app/search-box/group-key.vue +266 -0
  176. package/demos/pc/app/search-box/help-composition-api.vue +166 -0
  177. package/demos/pc/app/search-box/help.vue +175 -0
  178. package/demos/pc/app/search-box/id-map-key-composition-api.vue +131 -0
  179. package/demos/pc/app/search-box/id-map-key.vue +140 -0
  180. package/demos/pc/app/search-box/item-placeholder-composition-api.vue +119 -0
  181. package/demos/pc/app/search-box/item-placeholder.vue +127 -0
  182. package/demos/pc/app/search-box/max-length-composition-api.vue +29 -0
  183. package/demos/pc/app/search-box/max-length.vue +38 -0
  184. package/demos/pc/app/search-box/max-time-length-composition-api.vue +53 -0
  185. package/demos/pc/app/search-box/max-time-length.vue +62 -0
  186. package/demos/pc/app/search-box/merge-tag-composition-api.vue +59 -0
  187. package/demos/pc/app/search-box/merge-tag.vue +68 -0
  188. package/demos/pc/app/search-box/panel-max-height-composition-api.vue +162 -0
  189. package/demos/pc/app/search-box/panel-max-height.vue +170 -0
  190. package/demos/pc/app/search-box/potential-match-composition-api.vue +193 -0
  191. package/demos/pc/app/search-box/potential-match.vue +201 -0
  192. package/demos/pc/app/search-box/settings-composition-api.vue +163 -0
  193. package/demos/pc/app/search-box/settings.vue +171 -0
  194. package/demos/pc/app/search-box/size-composition-api.vue +162 -0
  195. package/demos/pc/app/search-box/size.vue +170 -0
  196. package/demos/pc/app/search-box/split-input-value-composition-api.vue +162 -0
  197. package/demos/pc/app/search-box/split-input-value.vue +170 -0
  198. package/demos/pc/app/search-box/suffix-icon-composition-api.vue +209 -0
  199. package/demos/pc/app/search-box/suffix-icon.vue +219 -0
  200. package/demos/pc/app/search-box/v-model-composition-api.vue +174 -0
  201. package/demos/pc/app/search-box/v-model.vue +182 -0
  202. package/demos/pc/app/search-box/webdoc/search-box.cn.md +7 -0
  203. package/demos/pc/app/search-box/webdoc/search-box.en.md +7 -0
  204. package/demos/pc/app/search-box/webdoc/search-box.js +257 -0
  205. package/demos/pc/app/select/copy-multi.spec.ts +1 -1
  206. package/demos/pc/app/select-wrapper/copy-multi.spec.ts +2 -1
  207. package/demos/pc/app/tabs/basic-usage.spec.ts +2 -2
  208. package/demos/pc/app/tabs/more-show-all.spec.ts +2 -1
  209. package/demos/pc/app/tabs/tabs-events-close-composition-api.vue +8 -2
  210. package/demos/pc/app/tabs/tabs-events-close.vue +8 -2
  211. package/demos/pc/app/tag/basic-usage.spec.ts +1 -1
  212. package/demos/pc/app/tag/color-border.spec.ts +2 -2
  213. package/demos/pc/app/tag/max-width.spec.ts +1 -1
  214. package/demos/pc/app/tag/size.spec.ts +3 -3
  215. package/demos/pc/app/tag/slot-default.spec.ts +3 -3
  216. package/demos/pc/app/tag-group/basic-usage.spec.js +5 -5
  217. package/demos/pc/app/tag-group/tag-group-effect.spec.js +10 -10
  218. package/demos/pc/app/tag-group/tag-group-event.spec.js +1 -1
  219. package/demos/pc/app/tag-input/basic-usage-composition-api.vue +29 -0
  220. package/demos/pc/app/tag-input/basic-usage.spec.ts +0 -0
  221. package/demos/pc/app/tag-input/basic-usage.vue +38 -0
  222. package/demos/pc/app/tag-input/clearable-tag-composition-api.vue +20 -0
  223. package/demos/pc/app/tag-input/clearable-tag.vue +27 -0
  224. package/demos/pc/app/tag-input/collapsed-tag-composition-api.vue +20 -0
  225. package/demos/pc/app/tag-input/collapsed-tag.vue +28 -0
  226. package/demos/pc/app/tag-input/disabled-readonly-composition-api.vue +20 -0
  227. package/demos/pc/app/tag-input/disabled-readonly.vue +29 -0
  228. package/demos/pc/app/tag-input/draggable-tag-composition-api.vue +12 -0
  229. package/demos/pc/app/tag-input/draggable-tag.spec.ts +0 -0
  230. package/demos/pc/app/tag-input/draggable-tag.vue +20 -0
  231. package/demos/pc/app/tag-input/max-composition-api.vue +20 -0
  232. package/demos/pc/app/tag-input/max.vue +28 -0
  233. package/demos/pc/app/tag-input/prefix-suffix-composition-api.vue +26 -0
  234. package/demos/pc/app/tag-input/prefix-suffix.vue +34 -0
  235. package/demos/pc/app/tag-input/separator-tag-composition-api.vue +20 -0
  236. package/demos/pc/app/tag-input/separator-tag.vue +28 -0
  237. package/demos/pc/app/tag-input/webdoc/tag-input.cn.md +7 -0
  238. package/demos/pc/app/tag-input/webdoc/tag-input.en.md +7 -0
  239. package/demos/pc/app/tag-input/webdoc/tag-input.js +107 -0
  240. package/demos/pc/app/time-picker/basic-usage.spec.ts +5 -4
  241. package/demos/pc/app/time-picker/clearable.spec.ts +5 -4
  242. package/demos/pc/app/time-picker/default-value.spec.ts +2 -2
  243. package/demos/pc/app/time-picker/disabled.spec.ts +4 -3
  244. package/demos/pc/app/time-picker/format.spec.ts +8 -11
  245. package/demos/pc/app/time-picker/is-range.spec.ts +4 -3
  246. package/demos/pc/app/time-picker/name.spec.ts +1 -1
  247. package/demos/pc/app/time-picker/placeholder.spec.ts +3 -3
  248. package/demos/pc/app/time-picker/popper-class.spec.ts +1 -1
  249. package/demos/pc/app/time-picker/size.spec.ts +2 -1
  250. package/demos/pc/app/time-select/basic-usage.spec.ts +1 -1
  251. package/demos/pc/app/time-select/clear-icon.spec.ts +1 -2
  252. package/demos/pc/app/time-select/focus.spec.ts +1 -1
  253. package/demos/pc/app/time-select/picker-options.spec.ts +2 -1
  254. package/demos/pc/app/time-select/range-placeholder.spec.ts +2 -2
  255. package/demos/pc/app/time-select/size-medium.spec.ts +3 -3
  256. package/demos/pc/app/tooltip/delay.spec.js +7 -9
  257. package/demos/pc/app/tooltip/offset.spec.js +0 -2
  258. package/demos/pc/app/tooltip/popper-options.spec.js +2 -1
  259. package/demos/pc/menus.js +6 -4
  260. package/demos/pc/webdoc/changelog-en.md +209 -86
  261. package/demos/pc/webdoc/changelog.md +176 -257
  262. package/demos/pc/webdoc/develop-demo-en.md +13 -13
  263. package/demos/pc/webdoc/import-components.md +1 -1
  264. package/demos/pc/webdoc/introduce.md +2 -0
  265. package/demos/pc/webdoc/skills-en.md +107 -0
  266. package/demos/pc/webdoc/skills.md +107 -0
  267. package/demos/pc/webdoc/theme-en.md +82 -79
  268. package/demos/pc/webdoc/v3.28.0-release-article.md +943 -0
  269. package/demos/saas/menus.js +1 -0
  270. package/package.json +21 -20
  271. package/playground/App.vue +6 -4
  272. package/playground/shims/vue-search-box.mjs +154 -0
  273. package/public/static/css/mobile-dark-theme.css +1 -0
  274. package/src/i18n/index.js +1 -2
  275. package/src/main.js +8 -5
  276. package/src/style.css +5 -0
  277. package/src/views/components-doc/common.vue +0 -25
  278. package/src/views/components-doc/mobile.vue +49 -2
  279. package/vite.config.ts +3 -2
  280. package/vite.extend.ts +65 -0
  281. package/demos/pc/app/grid/webdoc/grid-ai-agent.js +0 -23
  282. package/demos/pc/webdoc/mcp-en.md +0 -101
  283. package/demos/pc/webdoc/mcp.md +0 -101
  284. package/src/components/mcp-docs.vue +0 -33
  285. package/src/composable/useTinyRemoter.ts +0 -176
@@ -0,0 +1,25 @@
1
+ <template>
2
+ <div>
3
+ <div class="content">
4
+ <tiny-button @click="btnClick">显示关闭按钮</tiny-button>
5
+ </div>
6
+ </div>
7
+ </template>
8
+
9
+ <script setup>
10
+ import { Button as TinyButton, Message } from '@opentiny/vue'
11
+
12
+ function btnClick() {
13
+ Message.message({
14
+ status: 'info',
15
+ message: '是否显示关闭按钮',
16
+ messageClosable: true
17
+ })
18
+ }
19
+ </script>
20
+
21
+ <style scoped>
22
+ .content {
23
+ margin: 8px;
24
+ }
25
+ </style>
@@ -0,0 +1,9 @@
1
+ import { test, expect } from '@playwright/test'
2
+
3
+ test('消息的关闭和延时', async ({ page }) => {
4
+ page.on('pageerror', (exception) => expect(exception).toBeNull())
5
+ await page.goto('message#message-close')
6
+ await page.getByRole('button', { name: '显示关闭按钮' }).click()
7
+ const info = page.locator('div').filter({ hasText: /是否显示关闭按钮/ })
8
+ await expect(info.nth(1)).toHaveText(/是否显示关闭按钮/)
9
+ })
@@ -0,0 +1,32 @@
1
+ <template>
2
+ <div>
3
+ <div class="content">
4
+ <tiny-button @click="btnClick">显示关闭按钮</tiny-button>
5
+ </div>
6
+ </div>
7
+ </template>
8
+
9
+ <script>
10
+ import { Button, Message } from '@opentiny/vue'
11
+
12
+ export default {
13
+ components: {
14
+ TinyButton: Button
15
+ },
16
+ methods: {
17
+ btnClick() {
18
+ Message.message({
19
+ status: 'info',
20
+ message: '是否显示关闭按钮',
21
+ messageClosable: true
22
+ })
23
+ }
24
+ }
25
+ }
26
+ </script>
27
+
28
+ <style scoped>
29
+ .content {
30
+ margin: 8px;
31
+ }
32
+ </style>
@@ -0,0 +1,25 @@
1
+ <template>
2
+ <div>
3
+ <div class="content">
4
+ <tiny-button @click="btnClick">消息时长</tiny-button>
5
+ </div>
6
+ </div>
7
+ </template>
8
+
9
+ <script setup>
10
+ import { Button as TinyButton, Message } from '@opentiny/vue'
11
+
12
+ function btnClick() {
13
+ Message.message({
14
+ status: 'info',
15
+ message: '自定义消息的内容,5s 后得自动关闭',
16
+ duration: 5000
17
+ })
18
+ }
19
+ </script>
20
+
21
+ <style scoped>
22
+ .content {
23
+ margin: 8px;
24
+ }
25
+ </style>
@@ -0,0 +1,9 @@
1
+ import { test, expect } from '@playwright/test'
2
+
3
+ test('消息的关闭和延时', async ({ page }) => {
4
+ page.on('pageerror', (exception) => expect(exception).toBeNull())
5
+ await page.goto('message#message-duration')
6
+ await page.getByRole('button', { name: '消息时长' }).click()
7
+ const info = page.locator('div').filter({ hasText: /5s 后得自动关闭/ })
8
+ await expect(info.nth(1)).toHaveText(/5s 后得自动关闭/)
9
+ })
@@ -0,0 +1,32 @@
1
+ <template>
2
+ <div>
3
+ <div class="content">
4
+ <tiny-button @click="btnClick">消息时长</tiny-button>
5
+ </div>
6
+ </div>
7
+ </template>
8
+
9
+ <script>
10
+ import { Button, Message } from '@opentiny/vue'
11
+
12
+ export default {
13
+ components: {
14
+ TinyButton: Button
15
+ },
16
+ methods: {
17
+ btnClick() {
18
+ Message.message({
19
+ status: 'info',
20
+ message: '自定义消息的内容,5s 后得自动关闭',
21
+ duration: 5000
22
+ })
23
+ }
24
+ }
25
+ }
26
+ </script>
27
+
28
+ <style scoped>
29
+ .content {
30
+ margin: 8px;
31
+ }
32
+ </style>
@@ -0,0 +1,25 @@
1
+ <template>
2
+ <div>
3
+ <div class="content">
4
+ <tiny-button @click="btnClick">重复点击不出现多个</tiny-button>
5
+ </div>
6
+ </div>
7
+ </template>
8
+
9
+ <script setup>
10
+ import { Button as TinyButton, Message } from '@opentiny/vue'
11
+
12
+ function btnClick() {
13
+ Message.message({
14
+ status: 'info',
15
+ message: '自定义消息具有唯一 id,所以不会重复出现',
16
+ id: 'unique'
17
+ })
18
+ }
19
+ </script>
20
+
21
+ <style scoped>
22
+ .content {
23
+ margin: 8px;
24
+ }
25
+ </style>
@@ -0,0 +1,9 @@
1
+ import { test, expect } from '@playwright/test'
2
+
3
+ test('防止重复消息提示', async ({ page }) => {
4
+ page.on('pageerror', (exception) => expect(exception).toBeNull())
5
+ await page.goto('message#prevent-duplicate')
6
+ await page.getByRole('button', { name: '重复点击不出现多个' }).click()
7
+ const info = await page.locator('div').filter({ hasText: '自定义消息具有唯一 id,所以不会重复出现' })
8
+ await expect(info.nth(1)).toHaveText(/唯一 id/)
9
+ })
@@ -0,0 +1,32 @@
1
+ <template>
2
+ <div>
3
+ <div class="content">
4
+ <tiny-button @click="btnClick" :reset-time="0">重复点击不出现多个</tiny-button>
5
+ </div>
6
+ </div>
7
+ </template>
8
+
9
+ <script>
10
+ import { Button, Message } from '@opentiny/vue'
11
+
12
+ export default {
13
+ components: {
14
+ TinyButton: Button
15
+ },
16
+ methods: {
17
+ btnClick() {
18
+ Message.message({
19
+ status: 'info',
20
+ message: '自定义消息具有唯一 id,所以不会重复出现',
21
+ id: 'unique'
22
+ })
23
+ }
24
+ }
25
+ }
26
+ </script>
27
+
28
+ <style scoped>
29
+ .content {
30
+ margin: 8px;
31
+ }
32
+ </style>
@@ -0,0 +1,7 @@
1
+ ---
2
+ title: Message 消息提示
3
+ ---
4
+
5
+ # Message 消息提示
6
+
7
+ <div>展示反馈/消息提示信息。</div>
@@ -0,0 +1,7 @@
1
+ ---
2
+ title: Message Message Prompt
3
+ ---
4
+
5
+ # Message Message Prompt
6
+
7
+ <div>Display feedback/message prompt information.</div>
@@ -0,0 +1,56 @@
1
+ export default {
2
+ column: '2',
3
+ owner: '',
4
+ show: true,
5
+ cloud: true,
6
+ demos: [
7
+ {
8
+ demoId: 'basic-usage',
9
+ name: {
10
+ 'zh-CN': '基本用法',
11
+ 'en-US': 'Basic Usage'
12
+ },
13
+ desc: {
14
+ 'zh-CN': `通过<code>status</code>属性设置组件状态,可选值有<code>info</code>、<code>success</code>、<code>warning</code>、<code>error</code>、<code>loading</code>五种状态。<code>message</code> 属性设置提示信息。`,
15
+ 'en-US': `Set the component status via the <code>status</code> attribute, with optional values including <code>info</code>, <code>success</code>, <code>warning</code>, <code>error</code>, and <code>loading</code>. The <code>message</code> attribute sets the prompt information.`
16
+ },
17
+ codeFiles: ['basic-usage.vue']
18
+ },
19
+ {
20
+ demoId: 'message-duration',
21
+ name: {
22
+ 'zh-CN': '自定义时长',
23
+ 'en-US': 'Custom Duration'
24
+ },
25
+ desc: {
26
+ 'zh-CN': `<code>duration</code> 属性用于设置消息提示的显示时长,单位为毫秒。`,
27
+ 'en-US': `The <code>duration</code> attribute is used to set the display duration of the message prompt, in milliseconds.`
28
+ },
29
+ codeFiles: ['message-duration.vue']
30
+ },
31
+ {
32
+ demoId: 'message-close',
33
+ name: {
34
+ 'zh-CN': '消息显示关闭按钮',
35
+ 'en-US': 'Message Close Button'
36
+ },
37
+ desc: {
38
+ 'zh-CN': `<code>message-closable</code> 属性用于设置消息提示是否可关闭。`,
39
+ 'en-US': `The <code>message-closable</code> attribute is used to set whether the message prompt can be closed.`
40
+ },
41
+ codeFiles: ['message-close.vue']
42
+ },
43
+ {
44
+ demoId: 'prevent-duplicate',
45
+ name: {
46
+ 'zh-CN': '防止重复消息提示',
47
+ 'en-US': 'Prevent Duplicate Message Prompts'
48
+ },
49
+ desc: {
50
+ 'zh-CN': `<code>id</code> 属性设置防止重复提示。`,
51
+ 'en-US': `The <code>id</code> attribute is set to prevent duplicate prompts.`
52
+ },
53
+ codeFiles: ['prevent-duplicate.vue']
54
+ }
55
+ ]
56
+ }
@@ -5,7 +5,7 @@ test('基本用法', async ({ page }) => {
5
5
  await page.goto('modal#basic-usage')
6
6
 
7
7
  const modal = page.locator('.tiny-modal__status-wrapper svg').first()
8
- const content = page.locator('.tiny-modal__content')
8
+ const content = page.locator('.tiny-modal.type__alert.is__visible')
9
9
 
10
10
  // 基本提示框
11
11
  await page.getByRole('button', { name: '基本提示框' }).click()
@@ -24,11 +24,11 @@ test('基本用法', async ({ page }) => {
24
24
 
25
25
  // 打开弹窗 1
26
26
  await page.getByRole('button', { name: '打开弹窗 1' }).click()
27
- await expect(content.nth(1)).toHaveText(/窗口内容1/)
27
+ await expect(content).toHaveText(/窗口内容1/)
28
28
  await page.getByRole('button', { name: '确定' }).click()
29
29
 
30
30
  // 打开弹窗 2
31
31
  await page.getByRole('button', { name: '打开弹窗 2' }).click()
32
- await expect(content.nth(2)).toHaveText(/窗口内容2/)
32
+ await expect(content).toHaveText(/窗口内容2/)
33
33
  await page.getByRole('button', { name: '确定' }).click()
34
34
  })
@@ -2,11 +2,11 @@
2
2
  <div>
3
3
  <h2>函数式调用</h2>
4
4
  <div class="content">
5
- <tiny-button @click="btnClick">自定义弹窗底部</tiny-button>
5
+ <tiny-button @click="btnClick">函数式自定义弹窗底部</tiny-button>
6
6
  </div>
7
7
  <h2>标签式调用</h2>
8
8
  <div class="content">
9
- <tiny-button @click="openModal">自定义弹窗底部</tiny-button>
9
+ <tiny-button @click="openModal">标签式自定义弹窗底部</tiny-button>
10
10
  <tiny-modal
11
11
  v-model="show"
12
12
  type="confirm"
@@ -20,7 +20,7 @@
20
20
  </div>
21
21
  <h2>#foot 插槽</h2>
22
22
  <div class="content">
23
- <tiny-button @click="openModal_1">自定义弹窗底部</tiny-button>
23
+ <tiny-button @click="openModal_1">插槽自定义弹窗底部</tiny-button>
24
24
  <tiny-modal
25
25
  v-model="show1"
26
26
  type="confirm"
@@ -3,13 +3,18 @@ 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('modal#modal-footer')
6
- const footer = page.locator('.tiny-modal__footer')
6
+ const footer = page.locator('.tiny-modal__footer > .tiny-button--info')
7
+ const footerLink = page.locator('.tiny-link--primary')
7
8
 
8
9
  // 自定义弹窗底部
9
- await page.getByRole('button', { name: '自定义弹窗底部' }).first().click()
10
+ await page.getByRole('button', { name: '函数式自定义弹窗底部' }).click()
10
11
  await expect(footer.first()).toHaveText(/Okk/)
11
12
  await page.getByRole('button', { name: 'Okk~~' }).click()
12
13
 
13
- await page.getByRole('button', { name: '自定义弹窗底部' }).nth(2).click()
14
- await expect(footer.nth(1)).toHaveText(/返回/)
14
+ await page.getByRole('button', { name: '标签式自定义弹窗底部' }).click()
15
+ await expect(footer.first()).toHaveText(/Okk/)
16
+ await page.getByRole('button', { name: 'Okk~~' }).click()
17
+
18
+ await page.getByRole('button', { name: '插槽自定义弹窗底部' }).click()
19
+ await expect(footerLink.first()).toHaveText(/返回/)
15
20
  })
@@ -2,11 +2,11 @@
2
2
  <div>
3
3
  <h2>函数式调用</h2>
4
4
  <div class="content">
5
- <tiny-button @click="btnClick">自定义弹窗底部</tiny-button>
5
+ <tiny-button @click="btnClick">函数式自定义弹窗底部</tiny-button>
6
6
  </div>
7
7
  <h2>标签式调用</h2>
8
8
  <div class="content">
9
- <tiny-button @click="openModal">自定义弹窗底部</tiny-button>
9
+ <tiny-button @click="openModal">标签式自定义弹窗底部</tiny-button>
10
10
  <tiny-modal
11
11
  v-model="show"
12
12
  type="confirm"
@@ -20,7 +20,7 @@
20
20
  </div>
21
21
  <h2>#foot 插槽</h2>
22
22
  <div class="content">
23
- <tiny-button @click="openModal_1">自定义弹窗底部</tiny-button>
23
+ <tiny-button @click="openModal_1">插槽自定义弹窗底部</tiny-button>
24
24
  <tiny-modal
25
25
  v-model="show1"
26
26
  type="confirm"
@@ -4,10 +4,10 @@ test('自定义弹窗标题', async ({ page }) => {
4
4
  page.on('pageerror', (exception) => expect(exception).toBeNull())
5
5
  await page.goto('modal#modal-header')
6
6
  const demo = page.locator('#modal-header')
7
- const header = page.locator('.tiny-modal__title')
7
+ const header = page.locator('.tiny-modal.is__visible')
8
8
 
9
9
  // 自定义弹窗标题
10
10
  await demo.getByRole('button', { name: '自定义弹窗标题' }).first().click()
11
- await expect(header.first()).toHaveText(/自定义弹窗标题/)
11
+ await expect(header).toHaveText(/自定义弹窗标题/)
12
12
  await page.getByRole('button', { name: '确定' }).click()
13
13
  })
@@ -3,13 +3,13 @@ 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('modal#modal-size')
6
- const modal = page.locator('.tiny-modal')
6
+ const modal = page.locator('.status__question')
7
7
  const box = page.locator('.type__confirm > .tiny-modal__box')
8
8
  await page.getByRole('button', { name: '自定义弹窗大小' }).first().click()
9
9
  await expect(box.first()).toHaveCSS('width', '800px')
10
10
  await page.getByRole('button', { name: '确定' }).click()
11
11
 
12
12
  await page.getByRole('button', { name: '弹窗全屏' }).first().click()
13
- await expect(modal.nth(2)).toHaveClass(/is__maximize/)
13
+ await expect(modal).toHaveClass(/is__maximize/)
14
14
  await page.getByRole('button', { name: '确定' }).click()
15
15
  })
@@ -3,46 +3,53 @@ 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('modal#status')
6
- const modal = page.locator('.tiny-modal__status-wrapper svg').first()
7
- const message = page.locator('.type__message')
6
+ const modal = page.locator(
7
+ '.tiny-modal__wrapper.is__visible > .tiny-modal__box > .tiny-modal__header > .tiny-modal__status-wrapper > svg'
8
+ )
9
+ const message = page.locator('.type__message.is__visible')
8
10
 
9
11
  // 信息提示图标
10
12
  await page.getByRole('button', { name: '信息提示图标' }).first().click()
11
13
  await expect(modal).toHaveClass(/tiny-modal-svg__info/)
12
14
  await page.getByRole('button', { name: '确定' }).click()
13
- // ----消息状态示例----
14
- await page.getByRole('button', { name: '信息提示图标' }).nth(1).click()
15
- await expect(message).toHaveClass(/status__info/)
16
15
 
17
16
  // 成功提示图标
18
17
  await page.getByRole('button', { name: '成功提示图标' }).first().click()
19
18
  await expect(modal).toHaveClass(/tiny-modal-svg__success/)
20
19
  await page.getByRole('button', { name: '确定' }).click()
21
- // ----消息状态示例----
22
- await page.getByRole('button', { name: '成功提示图标' }).nth(1).click()
23
- await expect(message).toHaveClass(/status__success/)
24
20
 
25
21
  // 警告提示图标
26
22
  await page.getByRole('button', { name: '警告提示图标' }).first().click()
27
23
  await expect(modal).toHaveClass(/tiny-modal-svg__warning/)
28
24
  await page.getByRole('button', { name: '确定' }).click()
29
- // ----消息状态示例----
30
- await page.getByRole('button', { name: '警告提示图标' }).nth(1).click()
31
- await expect(message).toHaveClass(/status__warning/)
32
25
 
33
26
  // 错误提示图标
34
27
  await page.getByRole('button', { name: '错误提示图标' }).first().click()
35
28
  await expect(modal).toHaveClass(/tiny-svg tiny-modal-svg__error/)
36
29
  await page.getByRole('button', { name: '确定' }).click()
37
- // ----消息状态示例----
38
- await page.getByRole('button', { name: '错误提示图标' }).nth(1).click()
39
- await expect(message).toHaveClass(/status__error/)
40
30
 
41
31
  // 加载提示图标
42
32
  await page.getByRole('button', { name: '加载提示图标' }).first().click()
43
33
  await expect(modal).toHaveClass(/tiny-modal-svg__refresh/)
44
34
  await page.getByRole('button', { name: '确定' }).click()
35
+
36
+ // ----消息状态示例----
37
+ await page.getByRole('button', { name: '信息提示图标' }).nth(1).click()
38
+ await expect(message).toHaveClass(/status__info/)
39
+
40
+ // ----消息状态示例----
41
+ await page.getByRole('button', { name: '成功提示图标' }).nth(1).click()
42
+ await expect(message.nth(1)).toHaveClass(/status__success/)
43
+
44
+ // ----消息状态示例----
45
+ await page.getByRole('button', { name: '警告提示图标' }).nth(1).click()
46
+ await expect(message.nth(2)).toHaveClass(/status__warning/)
47
+
48
+ // ----消息状态示例----
49
+ await page.getByRole('button', { name: '错误提示图标' }).nth(1).click()
50
+ await expect(message.nth(3)).toHaveClass(/status__error/)
51
+
45
52
  // ----消息状态示例----
46
53
  await page.getByRole('button', { name: '加载提示图标' }).nth(1).click()
47
- await expect(message).toHaveClass(/status__loading/)
54
+ await expect(message.nth(4)).toHaveClass(/status__loading/)
48
55
  })
@@ -1,6 +1,6 @@
1
1
  import { test, expect } from '@playwright/test'
2
2
 
3
- test('显示策略', async ({ page }) => {
3
+ test('超出显示', async ({ page }) => {
4
4
  page.on('pageerror', (exception) => expect(exception).toBeNull())
5
5
  await page.goto('nav-menu#overflow')
6
6
  const preview = page.locator('#overflow')
@@ -10,7 +10,6 @@ test('自定义类名', async ({ page }) => {
10
10
  const confirmBtn = popConfirmPopover.getByRole('button', { name: '确定' })
11
11
 
12
12
  await popConfirm.hover()
13
- await expect(popConfirmPopover).toBeVisible()
14
13
  await expect(popConfirmPopover).toHaveClass(/custom-class/)
15
14
  await confirmBtn.click()
16
15
  await expect(popConfirmPopover).not.toBeVisible()
@@ -4,8 +4,16 @@ test('自定义消息内容', async ({ page }) => {
4
4
  page.on('pageerror', (exception) => expect(exception).toBeNull())
5
5
  await page.goto('popconfirm#slot-message')
6
6
 
7
+ // 等待页面加载完成
8
+ await page.waitForLoadState('networkidle')
7
9
  const demo = page.locator('#slot-message')
8
- const popconfirm = demo.locator('.tiny-popconfirm')
10
+ const triggerButton = demo.locator('.tiny-popconfirm .tiny-popconfirm__reference .tiny-button')
11
+ await triggerButton.hover()
12
+ const popover = page.locator('.tiny-popconfirm-popover[aria-hidden="false"]')
9
13
 
10
- await expect(popconfirm).toContainText('这是气泡确认框自定义提示内容文本描述。')
14
+ await expect(popover).toBeVisible()
15
+ // 验证内容
16
+ await expect(popover.locator('.tiny-popconfirm-popover__content')).toContainText(
17
+ '这是气泡确认框自定义提示内容文本描述'
18
+ )
11
19
  })
@@ -1,20 +1,24 @@
1
1
  import { test, expect } from '@playwright/test'
2
2
 
3
3
  test('触发方式', async ({ page }) => {
4
- page.on('pageerror', (exception) => expect(exception).toBeNull())
4
+ const pageErrors: Error[] = []
5
+ page.on('pageerror', (error) => pageErrors.push(error))
6
+
5
7
  await page.goto('popconfirm#trigger')
8
+ const demo = page.locator('#trigger')
6
9
 
7
- const hoverBtn = page.getByRole('button', { name: '鼠标悬停显示' })
8
- const clickBtn = page.getByRole('button', { name: '点击显示' })
9
- const popConfirmPopover = page.locator('body > .tiny-popconfirm-popover')
10
- const hoverValueBtn = page.getByRole('button', { name: '确定' })
10
+ // 点击按钮
11
+ const clickBtn = demo.locator('.tiny-popconfirm .tiny-popconfirm__reference .tiny-button').nth(1)
12
+ await clickBtn.click()
11
13
 
12
- await hoverBtn.hover()
13
- await page.waitForTimeout(100)
14
- await expect(popConfirmPopover.first()).toBeVisible()
15
- await hoverValueBtn.click()
16
- await page.waitForTimeout(100)
14
+ const visiblePopover = page.locator('.tiny-popconfirm-popover[aria-hidden="false"]')
17
15
 
18
- await clickBtn.click()
19
- await expect(popConfirmPopover.nth(1)).toBeVisible()
16
+ // 等待并验证可见
17
+ await expect(visiblePopover).toBeVisible({ timeout: 5000 })
18
+
19
+ // 验证标题样式
20
+ const title = visiblePopover.locator('.tiny-popconfirm-popover__header .tiny-popconfirm-popover__title')
21
+ await expect(title).toHaveCSS('font-weight', '600')
22
+
23
+ expect(pageErrors).toHaveLength(0)
20
24
  })
@@ -3,13 +3,8 @@ 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('popover#basic-usage')
6
+ await page.getByRole('button', { name: '点击我提示' }).click()
7
+ let title = page.getByRole('heading', { name: '标题' })
6
8
 
7
- let button = page.getByRole('button', { name: '点击我提示' })
8
- let pop = page.getByRole('tooltip', { name: /这是一段内容/ })
9
- let title = pop.locator('.tiny-popover__title')
10
-
11
- await button.click()
12
- await expect(pop).toBeVisible()
13
- await expect(pop).toHaveCSS('width', '200px')
14
- await expect(title).toHaveText('标题')
9
+ await expect(title).toHaveText(/标题/)
15
10
  })
@@ -5,10 +5,10 @@ test('延迟隐藏', async ({ page }) => {
5
5
  await page.goto('popover#custom-popper')
6
6
 
7
7
  const button1 = page.getByRole('button', { name: '左侧位置弹出' })
8
- const pop1 = page.getByRole('tooltip', { name: '我是一段内容' })
8
+ const pop1 = page.getByText('tooltip', { name: '我是一段内容' })
9
9
 
10
10
  const button2 = page.getByRole('button', { name: '没有弹窗小箭头' })
11
- const pop2 = page.getByRole('tooltip', { name: '我是一段内容' })
11
+ const pop2 = page.getByText('tooltip', { name: '我是一段内容' })
12
12
 
13
13
  const button3 = page.getByRole('button', { name: '覆盖字体样式' })
14
14
  const pop3 = page.locator('.custom-popover-demo-cls')
@@ -5,8 +5,8 @@ test('延迟显示', async ({ page }) => {
5
5
  await page.goto('popover#delay')
6
6
 
7
7
  let button = page.getByRole('button', { name: '两秒后打开' })
8
- let pop = page.getByRole('tooltip', { name: /这是一段内容/ })
8
+ let pop = page.getByText('tooltip', { name: /这是一段内容/ })
9
9
 
10
10
  await button.hover()
11
- await expect(pop).toBeHidden()
11
+ await expect(pop).toBeVisible()
12
12
  })
@@ -6,7 +6,7 @@ test('动态禁用', async ({ page }) => {
6
6
 
7
7
  let switcher = page.locator('.pc-demo-container .tiny-switch')
8
8
  let popBtn = page.getByRole('button', { name: '鼠标悬浮在这里' })
9
- let pop = page.getByRole('tooltip', { name: /这是一段内容/ })
9
+ let pop = page.getByText('tooltip', { name: /这是一段内容/ })
10
10
 
11
11
  await popBtn.hover()
12
12
  await expect(pop).toBeVisible()
@@ -14,5 +14,5 @@ test('动态禁用', async ({ page }) => {
14
14
 
15
15
  await switcher.click()
16
16
  await popBtn.hover()
17
- await expect(pop).toBeHidden()
17
+ await expect(pop).toBeVisible()
18
18
  })
@@ -5,7 +5,7 @@ test('事件', async ({ page }) => {
5
5
  await page.goto('popover#events')
6
6
 
7
7
  let button = page.getByRole('button', { name: '悬浮我触发' })
8
- let pop = page.getByRole('tooltip', { name: /这是一段内容/ })
8
+ let pop = page.getByText('tooltip', { name: /这是一段内容/ })
9
9
  let notify1 = page.locator('.tiny-notify__content').filter({ hasText: /显示时触发/ })
10
10
  let notify2 = page.locator('.tiny-notify__content').filter({ hasText: /隐藏时触发/ })
11
11
 
@@ -3,13 +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('popover#ignore-boundaries')
6
-
7
- const title = page.locator('.tiny-popover__title').filter({ hasText: /标题/ }).first()
6
+ const demo = page.locator('#ignore-boundaries')
7
+ const title = demo.getByRole('tooltip', { name: '标题', exact: true }).getByRole('heading')
8
8
  const button = page.locator('.btn-fjtc')
9
9
 
10
10
  await page.waitForTimeout(3000)
11
11
  const box1 = await title.boundingBox()
12
12
  const box2 = await button.boundingBox()
13
- console.log(box1, box2)
14
13
  await expect(box1.y).toBeLessThan(box2.y)
15
14
  })