@opentiny/vue-docs 3.25.0 → 3.26.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 (158) hide show
  1. package/.stylelintrc.js +2 -2
  2. package/demos/apis/modal.js +1 -1
  3. package/demos/apis/numeric.js +3 -3
  4. package/demos/apis/search.js +28 -0
  5. package/demos/apis/slider-button.js +22 -0
  6. package/demos/apis/split.js +11 -0
  7. package/demos/apis/steps.js +3 -3
  8. package/demos/apis/tabs.js +12 -0
  9. package/demos/apis/time-line.js +20 -0
  10. package/demos/mobile-first/app/slider-button/basic-usage.vue +5 -5
  11. package/demos/mobile-first/app/slider-button/webdoc/slider-button.js +1 -1
  12. package/demos/mobile-first/app/steps/advanced-steps.vue +8 -1
  13. package/demos/mobile-first/menus.js +16 -9
  14. package/demos/pc/app/amount/custom-service.spec.js +4 -4
  15. package/demos/pc/app/base-select/slot-reference.spec.ts +1 -1
  16. package/demos/pc/app/color-picker/alpha-composition-api.vue +1 -1
  17. package/demos/pc/app/color-picker/alpha.spec.ts +2 -2
  18. package/demos/pc/app/color-picker/alpha.vue +1 -1
  19. package/demos/pc/app/color-picker/base.spec.ts +2 -2
  20. package/demos/pc/app/color-picker/default-visible.spec.ts +1 -1
  21. package/demos/pc/app/color-picker/event-composition-api.vue +2 -2
  22. package/demos/pc/app/color-picker/event.spec.ts +4 -4
  23. package/demos/pc/app/color-picker/event.vue +1 -1
  24. package/demos/pc/app/color-picker/format.spec.ts +6 -6
  25. package/demos/pc/app/color-picker/history.spec.ts +1 -7
  26. package/demos/pc/app/color-picker/predefine.spec.ts +3 -10
  27. package/demos/pc/app/color-picker/size.spec.ts +4 -4
  28. package/demos/pc/app/color-select-panel/format.spec.ts +2 -8
  29. package/demos/pc/app/color-select-panel/history.spec.ts +0 -2
  30. package/demos/pc/app/color-select-panel/predefine.spec.ts +0 -3
  31. package/demos/pc/app/container/basic-usage-composition-api.vue +10 -10
  32. package/demos/pc/app/container/basic-usage.vue +10 -10
  33. package/demos/pc/app/container/custom-with-height-composition-api.vue +8 -8
  34. package/demos/pc/app/container/custom-with-height.vue +10 -10
  35. package/demos/pc/app/dialog-select/nest-grid-single.spec.ts +40 -0
  36. package/demos/pc/app/dialog-select/nest-tree-multi.spec.ts +53 -0
  37. package/demos/pc/app/dialog-select/nest-tree-single.spec.ts +25 -0
  38. package/demos/pc/app/dialog-select/set-selection.spec.ts +20 -0
  39. package/demos/pc/app/file-upload/before-upload-limit-composition-api.vue +1 -1
  40. package/demos/pc/app/file-upload/before-upload-limit.spec.ts +1 -1
  41. package/demos/pc/app/file-upload/before-upload-limit.vue +1 -1
  42. package/demos/pc/app/file-upload/custom-trigger-composition-api.vue +1 -1
  43. package/demos/pc/app/file-upload/custom-trigger.spec.ts +1 -1
  44. package/demos/pc/app/file-upload/custom-trigger.vue +1 -1
  45. package/demos/pc/app/file-upload/custom-upload-tip-composition-api.vue +1 -1
  46. package/demos/pc/app/file-upload/custom-upload-tip.vue +1 -1
  47. package/demos/pc/app/file-upload/form-validation-composition-api.vue +1 -1
  48. package/demos/pc/app/file-upload/form-validation.vue +1 -1
  49. package/demos/pc/app/file-upload/image-size-composition-api.vue +1 -1
  50. package/demos/pc/app/file-upload/image-size.spec.ts +1 -1
  51. package/demos/pc/app/file-upload/image-size.vue +1 -1
  52. package/demos/pc/app/file-upload/multiple-file-composition-api.vue +1 -1
  53. package/demos/pc/app/file-upload/multiple-file.spec.ts +1 -1
  54. package/demos/pc/app/file-upload/multiple-file.vue +1 -1
  55. package/demos/pc/app/file-upload/prevent-delete-file-composition-api.vue +1 -1
  56. package/demos/pc/app/file-upload/prevent-delete-file.vue +1 -1
  57. package/demos/pc/app/file-upload/upload-request-composition-api.vue +1 -1
  58. package/demos/pc/app/file-upload/upload-request.spec.ts +2 -2
  59. package/demos/pc/app/file-upload/upload-request.vue +1 -1
  60. package/demos/pc/app/grid/data-source/auto-load.spec.js +0 -1
  61. package/demos/pc/app/grid/dynamically-columns/dynamically-columns.spec.js +2 -1
  62. package/demos/pc/app/grid/filter/custom-filter.spec.js +3 -3
  63. package/demos/pc/app/grid/filter/simple-filter.spec.ts +5 -4
  64. package/demos/pc/app/grid/slot/slot-conf-composition-api.vue +141 -0
  65. package/demos/pc/app/grid/slot/slot-conf.spec.js +12 -0
  66. package/demos/pc/app/grid/slot/slot-conf.vue +151 -0
  67. package/demos/pc/app/grid/webdoc/grid-slot.js +9 -0
  68. package/demos/pc/app/icon/iconGroups.js +7 -2
  69. package/demos/pc/app/input/basic-usage.spec.ts +1 -1
  70. package/demos/pc/app/loading/background.spec.ts +3 -1
  71. package/demos/pc/app/loading/custom-class.spec.ts +4 -2
  72. package/demos/pc/app/loading/fullscreen.spec.ts +6 -4
  73. package/demos/pc/app/loading/loading-tip-text.spec.ts +3 -1
  74. package/demos/pc/app/loading/size.spec.ts +5 -3
  75. package/demos/pc/app/locales/custom-service-composition-api.vue +3 -3
  76. package/demos/pc/app/locales/custom-service.spec.ts +1 -1
  77. package/demos/pc/app/locales/custom-service.vue +3 -3
  78. package/demos/pc/app/modal/basic-usage.spec.ts +2 -1
  79. package/demos/pc/app/modal/message-close.spec.ts +2 -2
  80. package/demos/pc/app/modal/message-id.spec.ts +2 -2
  81. package/demos/pc/app/modal/modal-fn-slots.spec.ts +5 -7
  82. package/demos/pc/app/modal/modal-header.spec.ts +2 -1
  83. package/demos/pc/app/numeric/input-event-composition-api.vue +26 -0
  84. package/demos/pc/app/numeric/input-event.spec.ts +15 -0
  85. package/demos/pc/app/numeric/input-event.vue +34 -0
  86. package/demos/pc/app/numeric/webdoc/numeric.js +12 -0
  87. package/demos/pc/app/pager/align-composition-api.vue +10 -13
  88. package/demos/pc/app/pager/align.spec.ts +8 -3
  89. package/demos/pc/app/pager/align.vue +11 -5
  90. package/demos/pc/app/pager/page-size-composition-api.vue +2 -2
  91. package/demos/pc/app/pager/page-size.spec.ts +1 -1
  92. package/demos/pc/app/pager/page-size.vue +2 -2
  93. package/demos/pc/app/pager/pager-in-grid-composition-api.vue +0 -1
  94. package/demos/pc/app/pager/pager-in-grid.vue +0 -1
  95. package/demos/pc/app/pager/popper-append-to-body-composition-api.vue +1 -7
  96. package/demos/pc/app/pager/popper-append-to-body.vue +1 -7
  97. package/demos/pc/app/pager/popper-class-composition-api.vue +1 -7
  98. package/demos/pc/app/pager/popper-class.vue +1 -7
  99. package/demos/pc/app/popeditor/suggest.spec.ts +1 -1
  100. package/demos/pc/app/qr-code/icon-composition-api.vue +17 -3
  101. package/demos/pc/app/qr-code/icon.spec.ts +19 -0
  102. package/demos/pc/app/qr-code/icon.vue +25 -4
  103. package/demos/pc/app/qr-code/style-composition-api.vue +2 -9
  104. package/demos/pc/app/qr-code/style.spec.ts +18 -1
  105. package/demos/pc/app/qr-code/style.vue +11 -8
  106. package/demos/pc/app/query-builder/webdoc/query-builder.js +5 -3
  107. package/demos/pc/app/search/events.spec.ts +1 -1
  108. package/demos/pc/app/search/events.vue +9 -0
  109. package/demos/pc/app/search/slot-prefix-suffix.spec.ts +1 -1
  110. package/demos/pc/app/search/webdoc/search.js +12 -4
  111. package/demos/pc/app/tabs/basic-usage.spec.ts +2 -2
  112. package/demos/pc/app/tabs/header-only.vue +56 -0
  113. package/demos/pc/app/tabs/size.spec.ts +2 -2
  114. package/demos/pc/app/tabs/webdoc/tabs.js +12 -0
  115. package/demos/pc/app/time-line/slot-default-composition-api.vue +81 -0
  116. package/demos/pc/app/time-line/slot-default.spec.ts +13 -0
  117. package/demos/pc/app/time-line/slot-default.vue +95 -0
  118. package/demos/pc/app/time-line/webdoc/time-line.js +12 -0
  119. package/demos/pc/menus.js +20 -10
  120. package/demos/pc/webdoc/changelog-en.md +86 -132
  121. package/demos/pc/webdoc/changelog.md +86 -132
  122. package/demos/pc/webdoc/faq.md +14 -0
  123. package/demos/saas/menus.js +2 -14
  124. package/env/.env +3 -0
  125. package/package.json +25 -20
  126. package/playground/App.vue +2 -2
  127. package/postcss.config.cjs +1 -0
  128. package/src/App.vue +26 -42
  129. package/src/components/anchor.vue +5 -1
  130. package/src/components/demo.vue +18 -7
  131. package/src/components/design-token.vue +90 -0
  132. package/src/components/float-settings.vue +4 -10
  133. package/src/components/mcp-docs.vue +4 -26
  134. package/src/components/version-tip.vue +1 -1
  135. package/src/composable/useTinyRemoter.ts +176 -0
  136. package/src/composable/utils.ts +2 -6
  137. package/src/const.ts +6 -1
  138. package/src/i18n/en.json +2 -0
  139. package/src/i18n/es.json +47 -0
  140. package/src/i18n/index.js +25 -5
  141. package/src/i18n/pt.json +47 -0
  142. package/src/i18n/zh.json +2 -0
  143. package/src/main.js +17 -4
  144. package/src/{menus.jsx → menus.js} +0 -1
  145. package/src/router.js +3 -6
  146. package/src/tools/appData.js +4 -5
  147. package/src/tools/storage.js +5 -3
  148. package/src/tools/useApiMode.js +11 -3
  149. package/src/tools/useBulletin.jsx +9 -8
  150. package/src/tools/useStyleSettings.js +8 -0
  151. package/src/tools/useTemplateMode.js +5 -1
  152. package/src/tools/utils.js +32 -1
  153. package/src/views/components-doc/cmp-config.js +13 -1
  154. package/src/views/components-doc/common.vue +42 -9
  155. package/src/views/layout/layout.vue +5 -8
  156. package/src/views/overview.vue +1 -1
  157. package/tsconfig.node.json +2 -4
  158. package/src/tools/useAllTaskFinish.ts +0 -0
