@sigmaott/base-library-next 2.2.6 → 2.2.7

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 (63) hide show
  1. package/.npmrc +3 -0
  2. package/locales/en.yaml +289 -289
  3. package/locales/vi.yaml +294 -294
  4. package/nuxt.config.ts +18 -18
  5. package/package.json +32 -33
  6. package/public/routes.json +33 -33
  7. package/src/api/axios.ts +3 -3
  8. package/src/api/index.ts +86 -86
  9. package/src/api-client-library/.openapi-generator/FILES +20 -20
  10. package/src/api-client-library/.openapi-generator-ignore +23 -23
  11. package/src/api-client-library/api/health-api.ts +119 -119
  12. package/src/api-client-library/api/presets-api.ts +599 -599
  13. package/src/api-client-library/api/profiles-api.ts +676 -676
  14. package/src/api-client-library/api.ts +20 -20
  15. package/src/api-client-library/base.ts +72 -72
  16. package/src/api-client-library/common.ts +150 -150
  17. package/src/api-client-library/configuration.ts +101 -101
  18. package/src/api-client-library/git_push.sh +57 -57
  19. package/src/api-client-library/index.ts +18 -18
  20. package/src/api-client-library/models/create-preset-dto.ts +223 -223
  21. package/src/api-client-library/models/create-profile-dto.ts +45 -45
  22. package/src/api-client-library/models/health-controller-get-health200-response-info-value.ts +32 -32
  23. package/src/api-client-library/models/health-controller-get-health200-response.ts +51 -51
  24. package/src/api-client-library/models/health-controller-get-health503-response.ts +51 -51
  25. package/src/api-client-library/models/index.ts +7 -7
  26. package/src/api-client-library/models/update-preset-dto.ts +223 -223
  27. package/src/api-client-library/models/update-profile-dto.ts +45 -45
  28. package/src/components/MediaSelection.vue +40 -40
  29. package/src/components/PresetModify.vue +154 -154
  30. package/src/components/PresetTable.vue +114 -114
  31. package/src/components/ProfileAllList.vue +137 -137
  32. package/src/components/ProfileFormModal.vue +79 -79
  33. package/src/components/ProfileModify.vue +152 -152
  34. package/src/components/ProfileTable.vue +68 -68
  35. package/src/components/WatermarkDraggableItem.vue +88 -88
  36. package/src/components/channel/ConfigWatermarkItem.vue +239 -239
  37. package/src/components/channel/WatermarkPreview.vue +19 -19
  38. package/src/components/common/Vue3DraggableResizable/Container.vue +71 -71
  39. package/src/components/common/Vue3DraggableResizable/index.vue +1327 -1327
  40. package/src/components/common/Vue3DraggableResizable/utils/dom.js +63 -63
  41. package/src/components/common/Vue3DraggableResizable/utils/fns.js +37 -37
  42. package/src/components/common/VueDraggableResizable/dom.js +63 -63
  43. package/src/components/common/VueDraggableResizable/fns.js +37 -37
  44. package/src/components/common/VueDraggableResizable/index.vue +958 -958
  45. package/src/components/preset/ConfigItem.vue +956 -956
  46. package/src/components/profile/ConfigItem.vue +765 -765
  47. package/src/components/profile/TableColumns.vue +137 -137
  48. package/src/components/shared/AudioInfoViewer.vue +101 -101
  49. package/src/components/shared/MediaInfoViewer.vue +249 -249
  50. package/src/components/shared/MediaInfoViewerSmall.vue +111 -105
  51. package/src/components/shared/PopoverProfile.vue +17 -17
  52. package/src/components/shared/VideoInfoViewer.vue +136 -136
  53. package/src/components/shared/fileSizeFilter.ts +26 -26
  54. package/src/composables/preset.ts +141 -141
  55. package/src/public/build-time.json +1 -1
  56. package/src/public/favicon.svg +15 -15
  57. package/src/public/logo.svg +9 -9
  58. package/src/public/routes.json +86 -86
  59. package/src/utils/common.ts +175 -175
  60. package/src/utils/config.ts +19 -19
  61. package/src/utils/preset.ts +353 -353
  62. package/src/utils/profile.ts +30 -30
  63. package/tsconfig.json +3 -3
