jvs-ppt-ui 0.0.19 → 0.0.21
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.
- package/dist/lib/jvs-ppt-ui.es.js +9119 -9089
- package/dist/lib/jvs-ppt-ui.umd.js +61 -61
- package/dist/lib/style.css +1 -1
- package/package.json +2 -2
- package/src/components/Header.vue +20 -4
- package/src/components/TemplateGallery.vue +22 -22
- package/src/components/canvas/elements/CanvasShapeElement.vue +3 -3
- package/src/utils/canvas/elementStyles.ts +1 -1
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "jvs-ppt-ui",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.21",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/lib/jvs-ppt-ui.umd.js",
|
|
7
7
|
"module": "./dist/lib/jvs-ppt-ui.es.js",
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"jszip": "^3.10.1",
|
|
42
42
|
"jvs-picker-color-v3": "^0.0.11",
|
|
43
43
|
"jvs-pptxgenjs": "^0.0.8",
|
|
44
|
-
"jvs-pptxtojson": "^0.0.
|
|
44
|
+
"jvs-pptxtojson": "^0.0.27",
|
|
45
45
|
"svg-pathdata": "^7.2.0",
|
|
46
46
|
"vue": "^3.5.34",
|
|
47
47
|
"vuedraggable": "^4.1.0",
|
|
@@ -3923,7 +3923,12 @@ const parsePPTXJSONData = (json: any, zipMeta?: any) => {
|
|
|
3923
3923
|
const metrics = getParagraphMetrics(el.content, fontScale, defaultFontSize)
|
|
3924
3924
|
const shapeEl: any = {
|
|
3925
3925
|
type: 'shape',
|
|
3926
|
-
id: generateAndRegisterId(el.id),
|
|
3926
|
+
id: generateAndRegisterId(el.id),
|
|
3927
|
+
name: el.name,
|
|
3928
|
+
phType: el.phType,
|
|
3929
|
+
isPlaceholder: el.isPlaceholder,
|
|
3930
|
+
placeholderType: el.placeholderType,
|
|
3931
|
+
placeholder: el.placeholder,
|
|
3927
3932
|
order: el.order !== undefined ? el.order : undefined,
|
|
3928
3933
|
width: el.width,
|
|
3929
3934
|
height: el.height,
|
|
@@ -4058,7 +4063,12 @@ const parsePPTXJSONData = (json: any, zipMeta?: any) => {
|
|
|
4058
4063
|
const metrics = getParagraphMetrics(el.content, ratio, defaultFontSize)
|
|
4059
4064
|
const textEl: any = {
|
|
4060
4065
|
type: 'text',
|
|
4061
|
-
id: generateAndRegisterId(el.id),
|
|
4066
|
+
id: generateAndRegisterId(el.id),
|
|
4067
|
+
name: el.name,
|
|
4068
|
+
phType: el.phType,
|
|
4069
|
+
isPlaceholder: el.isPlaceholder,
|
|
4070
|
+
placeholderType: el.placeholderType,
|
|
4071
|
+
placeholder: el.placeholder,
|
|
4062
4072
|
order: el.order !== undefined ? el.order : undefined,
|
|
4063
4073
|
width: el.width,
|
|
4064
4074
|
height: el.height,
|
|
@@ -4425,7 +4435,12 @@ const parsePPTXJSONData = (json: any, zipMeta?: any) => {
|
|
|
4425
4435
|
|
|
4426
4436
|
const element: any = {
|
|
4427
4437
|
type: 'shape',
|
|
4428
|
-
id: generateAndRegisterId(el.id),
|
|
4438
|
+
id: generateAndRegisterId(el.id),
|
|
4439
|
+
name: el.name,
|
|
4440
|
+
phType: el.phType,
|
|
4441
|
+
isPlaceholder: el.isPlaceholder,
|
|
4442
|
+
placeholderType: el.placeholderType,
|
|
4443
|
+
placeholder: el.placeholder,
|
|
4429
4444
|
order: el.order !== undefined ? el.order : undefined,
|
|
4430
4445
|
width: el.width,
|
|
4431
4446
|
height: el.height,
|
|
@@ -4471,7 +4486,8 @@ const parsePPTXJSONData = (json: any, zipMeta?: any) => {
|
|
|
4471
4486
|
}
|
|
4472
4487
|
element.style.borderColor = el.borderColor || (el.outline?.color || 'transparent')
|
|
4473
4488
|
element.style.borderWidth = el.borderWidth !== undefined ? `${+(el.borderWidth * ratio).toFixed(2)}px` : (el.outline?.width !== undefined ? `${el.outline.width}px` : '0px')
|
|
4474
|
-
element.style.borderStyle = el.borderType || (el.outline?.style || 'solid')
|
|
4489
|
+
element.style.borderStyle = el.borderType || (el.outline?.style || 'solid')
|
|
4490
|
+
if (el.placeholderType === 'pic' && el.borderWidth > 0) element.style.enableBorder = true
|
|
4475
4491
|
if (lineCap) {
|
|
4476
4492
|
element.style.borderLineCap = lineCap
|
|
4477
4493
|
element.style.strokeLinecap = lineCap === 'round' ? 'round' : (lineCap === 'square' ? 'square' : 'butt')
|
|
@@ -106,7 +106,7 @@ const subTypeNameMap: Record<StockSubType, string> = {
|
|
|
106
106
|
Videos: '高清视频'
|
|
107
107
|
}
|
|
108
108
|
|
|
109
|
-
// 顶层 3-Tab
|
|
109
|
+
// 顶层 3-Tab 状态(联网搜索 / AI生成 / 我的空间)与 jvs_session_v3 鉴权
|
|
110
110
|
export type MaterialMainTab = 'search' | 'mine' | 'create'
|
|
111
111
|
const {
|
|
112
112
|
isDamLoggedIn,
|
|
@@ -124,9 +124,9 @@ const guestToastText = ref('请先登录后使用该功能')
|
|
|
124
124
|
let guestToastTimer: ReturnType<typeof setTimeout> | null = null
|
|
125
125
|
|
|
126
126
|
function showGuestAuthToast(tabName: string) {
|
|
127
|
-
guestToastText.value = tabName === '
|
|
128
|
-
? '
|
|
129
|
-
: '
|
|
127
|
+
guestToastText.value = tabName === '我的空间'
|
|
128
|
+
? '请先登录后查看「我的空间」'
|
|
129
|
+
: '请先登录后使用「AI生成」'
|
|
130
130
|
guestToastVisible.value = true
|
|
131
131
|
if (guestToastTimer) clearTimeout(guestToastTimer)
|
|
132
132
|
guestToastTimer = setTimeout(() => {
|
|
@@ -139,7 +139,7 @@ async function handleSwitchMainTab(tab: MaterialMainTab) {
|
|
|
139
139
|
if (tab !== 'search' && !isDamLoggedIn.value) {
|
|
140
140
|
const verified = await probeRemoteSessionV3(true)
|
|
141
141
|
if (!verified && !isDamLoggedIn.value) {
|
|
142
|
-
showGuestAuthToast(tab === 'mine' ? '
|
|
142
|
+
showGuestAuthToast(tab === 'mine' ? '我的空间' : 'AI生成')
|
|
143
143
|
return
|
|
144
144
|
}
|
|
145
145
|
}
|
|
@@ -358,7 +358,7 @@ function openCustomListPreview(item: MaterialItem, list: MaterialItem[], e?: Eve
|
|
|
358
358
|
previewVisible.value = true
|
|
359
359
|
}
|
|
360
360
|
|
|
361
|
-
//
|
|
361
|
+
// 将「联网搜索」或「我的空间」中的图片一键送入「AI生成」作为参考图
|
|
362
362
|
async function handleSendToCreateRef(item: MaterialItem, e?: Event) {
|
|
363
363
|
if (e) {
|
|
364
364
|
e.stopPropagation()
|
|
@@ -368,7 +368,7 @@ async function handleSendToCreateRef(item: MaterialItem, e?: Event) {
|
|
|
368
368
|
if (!isDamLoggedIn.value) {
|
|
369
369
|
const verified = await probeRemoteSessionV3(true)
|
|
370
370
|
if (!verified && !isDamLoggedIn.value) {
|
|
371
|
-
showGuestAuthToast('
|
|
371
|
+
showGuestAuthToast('AI生成')
|
|
372
372
|
return
|
|
373
373
|
}
|
|
374
374
|
}
|
|
@@ -947,7 +947,7 @@ watch([() => materialApiUrl?.value, () => materialPageApiUrl?.value, () => mater
|
|
|
947
947
|
</button>
|
|
948
948
|
</div>
|
|
949
949
|
|
|
950
|
-
<!-- 顶层 3-Tab
|
|
950
|
+
<!-- 顶层 3-Tab 分段切换器(联网搜索 | AI生成 | 我的空间) -->
|
|
951
951
|
<div v-if="activeMainTab !== 'search' || viewMode === 'overview'" class="material-top-tabs-wrap">
|
|
952
952
|
<div class="material-top-segmented">
|
|
953
953
|
<button
|
|
@@ -956,22 +956,23 @@ watch([() => materialApiUrl?.value, () => materialPageApiUrl?.value, () => mater
|
|
|
956
956
|
:class="{ active: activeMainTab === 'search' }"
|
|
957
957
|
@click="handleSwitchMainTab('search')"
|
|
958
958
|
>
|
|
959
|
-
<span
|
|
959
|
+
<span>联网搜索</span>
|
|
960
960
|
</button>
|
|
961
961
|
|
|
962
962
|
<button
|
|
963
963
|
type="button"
|
|
964
964
|
class="material-main-tab-btn"
|
|
965
965
|
:class="{
|
|
966
|
-
active: activeMainTab === '
|
|
966
|
+
active: activeMainTab === 'create',
|
|
967
967
|
'is-disabled': !isDamLoggedIn
|
|
968
968
|
}"
|
|
969
|
-
:title="!isDamLoggedIn ? '
|
|
970
|
-
@click="handleSwitchMainTab('
|
|
969
|
+
:title="!isDamLoggedIn ? '请先登录后使用AI生成' : 'AI 生成图片或视频素材'"
|
|
970
|
+
@click="handleSwitchMainTab('create')"
|
|
971
971
|
>
|
|
972
|
-
<span
|
|
972
|
+
<span>AI生成</span>
|
|
973
|
+
<span v-if="isDamLoggedIn" class="tab-ai-spark">✦</span>
|
|
973
974
|
<svg
|
|
974
|
-
v-
|
|
975
|
+
v-else
|
|
975
976
|
class="tab-lock-svg"
|
|
976
977
|
viewBox="0 0 24 24"
|
|
977
978
|
width="11"
|
|
@@ -989,16 +990,15 @@ watch([() => materialApiUrl?.value, () => materialPageApiUrl?.value, () => mater
|
|
|
989
990
|
type="button"
|
|
990
991
|
class="material-main-tab-btn"
|
|
991
992
|
:class="{
|
|
992
|
-
active: activeMainTab === '
|
|
993
|
+
active: activeMainTab === 'mine',
|
|
993
994
|
'is-disabled': !isDamLoggedIn
|
|
994
995
|
}"
|
|
995
|
-
:title="!isDamLoggedIn ? '
|
|
996
|
-
@click="handleSwitchMainTab('
|
|
996
|
+
:title="!isDamLoggedIn ? '请先登录后查看我的空间' : '查看我的项目与个人素材'"
|
|
997
|
+
@click="handleSwitchMainTab('mine')"
|
|
997
998
|
>
|
|
998
|
-
<span
|
|
999
|
-
<span v-if="isDamLoggedIn" class="tab-ai-spark">✦</span>
|
|
999
|
+
<span>我的空间</span>
|
|
1000
1000
|
<svg
|
|
1001
|
-
v-
|
|
1001
|
+
v-if="!isDamLoggedIn"
|
|
1002
1002
|
class="tab-lock-svg"
|
|
1003
1003
|
viewBox="0 0 24 24"
|
|
1004
1004
|
width="11"
|
|
@@ -1100,7 +1100,7 @@ watch([() => materialApiUrl?.value, () => materialPageApiUrl?.value, () => mater
|
|
|
1100
1100
|
v-if="isDamLoggedIn && cat.subType !== 'Videos' && !isVideoMaterial(item) && getMaterialThumb(item)"
|
|
1101
1101
|
type="button"
|
|
1102
1102
|
class="overview-card-ref-btn"
|
|
1103
|
-
title="
|
|
1103
|
+
title="作为参考图发送到「AI生成」"
|
|
1104
1104
|
@click.stop.prevent="handleSendToCreateRef(item, $event)"
|
|
1105
1105
|
>
|
|
1106
1106
|
@参考
|
|
@@ -1251,7 +1251,7 @@ watch([() => materialApiUrl?.value, () => materialPageApiUrl?.value, () => mater
|
|
|
1251
1251
|
v-if="isDamLoggedIn && filterParams.activeSubType !== 'Videos' && !isVideoMaterial(item) && getMaterialThumb(item)"
|
|
1252
1252
|
type="button"
|
|
1253
1253
|
class="detail-card-ref-btn"
|
|
1254
|
-
title="
|
|
1254
|
+
title="作为参考图发送到「AI生成」"
|
|
1255
1255
|
@click.stop.prevent="handleSendToCreateRef(item, $event)"
|
|
1256
1256
|
>
|
|
1257
1257
|
@参考
|
|
@@ -331,7 +331,7 @@ function getRawText(el: any): string {
|
|
|
331
331
|
|
|
332
332
|
function getImagePlaceholderFill(el: any): string {
|
|
333
333
|
const fill = getElementFill(el)
|
|
334
|
-
if (!fill || fill === '#f1f5f9' || fill === '#f8fafc') {
|
|
334
|
+
if (!fill || fill === 'none' || fill === 'transparent' || fill === '#f1f5f9' || fill === '#f8fafc') {
|
|
335
335
|
return '#d9dde3'
|
|
336
336
|
}
|
|
337
337
|
return fill
|
|
@@ -668,7 +668,7 @@ function formatShapeHtml(el: any): string {
|
|
|
668
668
|
:rx="getRectRadiusInVb(element).rx"
|
|
669
669
|
:ry="getRectRadiusInVb(element).ry"
|
|
670
670
|
vector-effect="non-scaling-stroke"
|
|
671
|
-
:fill="hasElementFill(element) ? (getElementPattern(element) ? `url(#shape-pattern-${svgIdKey})` : (getElementGradientConfig(element) ? `url(#shape-gradient-${svgIdKey})` : (getElementFill(element) !== undefined ? getElementFill(element) : '#3b82f6'))) : 'none'"
|
|
671
|
+
:fill="hasElementFill(element) ? (getElementPattern(element) ? `url(#shape-pattern-${svgIdKey})` : (getElementGradientConfig(element) ? `url(#shape-gradient-${svgIdKey})` : (getElementFill(element) !== undefined ? getElementFill(element) : '#3b82f6'))) : ((isImagePlaceholder && isImagePlaceholder(element)) ? getImagePlaceholderFill(element) : 'none')"
|
|
672
672
|
:stroke="(isImagePlaceholder && isImagePlaceholder(element) && element.style?.enableBorder !== true) ? 'none' : (element.style?.enableBorder === false ? 'none' : getEffectiveBorderColor(element, 'none'))"
|
|
673
673
|
:stroke-width="(isImagePlaceholder && isImagePlaceholder(element) && element.style?.enableBorder !== true) ? 0 : (element.style?.enableBorder === false ? 0 : getElementBorderWidth(element))"
|
|
674
674
|
:stroke-linecap="element.style?.strokeLinecap || element.borderLineCap || element.lineCap || (element.shapType === 'arc' ? 'round' : (isOpenLineShape(element) ? 'butt' : undefined))"
|
|
@@ -678,7 +678,7 @@ function formatShapeHtml(el: any): string {
|
|
|
678
678
|
v-else
|
|
679
679
|
vector-effect="non-scaling-stroke"
|
|
680
680
|
:d="element.path || element.content"
|
|
681
|
-
:fill="hasElementFill(element) ? (getElementPattern(element) ? `url(#shape-pattern-${svgIdKey})` : (getElementGradientConfig(element) ? `url(#shape-gradient-${svgIdKey})` : (getElementFill(element) !== undefined ? getElementFill(element) : '#3b82f6'))) : 'none'"
|
|
681
|
+
:fill="hasElementFill(element) ? (getElementPattern(element) ? `url(#shape-pattern-${svgIdKey})` : (getElementGradientConfig(element) ? `url(#shape-gradient-${svgIdKey})` : (getElementFill(element) !== undefined ? getElementFill(element) : '#3b82f6'))) : ((isImagePlaceholder && isImagePlaceholder(element)) ? getImagePlaceholderFill(element) : 'none')"
|
|
682
682
|
:stroke="(isImagePlaceholder && isImagePlaceholder(element) && element.style?.enableBorder !== true) ? 'none' : (element.style?.enableBorder === false ? 'none' : getEffectiveBorderColor(element, 'none'))"
|
|
683
683
|
:stroke-width="(isImagePlaceholder && isImagePlaceholder(element) && element.style?.enableBorder !== true) ? 0 : (element.style?.enableBorder === false ? 0 : getElementBorderWidth(element))"
|
|
684
684
|
:stroke-linecap="element.style?.strokeLinecap || element.borderLineCap || element.lineCap || (element.shapType === 'arc' ? 'round' : (isOpenLineShape(element) ? 'butt' : undefined))"
|
|
@@ -804,7 +804,7 @@ export function isImagePlaceholder(el: any): boolean {
|
|
|
804
804
|
|
|
805
805
|
if (el.id && typeof el.id === 'string' && (el.id.includes('ph-image') || el.id.includes('image-ph') || el.id.includes('placeholder-image'))) return true
|
|
806
806
|
if (el.name && typeof el.name === 'string' && (el.name.includes('图片占位符') || el.name.includes('图片框'))) return true
|
|
807
|
-
if (el.role === 'image' || el.placeholderType === 'image' || el.placeholderType === 'pic' || el.placeholder?.type === 'pic' || el.placeholder?.type === 'image') return true
|
|
807
|
+
if (el.phType === 'pic' || el.phType === 'picture' || el.phType === 'clipArt' || el.role === 'image' || el.placeholderType === 'image' || el.placeholderType === 'pic' || el.placeholder?.type === 'pic' || el.placeholder?.type === 'image') return true
|
|
808
808
|
|
|
809
809
|
const rawText = typeof el.text === 'string' ? el.text : (typeof el.content === 'string' ? el.content : '')
|
|
810
810
|
const textHtml = rawText.toLowerCase()
|