@@ -1,20 +1,17 @@
1
1
  <template>
2
2
  <div class="content">
3
- <tiny-pager align="left" :total="100"></tiny-pager>
4
- <tiny-pager align="center" :total="100"></tiny-pager>
5
- <tiny-pager align="right" :total="100"></tiny-pager>
3
+ <TinyRadioGroup v-model="state.align" type="button" :options="state.options"></TinyRadioGroup>
4
+ <TinyPager :align="state.align" :total="100"></TinyPager>
6
5
  </div>
7
6
  </template>
8
7
 
9
8
  <script setup>
10
- import { TinyPager } from '@opentiny/vue'
11
- </script>
9
+ import { reactive } from 'vue'
10
+
11
+ import { TinyPager, TinyRadioGroup } from '@opentiny/vue'
12
12
 
13
- <style scoped>
14
- .content {
15
- margin-bottom: 20px;
16
- }
17
- .tiny-radio-group {
18
- margin-bottom: 10px;
19
- }
20
- </style>
13
+ const state = reactive({
14
+ align: 'left',
15
+ options: ['left', 'center', 'right'].map((item) => ({ label: item, text: item }))
16
+ })
17
+ </script>
@@ -7,7 +7,12 @@ test('对齐方式', async ({ page }) => {
7
7
  const demo = page.locator('#align')
8
8
  const pager = demo.locator('.tiny-pager')
9
9
 
10
- await expect(pager.first()).toHaveCSS('text-align', 'left')
11
- await expect(pager.nth(1)).toHaveCSS('text-align', 'center')
12
- await expect(pager.nth(2)).toHaveCSS('text-align', 'right')
10
+ await expect(pager).toHaveCSS('text-align', 'left')
11
+
12
+ await page.click('text=center')
13
+ await expect(pager).toHaveCSS('text-align', 'center')
14
+ await page.click('text=right')
15
+ await expect(pager).toHaveCSS('text-align', 'right')
16
+ await page.click('text=left')
17
+ await expect(pager).toHaveCSS('text-align', 'left')
13
18
  })