@@ -1,152 +1,152 @@
1
- <script lang="ts" setup>
2
- import { serializePreset } from '../utils/preset'
3
- import type { CreateProfileDto } from '../api-client-library'
4
-
5
- const props = withDefaults(defineProps<{
6
- mode: 'create' | 'edit' | 'clone' // why so much mode?
7
- needSubmit: boolean
8
- prop?: string
9
- item?: CreateProfileDto | null
10
- isPackage?: boolean
11
- }>(), { needSubmit: true })
12
-
13
- const emit = defineEmits<{
14
- close: []
15
- submit: [profile: CreateProfileDto]
16
- }>()
17
-
18
- const item = toRef(props, 'item')
19
-
20
- const activeMedia = ref()
21
-
22
- const initFields = ref<any>({
23
- name: '',
24
- video: [],
25
- audio: [],
26
- other: [],
27
- presets: [],
28
- })
29
- const fields = ref(klona(initFields.value))
30
-
31
- if (props.prop)
32
- useSyncElForm(props.prop, { formValue, formErrors, submitLocks, formRef })
33
-
34
- watchEffect(() => {
35
- if (props.item) {
36
- initFields.value = klona(item.value)
37
- fields.value = klona(item.value)
38
- activeMedia.value = 'media-0'
39
- }
40
- })
41
-
42
- const { createProfileMutation, updateProfileMutation, isMutationLoading } = useProfileMutation()
43
-
44
- const { t } = useI18n()
45
- const { formRef, formValue, handleSubmit, handleValidate, formErrors, getAtrrs, submitLocks } = useElForm<any>({
46
- initialValues: fields,
47
- async onSubmit(values) {
48
- if (props.mode === 'create') {
49
- await createProfileMutation.mutateAsync(serializeData(fields.value))
50
- ElMessage.success(t('library_profile.profile_added_successfully'))
51
- handleReset()
52
- formRef.value?.resetFields()
53
- }
54
-
55
- if (props.mode === 'edit') {
56
- await updateProfileMutation.mutateAsync({
57
- id: fields.value.id,
58
- updateProfileDto: serializeData(fields.value),
59
- })
60
- ElMessage.success(t('library_profile.profile_updated_successfully'))
61
- }
62
-
63
- if (props.mode === 'clone') {
64
- await createProfileMutation.mutateAsync(serializeData(fields.value))
65
- ElMessage.success(t('library_profile.profile_cloned_successfully'))
66
- }
67
-
68
- emit('close')
69
- emit('submit', serializeData(fields.value))
70
- try {
71
- // switch (props.mode) {
72
- // case 'create': {
73
- // res = await createProfile(payload)
74
- // if (res) {
75
- // ElMessage.success('Add successful')
76
- // emit('added', res)
77
- // }
78
- // break
79
- // }
80
- // case 'edit': {
81
- // let parsed = serializeData(fields.value)
82
- // parsed = { ...parsed, ...{ id: fields.value.id } }
83
- // res = await updateProfile(parsed)
84
- // if (res) {
85
- // ElMessage.success('Update successful')
86
- // emit('updated', res)
87
- // }
88
- // break
89
- // }
90
- // case 'clone': {
91
- // const payload = serializeData(fields.value)
92
- // res = await createProfile(payload)
93
- // if (res) {
94
- // ElMessage.success('Clone successful')
95
- // emit('cloned', res)
96
- // }
97
- // break
98
- // }
99
- // default:
100
- // break
101
- // }
102
- }
103
- catch (error) {
104
- }
105
- },
106
- })
107
-
108
- function handleReset() {
109
- fields.value = klona(initFields.value)
110
- }
111
-
112
- function handleCancel() {
113
- emit('close')
114
- }
115
-
116
- function serializeData(data: any) {
117
- const { name, description, presets = [] } = data
118
- const serializedPresets = presets.map((item) => {
119
- return serializePreset(item)
120
- })
121
- return {
122
- name,
123
- description,
124
- presets: serializedPresets,
125
- }
126
- }
127
- </script>
128
-
129
- <template>
130
- <el-form
131
- ref="formRef" label-position="top" label-width="80px" :model="formValue"
132
- @validate="handleValidate"
133
- >
134
- <ProfileConfigItem v-model:activeMedia="activeMedia" :is-package="isPackage">
135
- <template #default>
136
- <slot name="input" :fields="fields" :get-atrrs="getAtrrs" />
137
- </template>
138
- </ProfileConfigItem>
139
- <div v-if="needSubmit" class="mt-4 w-full flex justify-end">
140
- <!-- <el-button :disabled="isMutationLoading" @click="handleReset">
141
- {{ $t('library_action.reset') }}
142
- </el-button> -->
143
-
144
- <el-button type="primary" plain :disabled="isMutationLoading" @click="handleCancel">
145
- {{ $t('library_action.cancel') }}
146
- </el-button>
147
- <el-button :loading="isMutationLoading" type="primary" @click="handleSubmit">
148
- {{ $t('library_action.submit') }}
149
- </el-button>
150
- </div>
151
- </el-form>
152
- </template>
1
+ <script lang="ts" setup>
2
+ import { serializePreset } from '../utils/preset'
3
+ import type { CreateProfileDto } from '../api-client-library'
4
+
5
+ const props = withDefaults(defineProps<{
6
+ mode: 'create' | 'edit' | 'clone' // why so much mode?
7
+ needSubmit: boolean
8
+ prop?: string
9
+ item?: CreateProfileDto | null
10
+ isPackage?: boolean
11
+ }>(), { needSubmit: true })
12
+
13
+ const emit = defineEmits<{
14
+ close: []
15
+ submit: [profile: CreateProfileDto]
16
+ }>()
17
+
18
+ const item = toRef(props, 'item')
19
+
20
+ const activeMedia = ref()
21
+
22
+ const initFields = ref<any>({
23
+ name: '',
24
+ video: [],
25
+ audio: [],
26
+ other: [],
27
+ presets: [],
28
+ })
29
+ const fields = ref(klona(initFields.value))
30
+
31
+ if (props.prop)
32
+ useSyncElForm(props.prop, { formValue, formErrors, submitLocks, formRef })
33
+
34
+ watchEffect(() => {
35
+ if (props.item) {
36
+ initFields.value = klona(item.value)
37
+ fields.value = klona(item.value)
38
+ activeMedia.value = 'media-0'
39
+ }
40
+ })
41
+
42
+ const { createProfileMutation, updateProfileMutation, isMutationLoading } = useProfileMutation()
43
+
44
+ const { t } = useI18n()
45
+ const { formRef, formValue, handleSubmit, handleValidate, formErrors, getAtrrs, submitLocks } = useElForm<any>({
46
+ initialValues: fields,
47
+ async onSubmit(values) {
48
+ if (props.mode === 'create') {
49
+ await createProfileMutation.mutateAsync(serializeData(fields.value))
50
+ ElMessage.success(t('library_profile.profile_added_successfully'))
51
+ handleReset()
52
+ formRef.value?.resetFields()
53
+ }
54
+
55
+ if (props.mode === 'edit') {
56
+ await updateProfileMutation.mutateAsync({
57
+ id: fields.value.id,
58
+ updateProfileDto: serializeData(fields.value),
59
+ })
60
+ ElMessage.success(t('library_profile.profile_updated_successfully'))
61
+ }
62
+
63
+ if (props.mode === 'clone') {
64
+ await createProfileMutation.mutateAsync(serializeData(fields.value))
65
+ ElMessage.success(t('library_profile.profile_cloned_successfully'))
66
+ }
67
+
68
+ emit('close')
69
+ emit('submit', serializeData(fields.value))
70
+ try {
71
+ // switch (props.mode) {
72
+ // case 'create': {
73
+ // res = await createProfile(payload)
74
+ // if (res) {
75
+ // ElMessage.success('Add successful')
76
+ // emit('added', res)
77
+ // }
78
+ // break
79
+ // }
80
+ // case 'edit': {
81
+ // let parsed = serializeData(fields.value)
82
+ // parsed = { ...parsed, ...{ id: fields.value.id } }
83
+ // res = await updateProfile(parsed)
84
+ // if (res) {
85
+ // ElMessage.success('Update successful')
86
+ // emit('updated', res)
87
+ // }
88
+ // break
89
+ // }
90
+ // case 'clone': {
91
+ // const payload = serializeData(fields.value)
92
+ // res = await createProfile(payload)
93
+ // if (res) {
94
+ // ElMessage.success('Clone successful')
95
+ // emit('cloned', res)
96
+ // }
97
+ // break
98
+ // }
99
+ // default:
100
+ // break
101
+ // }
102
+ }
103
+ catch (error) {
104
+ }
105
+ },
106
+ })
107
+
108
+ function handleReset() {
109
+ fields.value = klona(initFields.value)
110
+ }
111
+
112
+ function handleCancel() {
113
+ emit('close')
114
+ }
115
+
116
+ function serializeData(data: any) {
117
+ const { name, description, presets = [] } = data
118
+ const serializedPresets = presets.map((item) => {
119
+ return serializePreset(item)
120
+ })
121
+ return {
122
+ name,
123
+ description,
124
+ presets: serializedPresets,
125
+ }
126
+ }
127
+ </script>
128
+
129
+ <template>
130
+ <el-form
131
+ ref="formRef" label-position="top" label-width="80px" :model="formValue"
132
+ @validate="handleValidate"
133
+ >
134
+ <ProfileConfigItem v-model:activeMedia="activeMedia" :is-package="isPackage">
135
+ <template #default>
136
+ <slot name="input" :fields="fields" :get-atrrs="getAtrrs" />
137
+ </template>
138
+ </ProfileConfigItem>
139
+ <div v-if="needSubmit" class="mt-4 w-full flex justify-end">
140
+ <!-- <el-button :disabled="isMutationLoading" @click="handleReset">
141
+ {{ $t('library_action.reset') }}
142
+ </el-button> -->
143
+
144
+ <el-button type="primary" plain :disabled="isMutationLoading" @click="handleCancel">
145
+ {{ $t('library_action.cancel') }}
146
+ </el-button>
147
+ <el-button :loading="isMutationLoading" type="primary" @click="handleSubmit">
148
+ {{ $t('library_action.submit') }}
149
+ </el-button>
150
+ </div>
151
+ </el-form>
152
+ </template>
@@ -1,68 +1,68 @@
1
- <script lang="ts" setup>
2
- const { isLoading, selecteRow, tableData, hasSelection, sortChange } = definePropsRefs<{
3
- isLoading?: boolean
4
- selecteRow?: (row: any) => void
5
- tableData: any[]
6
- hasSelection?: boolean
7
- sortChange?: (row: any) => void
8
- }>()
9
-
10
- const { selectedProfiles } = defineModels<{
11
- selectedProfiles?: any[]
12
- }>()
13
-
14
- const hasId = computed(() => tableData.value?.some(item => item.id))
15
-
16
- const toggle = ref(false)
17
- function handleSelectionChange(val) {
18
- if (toggle.value)
19
- return
20
- selectedProfiles.value = val
21
- }
22
- const multipleTableRef = ref<any>()
23
- whenever(multipleTableRef, () => {
24
- if (selectedProfiles.value?.length > 0) {
25
- toggle.value = true
26
- tableData.value.forEach((row) => {
27
- const isSelected = selectedProfiles.value?.some(item => item.id === row.id)
28
- multipleTableRef.value?.toggleRowSelection(row, isSelected)
29
- })
30
- toggle.value = false
31
- }
32
- })
33
- </script>
34
-
35
- <template>
36
- <el-table
37
- ref="multipleTableRef"
38
- v-loading="isLoading"
39
- :data="tableData"
40
- stripe
41
- border
42
- row-key="id"
43
- v-bind="$attrs"
44
- class="my-16px w-full flex-1 [&_.el-table\_\_row:hover]:cursor-pointer"
45
- @sort-change="sortChange"
46
- @row-click="selecteRow"
47
- @selection-change="handleSelectionChange"
48
- >
49
- <slot name="empty" />
50
- <slot name="single" />
51
- <el-table-column v-if="hasSelection" type="selection" width="55" />
52
- <el-table-column
53
- prop="id"
54
- label="ID"
55
- width="60"
56
- fixed
57
- >
58
- <template #default="{ row }">
59
- <SSCopyButton v-if="hasId" :value="row.id" @click.prevent.stop />
60
- </template>
61
- </el-table-column>
62
- <ProfileTableColumns />
63
- <template #empty>
64
- <slot name="empty" />
65
- </template>
66
- <slot />
67
- </el-table>
68
- </template>
1
+ <script lang="ts" setup>
2
+ const { isLoading, selecteRow, tableData, hasSelection, sortChange } = definePropsRefs<{
3
+ isLoading?: boolean
4
+ selecteRow?: (row: any) => void
5
+ tableData: any[]
6
+ hasSelection?: boolean
7
+ sortChange?: (row: any) => void
8
+ }>()
9
+
10
+ const { selectedProfiles } = defineModels<{
11
+ selectedProfiles?: any[]
12
+ }>()
13
+
14
+ const hasId = computed(() => tableData.value?.some(item => item.id))
15
+
16
+ const toggle = ref(false)
17
+ function handleSelectionChange(val) {
18
+ if (toggle.value)
19
+ return
20
+ selectedProfiles.value = val
21
+ }
22
+ const multipleTableRef = ref<any>()
23
+ whenever(multipleTableRef, () => {
24
+ if (selectedProfiles.value?.length > 0) {
25
+ toggle.value = true
26
+ tableData.value.forEach((row) => {
27
+ const isSelected = selectedProfiles.value?.some(item => item.id === row.id)
28
+ multipleTableRef.value?.toggleRowSelection(row, isSelected)
29
+ })
30
+ toggle.value = false
31
+ }
32
+ })
33
+ </script>
34
+
35
+ <template>
36
+ <el-table
37
+ ref="multipleTableRef"
38
+ v-loading="isLoading"
39
+ :data="tableData"
40
+ stripe
41
+ border
42
+ row-key="id"
43
+ v-bind="$attrs"
44
+ class="my-16px w-full flex-1 [&_.el-table\_\_row:hover]:cursor-pointer"
45
+ @sort-change="sortChange"
46
+ @row-click="selecteRow"
47
+ @selection-change="handleSelectionChange"
48
+ >
49
+ <slot name="empty" />
50
+ <slot name="single" />
51
+ <el-table-column v-if="hasSelection" type="selection" width="55" />
52
+ <el-table-column
53
+ prop="id"
54
+ label="ID"
55
+ width="60"
56
+ fixed
57
+ >
58
+ <template #default="{ row }">
59
+ <SSCopyButton v-if="hasId" :value="row.id" @click.prevent.stop />
60
+ </template>
61
+ </el-table-column>
62
+ <ProfileTableColumns />
63
+ <template #empty>
64
+ <slot name="empty" />
65
+ </template>
66
+ <slot />
67
+ </el-table>
68
+ </template>
@@ -1,88 +1,88 @@
1
- <script lang="ts" setup>
2
- import { isNumber } from '@antfu/utils'
3
-
4
- const { modelValue } = defineModels<{
5
- modelValue: {
6
- mediaScale: number
7
- width: number
8
- height: number
9
- x: number
10
- y: number
11
- isActive: boolean
12
- assetId: string
13
- }
14
- }>()
15
-
16
- const screenRatio = ref(3)
17
- const watermarkXBoundary = ref(1920)
18
- const watermarkYBoundary = ref(1080)
19
-
20
- const w = computed({
21
- get: () => {
22
- return modelValue.value.width / screenRatio.value * modelValue.value.mediaScale
23
- },
24
- set: (value: number) => {
25
- modelValue.value = {
26
- ...modelValue.value,
27
- width: value * screenRatio.value,
28
- mediaScale: Number(((value * screenRatio.value) / modelValue.value.width).toFixed(1)),
29
- }
30
- },
31
- })
32
-
33
- const h = computed({
34
- get: () => {
35
- return modelValue.value.height / screenRatio.value * modelValue.value.mediaScale
36
- },
37
- set: (value: number) => {
38
- modelValue.value = {
39
- ...modelValue.value,
40
- height: value * screenRatio.value,
41
- }
42
- },
43
- })
44
-
45
- const x = computed({
46
- get: () => {
47
- const origin = modelValue.value.x
48
- if (origin >= 0)
49
- return origin / screenRatio.value
50
- return (watermarkXBoundary.value + origin - modelValue.value.width) / screenRatio.value
51
- },
52
- set: (left: number) => {
53
- modelValue.value.x = (left * screenRatio.value) || 0
54
- },
55
- })
56
-
57
- const y = computed({
58
- get: () => {
59
- const origin = modelValue.value.y
60
- if (isNumber(origin)) {
61
- if (origin >= 0)
62
- return origin / screenRatio.value
63
- return (watermarkYBoundary.value + origin - modelValue.value.height) / screenRatio.value
64
- }
65
- return origin
66
- },
67
- set: (top: number) => {
68
- modelValue.value.y = (top * screenRatio.value) || 0
69
- },
70
- })
71
-
72
- const { data } = useAssetDetail(() => modelValue.value.assetId)
73
- </script>
74
-
75
- <template>
76
- <CommonVue3DraggableResizable
77
- v-model:x="x" v-model:y="y" v-model:h="h" v-model:w="w"
78
- v-model:active="modelValue.isActive" :handles="['tl', 'tr', 'br', 'bl']" :parent="true" :draggable="true"
79
- :resizable="true" :lock-aspect-ratio="true"
80
- >
81
- <el-image v-if="data?.uri" class="h-full w-full" :src="data.uri" />
82
- </CommonVue3DraggableResizable>
83
- <!--
84
- :min-width="getVisualWatermarkSize(watermark.width || 10, 0.1)"
85
- :min-height="getVisualWatermarkSize(watermark.height || 10, 0.1)"
86
- :max-width="getVisualWatermarkSize(watermark.width, 10)"
87
- :max-height="getVisualWatermarkSize(watermark.height, 10)" -->
88
- </template>
1
+ <script lang="ts" setup>
2
+ import { isNumber } from '@antfu/utils'
3
+
4
+ const { modelValue } = defineModels<{
5
+ modelValue: {
6
+ mediaScale: number
7
+ width: number
8
+ height: number
9
+ x: number
10
+ y: number
11
+ isActive: boolean
12
+ assetId: string
13
+ }
14
+ }>()
15
+
16
+ const screenRatio = ref(3)
17
+ const watermarkXBoundary = ref(1920)
18
+ const watermarkYBoundary = ref(1080)
19
+
20
+ const w = computed({
21
+ get: () => {
22
+ return modelValue.value.width / screenRatio.value * modelValue.value.mediaScale
23
+ },
24
+ set: (value: number) => {
25
+ modelValue.value = {
26
+ ...modelValue.value,
27
+ width: value * screenRatio.value,
28
+ mediaScale: Number(((value * screenRatio.value) / modelValue.value.width).toFixed(1)),
29
+ }
30
+ },
31
+ })
32
+
33
+ const h = computed({
34
+ get: () => {
35
+ return modelValue.value.height / screenRatio.value * modelValue.value.mediaScale
36
+ },
37
+ set: (value: number) => {
38
+ modelValue.value = {
39
+ ...modelValue.value,
40
+ height: value * screenRatio.value,
41
+ }
42
+ },
43
+ })
44
+
45
+ const x = computed({
46
+ get: () => {
47
+ const origin = modelValue.value.x
48
+ if (origin >= 0)
49
+ return origin / screenRatio.value
50
+ return (watermarkXBoundary.value + origin - modelValue.value.width) / screenRatio.value
51
+ },
52
+ set: (left: number) => {
53
+ modelValue.value.x = (left * screenRatio.value) || 0
54
+ },
55
+ })
56
+
57
+ const y = computed({
58
+ get: () => {
59
+ const origin = modelValue.value.y
60
+ if (isNumber(origin)) {
61
+ if (origin >= 0)
62
+ return origin / screenRatio.value
63
+ return (watermarkYBoundary.value + origin - modelValue.value.height) / screenRatio.value
64
+ }
65
+ return origin
66
+ },
67
+ set: (top: number) => {
68
+ modelValue.value.y = (top * screenRatio.value) || 0
69
+ },
70
+ })
71
+
72
+ const { data } = useAssetDetail(() => modelValue.value.assetId)
73
+ </script>
74
+
75
+ <template>
76
+ <CommonVue3DraggableResizable
77
+ v-model:x="x" v-model:y="y" v-model:h="h" v-model:w="w"
78
+ v-model:active="modelValue.isActive" :handles="['tl', 'tr', 'br', 'bl']" :parent="true" :draggable="true"
79
+ :resizable="true" :lock-aspect-ratio="true"
80
+ >
81
+ <el-image v-if="data?.uri" class="h-full w-full" :src="data.uri" />
82
+ </CommonVue3DraggableResizable>
83
+ <!--
84
+ :min-width="getVisualWatermarkSize(watermark.width || 10, 0.1)"
85
+ :min-height="getVisualWatermarkSize(watermark.height || 10, 0.1)"
86
+ :max-width="getVisualWatermarkSize(watermark.width, 10)"
87
+ :max-height="getVisualWatermarkSize(watermark.height, 10)" -->
88
+ </template>