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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "jvs-ppt-ui",
3
3
  "private": false,
4
- "version": "0.0.19",
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.26",
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 状态(检索 / 我的素材 / 创建素材)与 jvs_session_v3 鉴权
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>检索</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 === 'mine',
966
+ active: activeMainTab === 'create',
967
967
  'is-disabled': !isDamLoggedIn
968
968
  }"
969
- :title="!isDamLoggedIn ? '请先登录后查看我的素材' : '查看我的项目与个人素材'"
970
- @click="handleSwitchMainTab('mine')"
969
+ :title="!isDamLoggedIn ? '请先登录后使用AI生成' : 'AI 生成图片或视频素材'"
970
+ @click="handleSwitchMainTab('create')"
971
971
  >
972
- <span>我的素材</span>
972
+ <span>AI生成</span>
973
+ <span v-if="isDamLoggedIn" class="tab-ai-spark">✦</span>
973
974
  <svg
974
- v-if="!isDamLoggedIn"
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 === 'create',
993
+ active: activeMainTab === 'mine',
993
994
  'is-disabled': !isDamLoggedIn
994
995
  }"
995
- :title="!isDamLoggedIn ? '请先登录后使用创建素材' : 'AI 生成图片或视频素材'"
996
- @click="handleSwitchMainTab('create')"
996
+ :title="!isDamLoggedIn ? '请先登录后查看我的空间' : '查看我的项目与个人素材'"
997
+ @click="handleSwitchMainTab('mine')"
997
998
  >
998
- <span>创建素材</span>
999
- <span v-if="isDamLoggedIn" class="tab-ai-spark">✦</span>
999
+ <span>我的空间</span>
1000
1000
  <svg
1001
- v-else
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()