@@ -1,17 +1,23 @@
1
1
  <template>
2
2
  <div class="content">
3
- <tiny-pager align="left" :total="100"></tiny-pager>
4
- <tiny-pager align="center" :total="100"></tiny-pager>
5
- <tiny-pager align="right" :total="100"></tiny-pager>
3
+ <TinyRadioGroup v-model="align" type="button" :options="options"></TinyRadioGroup>
4
+ <tiny-pager :align="align" :total="100"></tiny-pager>
6
5
  </div>
7
6
  </template>
8
7
 
9
8
  <script>
10
- import { TinyPager } from '@opentiny/vue'
9
+ import { TinyPager, TinyRadioGroup } from '@opentiny/vue'
11
10
 
12
11
  export default {
13
12
  components: {
14
- TinyPager
13
+ TinyPager,
14
+ TinyRadioGroup
15
+ },
16
+ data() {
17
+ return {
18
+ align: 'left',
19
+ options: ['left', 'center', 'right'].map((item) => ({ label: item, text: item }))
20
+ }
15
21
  }
16
22
  }
17
23
  </script>
@@ -1,7 +1,7 @@
1
1
  <template>
2
- <tiny-pager mode="number" :page-size="5" :page-sizes="[5, 7, 10, 20, 50]" :total="100"> </tiny-pager>
2
+ <tiny-pager mode="number" :page-size="20" :page-sizes="[10, 20, 50, 100]" :total="100"> </tiny-pager>
3
3
  </template>
4
4
 
5
5
  <script setup>
6
- import { TinyPager, TinyModal } from '@opentiny/vue'
6
+ import { TinyPager } from '@opentiny/vue'
7
7
  </script>
@@ -7,7 +7,7 @@ test('每页显示数量', async ({ page }) => {
7
7
  const preview = page.locator('#page-size')
8
8
  const pager = preview.locator('.tiny-pager')
9
9
  const total = 100
10
- const initPageSize = 5
10
+ const initPageSize = 20
11
11
  const getPageCount = (pageSize: number) => String(Math.ceil(total / pageSize))
12
12
  const sizeChange = pager.locator('.tiny-pager__page-size')
13
13
  const sizeSelect = page.locator('.tiny-pager__selector')
@@ -1,9 +1,9 @@
1
1
  <template>
2
- <tiny-pager mode="number" :page-size="5" :page-sizes="[5, 7, 10, 20, 50]" :total="100"> </tiny-pager>
2
+ <tiny-pager mode="number" :page-size="20" :page-sizes="[10, 20, 50, 100]" :total="100"> </tiny-pager>
3
3
  </template>
4
4
 
5
5
  <script>
6
- import { TinyPager, TinyModal } from '@opentiny/vue'
6
+ import { TinyPager } from '@opentiny/vue'
7
7
 
8
8
  export default {
9
9
  components: {
@@ -27,7 +27,6 @@
27
27
  :current-page="custPager.currentPage"
28
28
  :page-size="custPager.pageSize"
29
29
  :total="custPager.total"
30
- :page-sizes="[5, 10, 20, 50]"
31
30
  @current-change="currentChange"
32
31
  @size-change="sizeChange"
33
32
  layout="total, sizes, prev, pager, next, jumper"
@@ -27,7 +27,6 @@
27
27
  :current-page="custPager.currentPage"
28
28
  :page-size="custPager.pageSize"
29
29
  :total="custPager.total"
30
- :page-sizes="[5, 10, 20, 50]"
31
30
  @current-change="currentChange"
32
31
  @size-change="sizeChange"
33
32
  layout="total, sizes, prev, pager, next, jumper"
@@ -1,11 +1,5 @@
1
1
  <template>
2
- <tiny-pager
3
- :popper-append-to-body="false"
4
- layout="sizes,prev, pager, next"
5
- :page-size="5"
6
- :page-sizes="[5, 10, 20, 30, 40, 50, 100]"
7
- :total="50"
8
- ></tiny-pager>
2
+ <tiny-pager :popper-append-to-body="false" layout="sizes,prev, pager, next" :total="50"></tiny-pager>
9
3
  </template>
10
4
 
11
5
  <script setup>
@@ -1,11 +1,5 @@
1
1
  <template>
2
- <tiny-pager
3
- :popper-append-to-body="false"
4
- layout="sizes,prev, pager, next"
5
- :page-size="5"
6
- :page-sizes="[5, 10, 20, 30, 40, 50, 100]"
7
- :total="50"
8
- ></tiny-pager>
2
+ <tiny-pager :popper-append-to-body="false" layout="sizes,prev, pager, next" :total="50"></tiny-pager>
9
3
  </template>
10
4
 
11
5
  <script>
@@ -1,11 +1,5 @@
1
1
  <template>
2
- <tiny-pager
3
- popper-class="custom-pager"
4
- layout="sizes,prev, pager, next"
5
- :page-size="5"
6
- :page-sizes="[5, 10, 20, 30, 40, 50, 100]"
7
- :total="50"
8
- ></tiny-pager>
2
+ <tiny-pager popper-class="custom-pager" layout="sizes,prev, pager, next" :total="50"></tiny-pager>
9
3
  </template>
10
4
 
11
5
  <script setup>
@@ -1,11 +1,5 @@
1
1
  <template>
2
- <tiny-pager
3
- popper-class="custom-pager"
4
- layout="sizes,prev, pager, next"
5
- :page-size="5"
6
- :page-sizes="[5, 10, 20, 30, 40, 50, 100]"
7
- :total="50"
8
- ></tiny-pager>
2
+ <tiny-pager popper-class="custom-pager" layout="sizes,prev, pager, next" :total="50"></tiny-pager>
9
3
  </template>
10
4
 
11
5
  <script>
@@ -10,5 +10,5 @@ test('PopEditor 联想查询', async ({ page }) => {
10
10
 
11
11
  await textBox.fill('科技')
12
12
  await page.waitForTimeout(500)
13
- await expect(grid).toBeVisible()
13
+ await expect(grid.filter({ hasText: /GFD 科技 YX 公司/ })).toBeVisible()
14
14
  })
@@ -1,16 +1,30 @@
1
1
  <template>
2
+ <div class="qr-code-attr">
3
+ iconSize:
4
+ <tiny-numeric v-model="params.iconSize" :min="1" :max="params.size * 0.3" />
5
+ size: <tiny-numeric v-model="params.size" :min="1" :max="1e4" />
6
+ </div>
2
7
  <tiny-qr-code v-bind="params"></tiny-qr-code>
3
8
  </template>
4
9
 
5
10
  <script setup>
6
- import { TinyQrCode } from '@opentiny/vue'
11
+ import { reactive } from 'vue'
12
+ import { TinyNumeric, TinyQrCode } from '@opentiny/vue'
7
13
 
8
- const params = {
14
+ const params = reactive({
9
15
  value: '测试二维码数据',
10
16
  icon: import.meta.env.VITE_APP_BUILD_BASE_URL
11
17
  ? `${import.meta.env.VITE_APP_BUILD_BASE_URL}static/images/mountain.png`
12
18
  : 'https://res.hc-cdn.com/tinyui-design-common/1.0.5.20230707170109/assets/tinyvue.svg',
13
19
  iconSize: 60,
14
20
  size: 250
15
- }
21
+ })
16
22
  </script>
23
+
24
+ <style scoped>
25
+ .qr-code-attr {
26
+ display: flex;
27
+ align-items: center;
28
+ gap: 20px;
29
+ }
30
+ </style>
@@ -8,4 +8,23 @@ test('自定义 icon', async ({ page }) => {
8
8
  const canvasImg = page.locator('.tiny-qr-code .mask-icon img')
9
9
  await expect(canvas).toBeVisible()
10
10
  await expect(canvasImg).toBeVisible()
11
+
12
+ await page.getByLabel('示例', { exact: true }).getByRole('button').nth(1).click()
13
+ const iconSize = await canvasImg.evaluate((el) => {
14
+ return window.getComputedStyle(el)
15
+ })
16
+ const inputIconSizeWidth = await page.getByRole('spinbutton').first().inputValue()
17
+
18
+ expect(iconSize.width === `${inputIconSizeWidth}px`).toBe(true)
19
+ expect(iconSize.height === `${inputIconSizeWidth}px`).toBe(true)
20
+ await page.getByLabel('示例', { exact: true }).getByRole('button').nth(3).click()
21
+ const [qrWidth, qrHeight] = await page.locator('.tiny-qr-code').evaluate((el) => {
22
+ const style = window.getComputedStyle(el)
23
+ return [style.width, style.height]
24
+ })
25
+
26
+ const inputSizeWidth = await page.getByRole('spinbutton').nth(1).inputValue()
27
+
28
+ expect(qrWidth === `${inputSizeWidth}px`).toBe(true)
29
+ expect(qrHeight === `${inputSizeWidth}px`).toBe(true)
11
30
  })
@@ -1,25 +1,46 @@
1
1
  <template>
2
+ <div class="qr-code-attr">
3
+ iconSize:
4
+ <tiny-numeric v-model="iconSize" :min="1" :max="size * 0.3" />
5
+ size: <tiny-numeric v-model="size" :min="1" :max="1e4" />
6
+ </div>
7
+
2
8
  <tiny-qr-code v-bind="params"></tiny-qr-code>
3
9
  </template>
4
10
 
5
11
  <script>
6
- import { TinyQrCode } from '@opentiny/vue'
12
+ import { TinyNumeric, TinyQrCode } from '@opentiny/vue'
7
13
 
8
14
  export default {
9
15
  components: {
16
+ TinyNumeric,
10
17
  TinyQrCode
11
18
  },
12
19
  data() {
13
20
  return {
14
- params: {
21
+ size: 250,
22
+ iconSize: 60
23
+ }
24
+ },
25
+ computed: {
26
+ params() {
27
+ return {
15
28
  value: '测试二维码数据',
16
29
  icon: import.meta.env.VITE_APP_BUILD_BASE_URL
17
30
  ? `${import.meta.env.VITE_APP_BUILD_BASE_URL}static/images/mountain.png`
18
31
  : 'https://res.hc-cdn.com/tinyui-design-common/1.0.5.20230707170109/assets/tinyvue.svg',
19
- iconSize: 60,
20
- size: 250
32
+ iconSize: this.iconSize,
33
+ size: this.size
21
34
  }
22
35
  }
23
36
  }
24
37
  }
25
38
  </script>
39
+
40
+ <style scoped>
41
+ .qr-code-attr {
42
+ display: flex;
43
+ align-items: center;
44
+ gap: 20px;
45
+ }
46
+ </style>
@@ -1,15 +1,12 @@
1
1
  <template>
2
2
  <div class="qr-code-container">
3
- <div>
4
- <tiny-button @click="changeColor">改变颜色</tiny-button>
5
- </div>
6
- <br />
3
+ <tiny-color-picker v-model="params.color" />
7
4
  <tiny-qr-code v-bind="params"></tiny-qr-code>
8
5
  </div>
9
6
  </template>
10
7
 
11
8
  <script setup>
12
- import { TinyQrCode, TinyButton } from '@opentiny/vue'
9
+ import { TinyQrCode, TinyColorPicker } from '@opentiny/vue'
13
10
  import { ref } from 'vue'
14
11
 
15
12
  const params = ref({
@@ -18,8 +15,4 @@ const params = ref({
18
15
  size: 250,
19
16
  style: { background: '#f5f5f5', padding: '24px' }
20
17
  })
21
-
22
- const changeColor = () => {
23
- params.value.color = '#666'
24
- }
25
18
  </script>
@@ -4,6 +4,23 @@ test('自定义样式', async ({ page }) => {
4
4
  page.on('pageerror', (exception) => expect(exception).toBeNull())
5
5
  await page.goto('qr-code#style')
6
6
 
7
- const canvas = page.locator('.tiny-qr-code canvas')
7
+ const demo = page.locator('#style')
8
+ const wrapper = demo.locator('.tiny-qr-code')
9
+ const canvas = demo.locator('.tiny-qr-code canvas')
8
10
  await expect(canvas).toBeVisible()
11
+
12
+ const backgroundColor0 = await canvas.evaluate(
13
+ (el: any, { x, y }) => {
14
+ const ctx = el.getContext('2d')
15
+ const pixel = ctx.getImageData(x, y, 1, 1).data
16
+ const toHex = (num: number) => num.toString(16).padStart(2, '0')
17
+ return `#${toHex(pixel[0])}${toHex(pixel[1])}${toHex(pixel[2])}`
18
+ },
19
+ { x: 1, y: 1 }
20
+ )
21
+
22
+ expect(backgroundColor0 === '#1677ff').toBeTruthy()
23
+
24
+ const box = await wrapper.boundingBox()
25
+ expect(box?.width).toEqual(250)
9
26
  })
@@ -1,26 +1,29 @@
1
1
  <template>
2
2
  <div class="qr-code-container">
3
- <div>
4
- <tiny-button @click="changeColor">改变颜色</tiny-button>
5
- </div>
6
- <br />
3
+ <div>改变颜色<tiny-color-picker v-model="color" /></div>
4
+
7
5
  <tiny-qr-code v-bind="params"></tiny-qr-code>
8
6
  </div>
9
7
  </template>
10
8
 
11
9
  <script>
12
- import { TinyQrCode, TinyButton } from '@opentiny/vue'
10
+ import { TinyQrCode, TinyColorPicker } from '@opentiny/vue'
13
11
 
14
12
  export default {
15
13
  components: {
16
14
  TinyQrCode,
17
- TinyButton
15
+ TinyColorPicker
18
16
  },
19
17
  data() {
20
18
  return {
21
- params: {
19
+ color: '#1677ff'
20
+ }
21
+ },
22
+ computed: {
23
+ params() {
24
+ return {
22
25
  value: '测试二维码数据',
23
- color: '#1677ff',
26
+ color: this.color,
24
27
  size: 250,
25
28
  style: { background: '#f5f5f5', padding: '24px' }
26
29
  }
@@ -9,8 +9,10 @@ export default {
9
9
  'en-US': 'Basic Usage'
10
10
  },
11
11
  desc: {
12
- 'zh-CN':
13
- "\n <div class=\"tip custom-block\">\n <p class=\"custom-block-title\"> config 属性说明 </p>\n <code>autoSelectField</code>:范围域是否会默认选择,勾选则默认为第一个选项;反之则默认为----- <br>\n <code>autoSelectOperator</code>:运算符是否会默认选择,勾选则默认选择第一个选项,反之则默认为----- <br>\n <code>disabled</code>:禁用所有规则 <br>\n <code>parsenumbers</code>:数字会被转化为 Number 类型,而非 String 类型 <br>\n <code>showCloneButtons</code>:展示复制按钮,即整条规则可以被复制 <br>\n <code>showCombinatorsBetweenRules</code>:组合子数组统一修改,且不再展示在连线上,以下拉选择形式出现 <br>\n <code>showLockButtons</code>:展示锁定按钮,即整条规则可以被锁定 <br>\n <code>showNotToggle</code>:展示 not 条件切换框 <br>\n <code>displayOnlyField</code>:是否仅展示字段选择器 <br>\n </div> <br>\n 二、fields 数据配置 <br>\n <pre> <code>\n fields 中的数据(只用于说明各字段含义,无业务特定性) <br>\n { <br>\n name: 'isMusician', //name:格式化数据中的值(形参) <br>\n label: 'Is a musician', //label:范围域在规则生成器中对外展示名称 <br>\n valueEditorType: 'checkbox', //placeholder:值域的默认缺省值 <br>\n operators: [ //运算符自定义,name 为格式化数据中的值,label 为范围域对外展示的名称 <br>\n { <br>\n name: '=', <br>\n label: '=' <br>\n } <br>\n ], <br>\n bindProps: { // 通过 bindProps 参数可对某一类组件进行参数控制 <br>\n input:{ <br>\n clearable:true <br>\n }, <br>\n select:{ <br>\n filterable:true <br>\n } <br>\n }, <br>\n defaultValue: false, //defaultOperator:运算符的默认缺省选择 <br>\n validator: (r) => !!r.value //validator:校验规则(该功能点还在迭代开发中……) <br>\n inputType: 'number', //值域的数值类型 <br>\n valueEditorType: 'radio' //值域编辑器的类型 <br>\n defaultValue: false, //值域的默认值 <br>\n values: [ //值域的可选域配置(下拉) <br>\n { <br>\n label: 'Percussion instruments', <br>\n options: [ <br>\n { <br>\n name: 'Clapstick', <br>\n label: 'Clapstick' <br>\n } <br>\n ] <br>\n } <br>\n ], <br>\n values: [ //值域的可选域配置(单选) <br>\n { <br>\n name: 'M', <br>\n label: 'Male' <br>\n }, <br>\n { <br>\n name: 'F', <br>\n label: 'Female' <br>\n }, <br>\n { <br>\n name: 'O', <br>\n label: 'Other' <br>\n } <br>\n ], <br>\n valueSources: ['field', 'value'], //值域类型可选择 <br>\n comparator: 'groupNumber', //分组时的比较器 <br>\n groupNumber: 'group1', //分组的组别 <br>\n }, <br>\n // 组合子数组配置,label 为展示字符,name 为数据值 <br>\n combinators: [ <br>\n { <br>\n name: 'and', <br>\n label: '且' <br>\n }, <br>\n { <br>\n name: 'or', <br>\n label: '或' <br>\n } <br>\n ] <br>\n </code></pre> <br>\n ",
12
+ 'zh-CN': `
13
+ <div class="tip custom-block">
14
+ <p class=\"custom-block-title\"> config 属性说明 </p>
15
+ <code>autoSelectField</code>:范围域是否会默认选择,勾选则默认为第一个选项;反之则默认为----- \n <code>autoSelectOperator</code>:运算符是否会默认选择,勾选则默认选择第一个选项,反之则默认为----- \n <code>disabled</code>:禁用所有规则 \n <code>parsenumbers</code>:数字会被转化为 Number 类型,而非 String 类型 \n <code>showCloneButtons</code>:展示复制按钮,即整条规则可以被复制 \n <code>showCombinatorsBetweenRules</code>:组合子数组统一修改,且不再展示在连线上,以下拉选择形式出现 \n <code>showLockButtons</code>:展示锁定按钮,即整条规则可以被锁定 \n <code>showNotToggle</code>:展示 not 条件切换框 \n <code>displayOnlyField</code>:是否仅展示字段选择器 \n </div> \n 二、fields 数据配置 \n <pre> <code>\n fields 中的数据(只用于说明各字段含义,无业务特定性) \n { \n name: 'isMusician', //name:格式化数据中的值(形参) \n label: 'Is a musician', //label:范围域在规则生成器中对外展示名称 \n valueEditorType: 'checkbox', //placeholder:值域的默认缺省值 \n operators: [ //运算符自定义,name 为格式化数据中的值,label 为范围域对外展示的名称 \n { \n name: '=', \n label: '=' \n } \n ], \n bindProps: { // 通过 bindProps 参数可对某一类组件进行参数控制 \n input:{ \n clearable:true \n }, \n select:{ \n filterable:true \n } \n }, \n defaultValue: false, //defaultOperator:运算符的默认缺省选择 \n validator: (r) => !!r.value //validator:校验规则(该功能点还在迭代开发中……) \n inputType: 'number', //值域的数值类型 \n valueEditorType: 'radio' //值域编辑器的类型 \n defaultValue: false, //值域的默认值 \n values: [ //值域的可选域配置(下拉) \n { \n label: 'Percussion instruments', \n options: [ \n { \n name: 'Clapstick', \n label: 'Clapstick' \n } \n ] \n } \n ], \n values: [ //值域的可选域配置(单选) \n { \n name: 'M', \n label: 'Male' \n }, \n { \n name: 'F', \n label: 'Female' \n }, \n { \n name: 'O', \n label: 'Other' \n } \n ], \n valueSources: ['field', 'value'], //值域类型可选择 \n comparator: 'groupNumber', //分组时的比较器 \n groupNumber: 'group1', //分组的组别 \n }, \n // 组合子数组配置,label 为展示字符,name 为数据值 \n combinators: [ \n { \n name: 'and', \n label: '且' \n }, \n { \n name: 'or', \n label: '或' \n } \n ] \n </code></pre> <br>`,
14
16
  'en-US': ''
15
17
  },
16
18
  codeFiles: ['basic-usage.vue']
@@ -60,7 +62,7 @@ export default {
60
62
  },
61
63
  desc: {
62
64
  'zh-CN':
63
- 'config 配置添加 bindProps 属性可控制某一类组件的参数,中间操作符类组件暂不支持传参,具体配置见以下说明: <br>\n <div class="tip custom-block">\n <p class="custom-block-title"> bindProps 属性说明 </p>\n leftSelect:左侧 Select 参数,统一控制左侧所有 Select <br>\n select:右侧 Select 参数 <br>\n input:输入框参数,包括 textarea <br>\n numeric:计数器 <br>\n date:日期选择器 <br>\n time:时间选择器 <br>\n radio:单选框 <br>\n checkbox:多选框 <br>\n </div> <br>\n ',
65
+ 'config 配置添加 bindProps 属性可控制某一类组件的参数,中间操作符类组件暂不支持传参,具体配置见以下说明: \n<div class="tip custom-block">\n<p class="custom-block-title"> bindProps 属性说明 </p>\nleftSelect:左侧 Select 参数,统一控制左侧所有 Select \nselect:右侧 Select 参数 \ninput:输入框参数,包括 textarea \nnumeric:计数器 \ndate:日期选择器 \ntime:时间选择器 \nradio:单选框 \ncheckbox:多选框 \n</div> \n',
64
66
  'en-US': ' '
65
67
  },
66
68
  codeFiles: ['sub-component-param.vue']
@@ -9,7 +9,7 @@ test('事件是否正常触发', async ({ page }) => {
9
9
  const button = page.locator('.tiny-search__input-btn > a').first()
10
10
 
11
11
  await button.click()
12
- await expect(modal).toHaveCount(1)
12
+ await expect(modal).toHaveCount(2)
13
13
  await input.first().fill('111')
14
14
  await button.click()
15
15
  await modal.getByText('111').isVisible()
@@ -15,6 +15,9 @@
15
15
  <p>类型选中事件</p>
16
16
  <br />
17
17
  <tiny-search :search-types="searchTypes" @select="select"></tiny-search>
18
+ <p>mini模式展开和收起事件</p>
19
+ <br />
20
+ <tiny-search mini @collapse="handleCollapse" @expand="handleExpand"></tiny-search>
18
21
  </div>
19
22
  </template>
20
23
 
@@ -58,6 +61,12 @@ export default {
58
61
  },
59
62
  select(value) {
60
63
  TinyModal.message({ message: `${value.text}`, status: 'info' })
64
+ },
65
+ handleCollapse() {
66
+ TinyModal.message({ message: '收回', status: 'info' })
67
+ },
68
+ handleExpand() {
69
+ TinyModal.message({ message: '展开', status: 'info' })
61
70
  }
62
71
  }
63
72
  }
@@ -21,7 +21,7 @@ test('disabled', async ({ page }) => {
21
21
  page.on('pageerror', (exception) => expect(exception).toBeNull())
22
22
  await page.goto('search#slot-prefix-suffix')
23
23
 
24
- await page.locator('.tiny-button').last().click()
24
+ await page.getByRole('button', { name: '点击切换为“禁用状态”' }).click()
25
25
 
26
26
  const searchLocators = await page.locator('.tiny-search').all()
27
27
  for (const search of searchLocators) {
@@ -112,10 +112,18 @@ export default {
112
112
  'en-US': 'Search event'
113
113
  },
114
114
  desc: {
115
- 'zh-CN':
116
- '<div class="tip custom-block">通过 <code>is-enter-search</code> 设置回车触发搜索事件, <code>search</code> 监听搜索事件;<br />\n 通过 <code>change</code> 监听输入框失焦时搜索值改变事件,<code>input</code> 监听搜索值实时改变事件;<br />\n 通过 <code>select</code> 监听搜索类型选中事件。</div>',
117
- 'en-US':
118
- '<div class="tip custom-block">Set a carriage return to trigger a search event by <code>is enter search</code> , and listen for search events by <code>search</code> <br />\n By <code>change</code> listening for search value change events when the input box is out of focus, and <code>input</code> listening for real-time search value change events<br />\n Listen for search type selection events through <code>select</code> .</div>'
115
+ 'zh-CN': `
116
+ <div class="tip custom-block">通过 <code>is-enter-search</code> 设置回车触发搜索事件, <code>search</code> 监听搜索事件;<br />\n
117
+ 通过 <code>change</code> 监听输入框失焦时搜索值改变事件,<code>input</code> 监听搜索值实时改变事件;<br />\n
118
+ 通过 <code>select</code> 监听搜索类型选中事件;<br />\n
119
+ 通过 <code>expand</code> 监听 mini 搜索框展开事件;<br />\n
120
+ 通过 <code>collapse</code> 监听 mini 搜索框收起事件。</div>`,
121
+ 'en-US': `<div class="tip custom-block">
122
+ Set carriage return to trigger search event through<code>is-enter-search</code>, and<code>search</code>to listen for search events; <br />\n
123
+ Monitor the search value change event when the input box loses focus through<code>change</code>, and monitor the real-time search value change event through<code>input</code>; <br />\n
124
+ Monitor the search type selection event through<code>select</code>; <br />\n
125
+ Monitor mini search box expansion events through<code>expand</code>; <br />\n
126
+ Monitor the mini search box collapse event through<code>collapse</code>.</div>`
119
127
  },
120
128
  codeFiles: ['events.vue']
121
129
  }
@@ -20,11 +20,11 @@ test('基本用法', async ({ page }) => {
20
20
  /tiny-tabs__item is-top/
21
21
  ])
22
22
  await expect(content).toHaveText(/表单组件/)
23
- await expect(activeBar).toHaveCSS('width', '64px')
23
+ await expect(activeBar).toHaveCSS('width', '56px')
24
24
  await expect(activeBar).toHaveCSS('transform', 'matrix(1, 0, 0, 1, 0, 0)')
25
25
  await item1.click()
26
26
  await expect(item1).toHaveClass(/is-active/)
27
- await expect(activeBar).toHaveCSS('width', '64px')
27
+ await expect(activeBar).toHaveCSS('width', '56px')
28
28
  await expect(activeBar).toHaveCSS('transform', 'matrix(1, 0, 0, 1, 0, 0)')
29
29
  await expect(item1).toHaveCSS('color', 'rgb(25, 25, 25)')
30
30
  await expect(content).toHaveText(/表单组件/)
@@ -0,0 +1,56 @@
1
+ <template>
2
+ <div class="tab-demo-position">
3
+ <tiny-radio-group v-model="position" class="mb10">
4
+ <tiny-radio-button label="top">top 显示</tiny-radio-button>
5
+ <tiny-radio-button label="bottom">bottom 显示</tiny-radio-button>
6
+ <tiny-radio-button label="left">left 显示</tiny-radio-button>
7
+ <tiny-radio-button label="right">right 显示</tiny-radio-button>
8
+ </tiny-radio-group>
9
+ <tiny-tabs v-model="activeName4" tab-style="card" :position="position" header-only>
10
+ <tiny-tab-item v-for="item in tabs3" :key="item.name" :title="item.title" :name="item.name">
11
+ {{ item.content }}
12
+ </tiny-tab-item>
13
+ </tiny-tabs>
14
+ </div>
15
+ </template>
16
+
17
+ <script setup lang="jsx">
18
+ import { ref } from 'vue'
19
+ import { TinyTabs, TinyTabItem, TinyRadioGroup, TinyRadioButton } from '@opentiny/vue'
20
+
21
+ const activeName4 = ref('navigation1')
22
+ const position = ref('left')
23
+ const tabs3 = ref([
24
+ {
25
+ name: 'navigation1',
26
+ title: 'Navigation 1',
27
+ content: 'Navigation 1'
28
+ },
29
+ {
30
+ name: 'navigation2',
31
+ title: 'Navigation 2',
32
+ content: 'Navigation 2'
33
+ },
34
+ {
35
+ name: 'navigation3',
36
+ title: 'Navigation 3',
37
+ content: 'Navigation 3'
38
+ },
39
+ {
40
+ name: 'navigation4',
41
+ title: 'Navigation 4',
42
+ content: 'Navigation 4'
43
+ },
44
+ {
45
+ name: 'navigation5',
46
+ title: 'Navigation 5',
47
+ content: 'Navigation 5'
48
+ }
49
+ ])
50
+ </script>
51
+
52
+ <style scoped>
53
+ .tab-demo-position {
54
+ min-height: 250px;
55
+ }
56
+ </style>
@@ -8,9 +8,9 @@ test('小尺寸', async ({ page }) => {
8
8
  const headerBox = container.locator('.tiny-tabs .tiny-tabs__nav-scroll')
9
9
 
10
10
  await expect(headerBox.nth(0)).toHaveCSS('height', '40px')
11
- await expect(headerBox.nth(0)).toHaveCSS('font-size', '12px')
11
+ await expect(headerBox.nth(0).locator('.tiny-tabs__item').first()).toHaveCSS('font-size', '12px')
12
12
  await expect(headerBox.nth(1)).toHaveCSS('height', '24px')
13
- await expect(headerBox.nth(1).locator('.tiny-tabs__item').first()).toHaveCSS('font-size', '16px')
13
+ await expect(headerBox.nth(1).locator('.tiny-tabs__item').first()).toHaveCSS('font-size', '12px')
14
14
  await expect(headerBox.nth(2)).toHaveCSS('height', '24px')
15
15
  await expect(headerBox.nth(2).locator('.tiny-tabs__item').first()).toHaveCSS('font-size', '12px')
16
16
  })
@@ -282,6 +282,18 @@ export default {
282
282
  'Use <code>overflow-title</code> to set the title to hide and show when it exceeds a certain length (default 256px)... , move the cursor to the title to display the tooltip, and set <code>title-width</code> to the excess length of the title.'
283
283
  },
284
284
  codeFiles: ['overflow-title.vue']
285
+ },
286
+ {
287
+ demoId: 'header-only',
288
+ name: {
289
+ 'zh-CN': '仅展示头部',
290
+ 'en-US': 'Header only'
291
+ },
292
+ desc: {
293
+ 'zh-CN': '通过 <code>header-only</code> 仅展示头部。',
294
+ 'en-US': 'Use <code>>header-only</code> header only.'
295
+ },
296
+ codeFiles: ['header-only.vue']
285
297
  }
286
298
  ],
287
299
  features: [