@qxs-bns/components 0.0.55 → 0.0.57

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 (193) hide show
  1. package/es/index.mjs +1 -1
  2. package/es/index.mjs.map +1 -1
  3. package/es/node_modules/.pnpm/@iconify_vue@5.0.0_vue@3.5.18_typescript@5.8.3_/node_modules/@iconify/vue/dist/iconify.mjs +2 -0
  4. package/es/node_modules/.pnpm/{@iconify_vue@5.0.0_vue@3.5.13_typescript@5.8.2_ → @iconify_vue@5.0.0_vue@3.5.18_typescript@5.8.3_}/node_modules/@iconify/vue/dist/iconify.mjs.map +1 -1
  5. package/es/package.json.mjs +1 -1
  6. package/es/src/components.mjs +1 -1
  7. package/es/src/data-chart/src/analyze.mjs +1 -1
  8. package/es/src/data-chart/src/analyze.mjs.map +1 -1
  9. package/es/src/data-chart/src/components/area.vue2.mjs +1 -1
  10. package/es/src/data-chart/src/components/area.vue2.mjs.map +1 -1
  11. package/es/src/data-chart/src/components/bar.vue.mjs +1 -1
  12. package/es/src/data-chart/src/components/bar.vue.mjs.map +1 -1
  13. package/es/src/data-chart/src/components/card.vue2.mjs +1 -1
  14. package/es/src/data-chart/src/components/card.vue2.mjs.map +1 -1
  15. package/es/src/data-chart/src/components/data-chart-card-bg-left.svg.mjs.map +1 -1
  16. package/es/src/data-chart/src/components/data-chart-card-bg-right.svg.mjs.map +1 -1
  17. package/es/src/data-chart/src/components/empty.svg.mjs.map +1 -1
  18. package/es/src/data-chart/src/components/empty.vue.mjs.map +1 -1
  19. package/es/src/data-chart/src/components/funnel.vue.mjs +1 -1
  20. package/es/src/data-chart/src/components/funnel.vue.mjs.map +1 -1
  21. package/es/src/data-chart/src/components/line.vue2.mjs +1 -1
  22. package/es/src/data-chart/src/components/line.vue2.mjs.map +1 -1
  23. package/es/src/data-chart/src/components/pie.vue.mjs +1 -1
  24. package/es/src/data-chart/src/components/pie.vue.mjs.map +1 -1
  25. package/es/src/data-chart/src/components/radar.vue.mjs +1 -1
  26. package/es/src/data-chart/src/components/radar.vue.mjs.map +1 -1
  27. package/es/src/data-chart/src/components/scatter-simple.vue.mjs +1 -1
  28. package/es/src/data-chart/src/components/scatter-simple.vue.mjs.map +1 -1
  29. package/es/src/data-chart/src/components/scatter.vue.mjs +1 -1
  30. package/es/src/data-chart/src/components/scatter.vue.mjs.map +1 -1
  31. package/es/src/data-chart/src/components/table.vue.mjs +1 -1
  32. package/es/src/data-chart/src/components/table.vue.mjs.map +1 -1
  33. package/es/src/data-chart/src/data-chart.vue.mjs +1 -1
  34. package/es/src/data-chart/src/data-chart.vue.mjs.map +1 -1
  35. package/es/src/data-chart/src/utils/config.mjs +1 -1
  36. package/es/src/data-chart/src/utils/config.mjs.map +1 -1
  37. package/es/src/data-chart/src/utils/mapData.mjs +2 -0
  38. package/es/src/data-chart/src/utils/mapData.mjs.map +1 -0
  39. package/es/src/data-chart/src/utils/safe-eval.mjs.map +1 -1
  40. package/es/src/data-chart/src/utils/useCharts.mjs +1 -1
  41. package/es/src/data-chart/src/utils/useCharts.mjs.map +1 -1
  42. package/es/src/defaults.mjs.map +1 -1
  43. package/es/src/file-upload/src/file-upload.vue.mjs +1 -1
  44. package/es/src/file-upload/src/file-upload.vue.mjs.map +1 -1
  45. package/es/src/fixed-action-bar/src/fixed-action-bar.vue.mjs +1 -1
  46. package/es/src/fixed-action-bar/src/fixed-action-bar.vue.mjs.map +1 -1
  47. package/es/src/icon/index.mjs +1 -1
  48. package/es/src/icon/index.mjs.map +1 -1
  49. package/es/src/icon/src/icon.vue.mjs +1 -1
  50. package/es/src/icon/src/icon.vue.mjs.map +1 -1
  51. package/es/src/image-upload/src/image-upload.vue.mjs +1 -1
  52. package/es/src/image-upload/src/image-upload.vue.mjs.map +1 -1
  53. package/es/src/make-installer.mjs.map +1 -1
  54. package/es/src/photo-crop-tool/src/composables.mjs +1 -1
  55. package/es/src/photo-crop-tool/src/composables.mjs.map +1 -1
  56. package/es/src/photo-crop-tool/src/photo-crop-tool.vue.mjs +1 -1
  57. package/es/src/photo-crop-tool/src/photo-crop-tool.vue.mjs.map +1 -1
  58. package/es/src/subject-action/src/subject-action.vue.mjs +1 -1
  59. package/es/src/subject-action/src/subject-action.vue.mjs.map +1 -1
  60. package/es/src/subject-layout/src/subject-layout.vue.mjs.map +1 -1
  61. package/es/src/subject-list/src/components/SubjectPageEnd.vue.mjs +1 -1
  62. package/es/src/subject-list/src/components/SubjectPageEnd.vue.mjs.map +1 -1
  63. package/es/src/subject-list/src/components/SubjectRichText.vue.mjs +1 -1
  64. package/es/src/subject-list/src/components/SubjectRichText.vue.mjs.map +1 -1
  65. package/es/src/subject-list/src/components/subject-blank-fill.vue.mjs +1 -1
  66. package/es/src/subject-list/src/components/subject-blank-fill.vue.mjs.map +1 -1
  67. package/es/src/subject-list/src/components/subject-scale.vue.mjs +1 -1
  68. package/es/src/subject-list/src/components/subject-scale.vue.mjs.map +1 -1
  69. package/es/src/subject-list/src/components/subject-single.vue.mjs +1 -1
  70. package/es/src/subject-list/src/components/subject-single.vue.mjs.map +1 -1
  71. package/es/src/subject-list/src/components/subject-text-fill.vue.mjs +1 -1
  72. package/es/src/subject-list/src/components/subject-text-fill.vue.mjs.map +1 -1
  73. package/es/src/subject-list/src/subject-list.vue.mjs +1 -1
  74. package/es/src/subject-list/src/subject-list.vue.mjs.map +1 -1
  75. package/es/src/subject-type/src/subject-type.vue.mjs +1 -1
  76. package/es/src/subject-type/src/subject-type.vue.mjs.map +1 -1
  77. package/es/src/tiny-mce-editor/src/tiny-mce-editor.vue.mjs +1 -1
  78. package/es/src/tiny-mce-editor/src/tiny-mce-editor.vue.mjs.map +1 -1
  79. package/es/src/withInstall.mjs.map +1 -1
  80. package/lib/index.cjs +1 -1
  81. package/lib/index.cjs.map +1 -1
  82. package/lib/node_modules/.pnpm/@iconify_vue@5.0.0_vue@3.5.18_typescript@5.8.3_/node_modules/@iconify/vue/dist/iconify.cjs +2 -0
  83. package/lib/node_modules/.pnpm/{@iconify_vue@5.0.0_vue@3.5.13_typescript@5.8.2_ → @iconify_vue@5.0.0_vue@3.5.18_typescript@5.8.3_}/node_modules/@iconify/vue/dist/iconify.cjs.map +1 -1
  84. package/lib/package.json.cjs +1 -1
  85. package/lib/src/components.cjs +1 -1
  86. package/lib/src/data-chart/index.cjs.map +1 -1
  87. package/lib/src/data-chart/src/analyze.cjs +1 -1
  88. package/lib/src/data-chart/src/analyze.cjs.map +1 -1
  89. package/lib/src/data-chart/src/components/area.vue2.cjs +1 -1
  90. package/lib/src/data-chart/src/components/area.vue2.cjs.map +1 -1
  91. package/lib/src/data-chart/src/components/bar.vue.cjs +1 -1
  92. package/lib/src/data-chart/src/components/bar.vue.cjs.map +1 -1
  93. package/lib/src/data-chart/src/components/card.vue2.cjs +1 -1
  94. package/lib/src/data-chart/src/components/card.vue2.cjs.map +1 -1
  95. package/lib/src/data-chart/src/components/empty.vue.cjs.map +1 -1
  96. package/lib/src/data-chart/src/components/funnel.vue.cjs +1 -1
  97. package/lib/src/data-chart/src/components/funnel.vue.cjs.map +1 -1
  98. package/lib/src/data-chart/src/components/line.vue2.cjs +1 -1
  99. package/lib/src/data-chart/src/components/line.vue2.cjs.map +1 -1
  100. package/lib/src/data-chart/src/components/pie.vue.cjs +1 -1
  101. package/lib/src/data-chart/src/components/pie.vue.cjs.map +1 -1
  102. package/lib/src/data-chart/src/components/radar.vue.cjs +1 -1
  103. package/lib/src/data-chart/src/components/radar.vue.cjs.map +1 -1
  104. package/lib/src/data-chart/src/components/scatter-simple.vue.cjs +1 -1
  105. package/lib/src/data-chart/src/components/scatter-simple.vue.cjs.map +1 -1
  106. package/lib/src/data-chart/src/components/scatter.vue.cjs +1 -1
  107. package/lib/src/data-chart/src/components/scatter.vue.cjs.map +1 -1
  108. package/lib/src/data-chart/src/components/table.vue.cjs +1 -1
  109. package/lib/src/data-chart/src/components/table.vue.cjs.map +1 -1
  110. package/lib/src/data-chart/src/data-chart.vue.cjs +1 -1
  111. package/lib/src/data-chart/src/data-chart.vue.cjs.map +1 -1
  112. package/lib/src/data-chart/src/utils/config.cjs +1 -1
  113. package/lib/src/data-chart/src/utils/config.cjs.map +1 -1
  114. package/lib/src/data-chart/src/utils/mapData.cjs +2 -0
  115. package/lib/src/data-chart/src/utils/mapData.cjs.map +1 -0
  116. package/lib/src/data-chart/src/utils/safe-eval.cjs.map +1 -1
  117. package/lib/src/data-chart/src/utils/useCharts.cjs +1 -1
  118. package/lib/src/data-chart/src/utils/useCharts.cjs.map +1 -1
  119. package/lib/src/defaults.cjs.map +1 -1
  120. package/lib/src/file-upload/index.cjs.map +1 -1
  121. package/lib/src/file-upload/src/file-upload.vue.cjs +1 -1
  122. package/lib/src/file-upload/src/file-upload.vue.cjs.map +1 -1
  123. package/lib/src/fixed-action-bar/index.cjs.map +1 -1
  124. package/lib/src/fixed-action-bar/src/fixed-action-bar.vue.cjs +1 -1
  125. package/lib/src/fixed-action-bar/src/fixed-action-bar.vue.cjs.map +1 -1
  126. package/lib/src/icon/index.cjs +1 -1
  127. package/lib/src/icon/index.cjs.map +1 -1
  128. package/lib/src/icon/src/icon.vue.cjs +1 -1
  129. package/lib/src/icon/src/icon.vue.cjs.map +1 -1
  130. package/lib/src/image-upload/index.cjs.map +1 -1
  131. package/lib/src/image-upload/src/image-upload.vue.cjs +1 -1
  132. package/lib/src/image-upload/src/image-upload.vue.cjs.map +1 -1
  133. package/lib/src/make-installer.cjs.map +1 -1
  134. package/lib/src/photo-crop-tool/index.cjs.map +1 -1
  135. package/lib/src/photo-crop-tool/src/composables.cjs +1 -1
  136. package/lib/src/photo-crop-tool/src/composables.cjs.map +1 -1
  137. package/lib/src/photo-crop-tool/src/photo-crop-tool.vue.cjs +1 -1
  138. package/lib/src/photo-crop-tool/src/photo-crop-tool.vue.cjs.map +1 -1
  139. package/lib/src/subject-action/index.cjs.map +1 -1
  140. package/lib/src/subject-action/src/subject-action.vue.cjs +1 -1
  141. package/lib/src/subject-action/src/subject-action.vue.cjs.map +1 -1
  142. package/lib/src/subject-layout/index.cjs.map +1 -1
  143. package/lib/src/subject-layout/src/subject-layout.vue.cjs.map +1 -1
  144. package/lib/src/subject-list/index.cjs.map +1 -1
  145. package/lib/src/subject-list/src/components/SubjectPageEnd.vue.cjs +1 -1
  146. package/lib/src/subject-list/src/components/SubjectPageEnd.vue.cjs.map +1 -1
  147. package/lib/src/subject-list/src/components/SubjectRichText.vue.cjs +1 -1
  148. package/lib/src/subject-list/src/components/SubjectRichText.vue.cjs.map +1 -1
  149. package/lib/src/subject-list/src/components/subject-blank-fill.vue.cjs +1 -1
  150. package/lib/src/subject-list/src/components/subject-blank-fill.vue.cjs.map +1 -1
  151. package/lib/src/subject-list/src/components/subject-scale.vue.cjs +1 -1
  152. package/lib/src/subject-list/src/components/subject-scale.vue.cjs.map +1 -1
  153. package/lib/src/subject-list/src/components/subject-single.vue.cjs +1 -1
  154. package/lib/src/subject-list/src/components/subject-single.vue.cjs.map +1 -1
  155. package/lib/src/subject-list/src/components/subject-text-fill.vue.cjs +1 -1
  156. package/lib/src/subject-list/src/components/subject-text-fill.vue.cjs.map +1 -1
  157. package/lib/src/subject-list/src/subject-list.vue.cjs +1 -1
  158. package/lib/src/subject-list/src/subject-list.vue.cjs.map +1 -1
  159. package/lib/src/subject-type/index.cjs.map +1 -1
  160. package/lib/src/subject-type/src/subject-type.vue.cjs +1 -1
  161. package/lib/src/subject-type/src/subject-type.vue.cjs.map +1 -1
  162. package/lib/src/tiny-mce-editor/index.cjs.map +1 -1
  163. package/lib/src/tiny-mce-editor/src/tiny-mce-editor.vue.cjs +1 -1
  164. package/lib/src/tiny-mce-editor/src/tiny-mce-editor.vue.cjs.map +1 -1
  165. package/lib/src/withInstall.cjs.map +1 -1
  166. package/package.json +3 -2
  167. package/types/src/components.d.ts +1 -1
  168. package/types/src/components.d.ts.map +1 -1
  169. package/types/src/data-chart/src/components/area.vue.d.ts.map +1 -1
  170. package/types/src/data-chart/src/utils/config.d.ts.map +1 -1
  171. package/types/src/data-chart/src/utils/mapData.d.ts +64 -0
  172. package/types/src/data-chart/src/utils/mapData.d.ts.map +1 -0
  173. package/types/src/data-chart/src/utils/types.d.ts +4 -0
  174. package/types/src/data-chart/src/utils/types.d.ts.map +1 -1
  175. package/types/src/data-chart/src/utils/useCharts.d.ts +3 -4
  176. package/types/src/data-chart/src/utils/useCharts.d.ts.map +1 -1
  177. package/types/src/fixed-action-bar/index.d.ts +1 -1
  178. package/types/src/fixed-action-bar/src/fixed-action-bar.vue.d.ts +1 -1
  179. package/types/src/fixed-action-bar/src/fixed-action-bar.vue.d.ts.map +1 -1
  180. package/types/src/icon/index.d.ts +3 -3
  181. package/types/src/icon/index.d.ts.map +1 -1
  182. package/types/src/image-upload/index.d.ts +3 -2
  183. package/types/src/image-upload/index.d.ts.map +1 -1
  184. package/types/src/image-upload/src/image-upload.vue.d.ts +2 -80
  185. package/types/src/image-upload/src/image-upload.vue.d.ts.map +1 -1
  186. package/types/src/subject-layout/index.d.ts +5 -3
  187. package/types/src/subject-layout/index.d.ts.map +1 -1
  188. package/types/src/subject-layout/src/subject-layout.vue.d.ts +2 -24
  189. package/types/src/subject-layout/src/subject-layout.vue.d.ts.map +1 -1
  190. package/types/src/tiny-mce-editor/index.d.ts.map +1 -1
  191. package/types/tsconfig.tsbuildinfo +1 -1
  192. package/es/node_modules/.pnpm/@iconify_vue@5.0.0_vue@3.5.13_typescript@5.8.2_/node_modules/@iconify/vue/dist/iconify.mjs +0 -2
  193. package/lib/node_modules/.pnpm/@iconify_vue@5.0.0_vue@3.5.13_typescript@5.8.2_/node_modules/@iconify/vue/dist/iconify.cjs +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"fixed-action-bar.vue.cjs","sources":["../../../../../../packages/components/src/fixed-action-bar/src/fixed-action-bar.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useNamespace } from '@qxs-bns/hooks'\nimport { getDeviceType } from '@qxs-bns/utils'\nimport { debounce } from 'lodash-es'\n\nconst props = defineProps({\n padding: {\n type: Number,\n default: 8,\n },\n className: {\n type: String,\n default: '',\n },\n})\n\ninterface ElementSize { width: number, height: number }\n\nconst ns = useNamespace('fixed-action-bar')\nconst isBottom = ref(false)\nconst actionbar = ref<HTMLElement | null>(null)\nconst placeholderRef = ref<HTMLElement | null>(null)\n\nconst elementSize = ref<ElementSize>({ width: 0, height: 0 })\nconst parentWidth = ref(0)\nconst elementLeft = ref(0)\n\nconst observers = {\n resize: null as ResizeObserver | null,\n parent: null as ResizeObserver | null,\n}\n\nfunction getTotalPadding(el: HTMLElement) {\n const style = getComputedStyle(el)\n return {\n x: Number.parseFloat(style.paddingLeft) + Number.parseFloat(style.paddingRight),\n y: Number.parseFloat(style.paddingTop) + Number.parseFloat(style.paddingBottom),\n }\n}\n\nfunction createResizeObserver(el: HTMLElement,\n callback: (entry: ResizeObserverEntry) => void,\n options?: ResizeObserverOptions) {\n const observer = new ResizeObserver((entries) => {\n entries.forEach(entry => requestAnimationFrame(() => callback(entry)))\n })\n observer.observe(el, options)\n return observer\n}\n\nfunction initObservers() {\n if (!actionbar.value || !placeholderRef.value) {\n return\n }\n\n // 主元素尺寸观察\n observers.resize = createResizeObserver(\n actionbar.value,\n (entry) => {\n const padding = getTotalPadding(entry.target as HTMLElement)\n elementSize.value = {\n width: entry.contentRect.width + padding.x,\n height: entry.contentRect.height + padding.y,\n }\n },\n { box: 'border-box' },\n )\n\n // 父元素观察\n const parent = placeholderRef.value.parentElement\n if (parent) {\n observers.parent = createResizeObserver(parent, () => {\n const rect = parent.getBoundingClientRect()\n parentWidth.value = rect.width\n elementLeft.value = rect.left\n })\n }\n}\n\nconst calculateScrollDetails = debounce(() => {\n const { scrollY } = window\n const { clientHeight, scrollHeight } = document.documentElement\n isBottom.value = Math.ceil(scrollY + clientHeight) >= scrollHeight\n}, 100)\n\nconst shadowClass = computed(() => (!isBottom.value ? ns.is('shadow') : ''))\n\nconst paddingBottom = computed(() =>\n getDeviceType() === 'Android' ? Math.max(props.padding, 20) : props.padding,\n)\n\nconst actionbarStyle = computed(() => ({\n width: `${parentWidth.value}px`,\n left: `${elementLeft.value}px`,\n ...ns.cssVarBlock({\n 'actionbar-padding': `${props.padding}px`,\n 'actionbar-padding-bottom': `${paddingBottom.value}px`,\n }),\n}))\n\nonMounted(() => {\n initObservers()\n window.addEventListener('scroll', calculateScrollDetails, { passive: true })\n})\n\nonUnmounted(() => {\n observers.resize?.disconnect()\n observers.parent?.disconnect()\n window.removeEventListener('scroll', calculateScrollDetails)\n})\n</script>\n\n<script lang=\"ts\">\nexport default {\n name: 'QxsFixedActionBar',\n}\n</script>\n\n<template>\n <div\n ref=\"placeholderRef\"\n :style=\"{ width: '100%', height: `${elementSize.height}px` }\"\n >\n <div\n ref=\"actionbar\"\n :style=\"actionbarStyle\"\n :class=\"[ns.e('actionbar'), shadowClass, className]\"\n data-fixed-calc-width\n >\n <slot />\n </div>\n </div>\n</template>\n"],"names":["name","props","__props","ns","useNamespace","isBottom","ref","actionbar","placeholderRef","elementSize","width","height","parentWidth","elementLeft","observers","resize","parent","createResizeObserver","el","callback","options","observer","ResizeObserver","entries","forEach","entry","requestAnimationFrame","observe","initObservers","value","padding","style","getComputedStyle","x","Number","parseFloat","paddingLeft","paddingRight","y","paddingTop","paddingBottom","getTotalPadding","target","contentRect","box","parentElement","rect","getBoundingClientRect","left","calculateScrollDetails","debounce","scrollY","window","clientHeight","scrollHeight","document","documentElement","Math","ceil","shadowClass","computed","is","getDeviceType","max","actionbarStyle","cssVarBlock","onMounted","addEventListener","passive","onUnmounted","disconnect","removeEventListener"],"mappings":"iMAkHEA,KAAM,wGA7GR,MAAMC,EAAQC,EAaRC,EAAKC,eAAa,oBAClBC,EAAWC,OAAI,GACfC,EAAYD,MAAwB,MACpCE,EAAiBF,MAAwB,MAEzCG,EAAcH,EAAAA,IAAiB,CAAEI,MAAO,EAAGC,OAAQ,IACnDC,EAAcN,MAAI,GAClBO,EAAcP,MAAI,GAElBQ,EAAY,CAChBC,OAAQ,KACRC,OAAQ,MAWD,SAAAC,EAAqBC,EAC5BC,EACAC,GACA,MAAMC,EAAW,IAAIC,gBAAgBC,IACnCA,EAAQC,SAAiBC,GAAAC,uBAAsB,IAAMP,EAASM,MAAO,IAGhE,OADEJ,EAAAM,QAAQT,EAAIE,GACdC,CAAA,CAGT,SAASO,IACP,IAAKrB,EAAUsB,QAAUrB,EAAeqB,MACtC,OAIFf,EAAUC,OAASE,EACjBV,EAAUsB,OACTJ,IACO,MAAAK,EA3BZ,SAAyBZ,GACjB,MAAAa,EAAQC,iBAAiBd,GACxB,MAAA,CACLe,EAAGC,OAAOC,WAAWJ,EAAMK,aAAeF,OAAOC,WAAWJ,EAAMM,cAClEC,EAAGJ,OAAOC,WAAWJ,EAAMQ,YAAcL,OAAOC,WAAWJ,EAAMS,eACnE,CAsBoBC,CAAgBhB,EAAMiB,QACtCjC,EAAYoB,MAAQ,CAClBnB,MAAOe,EAAMkB,YAAYjC,MAAQoB,EAAQG,EACzCtB,OAAQc,EAAMkB,YAAYhC,OAASmB,EAAQQ,EAC7C,GAEF,CAAEM,IAAK,eAIH,MAAA5B,EAASR,EAAeqB,MAAMgB,cAChC7B,IACQF,EAAAE,OAASC,EAAqBD,GAAQ,KACxC,MAAA8B,EAAO9B,EAAO+B,wBACpBnC,EAAYiB,MAAQiB,EAAKpC,MACzBG,EAAYgB,MAAQiB,EAAKE,IAAA,IAE7B,CAGI,MAAAC,EAAyBC,EAAAA,UAAS,KAChC,MAAAC,QAAEA,GAAYC,QACdC,aAAEA,EAAAC,aAAcA,GAAiBC,SAASC,gBAChDnD,EAASwB,MAAQ4B,KAAKC,KAAKP,EAAUE,IAAiBC,CAAA,GACrD,KAEGK,EAAcC,YAAS,IAAQvD,EAASwB,MAA0B,GAAlB1B,EAAG0D,GAAG,YAEtDrB,EAAgBoB,EAAAA,UAAS,IACT,YAApBE,EAAcA,gBAAkBL,KAAKM,IAAI9D,EAAM6B,QAAS,IAAM7B,EAAM6B,UAGhEkC,EAAiBJ,EAAAA,UAAS,KAAO,CACrClD,MAAO,GAAGE,EAAYiB,UACtBmB,KAAM,GAAGnC,EAAYgB,aAClB1B,EAAG8D,YAAY,CAChB,oBAAqB,GAAGhE,EAAM6B,YAC9B,2BAA4B,GAAGU,EAAcX,uBAIjDqC,EAAAA,WAAU,KACMtC,IACdwB,OAAOe,iBAAiB,SAAUlB,EAAwB,CAAEmB,SAAS,GAAM,IAG7EC,EAAAA,aAAY,KACVvD,EAAUC,QAAQuD,aAClBxD,EAAUE,QAAQsD,aACXlB,OAAAmB,oBAAoB,SAAUtB,EAAsB"}
1
+ {"version":3,"file":"fixed-action-bar.vue.cjs","sources":["../../../../../../packages/components/src/fixed-action-bar/src/fixed-action-bar.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useNamespace } from '@qxs-bns/hooks'\nimport { getDeviceType } from '@qxs-bns/utils'\nimport { debounce } from 'lodash-es'\n\nconst props = defineProps({\n padding: {\n type: Number,\n default: 8,\n },\n className: {\n type: String,\n default: '',\n },\n})\n\ninterface ElementSize { width: number, height: number }\n\nconst ns = useNamespace('fixed-action-bar')\nconst isBottom = ref(false)\nconst actionbar = ref<HTMLElement | null>(null)\nconst placeholderRef = ref<HTMLElement | null>(null)\n\nconst elementSize = ref<ElementSize>({ width: 0, height: 0 })\nconst parentWidth = ref(0)\nconst elementLeft = ref(0)\n\nconst observers = {\n resize: null as ResizeObserver | null,\n parent: null as ResizeObserver | null,\n}\n\nfunction getTotalPadding(el: HTMLElement) {\n const style = getComputedStyle(el)\n return {\n x: Number.parseFloat(style.paddingLeft) + Number.parseFloat(style.paddingRight),\n y: Number.parseFloat(style.paddingTop) + Number.parseFloat(style.paddingBottom),\n }\n}\n\nfunction createResizeObserver(el: HTMLElement,\n callback: (entry: ResizeObserverEntry) => void,\n options?: ResizeObserverOptions) {\n const observer = new ResizeObserver((entries) => {\n entries.forEach(entry => requestAnimationFrame(() => callback(entry)))\n })\n observer.observe(el, options)\n return observer\n}\n\nfunction initObservers() {\n if (!actionbar.value || !placeholderRef.value) {\n return\n }\n\n // 主元素尺寸观察\n observers.resize = createResizeObserver(\n actionbar.value,\n (entry) => {\n const padding = getTotalPadding(entry.target as HTMLElement)\n elementSize.value = {\n width: entry.contentRect.width + padding.x,\n height: entry.contentRect.height + padding.y,\n }\n },\n { box: 'border-box' },\n )\n\n // 父元素观察\n const parent = placeholderRef.value.parentElement\n if (parent) {\n observers.parent = createResizeObserver(parent, () => {\n const rect = parent.getBoundingClientRect()\n parentWidth.value = rect.width\n elementLeft.value = rect.left\n })\n }\n}\n\nconst calculateScrollDetails = debounce(() => {\n const { scrollY } = window\n const { clientHeight, scrollHeight } = document.documentElement\n isBottom.value = Math.ceil(scrollY + clientHeight) >= scrollHeight\n}, 100)\n\nconst shadowClass = computed(() => (!isBottom.value ? ns.is('shadow') : ''))\n\nconst paddingBottom = computed(() =>\n getDeviceType() === 'Android' ? Math.max(props.padding, 20) : props.padding,\n)\n\nconst actionbarStyle = computed(() => ({\n width: `${parentWidth.value}px`,\n left: `${elementLeft.value}px`,\n ...ns.cssVarBlock({\n 'actionbar-padding': `${props.padding}px`,\n 'actionbar-padding-bottom': `${paddingBottom.value}px`,\n }),\n}))\n\nonMounted(() => {\n initObservers()\n window.addEventListener('scroll', calculateScrollDetails, { passive: true })\n})\n\nonUnmounted(() => {\n observers.resize?.disconnect()\n observers.parent?.disconnect()\n window.removeEventListener('scroll', calculateScrollDetails)\n})\n</script>\n\n<script lang=\"ts\">\nexport default {\n name: 'QxsFixedActionBar',\n}\n</script>\n\n<template>\n <div\n ref=\"placeholderRef\"\n :style=\"{ width: '100%', height: `${elementSize.height}px` }\"\n >\n <div\n ref=\"actionbar\"\n :style=\"actionbarStyle\"\n :class=\"[ns.e('actionbar'), shadowClass, className]\"\n data-fixed-calc-width\n >\n <slot />\n </div>\n </div>\n</template>\n"],"names":["name","props","__props","ns","useNamespace","isBottom","ref","actionbar","placeholderRef","elementSize","width","height","parentWidth","elementLeft","observers","resize","parent","createResizeObserver","el","callback","options","observer","ResizeObserver","entries","forEach","entry","requestAnimationFrame","observe","initObservers","value","padding","style","getComputedStyle","x","Number","parseFloat","paddingLeft","paddingRight","y","paddingTop","paddingBottom","getTotalPadding","target","contentRect","box","parentElement","rect","getBoundingClientRect","left","calculateScrollDetails","debounce","scrollY","window","clientHeight","scrollHeight","document","documentElement","Math","ceil","shadowClass","computed","is","getDeviceType","max","actionbarStyle","cssVarBlock","onMounted","addEventListener","passive","onUnmounted","disconnect","removeEventListener","_createElementBlock","_normalizeStyle","_unref","_createElementVNode","class","e","className","_renderSlot","_ctx","$slots"],"mappings":"iMAkHEA,KAAM,wGA7GR,MAAMC,EAAQC,EAaRC,EAAKC,EAAAA,aAAa,oBAClBC,EAAWC,EAAAA,KAAI,GACfC,EAAYD,EAAAA,IAAwB,MACpCE,EAAiBF,EAAAA,IAAwB,MAEzCG,EAAcH,EAAAA,IAAiB,CAAEI,MAAO,EAAGC,OAAQ,IACnDC,EAAcN,EAAAA,IAAI,GAClBO,EAAcP,EAAAA,IAAI,GAElBQ,EAAY,CAChBC,OAAQ,KACRC,OAAQ,MAWV,SAASC,EAAqBC,EAC5BC,EACAC,GACA,MAAMC,EAAW,IAAIC,eAAgBC,IACnCA,EAAQC,QAAQC,GAASC,sBAAsB,IAAMP,EAASM,OAGhE,OADAJ,EAASM,QAAQT,EAAIE,GACdC,CACT,CAEA,SAASO,IACP,IAAKrB,EAAUsB,QAAUrB,EAAeqB,MACtC,OAIFf,EAAUC,OAASE,EACjBV,EAAUsB,MACTJ,IACC,MAAMK,EA3BZ,SAAyBZ,GACvB,MAAMa,EAAQC,iBAAiBd,GAC/B,MAAO,CACLe,EAAGC,OAAOC,WAAWJ,EAAMK,aAAeF,OAAOC,WAAWJ,EAAMM,cAClEC,EAAGJ,OAAOC,WAAWJ,EAAMQ,YAAcL,OAAOC,WAAWJ,EAAMS,eAErE,CAqBsBC,CAAgBhB,EAAMiB,QACtCjC,EAAYoB,MAAQ,CAClBnB,MAAOe,EAAMkB,YAAYjC,MAAQoB,EAAQG,EACzCtB,OAAQc,EAAMkB,YAAYhC,OAASmB,EAAQQ,IAG/C,CAAEM,IAAK,eAIT,MAAM5B,EAASR,EAAeqB,MAAMgB,cAChC7B,IACFF,EAAUE,OAASC,EAAqBD,EAAQ,KAC9C,MAAM8B,EAAO9B,EAAO+B,wBACpBnC,EAAYiB,MAAQiB,EAAKpC,MACzBG,EAAYgB,MAAQiB,EAAKE,OAG/B,CAEA,MAAMC,EAAyBC,EAAAA,SAAS,KACtC,MAAMC,QAAEA,GAAYC,QACdC,aAAEA,EAAAC,aAAcA,GAAiBC,SAASC,gBAChDnD,EAASwB,MAAQ4B,KAAKC,KAAKP,EAAUE,IAAiBC,GACrD,KAEGK,EAAcC,WAAS,IAAQvD,EAASwB,MAA0B,GAAlB1B,EAAG0D,GAAG,WAEtDrB,EAAgBoB,EAAAA,SAAS,IACT,YAApBE,EAAAA,gBAAgCL,KAAKM,IAAI9D,EAAM6B,QAAS,IAAM7B,EAAM6B,SAGhEkC,EAAiBJ,EAAAA,SAAS,KAAA,CAC9BlD,MAAO,GAAGE,EAAYiB,UACtBmB,KAAM,GAAGnC,EAAYgB,aAClB1B,EAAG8D,YAAY,CAChB,oBAAqB,GAAGhE,EAAM6B,YAC9B,2BAA4B,GAAGU,EAAcX,sBAIjDqC,EAAAA,UAAU,KACRtC,IACAwB,OAAOe,iBAAiB,SAAUlB,EAAwB,CAAEmB,SAAS,MAGvEC,EAAAA,YAAY,KACVvD,EAAUC,QAAQuD,aAClBxD,EAAUE,QAAQsD,aAClBlB,OAAOmB,oBAAoB,SAAUtB,2BAWrCuB,EAAAA,mBAYM,MAAA,SAXA,iBAAJlE,IAAIE,EACHuB,MAAK0C,EAAAA,eAAA,CAAA/D,MAAA,OAAAC,OAAA,GAA8B+D,EAAAA,MAAAjE,GAAYE,eAEhDgE,EAAAA,mBAOM,MAAA,SANA,YAAJrE,IAAIC,EACHwB,uBAAO2C,QAAAV,IACPY,wBAAQF,QAAAvE,GAAG0E,EAAC,aAAeH,EAAAA,MAAAf,GAAazD,EAAA4E,YACzC,wBAAA,KAEAC,aAAQC,EAAAC,OAAA"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../withInstall.cjs"),t=require("./src/icon.vue.cjs");const r=e.withInstall(t.default);exports.Icon=r,exports.default=r;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../withInstall.cjs"),t=require("./src/icon.vue.cjs");const s=e.withInstall(t.default);exports.QxsIcon=s,exports.default=s;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../../../packages/components/src/icon/index.ts"],"sourcesContent":["import { withInstall } from '../withInstall'\nimport component from './src/icon.vue'\n\nconst Icon = withInstall(component)\n\nexport {\n Icon,\n}\n\nexport default Icon"],"names":["Icon","withInstall","component","default"],"mappings":"wIAGA,MAAMA,EAAOC,cAAYC,EAASC"}
1
+ {"version":3,"file":"index.cjs","sources":["../../../../../packages/components/src/icon/index.ts"],"sourcesContent":["import { withInstall } from '../withInstall'\nimport component from './src/icon.vue'\n\nconst QxsIcon = withInstall(component)\n\nexport {\n QxsIcon,\n}\n\nexport default QxsIcon\n"],"names":["QxsIcon","withInstall","component"],"mappings":"wIAGA,MAAMA,EAAUC,EAAAA,YAAYC,EAAAA"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("vue"),r=require("../../../node_modules/.pnpm/@iconify_vue@5.0.0_vue@3.5.13_typescript@5.8.2_/node_modules/@iconify/vue/dist/iconify.cjs"),n=require("@qxs-bns/hooks");const t={key:2,"aria-hidden":"true"},o=["xlink:href"];var i=e.defineComponent({name:"QxsIcon",__name:"icon",props:{name:{type:String,required:!0},runtime:{type:Boolean,required:!1},flip:{type:String,required:!1},rotate:{type:Number,required:!1},color:{type:String,required:!1},size:{type:[String,Number],required:!1}},setup(i){const s=i,u=e.useAttrs(),c=n.useNamespace("icon"),l=e.computed((()=>0===s.name.indexOf("i-")?s.runtime?"svg":"css":s.name.includes(":")?"svg":"custom")),a=e.computed((()=>{if(0===s.name.indexOf("i-")){let e=s.name;return s.runtime&&(e=e.replace("i-","")),e}return s.name})),p=e.computed((()=>{const e=[];if(""!==s.flip)switch(s.flip){case"horizontal":e.push("rotateY(180deg)");break;case"vertical":e.push("rotateX(180deg)");break;case"both":e.push("rotateX(180deg)"),e.push("rotateY(180deg)")}s.rotate&&e.push(`rotate(${s.rotate%360}deg)`);const{color:r,size:n}=s;return`${r?`color: ${r};`:""}\n ${n?`font-size: ${"number"==typeof n?`${n}px;`:n}`:""}\n ${e.length?`transform: ${e.join(" ")};`:""}`}));return(n,i)=>(e.openBlock(),e.createElementBlock("i",{class:e.normalizeClass(e.unref(c).e("icon")),style:e.normalizeStyle(e.unref(p)+e.unref(u).style)},["css"===e.unref(l)?(e.openBlock(),e.createElementBlock("i",{key:0,class:e.normalizeClass(e.unref(a))},null,2)):"svg"===e.unref(l)?(e.openBlock(),e.createBlock(e.unref(r.Icon),{key:1,icon:e.unref(a)},null,8,["icon"])):(e.openBlock(),e.createElementBlock("svg",t,[e.createElementVNode("use",{"xlink:href":`#icon-${e.unref(a)}`},null,8,o)]))],6))}});exports.default=i;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("vue"),r=require("../../../node_modules/.pnpm/@iconify_vue@5.0.0_vue@3.5.18_typescript@5.8.3_/node_modules/@iconify/vue/dist/iconify.cjs"),n=require("@qxs-bns/hooks");const t={key:2,"aria-hidden":"true"},o=["xlink:href"];var i=e.defineComponent({name:"QxsIcon",__name:"icon",props:{name:{type:String,required:!0},runtime:{type:Boolean,required:!1},flip:{type:String,required:!1},rotate:{type:Number,required:!1},color:{type:String,required:!1},size:{type:[String,Number],required:!1}},setup(i){const s=i,u=e.useAttrs(),c=n.useNamespace("icon"),l=e.computed(()=>0===s.name.indexOf("i-")?s.runtime?"svg":"css":s.name.includes(":")?"svg":"custom"),a=e.computed(()=>{if(0===s.name.indexOf("i-")){let e=s.name;return s.runtime&&(e=e.replace("i-","")),e}return s.name}),p=e.computed(()=>{const e=[];if(""!==s.flip)switch(s.flip){case"horizontal":e.push("rotateY(180deg)");break;case"vertical":e.push("rotateX(180deg)");break;case"both":e.push("rotateX(180deg)"),e.push("rotateY(180deg)")}s.rotate&&e.push(`rotate(${s.rotate%360}deg)`);const{color:r,size:n}=s;return`${r?`color: ${r};`:""}\n ${n?`font-size: ${"number"==typeof n?`${n}px;`:n}`:""}\n ${e.length?`transform: ${e.join(" ")};`:""}`});return(n,i)=>(e.openBlock(),e.createElementBlock("i",{class:e.normalizeClass(e.unref(c).e("icon")),style:e.normalizeStyle(e.unref(p)+e.unref(u).style)},["css"===e.unref(l)?(e.openBlock(),e.createElementBlock("i",{key:0,class:e.normalizeClass(e.unref(a))},null,2)):"svg"===e.unref(l)?(e.openBlock(),e.createBlock(e.unref(r.Icon),{key:1,icon:e.unref(a)},null,8,["icon"])):(e.openBlock(),e.createElementBlock("svg",t,[e.createElementVNode("use",{"xlink:href":`#icon-${e.unref(a)}`},null,8,o)]))],6))}});exports.default=i;
2
2
  //# sourceMappingURL=icon.vue.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"icon.vue.cjs","sources":["../../../../../../packages/components/src/icon/src/icon.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { Icon } from '@iconify/vue'\nimport { useNamespace } from '@qxs-bns/hooks'\n\ndefineOptions({\n name: 'QxsIcon',\n})\n\nconst props = defineProps<PropsType>()\n\nconst attrs = useAttrs()\n\nconst ns = useNamespace('icon')\n\nexport interface PropsType {\n name: string\n runtime?: boolean\n flip?: 'horizontal' | 'vertical' | 'both' | ''\n rotate?: number\n color?: string\n size?: string | number\n}\nconst outputType = computed(() => {\n if (props.name.indexOf('i-') === 0) {\n return props.runtime ? 'svg' : 'css'\n }\n else if (props.name.includes(':')) {\n return 'svg'\n }\n else {\n return 'custom'\n }\n})\n\nconst outputName = computed(() => {\n if (props.name.indexOf('i-') === 0) {\n let conversionName = props.name\n if (props.runtime) {\n conversionName = conversionName.replace('i-', '')\n }\n return conversionName\n }\n else {\n return props.name\n }\n})\n\nconst style = computed(() => {\n const transform = []\n if (props.flip !== '') {\n switch (props.flip) {\n case 'horizontal':\n transform.push('rotateY(180deg)')\n break\n case 'vertical':\n transform.push('rotateX(180deg)')\n break\n case 'both':\n transform.push('rotateX(180deg)')\n transform.push('rotateY(180deg)')\n break\n }\n }\n if (props.rotate) {\n transform.push(`rotate(${props.rotate % 360}deg)`)\n }\n const { color, size } = props\n return `${color ? `color: ${color};` : ''}\n ${size ? `font-size: ${typeof size === 'number' ? `${size}px;` : size}` : ''}\n ${transform.length ? `transform: ${transform.join(' ')};` : ''}`\n})\n</script>\n\n<template>\n <i\n :class=\"ns.e('icon')\"\n :style=\"style + attrs.style\"\n >\n <i\n v-if=\"outputType === 'css'\"\n :class=\"outputName\"\n />\n <Icon\n v-else-if=\"outputType === 'svg'\"\n :icon=\"outputName\"\n />\n <svg\n v-else\n aria-hidden=\"true\"\n >\n <use :xlink:href=\"`#icon-${outputName}`\" />\n </svg>\n </i>\n</template>\n"],"names":["props","__props","attrs","useAttrs","ns","useNamespace","outputType","computed","name","indexOf","runtime","includes","outputName","conversionName","replace","style","transform","flip","push","rotate","color","size","length","join"],"mappings":"gkBAQA,MAAMA,EAAQC,EAERC,EAAQC,EAAAA,WAERC,EAAKC,eAAa,QAUlBC,EAAaC,EAAAA,UAAS,IACO,IAA7BP,EAAMQ,KAAKC,QAAQ,MACdT,EAAMU,QAAU,MAAQ,MAExBV,EAAMQ,KAAKG,SAAS,KACpB,MAGA,WAILC,EAAaL,EAAAA,UAAS,KAC1B,GAAiC,IAA7BP,EAAMQ,KAAKC,QAAQ,MAAa,CAClC,IAAII,EAAiBb,EAAMQ,KAIpB,OAHHR,EAAMU,UACSG,EAAAA,EAAeC,QAAQ,KAAM,KAEzCD,CAAA,CAGP,OAAOb,EAAMQ,IAAA,IAIXO,EAAQR,EAAAA,UAAS,KACrB,MAAMS,EAAY,GACd,GAAe,KAAfhB,EAAMiB,KACR,OAAQjB,EAAMiB,MACZ,IAAK,aACHD,EAAUE,KAAK,mBACf,MACF,IAAK,WACHF,EAAUE,KAAK,mBACf,MACF,IAAK,OACHF,EAAUE,KAAK,mBACfF,EAAUE,KAAK,mBAIjBlB,EAAMmB,QACRH,EAAUE,KAAK,UAAUlB,EAAMmB,OAAS,WAEpC,MAAAC,MAAEA,EAAOC,KAAAA,GAASrB,EACxB,MAAO,GAAGoB,EAAQ,UAAUA,KAAW,iBAC7BC,EAAO,cAA8B,iBAATA,EAAoB,GAAGA,OAAYA,IAAS,iBACxEL,EAAUM,OAAS,cAAcN,EAAUO,KAAK,QAAU,IAAE"}
1
+ {"version":3,"file":"icon.vue.cjs","sources":["../../../../../../packages/components/src/icon/src/icon.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { Icon } from '@iconify/vue'\nimport { useNamespace } from '@qxs-bns/hooks'\n\ndefineOptions({\n name: 'QxsIcon',\n})\n\nconst props = defineProps<PropsType>()\n\nconst attrs = useAttrs()\n\nconst ns = useNamespace('icon')\n\nexport interface PropsType {\n name: string\n runtime?: boolean\n flip?: 'horizontal' | 'vertical' | 'both' | ''\n rotate?: number\n color?: string\n size?: string | number\n}\nconst outputType = computed(() => {\n if (props.name.indexOf('i-') === 0) {\n return props.runtime ? 'svg' : 'css'\n }\n else if (props.name.includes(':')) {\n return 'svg'\n }\n else {\n return 'custom'\n }\n})\n\nconst outputName = computed(() => {\n if (props.name.indexOf('i-') === 0) {\n let conversionName = props.name\n if (props.runtime) {\n conversionName = conversionName.replace('i-', '')\n }\n return conversionName\n }\n else {\n return props.name\n }\n})\n\nconst style = computed(() => {\n const transform = []\n if (props.flip !== '') {\n switch (props.flip) {\n case 'horizontal':\n transform.push('rotateY(180deg)')\n break\n case 'vertical':\n transform.push('rotateX(180deg)')\n break\n case 'both':\n transform.push('rotateX(180deg)')\n transform.push('rotateY(180deg)')\n break\n }\n }\n if (props.rotate) {\n transform.push(`rotate(${props.rotate % 360}deg)`)\n }\n const { color, size } = props\n return `${color ? `color: ${color};` : ''}\n ${size ? `font-size: ${typeof size === 'number' ? `${size}px;` : size}` : ''}\n ${transform.length ? `transform: ${transform.join(' ')};` : ''}`\n})\n</script>\n\n<template>\n <i\n :class=\"ns.e('icon')\"\n :style=\"style + attrs.style\"\n >\n <i\n v-if=\"outputType === 'css'\"\n :class=\"outputName\"\n />\n <Icon\n v-else-if=\"outputType === 'svg'\"\n :icon=\"outputName\"\n />\n <svg\n v-else\n aria-hidden=\"true\"\n >\n <use :xlink:href=\"`#icon-${outputName}`\" />\n </svg>\n </i>\n</template>\n"],"names":["props","__props","attrs","useAttrs","ns","useNamespace","outputType","computed","name","indexOf","runtime","includes","outputName","conversionName","replace","style","transform","flip","push","rotate","color","size","length","join","_createElementBlock","class","_normalizeClass","_unref","e","_normalizeStyle","_createBlock","Icon","icon","_openBlock","_hoisted_1","_createElementVNode"],"mappings":"gkBAQA,MAAMA,EAAQC,EAERC,EAAQC,EAAAA,WAERC,EAAKC,EAAAA,aAAa,QAUlBC,EAAaC,EAAAA,SAAS,IACO,IAA7BP,EAAMQ,KAAKC,QAAQ,MACdT,EAAMU,QAAU,MAAQ,MAExBV,EAAMQ,KAAKG,SAAS,KACpB,MAGA,UAILC,EAAaL,EAAAA,SAAS,KAC1B,GAAiC,IAA7BP,EAAMQ,KAAKC,QAAQ,MAAa,CAClC,IAAII,EAAiBb,EAAMQ,KAI3B,OAHIR,EAAMU,UACRG,EAAiBA,EAAeC,QAAQ,KAAM,KAEzCD,CACT,CAEE,OAAOb,EAAMQ,OAIXO,EAAQR,EAAAA,SAAS,KACrB,MAAMS,EAAY,GAClB,GAAmB,KAAfhB,EAAMiB,KACR,OAAQjB,EAAMiB,MACZ,IAAK,aACHD,EAAUE,KAAK,mBACf,MACF,IAAK,WACHF,EAAUE,KAAK,mBACf,MACF,IAAK,OACHF,EAAUE,KAAK,mBACfF,EAAUE,KAAK,mBAIjBlB,EAAMmB,QACRH,EAAUE,KAAK,UAAUlB,EAAMmB,OAAS,WAE1C,MAAMC,MAAEA,EAAAC,KAAOA,GAASrB,EACxB,MAAO,GAAGoB,EAAQ,UAAUA,KAAW,iBAC7BC,EAAO,cAA8B,iBAATA,EAAoB,GAAGA,OAAYA,IAAS,iBACxEL,EAAUM,OAAS,cAAcN,EAAUO,KAAK,QAAU,mCAKpEC,EAAAA,mBAkBI,IAAA,CAjBDC,MAAKC,EAAAA,eAAEC,EAAAA,MAAAvB,GAAGwB,EAAC,SACXb,MAAKc,EAAAA,eAAEF,QAAAZ,GAAQY,EAAAA,MAAAzB,GAAMa,SAGJ,QAAVY,EAAAA,MAAArB,kBADRkB,EAAAA,mBAGE,IAAA,OADCC,uBAAOE,EAAAA,MAAAf,cAGa,QAAVe,EAAAA,MAAArB,kBADbwB,EAAAA,YAGEH,QAAAI,EAAAA,MAAA,OADCC,KAAML,EAAAA,MAAAf,uBAETqB,EAAAA,YAAAT,EAAAA,mBAKM,MALNU,EAKM,CADJC,EAAAA,mBAA2C,MAAA,CAArC,sBAAqBR,EAAAA,MAAAf"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../../../packages/components/src/image-upload/index.ts"],"sourcesContent":["import { withInstall } from '../withInstall'\nimport component from './src/image-upload.vue'\n\nconst QxsImageUpload = withInstall(component)\n\nexport {\n QxsImageUpload,\n}\n\nexport default QxsImageUpload\n"],"names":["QxsImageUpload","withInstall","component","default"],"mappings":"gJAGA,MAAMA,EAAiBC,cAAYC,EAASC"}
1
+ {"version":3,"file":"index.cjs","sources":["../../../../../packages/components/src/image-upload/index.ts"],"sourcesContent":["import { withInstall } from '../withInstall'\nimport component from './src/image-upload.vue'\n\nconst QxsImageUpload = withInstall(component)\n\nexport {\n QxsImageUpload,\n}\n\nexport default QxsImageUpload\n"],"names":["QxsImageUpload","withInstall","component"],"mappings":"gJAGA,MAAMA,EAAiBC,EAAAA,YAAYC,EAAAA"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("element-plus/es");require("element-plus/es/components/base/style/index"),require("element-plus/es/components/image-viewer/style/index"),require("element-plus/es/components/upload/style/index"),require("element-plus/es/components/icon/style/index");var t=require("vue"),l=require("@element-plus/icons-vue"),i=require("element-plus");require("element-plus/es/components/message/style/index");const r={class:"image-slot"},a=["src"],n=["onClick"],s=["onClick"],o={class:"tip-content"};var u=t.defineComponent({name:"QxsImageUpload",__name:"image-upload",props:t.mergeModels({action:{type:String,required:!0},headers:{type:null,required:!1},data:{type:null,required:!1},name:{type:String,required:!1,default:"file"},url:{type:String,required:!1},size:{type:Number,required:!1,default:20},width:{type:Number,required:!1,default:160},accept:{type:String,required:!1,default:"image/jpeg,image/jpg,image/png,image/gif"},height:{type:Number,required:!1,default:90},placeholder:{type:String,required:!1,default:"上传图片"},notip:{type:Boolean,required:!1,default:!1},tipText:{type:String,required:!1,default:""},beforeUpload:{type:null,required:!1},disabled:{type:Boolean,required:!1,default:!1},limit:{type:Number,required:!1,default:1}},{fileList:{type:Array,default:()=>[]},fileListModifiers:{}}),emits:t.mergeModels(["onSuccess","remove"],["update:fileList"]),setup(u,{emit:p}){const d=p,c=t.useAttrs(),m=t.useModel(u,"fileList"),f=i.useNamespace("image-upload"),g=t.ref(0),v=t.ref({imageViewerVisible:!1,progress:{preview:"",percent:0}}),h=t.computed((()=>f.cssVarBlock({ns:f.namespace.value,width:`${u.width||160}px`,height:`${u.height||90}px`}))),y=t.computed((()=>u.accept.split(",").map((e=>e.split("/").pop())))),V=t.computed((()=>u.tipText||`上传图片支持 ${y.value.join(" / ")} 格式,且图片大小不超过 ${u.size}MB${u.width&&u.height?`,建议图片尺寸为 ${u.width}*${u.height}`:""}`));function q(e){g.value=m.value.indexOf(e),v.value.imageViewerVisible=!0}function x(e){m.value.splice(m.value.indexOf(e),1)}function w(){v.value.imageViewerVisible=!1}const C=t=>{const l=t.name.split(".").pop()??"",i=y.value.includes(l),r=t.size/1024/1024<u.size;return i?r?(v.value.progress.preview=URL.createObjectURL(t),!u.beforeUpload||u.beforeUpload(t)):(e.ElMessage.error(`上传图片大小不能超过 ${u.size}MB!`),!1):(e.ElMessage.error(`上传图片只支持${y.value.join(" / ")}格式!`),!1)},N=e=>{v.value.progress.percent=Math.floor(e.percent)},b=(...e)=>{v.value.progress={preview:"",percent:0},d("onSuccess",...e)};return(i,u)=>{const p=e.ElIcon,d=e.ElUpload,y=e.ElImageViewer;return t.openBlock(),t.createElementBlock("div",{class:t.normalizeClass(t.unref(f).e("container")),style:t.normalizeStyle(t.unref(h))},[t.createVNode(d,t.mergeProps(t.unref(c),{"file-list":m.value,"onUpdate:fileList":u[0]||(u[0]=e=>m.value=e),drag:"",limit:i.limit,"list-type":"picture-card",headers:i.headers,action:i.action,data:i.data,name:i.name,accept:i.accept,"before-upload":C,"on-progress":N,"on-preview":q,"on-success":b,class:[t.unref(f).e("control"),i.limit<=m.value.length?t.unref(f).e("more-than-limit"):""],"on-remove":x}),{file:t.withCtx((({file:e})=>[t.createElementVNode("img",{class:t.normalizeClass(`${t.unref(f).namespace.value}-upload-list__item-thumbnail`),src:e.url,alt:""},null,10,a),t.createElementVNode("span",{class:t.normalizeClass(`${t.unref(f).namespace.value}-upload-list__item-actions`)},[t.createElementVNode("span",{class:t.normalizeClass(`${t.unref(f).namespace.value}-upload-list__item-preview`),onClick:t=>q(e)},[t.createVNode(p,null,{default:t.withCtx((()=>[t.createVNode(t.unref(l.ZoomIn))])),_:1})],10,n),i.disabled?t.createCommentVNode("v-if",!0):(t.openBlock(),t.createElementBlock("span",{key:0,class:t.normalizeClass(`${t.unref(f).namespace.value}-upload-list__item-delete`),onClick:t=>x(e)},[t.createVNode(p,null,{default:t.withCtx((()=>[t.createVNode(t.unref(l.Delete))])),_:1})],10,s))],2)])),tip:t.withCtx((()=>[t.renderSlot(i.$slots,"tip",{},(()=>[i.notip?t.createCommentVNode("v-if",!0):(t.openBlock(),t.createElementBlock("div",{key:0,class:t.normalizeClass(`${t.unref(f).namespace.value}-upload__tip-text`)},[t.createElementVNode("div",o,t.toDisplayString(t.unref(V)),1)],2))]))])),default:t.withCtx((()=>[t.renderSlot(i.$slots,"default",{},(()=>[t.createElementVNode("div",r,[t.createVNode(p,null,{default:t.withCtx((()=>[t.createVNode(t.unref(l.Plus))])),_:1}),t.createElementVNode("p",null,t.toDisplayString(i.placeholder),1)])]))])),_:3},16,["file-list","limit","headers","action","data","name","accept","class"]),t.unref(v).imageViewerVisible?(t.openBlock(),t.createBlock(y,{key:0,"url-list":m.value.map((e=>e.url)).filter((e=>void 0!==e)),"initial-index":t.unref(g),teleported:"",onClose:w},null,8,["url-list","initial-index"])):t.createCommentVNode("v-if",!0)],6)}}});exports.default=u;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("element-plus/es");require("element-plus/es/components/base/style/index"),require("element-plus/es/components/image-viewer/style/index"),require("element-plus/es/components/upload/style/index"),require("element-plus/es/components/icon/style/index");var t=require("vue"),l=require("@element-plus/icons-vue"),i=require("element-plus");require("element-plus/es/components/message/style/index");const r={class:"image-slot"},a=["src"],n=["onClick"],s=["onClick"],o={class:"tip-content"};var u=t.defineComponent({name:"QxsImageUpload",__name:"image-upload",props:t.mergeModels({action:{type:String,required:!0},headers:{type:null,required:!1},data:{type:null,required:!1},name:{type:String,required:!1,default:"file"},url:{type:String,required:!1},size:{type:Number,required:!1,default:20},width:{type:Number,required:!1,default:160},accept:{type:String,required:!1,default:"image/jpeg,image/jpg,image/png,image/gif"},height:{type:Number,required:!1,default:90},placeholder:{type:String,required:!1,default:"上传图片"},notip:{type:Boolean,required:!1,default:!1},tipText:{type:String,required:!1,default:""},beforeUpload:{type:null,required:!1},disabled:{type:Boolean,required:!1,default:!1},limit:{type:Number,required:!1,default:1}},{fileList:{type:Array,default:()=>[]},fileListModifiers:{}}),emits:t.mergeModels(["onSuccess","remove"],["update:fileList"]),setup(u,{emit:p}){const d=p,c=t.useAttrs(),m=t.useModel(u,"fileList"),f=i.useNamespace("image-upload"),g=t.ref(0),v=t.ref({imageViewerVisible:!1,progress:{preview:"",percent:0}}),h=t.computed(()=>f.cssVarBlock({ns:f.namespace.value,width:`${u.width||160}px`,height:`${u.height||90}px`})),y=t.computed(()=>u.accept.split(",").map(e=>e.split("/").pop())),V=t.computed(()=>u.tipText||`上传图片支持 ${y.value.join(" / ")} 格式,且图片大小不超过 ${u.size}MB${u.width&&u.height?`,建议图片尺寸为 ${u.width}*${u.height}`:""}`);function q(e){g.value=m.value.indexOf(e),v.value.imageViewerVisible=!0}function x(e){m.value.splice(m.value.indexOf(e),1)}function w(){v.value.imageViewerVisible=!1}const C=t=>{const l=t.name.split(".").pop()??"",i=y.value.includes(l),r=t.size/1024/1024<u.size;return i?r?(v.value.progress.preview=URL.createObjectURL(t),!u.beforeUpload||u.beforeUpload(t)):(e.ElMessage.error(`上传图片大小不能超过 ${u.size}MB!`),!1):(e.ElMessage.error(`上传图片只支持${y.value.join(" / ")}格式!`),!1)},N=e=>{v.value.progress.percent=Math.floor(e.percent)},b=(...e)=>{v.value.progress={preview:"",percent:0},d("onSuccess",...e)};return(i,u)=>{const p=e.ElIcon,d=e.ElUpload,y=e.ElImageViewer;return t.openBlock(),t.createElementBlock("div",{class:t.normalizeClass(t.unref(f).e("container")),style:t.normalizeStyle(t.unref(h))},[t.createVNode(d,t.mergeProps(t.unref(c),{"file-list":m.value,"onUpdate:fileList":u[0]||(u[0]=e=>m.value=e),drag:"",limit:i.limit,"list-type":"picture-card",headers:i.headers,action:i.action,data:i.data,name:i.name,accept:i.accept,"before-upload":C,"on-progress":N,"on-preview":q,"on-success":b,class:[t.unref(f).e("control"),i.limit<=m.value.length?t.unref(f).e("more-than-limit"):""],"on-remove":x}),{file:t.withCtx(({file:e})=>[t.createElementVNode("img",{class:t.normalizeClass(`${t.unref(f).namespace.value}-upload-list__item-thumbnail`),src:e.url,alt:""},null,10,a),t.createElementVNode("span",{class:t.normalizeClass(`${t.unref(f).namespace.value}-upload-list__item-actions`)},[t.createElementVNode("span",{class:t.normalizeClass(`${t.unref(f).namespace.value}-upload-list__item-preview`),onClick:t=>q(e)},[t.createVNode(p,null,{default:t.withCtx(()=>[t.createVNode(t.unref(l.ZoomIn))]),_:1})],10,n),i.disabled?t.createCommentVNode("v-if",!0):(t.openBlock(),t.createElementBlock("span",{key:0,class:t.normalizeClass(`${t.unref(f).namespace.value}-upload-list__item-delete`),onClick:t=>x(e)},[t.createVNode(p,null,{default:t.withCtx(()=>[t.createVNode(t.unref(l.Delete))]),_:1})],10,s))],2)]),tip:t.withCtx(()=>[t.renderSlot(i.$slots,"tip",{},()=>[i.notip?t.createCommentVNode("v-if",!0):(t.openBlock(),t.createElementBlock("div",{key:0,class:t.normalizeClass(`${t.unref(f).namespace.value}-upload__tip-text`)},[t.createElementVNode("div",o,t.toDisplayString(t.unref(V)),1)],2))])]),default:t.withCtx(()=>[t.renderSlot(i.$slots,"default",{},()=>[t.createElementVNode("div",r,[t.createVNode(p,null,{default:t.withCtx(()=>[t.createVNode(t.unref(l.Plus))]),_:1}),t.createElementVNode("p",null,t.toDisplayString(i.placeholder),1)])])]),_:3},16,["file-list","limit","headers","action","data","name","accept","class"]),t.unref(v).imageViewerVisible?(t.openBlock(),t.createBlock(y,{key:0,"url-list":m.value.map(e=>e.url).filter(e=>void 0!==e),"initial-index":t.unref(g),teleported:"",onClose:w},null,8,["url-list","initial-index"])):t.createCommentVNode("v-if",!0)],6)}}});exports.default=u;
2
2
  //# sourceMappingURL=image-upload.vue.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"image-upload.vue.cjs","sources":["../../../../../../packages/components/src/image-upload/src/image-upload.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { UploadFile, UploadFiles, UploadProps } from 'element-plus'\nimport { Delete, Plus, ZoomIn } from '@element-plus/icons-vue'\nimport { useNamespace } from 'element-plus'\n// import QxsIcon from '../../icon'\n\n// 组件名称\ndefineOptions({\n name: 'QxsImageUpload',\n})\n\n// Props 定义\nconst {\n name = 'file',\n size = 20,\n width = 160,\n height = 90,\n limit = 1,\n placeholder = '上传图片',\n notip = false,\n accept = 'image/jpeg,image/jpg,image/png,image/gif',\n beforeUpload,\n tipText = '',\n disabled = false,\n} = defineProps<ImageUploadProps>()\n\n// Emits 定义\nconst emits = defineEmits<{\n onSuccess: [res: any, uploadFile: UploadFile, uploadFiles: UploadFiles]\n remove: [file: UploadFile]\n}>()\n\n// 类型定义\nexport interface ImageUploadProps {\n action: UploadProps['action']\n headers?: UploadProps['headers']\n data?: UploadProps['data']\n name?: UploadProps['name']\n url?: string\n size?: number\n width?: number\n accept?: string\n height?: number\n placeholder?: string\n notip?: boolean\n tipText?: string\n beforeUpload?: UploadProps['beforeUpload']\n disabled?: boolean\n limit?: number\n}\n\ninterface UploadProgress {\n preview: string\n percent: number\n}\n\nconst attrs = useAttrs()\n\nconst fileList = defineModel('fileList', {\n type: Array as () => UploadFile[],\n default: () => [],\n})\n\n// 命名空间\nconst nsEl = useNamespace('image-upload')\n\nconst initialIndex = ref(0)\n// 响应式数据\nconst uploadData = ref<{\n imageViewerVisible: boolean\n progress: UploadProgress\n}>({\n imageViewerVisible: false,\n progress: {\n preview: '',\n percent: 0,\n },\n})\n\nconst cssVar = computed(() => {\n return nsEl.cssVarBlock({\n ns: nsEl.namespace.value,\n width: `${width || 160}px`,\n height: `${height || 90}px`,\n })\n})\n\n// 计算属性\nconst exts = computed(() =>\n accept.split(',').map(ext => ext.split('/').pop()),\n)\n\nconst tipMessage = computed(\n () =>\n tipText\n || `上传图片支持 ${exts.value.join(\n ' / ',\n )} 格式,且图片大小不超过 ${size}MB${width && height ? `,建议图片尺寸为 ${width}*${height}` : ''}`,\n)\n\n// 方法\nfunction onPreview(file: UploadFile) {\n initialIndex.value = fileList.value.indexOf(file)\n uploadData.value.imageViewerVisible = true\n}\nfunction onRemove(file: UploadFile) {\n fileList.value.splice(fileList.value.indexOf(file), 1)\n}\n\nfunction previewClose() {\n uploadData.value.imageViewerVisible = false\n}\n\nconst handleBeforeUpload: UploadProps['beforeUpload'] = (file) => {\n const fileExt = file.name.split('.').pop() ?? ''\n const isTypeOk = exts.value.includes(fileExt)\n const isSizeOk = file.size / 1024 / 1024 < size\n\n if (!isTypeOk) {\n ElMessage.error(`上传图片只支持${exts.value.join(' / ')}格式!`)\n return false\n }\n\n if (!isSizeOk) {\n ElMessage.error(`上传图片大小不能超过 ${size}MB!`)\n return false\n }\n\n uploadData.value.progress.preview = URL.createObjectURL(file)\n\n return beforeUpload ? beforeUpload(file) : true\n}\n\nconst onProgress: UploadProps['onProgress'] = (evt) => {\n uploadData.value.progress.percent = Math.floor(evt.percent)\n}\n\nconst onSuccess: UploadProps['onSuccess'] = (...args) => {\n uploadData.value.progress = {\n preview: '',\n percent: 0,\n }\n emits('onSuccess', ...args)\n}\n</script>\n\n<template>\n <div\n :class=\"nsEl.e('container')\"\n :style=\"cssVar\"\n >\n <el-upload\n v-bind=\"attrs\"\n v-model:file-list=\"fileList\"\n drag\n :limit=\"limit\"\n list-type=\"picture-card\"\n :headers=\"headers\"\n :action=\"action\"\n :data=\"data\"\n :name=\"name\"\n :accept=\"accept\"\n :before-upload=\"handleBeforeUpload\"\n :on-progress=\"onProgress\"\n :on-preview=\"onPreview\"\n :on-success=\"onSuccess\"\n :class=\"[nsEl.e('control'), limit <= fileList.length ? nsEl.e('more-than-limit') : '']\"\n :on-remove=\"onRemove\"\n >\n <slot>\n <div class=\"image-slot\">\n <el-icon><Plus /></el-icon>\n <p>{{ placeholder }}</p>\n </div>\n </slot>\n <template #file=\"{ file }\">\n <img\n :class=\"`${nsEl.namespace.value}-upload-list__item-thumbnail`\"\n :src=\"file.url\"\n alt=\"\"\n >\n <span :class=\"`${nsEl.namespace.value}-upload-list__item-actions`\">\n <span\n :class=\"`${nsEl.namespace.value}-upload-list__item-preview`\"\n @click=\"onPreview(file)\"\n >\n <el-icon><ZoomIn /></el-icon>\n </span>\n <span\n v-if=\"!disabled\"\n :class=\"`${nsEl.namespace.value}-upload-list__item-delete`\"\n @click=\"onRemove(file)\"\n >\n <el-icon><Delete /></el-icon>\n </span>\n </span>\n </template>\n <template #tip>\n <slot name=\"tip\">\n <div\n v-if=\"!notip\"\n :class=\"`${nsEl.namespace.value}-upload__tip-text`\"\n >\n <div class=\"tip-content\">\n {{ tipMessage }}\n </div>\n </div>\n </slot>\n </template>\n </el-upload>\n\n <el-image-viewer\n v-if=\"uploadData.imageViewerVisible\"\n :url-list=\"fileList.map(item => item.url).filter(v => v !== undefined)\"\n :initial-index=\"initialIndex\"\n teleported\n @close=\"previewClose\"\n />\n </div>\n</template>\n"],"names":["emits","__emit","attrs","useAttrs","fileList","_useModel","__props","nsEl","useNamespace","initialIndex","ref","uploadData","imageViewerVisible","progress","preview","percent","cssVar","computed","cssVarBlock","ns","namespace","value","width","height","exts","split","map","ext","pop","tipMessage","tipText","join","size","onPreview","file","indexOf","onRemove","splice","previewClose","handleBeforeUpload","fileExt","name","isTypeOk","includes","isSizeOk","URL","createObjectURL","beforeUpload","ElMessage","error","onProgress","evt","Math","floor","onSuccess","args"],"mappings":"06CA2BA,MAAMA,EAAQC,EA6BRC,EAAQC,EAAAA,WAERC,EAAWC,EAAAA,SAAYC,EAAA,YAMvBC,EAAOC,eAAa,gBAEpBC,EAAeC,MAAI,GAEnBC,EAAaD,EAAAA,IAGhB,CACDE,oBAAoB,EACpBC,SAAU,CACRC,QAAS,GACTC,QAAS,KAIPC,EAASC,EAAAA,UAAS,IACfV,EAAKW,YAAY,CACtBC,GAAIZ,EAAKa,UAAUC,MACnBC,MAAO,GAAGhB,EAAKgB,OAAI,QACnBC,OAAQ,GAAGjB,EAAAiB,QAAU,WAKnBC,EAAOP,EAAAA,UAAS,IACpBX,SAAOmB,MAAM,KAAKC,KAAIC,GAAOA,EAAIF,MAAM,KAAKG,UAGxCC,EAAaZ,EAAAA,UACjB,IACEX,EAAAwB,SACG,UAAUN,EAAKH,MAAMU,KACtB,sBACezB,EAAI0B,SAAK1B,EAAKgB,OAAIhB,EAAAiB,OAAS,YAAYjB,EAAAgB,SAAShB,EAAMiB,SAAK,OAIhF,SAASU,EAAUC,GACjBzB,EAAaY,MAAQjB,EAASiB,MAAMc,QAAQD,GAC5CvB,EAAWU,MAAMT,oBAAqB,CAAA,CAExC,SAASwB,EAASF,GAChB9B,EAASiB,MAAMgB,OAAOjC,EAASiB,MAAMc,QAAQD,GAAO,EAAC,CAGvD,SAASI,IACP3B,EAAWU,MAAMT,oBAAqB,CAAA,CAGlC,MAAA2B,EAAmDL,IACvD,MAAMM,EAAUN,EAAKO,KAAKhB,MAAM,KAAKG,OAAS,GACxCc,EAAWlB,EAAKH,MAAMsB,SAASH,GAC/BI,EAAWV,EAAKF,KAAO,KAAO,KAAO1B,EAAA0B,KAE3C,OAAKU,EAKAE,GAKLjC,EAAWU,MAAMR,SAASC,QAAU+B,IAAIC,gBAAgBZ,IAEjD5B,EAAYyC,cAAGzC,eAAa4B,KANjCc,EAAAA,UAAUC,MAAM,cAAc3C,EAAA0B,YACvB,IANPgB,YAAUC,MAAM,UAAUzB,EAAKH,MAAMU,KAAK,cACnC,EAUkC,EAGvCmB,EAAyCC,IAC7CxC,EAAWU,MAAMR,SAASE,QAAUqC,KAAKC,MAAMF,EAAIpC,QAAO,EAGtDuC,EAAsC,IAAIC,KAC9C5C,EAAWU,MAAMR,SAAW,CAC1BC,QAAS,GACTC,QAAS,GAELf,EAAA,eAAgBuD,EAAI"}
1
+ {"version":3,"file":"image-upload.vue.cjs","sources":["../../../../../../packages/components/src/image-upload/src/image-upload.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { UploadFile, UploadFiles, UploadProps } from 'element-plus'\nimport { Delete, Plus, ZoomIn } from '@element-plus/icons-vue'\nimport { useNamespace } from 'element-plus'\n\n// 组件名称\ndefineOptions({\n name: 'QxsImageUpload',\n})\n\n// Props 定义\nconst {\n name = 'file',\n size = 20,\n width = 160,\n height = 90,\n limit = 1,\n placeholder = '上传图片',\n notip = false,\n accept = 'image/jpeg,image/jpg,image/png,image/gif',\n beforeUpload,\n tipText = '',\n disabled = false,\n} = defineProps<ImageUploadProps>()\n\n// Emits 定义\nconst emits = defineEmits<{\n onSuccess: [res: any, uploadFile: UploadFile, uploadFiles: UploadFiles]\n remove: [file: UploadFile]\n}>()\n\n// 类型定义\nexport interface ImageUploadProps {\n action: UploadProps['action']\n headers?: UploadProps['headers']\n data?: UploadProps['data']\n name?: UploadProps['name']\n url?: string\n size?: number\n width?: number\n accept?: string\n height?: number\n placeholder?: string\n notip?: boolean\n tipText?: string\n beforeUpload?: UploadProps['beforeUpload']\n disabled?: boolean\n limit?: number\n}\n\ninterface UploadProgress {\n preview: string\n percent: number\n}\n\nconst attrs = useAttrs()\n\nconst fileList = defineModel('fileList', {\n type: Array as () => UploadFile[],\n default: () => [],\n})\n\n// 命名空间\nconst nsEl = useNamespace('image-upload')\n\nconst initialIndex = ref(0)\n// 响应式数据\nconst uploadData = ref<{\n imageViewerVisible: boolean\n progress: UploadProgress\n}>({\n imageViewerVisible: false,\n progress: {\n preview: '',\n percent: 0,\n },\n})\n\nconst cssVar = computed(() => {\n return nsEl.cssVarBlock({\n ns: nsEl.namespace.value,\n width: `${width || 160}px`,\n height: `${height || 90}px`,\n })\n})\n\n// 计算属性\nconst exts = computed(() =>\n accept.split(',').map(ext => ext.split('/').pop()),\n)\n\nconst tipMessage = computed(\n () =>\n tipText\n || `上传图片支持 ${exts.value.join(\n ' / ',\n )} 格式,且图片大小不超过 ${size}MB${width && height ? `,建议图片尺寸为 ${width}*${height}` : ''}`,\n)\n\n// 方法\nfunction onPreview(file: UploadFile) {\n initialIndex.value = fileList.value.indexOf(file)\n uploadData.value.imageViewerVisible = true\n}\nfunction onRemove(file: UploadFile) {\n fileList.value.splice(fileList.value.indexOf(file), 1)\n}\n\nfunction previewClose() {\n uploadData.value.imageViewerVisible = false\n}\n\nconst handleBeforeUpload: UploadProps['beforeUpload'] = (file) => {\n const fileExt = file.name.split('.').pop() ?? ''\n const isTypeOk = exts.value.includes(fileExt)\n const isSizeOk = file.size / 1024 / 1024 < size\n\n if (!isTypeOk) {\n ElMessage.error(`上传图片只支持${exts.value.join(' / ')}格式!`)\n return false\n }\n\n if (!isSizeOk) {\n ElMessage.error(`上传图片大小不能超过 ${size}MB!`)\n return false\n }\n\n uploadData.value.progress.preview = URL.createObjectURL(file)\n\n return beforeUpload ? beforeUpload(file) : true\n}\n\nconst onProgress: UploadProps['onProgress'] = (evt) => {\n uploadData.value.progress.percent = Math.floor(evt.percent)\n}\n\nconst onSuccess: UploadProps['onSuccess'] = (...args) => {\n uploadData.value.progress = {\n preview: '',\n percent: 0,\n }\n emits('onSuccess', ...args)\n}\n</script>\n\n<template>\n <div\n :class=\"nsEl.e('container')\"\n :style=\"cssVar\"\n >\n <el-upload\n v-bind=\"attrs\"\n v-model:file-list=\"fileList\"\n drag\n :limit=\"limit\"\n list-type=\"picture-card\"\n :headers=\"headers\"\n :action=\"action\"\n :data=\"data\"\n :name=\"name\"\n :accept=\"accept\"\n :before-upload=\"handleBeforeUpload\"\n :on-progress=\"onProgress\"\n :on-preview=\"onPreview\"\n :on-success=\"onSuccess\"\n :class=\"[nsEl.e('control'), limit <= fileList.length ? nsEl.e('more-than-limit') : '']\"\n :on-remove=\"onRemove\"\n >\n <slot>\n <div class=\"image-slot\">\n <el-icon><Plus /></el-icon>\n <p>{{ placeholder }}</p>\n </div>\n </slot>\n <template #file=\"{ file }\">\n <img\n :class=\"`${nsEl.namespace.value}-upload-list__item-thumbnail`\"\n :src=\"file.url\"\n alt=\"\"\n >\n <span :class=\"`${nsEl.namespace.value}-upload-list__item-actions`\">\n <span\n :class=\"`${nsEl.namespace.value}-upload-list__item-preview`\"\n @click=\"onPreview(file)\"\n >\n <el-icon><ZoomIn /></el-icon>\n </span>\n <span\n v-if=\"!disabled\"\n :class=\"`${nsEl.namespace.value}-upload-list__item-delete`\"\n @click=\"onRemove(file)\"\n >\n <el-icon><Delete /></el-icon>\n </span>\n </span>\n </template>\n <template #tip>\n <slot name=\"tip\">\n <div\n v-if=\"!notip\"\n :class=\"`${nsEl.namespace.value}-upload__tip-text`\"\n >\n <div class=\"tip-content\">\n {{ tipMessage }}\n </div>\n </div>\n </slot>\n </template>\n </el-upload>\n\n <el-image-viewer\n v-if=\"uploadData.imageViewerVisible\"\n :url-list=\"fileList.map(item => item.url).filter(v => v !== undefined)\"\n :initial-index=\"initialIndex\"\n teleported\n @close=\"previewClose\"\n />\n </div>\n</template>\n"],"names":["emits","__emit","attrs","useAttrs","fileList","_useModel","__props","nsEl","useNamespace","initialIndex","ref","uploadData","imageViewerVisible","progress","preview","percent","cssVar","computed","cssVarBlock","ns","namespace","value","width","height","exts","split","map","ext","pop","tipMessage","tipText","join","size","onPreview","file","indexOf","onRemove","splice","previewClose","handleBeforeUpload","fileExt","name","isTypeOk","includes","isSizeOk","URL","createObjectURL","beforeUpload","ElMessage","error","onProgress","evt","Math","floor","onSuccess","args","_createElementBlock","class","_normalizeClass","_unref","e","style","_createVNode","_component_el_upload","_mergeProps","$event","drag","limit","headers","action","data","accept","length","_withCtx","_createElementVNode","src","url","alt","onClick","_component_el_icon","ZoomIn","disabled","Delete","tip","_renderSlot","_ctx","notip","_hoisted_5","_toDisplayString","_hoisted_1","Plus","placeholder","_createBlock","_component_el_image_viewer","item","filter","v","teleported","onClose"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"make-installer.cjs","sources":["../../../../packages/components/src/make-installer.ts"],"sourcesContent":["import type { Plugin } from 'vue'\nimport { version } from '../package.json'\n\nfunction makeInstaller(components: {\n [key: number]: Plugin\n}) {\n const install = (app: any) => {\n for (const n in components) {\n app.use(components[n])\n }\n }\n\n return {\n version,\n install,\n }\n}\n\nexport { makeInstaller }\n"],"names":["components","version","install","app","n","use"],"mappings":"wEAGA,SAAuBA,GASd,MAAA,SACLC,EAAAA,QACAC,QAReC,IACf,IAAA,MAAWC,KAAKJ,EACVG,EAAAE,IAAIL,EAAWI,GACrB,EAOJ"}
1
+ {"version":3,"file":"make-installer.cjs","sources":["../../../../packages/components/src/make-installer.ts"],"sourcesContent":["import type { Plugin } from 'vue'\nimport { version } from '../package.json'\n\nfunction makeInstaller(components: {\n [key: number]: Plugin\n}) {\n const install = (app: any) => {\n for (const n in components) {\n app.use(components[n])\n }\n }\n\n return {\n version,\n install,\n }\n}\n\nexport { makeInstaller }\n"],"names":["components","version","install","app","n","use"],"mappings":"wEAGA,SAAuBA,GASrB,MAAO,SACLC,EAAAA,QACAC,QAReC,IACf,IAAA,MAAWC,KAAKJ,EACdG,EAAIE,IAAIL,EAAWI,KAQzB"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../../../packages/components/src/photo-crop-tool/index.ts"],"sourcesContent":["import { withInstall } from '../withInstall'\nimport component from './src/photo-crop-tool.vue'\n\nconst QxsPhotoCropTool = withInstall(component)\n\nexport {\n QxsPhotoCropTool,\n}\n\nexport default QxsPhotoCropTool\n"],"names":["QxsPhotoCropTool","withInstall","component","default"],"mappings":"mJAGA,MAAMA,EAAmBC,cAAYC,EAASC"}
1
+ {"version":3,"file":"index.cjs","sources":["../../../../../packages/components/src/photo-crop-tool/index.ts"],"sourcesContent":["import { withInstall } from '../withInstall'\nimport component from './src/photo-crop-tool.vue'\n\nconst QxsPhotoCropTool = withInstall(component)\n\nexport {\n QxsPhotoCropTool,\n}\n\nexport default QxsPhotoCropTool\n"],"names":["QxsPhotoCropTool","withInstall","component"],"mappings":"mJAGA,MAAMA,EAAmBC,EAAAA,YAAYC,EAAAA"}
@@ -1,2 +1,2 @@
1
- "use strict";var e=require("vue");exports.useCanvas=function(a){const l=e.ref(null);return a&&(l.value=a.getContext("2d")),{clearCanvas:()=>{l.value&&l.value.clearRect(0,0,a.width,a.height)},drawColor:(e,a,t,n,r)=>{l.value&&(l.value.fillStyle=r,l.value.fillRect(e,a,t,n))},drawImage:(e,a,t,n,r)=>{l.value.drawImage(e,a,t,n,r)},cropCanvas:(e,t,n,r)=>new Promise((u=>{if(l.value){const l=document.createElement("canvas");l.width=n,l.height=r;const i=l.getContext("2d");i?(i.drawImage(a,e,t,n,r,0,0,n,r),l.toBlob((e=>{if(e){const a=new File([e],"cropped_image.png",{type:"image/png"});u(a)}else u(null)}),"image/png")):u(null)}else u(null)}))}};
1
+ "use strict";var e=require("vue");exports.useCanvas=function(a){const l=e.ref(null);return a&&(l.value=a.getContext("2d")),{clearCanvas:()=>{l.value&&l.value.clearRect(0,0,a.width,a.height)},drawColor:(e,a,t,n,r)=>{l.value&&(l.value.fillStyle=r,l.value.fillRect(e,a,t,n))},drawImage:(e,a,t,n,r)=>{l.value.drawImage(e,a,t,n,r)},cropCanvas:(e,t,n,r)=>new Promise(u=>{if(l.value){const l=document.createElement("canvas");l.width=n,l.height=r;const i=l.getContext("2d");i?(i.drawImage(a,e,t,n,r,0,0,n,r),l.toBlob(e=>{if(e){const a=new File([e],"cropped_image.png",{type:"image/png"});u(a)}else u(null)},"image/png")):u(null)}else u(null)})}};
2
2
  //# sourceMappingURL=composables.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"composables.cjs","sources":["../../../../../../packages/components/src/photo-crop-tool/src/composables.ts"],"sourcesContent":["// useCanvas.ts\nimport type { Ref } from 'vue'\n\nexport function useCanvas(canvasElement: HTMLCanvasElement) {\n const context: Ref<CanvasRenderingContext2D | null> = ref(null)\n\n if (canvasElement) {\n context.value = canvasElement.getContext('2d')\n }\n\n const clearCanvas = () => {\n if (context.value) {\n context.value.clearRect(0, 0, canvasElement.width, canvasElement.height)\n }\n }\n\n const drawColor = (x: number, y: number, width: number, height: number, color: string) => {\n if (context.value) {\n context.value.fillStyle = color\n context.value.fillRect(x, y, width, height)\n }\n }\n\n const drawImage = (image: HTMLImageElement, x: number, y: number, width: number, height: number) => {\n context.value!.drawImage(image, x, y, width, height)\n }\n\n const cropCanvas = (x: number, y: number, width: number, height: number): Promise<File | null> => {\n return new Promise((resolve) => {\n if (context.value) {\n const croppedCanvas = document.createElement('canvas')\n croppedCanvas.width = width\n croppedCanvas.height = height\n const croppedContext = croppedCanvas.getContext('2d')\n if (croppedContext) {\n croppedContext.drawImage(canvasElement, x, y, width, height, 0, 0, width, height)\n croppedCanvas.toBlob((blob) => {\n if (blob) {\n const file = new File([blob], 'cropped_image.png', { type: 'image/png' })\n resolve(file)\n }\n else {\n resolve(null)\n }\n }, 'image/png')\n }\n else {\n resolve(null)\n }\n }\n else {\n resolve(null)\n }\n })\n }\n\n return {\n clearCanvas,\n drawColor,\n drawImage,\n cropCanvas,\n }\n}\n"],"names":["canvasElement","context","ref","value","getContext","clearCanvas","clearRect","width","height","drawColor","x","y","color","fillStyle","fillRect","drawImage","image","cropCanvas","Promise","resolve","croppedCanvas","document","createElement","croppedContext","toBlob","blob","file","File","type"],"mappings":"oDAGO,SAAmBA,GAClB,MAAAC,EAAgDC,MAAI,MAoDnD,OAlDHF,IACMC,EAAAE,MAAQH,EAAcI,WAAW,OAiDpC,CACLC,YA/CkBA,KACdJ,EAAQE,OACVF,EAAQE,MAAMG,UAAU,EAAG,EAAGN,EAAcO,MAAOP,EAAcQ,OACnE,EA6CAC,UA1CgBA,CAACC,EAAWC,EAAWJ,EAAeC,EAAgBI,KAClEX,EAAQE,QACVF,EAAQE,MAAMU,UAAYD,EAC1BX,EAAQE,MAAMW,SAASJ,EAAGC,EAAGJ,EAAOC,GACtC,EAuCAO,UApCgBA,CAACC,EAAyBN,EAAWC,EAAWJ,EAAeC,KAC/EP,EAAQE,MAAOY,UAAUC,EAAON,EAAGC,EAAGJ,EAAOC,EAAM,EAoCnDS,WAjCiBA,CAACP,EAAWC,EAAWJ,EAAeC,IAChD,IAAIU,SAASC,IAClB,GAAIlB,EAAQE,MAAO,CACX,MAAAiB,EAAgBC,SAASC,cAAc,UAC7CF,EAAcb,MAAQA,EACtBa,EAAcZ,OAASA,EACjB,MAAAe,EAAiBH,EAAchB,WAAW,MAC5CmB,GACaA,EAAAR,UAAUf,EAAeU,EAAGC,EAAGJ,EAAOC,EAAQ,EAAG,EAAGD,EAAOC,GAC5DY,EAAAI,QAAQC,IACpB,GAAIA,EAAM,CACF,MAAAC,EAAO,IAAIC,KAAK,CAACF,GAAO,oBAAqB,CAAEG,KAAM,cAC3DT,EAAQO,EACV,MAEEP,EAAQ,KACV,GACC,cAGHA,EAAQ,KAEZ,MAEEA,EAAQ,KACV,IAUN"}
1
+ {"version":3,"file":"composables.cjs","sources":["../../../../../../packages/components/src/photo-crop-tool/src/composables.ts"],"sourcesContent":["// useCanvas.ts\nimport type { Ref } from 'vue'\n\nexport function useCanvas(canvasElement: HTMLCanvasElement) {\n const context: Ref<CanvasRenderingContext2D | null> = ref(null)\n\n if (canvasElement) {\n context.value = canvasElement.getContext('2d')\n }\n\n const clearCanvas = () => {\n if (context.value) {\n context.value.clearRect(0, 0, canvasElement.width, canvasElement.height)\n }\n }\n\n const drawColor = (x: number, y: number, width: number, height: number, color: string) => {\n if (context.value) {\n context.value.fillStyle = color\n context.value.fillRect(x, y, width, height)\n }\n }\n\n const drawImage = (image: HTMLImageElement, x: number, y: number, width: number, height: number) => {\n context.value!.drawImage(image, x, y, width, height)\n }\n\n const cropCanvas = (x: number, y: number, width: number, height: number): Promise<File | null> => {\n return new Promise((resolve) => {\n if (context.value) {\n const croppedCanvas = document.createElement('canvas')\n croppedCanvas.width = width\n croppedCanvas.height = height\n const croppedContext = croppedCanvas.getContext('2d')\n if (croppedContext) {\n croppedContext.drawImage(canvasElement, x, y, width, height, 0, 0, width, height)\n croppedCanvas.toBlob((blob) => {\n if (blob) {\n const file = new File([blob], 'cropped_image.png', { type: 'image/png' })\n resolve(file)\n }\n else {\n resolve(null)\n }\n }, 'image/png')\n }\n else {\n resolve(null)\n }\n }\n else {\n resolve(null)\n }\n })\n }\n\n return {\n clearCanvas,\n drawColor,\n drawImage,\n cropCanvas,\n }\n}\n"],"names":["canvasElement","context","ref","value","getContext","clearCanvas","clearRect","width","height","drawColor","x","y","color","fillStyle","fillRect","drawImage","image","cropCanvas","Promise","resolve","croppedCanvas","document","createElement","croppedContext","toBlob","blob","file","File","type"],"mappings":"oDAGO,SAAmBA,GACxB,MAAMC,EAAgDC,EAAAA,IAAI,MAoD1D,OAlDIF,IACFC,EAAQE,MAAQH,EAAcI,WAAW,OAiDpC,CACLC,YA/CkBA,KACdJ,EAAQE,OACVF,EAAQE,MAAMG,UAAU,EAAG,EAAGN,EAAcO,MAAOP,EAAcQ,SA8CnEC,UA1CgBA,CAACC,EAAWC,EAAWJ,EAAeC,EAAgBI,KAClEX,EAAQE,QACVF,EAAQE,MAAMU,UAAYD,EAC1BX,EAAQE,MAAMW,SAASJ,EAAGC,EAAGJ,EAAOC,KAwCtCO,UApCgBA,CAACC,EAAyBN,EAAWC,EAAWJ,EAAeC,KAC/EP,EAAQE,MAAOY,UAAUC,EAAON,EAAGC,EAAGJ,EAAOC,IAoC7CS,WAjCiBA,CAACP,EAAWC,EAAWJ,EAAeC,IAChD,IAAIU,QAASC,IAClB,GAAIlB,EAAQE,MAAO,CACjB,MAAMiB,EAAgBC,SAASC,cAAc,UAC7CF,EAAcb,MAAQA,EACtBa,EAAcZ,OAASA,EACvB,MAAMe,EAAiBH,EAAchB,WAAW,MAC5CmB,GACFA,EAAeR,UAAUf,EAAeU,EAAGC,EAAGJ,EAAOC,EAAQ,EAAG,EAAGD,EAAOC,GAC1EY,EAAcI,OAAQC,IACpB,GAAIA,EAAM,CACR,MAAMC,EAAO,IAAIC,KAAK,CAACF,GAAO,oBAAqB,CAAEG,KAAM,cAC3DT,EAAQO,EACV,MAEEP,EAAQ,OAET,cAGHA,EAAQ,KAEZ,MAEEA,EAAQ,QAWhB"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("vue"),t=require("@qxs-bns/hooks"),o=require("./composables.cjs"),l=require("@vueuse/core");const i=["src"];var a=e.defineComponent({name:"QxsPhotoCropTool",__name:"photo-crop-tool",props:{imgFile:{type:Object,default:()=>null},aspectRatio:{type:String,default:()=>"16 / 9"},defaultWidth:{type:Number,default:()=>320},defaultHeight:{type:Number,default:()=>180},zoomType:{type:String,default:()=>"fixed"}},setup(a,{expose:u}){const n=a;let r=0,s=0,v=0,h=0;const c=t.useNamespace("photo-crop-tool"),p=e.ref(null),d=e.ref(null),f=e.ref(null),m=e.ref(""),g=e.ref(""),w=e.ref({x:0,y:0}),y=e.ref({width:n.defaultWidth,height:n.defaultHeight,x:0,y:0}),{width:x,height:b}=l.useElementSize(p),{width:E}=l.useElementSize(f),{x:T,y:M,style:z}=l.useDraggable(p,{containerElement:d,draggingElement:p,disabled:e.computed((()=>!!g.value)),exact:!0,initialValue:w}),N=e.computed((()=>n.imgFile?URL.createObjectURL(n.imgFile):""));e.watch((()=>n.imgFile),(e=>{e&&!e.type.startsWith("image/")?m.value="文件类型错误":m.value=""}));const R=e.computed((()=>(f.value?.naturalWidth||0)/E.value)),k=e.computed((()=>{const e={left:0,top:0};return"bottom-right"===g.value?(e.left=y.value.x,e.top=y.value.y):"top-left"===g.value?(e.left=y.value.x-x.value,e.top=y.value.y-b.value):"top-right"===g.value?(e.top=y.value.y-b.value,e.left=y.value.x):"bottom-left"===g.value&&(e.left=y.value.x-x.value,e.top=y.value.y),e})),H=e.computed((()=>{const{aspectRatio:e}=n,t={width:`${y.value.width||n.defaultWidth}`,height:`${y.value.height||n.defaultHeight}`,"aspect-ratio":e,top:`${k.value.top}px`,left:`${k.value.left}px`};return"free"===n.zoomType?delete t["aspect-ratio"]:"fixed"===n.zoomType&&delete t.height,c.cssVarBlock(t)}));function C(e){return e*R.value}function L(e,t){const o=d.value?.clientWidth||1/0,l=d.value?.clientHeight||1/0;return{width:Math.min(Math.max(e,0),o),height:Math.min(Math.max(t,0),l)}}function F(e){return e instanceof MouseEvent?{clientX:e.clientX,clientY:e.clientY}:e instanceof TouchEvent&&e.touches.length>0?{clientX:e.touches[0].clientX,clientY:e.touches[0].clientY}:{clientX:0,clientY:0}}function W(e,t){const{clientX:o,clientY:l}=F(e);g.value=t,r=o,s=l,v=y.value.width,h=y.value.height,document.addEventListener("touchmove",B,{passive:!1}),document.addEventListener("touchend",V),"bottom-right"===t?(y.value.x=T.value,y.value.y=M.value):"top-left"===t?(y.value.x=T.value+x.value,y.value.y=M.value+b.value):"top-right"===t?(y.value.x=T.value,y.value.y=M.value+b.value):"bottom-left"===t&&(y.value.x=T.value+x.value,y.value.y=M.value),e instanceof TouchEvent&&e.preventDefault()}function B(e){e instanceof TouchEvent&&g.value&&e.preventDefault();const{clientX:t,clientY:o}=F(e),l=t-r,i=o-s;if("bottom-right"===g.value){if("free"===n.zoomType){const{width:e,height:t}=L(v+l,h+i);y.value.width=e,y.value.height=t}else if("fixed"===n.zoomType){const e=Number.parseFloat(n.aspectRatio.split(" / ")[0])/Number.parseFloat(n.aspectRatio.split(" / ")[1]);let t=v+l,o=t/e;const{width:i,height:a}=L(t,o);a>(d.value?.clientHeight||1/0)&&(o=d.value?.clientHeight||1/0,t=o*e),y.value.width=i,y.value.height=a}}else if("top-left"===g.value){if("free"===n.zoomType){const{width:e,height:t}=L(v-l,h-i);y.value.width=e,y.value.height=t}else if("fixed"===n.zoomType){const e=Number.parseFloat(n.aspectRatio.split(" / ")[0])/Number.parseFloat(n.aspectRatio.split(" / ")[1]);let t=v-l,o=t/e;const{width:i,height:a}=L(t,o);a>(d.value?.clientHeight||1/0)&&(o=d.value?.clientHeight||1/0,t=o*e),y.value.width=i,y.value.height=a}T.value=k.value.left,M.value=k.value.top}else if("top-right"===g.value){if("free"===n.zoomType){const{width:e,height:t}=L(v+l,h-i);y.value.width=e,y.value.height=t}else if("fixed"===n.zoomType){const e=Number.parseFloat(n.aspectRatio.split(" / ")[0])/Number.parseFloat(n.aspectRatio.split(" / ")[1]);let t=v+l,o=t/e;const{width:i,height:a}=L(t,o);a>(d.value?.clientHeight||1/0)&&(o=d.value?.clientHeight||1/0,t=o*e),y.value.width=i,y.value.height=a}T.value=k.value.left,M.value=k.value.top}else if("bottom-left"===g.value){if("free"===n.zoomType){const{width:e,height:t}=L(v-l,h+i);y.value.width=e,y.value.height=t}else if("fixed"===n.zoomType){const e=Number.parseFloat(n.aspectRatio.split(" / ")[0])/Number.parseFloat(n.aspectRatio.split(" / ")[1]);let t=v-l,o=t/e;const{width:i,height:a}=L(t,o);a>(d.value?.clientHeight||1/0)&&(o=d.value?.clientHeight||1/0,t=o*e),y.value.width=i,y.value.height=a}T.value=k.value.left,M.value=k.value.top}}function V(){document.removeEventListener("touchmove",B),document.removeEventListener("touchend",V),g.value=""}return e.onMounted((()=>{e.nextTick((()=>{w.value.x=(d.value?.offsetWidth||0)/2-y.value.width/2,w.value.y=(d.value?.offsetHeight||0)/2-y.value.height/2})),document.addEventListener("mouseup",V),document.addEventListener("mousemove",B,{passive:!1}),document.addEventListener("touchmove",B,{passive:!1}),document.addEventListener("touchend",V)})),e.onUnmounted((()=>{N.value&&URL.revokeObjectURL(N.value),document.removeEventListener("mouseup",V),document.removeEventListener("mousemove",B)})),u({crop:async function(e=f.value){let t="transparent";d.value&&(t=window.getComputedStyle(d.value).backgroundColor);const l=document.createElement("canvas");l.width=C(d.value?.clientWidth||0),l.height=C(d.value?.clientHeight||0);const{drawImage:i,cropCanvas:a,drawColor:u}=o.useCanvas(l);return u(0,0,l.width,l.height,t),i(e,C(e.offsetLeft),C(e.offsetTop),e.naturalWidth,e.naturalHeight),await a(C(T.value),C(M.value),C(x.value),C(b.value))},resize:function(){y.value.width=n.defaultWidth,y.value.height=n.defaultHeight,T.value=0,M.value=0}}),(t,o)=>(e.openBlock(),e.createElementBlock("div",{ref_key:"containerBoxRef",ref:d,class:e.normalizeClass([e.unref(c).e("img-box")])},[e.unref(m)?(e.openBlock(),e.createElementBlock("div",{key:0,class:e.normalizeClass([e.unref(c).e("error-message")])},e.toDisplayString(e.unref(m)),3)):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[e.createElementVNode("img",{ref_key:"imgRef",ref:f,class:e.normalizeClass([e.unref(c).e("image")]),src:e.unref(N)},null,10,i),e.createElementVNode("div",{ref_key:"cropBoxRef",ref:p,class:e.normalizeClass([e.unref(c).e("crop-tool-box")]),style:e.normalizeStyle([e.unref(H),e.unref(g)?`left: ${e.unref(k).left}px;top: ${e.unref(k).top}px`:e.unref(z)]),onTouchstart:o[8]||(o[8]=e.withModifiers((()=>{}),["stop","prevent"])),onTouchend:e.withModifiers(V,["stop","prevent"])},[e.createElementVNode("div",{class:e.normalizeClass([e.unref(c).e("top-left")]),onMousedown:o[0]||(o[0]=e.withModifiers((e=>W(e,"top-left")),["stop","prevent"])),onTouchstart:o[1]||(o[1]=e.withModifiers((e=>W(e,"top-left")),["stop","prevent"])),onTouchend:e.withModifiers(V,["stop","prevent"])},null,34),e.createElementVNode("div",{class:e.normalizeClass([e.unref(c).e("top-right")]),onMousedown:o[2]||(o[2]=e.withModifiers((e=>W(e,"top-right")),["stop","prevent"])),onTouchstart:o[3]||(o[3]=e.withModifiers((e=>W(e,"top-right")),["stop","prevent"])),onTouchend:e.withModifiers(V,["stop","prevent"])},null,34),e.createElementVNode("div",{class:e.normalizeClass([e.unref(c).e("bottom-right")]),onMousedown:o[4]||(o[4]=e.withModifiers((e=>W(e,"bottom-right")),["stop","prevent"])),onTouchstart:o[5]||(o[5]=e.withModifiers((e=>W(e,"bottom-right")),["stop","prevent"])),onTouchend:e.withModifiers(V,["stop","prevent"])},null,34),e.createElementVNode("div",{class:e.normalizeClass([e.unref(c).e("bottom-left")]),onMousedown:o[6]||(o[6]=e.withModifiers((e=>W(e,"bottom-left")),["stop","prevent"])),onTouchstart:o[7]||(o[7]=e.withModifiers((e=>W(e,"bottom-left")),["stop","prevent"])),onTouchend:e.withModifiers(V,["stop","prevent"])},null,34)],38)],64))],2))}});exports.default=a;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("vue"),t=require("@qxs-bns/hooks"),o=require("./composables.cjs"),l=require("@vueuse/core");const i=["src"];var a=e.defineComponent({name:"QxsPhotoCropTool",__name:"photo-crop-tool",props:{imgFile:{type:Object,default:()=>null},aspectRatio:{type:String,default:()=>"16 / 9"},defaultWidth:{type:Number,default:()=>320},defaultHeight:{type:Number,default:()=>180},zoomType:{type:String,default:()=>"fixed"}},setup(a,{expose:u}){const n=a;let r=0,s=0,v=0,h=0;const c=t.useNamespace("photo-crop-tool"),p=e.ref(null),d=e.ref(null),f=e.ref(null),m=e.ref(""),g=e.ref(""),w=e.ref({x:0,y:0}),y=e.ref({width:n.defaultWidth,height:n.defaultHeight,x:0,y:0}),{width:x,height:b}=l.useElementSize(p),{width:E}=l.useElementSize(f),{x:T,y:M,style:z}=l.useDraggable(p,{containerElement:d,draggingElement:p,disabled:e.computed(()=>!!g.value),exact:!0,initialValue:w}),N=e.computed(()=>n.imgFile?URL.createObjectURL(n.imgFile):"");e.watch(()=>n.imgFile,e=>{e&&!e.type.startsWith("image/")?m.value="文件类型错误":m.value=""});const R=e.computed(()=>(f.value?.naturalWidth||0)/E.value),k=e.computed(()=>{const e={left:0,top:0};return"bottom-right"===g.value?(e.left=y.value.x,e.top=y.value.y):"top-left"===g.value?(e.left=y.value.x-x.value,e.top=y.value.y-b.value):"top-right"===g.value?(e.top=y.value.y-b.value,e.left=y.value.x):"bottom-left"===g.value&&(e.left=y.value.x-x.value,e.top=y.value.y),e}),H=e.computed(()=>{const{aspectRatio:e}=n,t={width:`${y.value.width||n.defaultWidth}`,height:`${y.value.height||n.defaultHeight}`,"aspect-ratio":e,top:`${k.value.top}px`,left:`${k.value.left}px`};return"free"===n.zoomType?delete t["aspect-ratio"]:"fixed"===n.zoomType&&delete t.height,c.cssVarBlock(t)});function C(e){return e*R.value}function L(e,t){const o=d.value?.clientWidth||1/0,l=d.value?.clientHeight||1/0;return{width:Math.min(Math.max(e,0),o),height:Math.min(Math.max(t,0),l)}}function F(e){return e instanceof MouseEvent?{clientX:e.clientX,clientY:e.clientY}:e instanceof TouchEvent&&e.touches.length>0?{clientX:e.touches[0].clientX,clientY:e.touches[0].clientY}:{clientX:0,clientY:0}}function W(e,t){const{clientX:o,clientY:l}=F(e);g.value=t,r=o,s=l,v=y.value.width,h=y.value.height,document.addEventListener("touchmove",B,{passive:!1}),document.addEventListener("touchend",V),"bottom-right"===t?(y.value.x=T.value,y.value.y=M.value):"top-left"===t?(y.value.x=T.value+x.value,y.value.y=M.value+b.value):"top-right"===t?(y.value.x=T.value,y.value.y=M.value+b.value):"bottom-left"===t&&(y.value.x=T.value+x.value,y.value.y=M.value),e instanceof TouchEvent&&e.preventDefault()}function B(e){e instanceof TouchEvent&&g.value&&e.preventDefault();const{clientX:t,clientY:o}=F(e),l=t-r,i=o-s;if("bottom-right"===g.value){if("free"===n.zoomType){const{width:e,height:t}=L(v+l,h+i);y.value.width=e,y.value.height=t}else if("fixed"===n.zoomType){const e=Number.parseFloat(n.aspectRatio.split(" / ")[0])/Number.parseFloat(n.aspectRatio.split(" / ")[1]);let t=v+l,o=t/e;const{width:i,height:a}=L(t,o);a>(d.value?.clientHeight||1/0)&&(o=d.value?.clientHeight||1/0,t=o*e),y.value.width=i,y.value.height=a}}else if("top-left"===g.value){if("free"===n.zoomType){const{width:e,height:t}=L(v-l,h-i);y.value.width=e,y.value.height=t}else if("fixed"===n.zoomType){const e=Number.parseFloat(n.aspectRatio.split(" / ")[0])/Number.parseFloat(n.aspectRatio.split(" / ")[1]);let t=v-l,o=t/e;const{width:i,height:a}=L(t,o);a>(d.value?.clientHeight||1/0)&&(o=d.value?.clientHeight||1/0,t=o*e),y.value.width=i,y.value.height=a}T.value=k.value.left,M.value=k.value.top}else if("top-right"===g.value){if("free"===n.zoomType){const{width:e,height:t}=L(v+l,h-i);y.value.width=e,y.value.height=t}else if("fixed"===n.zoomType){const e=Number.parseFloat(n.aspectRatio.split(" / ")[0])/Number.parseFloat(n.aspectRatio.split(" / ")[1]);let t=v+l,o=t/e;const{width:i,height:a}=L(t,o);a>(d.value?.clientHeight||1/0)&&(o=d.value?.clientHeight||1/0,t=o*e),y.value.width=i,y.value.height=a}T.value=k.value.left,M.value=k.value.top}else if("bottom-left"===g.value){if("free"===n.zoomType){const{width:e,height:t}=L(v-l,h+i);y.value.width=e,y.value.height=t}else if("fixed"===n.zoomType){const e=Number.parseFloat(n.aspectRatio.split(" / ")[0])/Number.parseFloat(n.aspectRatio.split(" / ")[1]);let t=v-l,o=t/e;const{width:i,height:a}=L(t,o);a>(d.value?.clientHeight||1/0)&&(o=d.value?.clientHeight||1/0,t=o*e),y.value.width=i,y.value.height=a}T.value=k.value.left,M.value=k.value.top}}function V(){document.removeEventListener("touchmove",B),document.removeEventListener("touchend",V),g.value=""}return e.onMounted(()=>{e.nextTick(()=>{w.value.x=(d.value?.offsetWidth||0)/2-y.value.width/2,w.value.y=(d.value?.offsetHeight||0)/2-y.value.height/2}),document.addEventListener("mouseup",V),document.addEventListener("mousemove",B,{passive:!1}),document.addEventListener("touchmove",B,{passive:!1}),document.addEventListener("touchend",V)}),e.onUnmounted(()=>{N.value&&URL.revokeObjectURL(N.value),document.removeEventListener("mouseup",V),document.removeEventListener("mousemove",B)}),u({crop:async function(e=f.value){let t="transparent";d.value&&(t=window.getComputedStyle(d.value).backgroundColor);const l=document.createElement("canvas");l.width=C(d.value?.clientWidth||0),l.height=C(d.value?.clientHeight||0);const{drawImage:i,cropCanvas:a,drawColor:u}=o.useCanvas(l);return u(0,0,l.width,l.height,t),i(e,C(e.offsetLeft),C(e.offsetTop),e.naturalWidth,e.naturalHeight),await a(C(T.value),C(M.value),C(x.value),C(b.value))},resize:function(){y.value.width=n.defaultWidth,y.value.height=n.defaultHeight,T.value=0,M.value=0}}),(t,o)=>(e.openBlock(),e.createElementBlock("div",{ref_key:"containerBoxRef",ref:d,class:e.normalizeClass([e.unref(c).e("img-box")])},[e.unref(m)?(e.openBlock(),e.createElementBlock("div",{key:0,class:e.normalizeClass([e.unref(c).e("error-message")])},e.toDisplayString(e.unref(m)),3)):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[e.createElementVNode("img",{ref_key:"imgRef",ref:f,class:e.normalizeClass([e.unref(c).e("image")]),src:e.unref(N)},null,10,i),e.createElementVNode("div",{ref_key:"cropBoxRef",ref:p,class:e.normalizeClass([e.unref(c).e("crop-tool-box")]),style:e.normalizeStyle([e.unref(H),e.unref(g)?`left: ${e.unref(k).left}px;top: ${e.unref(k).top}px`:e.unref(z)]),onTouchstart:o[8]||(o[8]=e.withModifiers(()=>{},["stop","prevent"])),onTouchend:e.withModifiers(V,["stop","prevent"])},[e.createElementVNode("div",{class:e.normalizeClass([e.unref(c).e("top-left")]),onMousedown:o[0]||(o[0]=e.withModifiers(e=>W(e,"top-left"),["stop","prevent"])),onTouchstart:o[1]||(o[1]=e.withModifiers(e=>W(e,"top-left"),["stop","prevent"])),onTouchend:e.withModifiers(V,["stop","prevent"])},null,34),e.createElementVNode("div",{class:e.normalizeClass([e.unref(c).e("top-right")]),onMousedown:o[2]||(o[2]=e.withModifiers(e=>W(e,"top-right"),["stop","prevent"])),onTouchstart:o[3]||(o[3]=e.withModifiers(e=>W(e,"top-right"),["stop","prevent"])),onTouchend:e.withModifiers(V,["stop","prevent"])},null,34),e.createElementVNode("div",{class:e.normalizeClass([e.unref(c).e("bottom-right")]),onMousedown:o[4]||(o[4]=e.withModifiers(e=>W(e,"bottom-right"),["stop","prevent"])),onTouchstart:o[5]||(o[5]=e.withModifiers(e=>W(e,"bottom-right"),["stop","prevent"])),onTouchend:e.withModifiers(V,["stop","prevent"])},null,34),e.createElementVNode("div",{class:e.normalizeClass([e.unref(c).e("bottom-left")]),onMousedown:o[6]||(o[6]=e.withModifiers(e=>W(e,"bottom-left"),["stop","prevent"])),onTouchstart:o[7]||(o[7]=e.withModifiers(e=>W(e,"bottom-left"),["stop","prevent"])),onTouchend:e.withModifiers(V,["stop","prevent"])},null,34)],38)],64))],2))}});exports.default=a;
2
2
  //# sourceMappingURL=photo-crop-tool.vue.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"photo-crop-tool.vue.cjs","sources":["../../../../../../packages/components/src/photo-crop-tool/src/photo-crop-tool.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { PropType } from 'vue'\nimport { useNamespace } from '@qxs-bns/hooks'\nimport { useCanvas } from './composables'\n\ndefineOptions({\n name: 'QxsPhotoCropTool',\n})\n\nconst props = defineProps({\n imgFile: {\n type: Object as PropType<File>,\n default: () => null,\n },\n aspectRatio: {\n type: String,\n default: () => '16 / 9',\n },\n defaultWidth: {\n type: Number,\n default: () => 320,\n },\n defaultHeight: {\n type: Number,\n default: () => 180,\n },\n /**\n * free 自由缩放\n * fixed 固定比例缩放\n */\n zoomType: {\n type: String,\n default: () => 'fixed',\n },\n})\nlet startX = 0\nlet startY = 0\nlet startWidth = 0\nlet startHeight = 0\n\nconst ns = useNamespace('photo-crop-tool')\n\nconst cropBoxRef = ref<HTMLElement | null>(null)\nconst containerBoxRef = ref<HTMLElement | null>(null)\nconst imgRef = ref<HTMLImageElement | null>(null)\nconst errorMessage = ref('')\nconst dargPoint = ref('')\nconst initialValue = ref({\n x: 0,\n y: 0,\n})\nconst cropInfo = ref({\n width: props.defaultWidth,\n height: props.defaultHeight,\n x: 0,\n y: 0,\n})\n\nconst { width, height } = useElementSize(cropBoxRef)\nconst { width: imgWidth } = useElementSize(imgRef)\n\nconst { x, y, style } = useDraggable(cropBoxRef, {\n containerElement: containerBoxRef,\n draggingElement: cropBoxRef,\n disabled: computed(() => !!dargPoint.value),\n exact: true,\n initialValue,\n})\n\nconst imageUrl = computed(() => {\n if (!props.imgFile) {\n return ''\n }\n return URL.createObjectURL(props.imgFile)\n})\n\nwatch(\n () => props.imgFile,\n (newFile: File | null) => {\n if (newFile && !newFile.type.startsWith('image/')) {\n errorMessage.value = '文件类型错误'\n }\n else {\n errorMessage.value = ''\n }\n },\n)\n\nconst ratio = computed(() => {\n return (imgRef.value?.naturalWidth || 0) / imgWidth.value\n})\n\nconst customStyle = computed(() => {\n const position = {\n left: 0,\n top: 0,\n }\n if (dargPoint.value === 'bottom-right') {\n position.left = cropInfo.value.x\n position.top = cropInfo.value.y\n }\n else if (dargPoint.value === 'top-left') {\n position.left = cropInfo.value.x - width.value\n position.top = cropInfo.value.y - height.value\n }\n else if (dargPoint.value === 'top-right') {\n position.top = cropInfo.value.y - height.value\n position.left = cropInfo.value.x\n }\n else if (dargPoint.value === 'bottom-left') {\n position.left = cropInfo.value.x - width.value\n position.top = cropInfo.value.y\n }\n return position\n})\n\nconst sizeStyle = computed(() => {\n const { aspectRatio } = props\n\n const style: {\n 'height'?: string\n 'width': string\n 'aspect-ratio'?: string\n 'top': string\n 'left': string\n } = {\n 'width': `${cropInfo.value.width || props.defaultWidth}`,\n 'height': `${cropInfo.value.height || props.defaultHeight}`,\n 'aspect-ratio': aspectRatio,\n 'top': `${customStyle.value.top}px`,\n 'left': `${customStyle.value.left}px`,\n }\n if (props.zoomType === 'free') {\n delete style['aspect-ratio']\n }\n else if (props.zoomType === 'fixed') {\n delete style.height\n }\n return ns.cssVarBlock(style)\n})\n\nfunction zoom(pixel: number) {\n return pixel * ratio.value\n}\nasync function crop(img: HTMLImageElement = imgRef.value!) {\n let backgroundColor = 'transparent'\n if (containerBoxRef.value) {\n backgroundColor = window.getComputedStyle(\n containerBoxRef.value,\n ).backgroundColor\n }\n const canvas = document.createElement('canvas')\n canvas.width = zoom(containerBoxRef.value?.clientWidth || 0)\n canvas.height = zoom(containerBoxRef.value?.clientHeight || 0)\n const { drawImage, cropCanvas, drawColor } = useCanvas(canvas)\n drawColor(0, 0, canvas.width, canvas.height, backgroundColor)\n drawImage(\n img,\n zoom(img.offsetLeft),\n zoom(img.offsetTop),\n img.naturalWidth,\n img.naturalHeight,\n )\n return await cropCanvas(\n zoom(x.value),\n zoom(y.value),\n zoom(width.value),\n zoom(height.value),\n )\n}\n\nfunction checkBoundaries(\n newWidth: number,\n newHeight: number,\n): { width: number, height: number } {\n const maxWidth = containerBoxRef.value?.clientWidth || Infinity\n const maxHeight = containerBoxRef.value?.clientHeight || Infinity\n\n return {\n width: Math.min(Math.max(newWidth, 0), maxWidth),\n height: Math.min(Math.max(newHeight, 0), maxHeight),\n }\n}\n\nfunction getClientPos(e: MouseEvent | TouchEvent): { clientX: number, clientY: number } {\n if (e instanceof MouseEvent) {\n return { clientX: e.clientX, clientY: e.clientY }\n }\n else if (e instanceof TouchEvent && e.touches.length > 0) {\n return { clientX: e.touches[0].clientX, clientY: e.touches[0].clientY }\n }\n return { clientX: 0, clientY: 0 }\n}\n\nfunction handleStart(e: MouseEvent | TouchEvent, point: string) {\n const { clientX, clientY } = getClientPos(e)\n dargPoint.value = point\n startX = clientX\n startY = clientY\n startWidth = cropInfo.value.width\n startHeight = cropInfo.value.height\n\n // 添加移动端事件监听\n document.addEventListener('touchmove', handleMove, { passive: false })\n document.addEventListener('touchend', handleEnd)\n\n if (point === 'bottom-right') {\n cropInfo.value.x = x.value\n cropInfo.value.y = y.value\n }\n else if (point === 'top-left') {\n cropInfo.value.x = x.value + width.value\n cropInfo.value.y = y.value + height.value\n }\n else if (point === 'top-right') {\n cropInfo.value.x = x.value\n cropInfo.value.y = y.value + height.value\n }\n else if (point === 'bottom-left') {\n cropInfo.value.x = x.value + width.value\n cropInfo.value.y = y.value\n }\n\n // Prevent touch scrolling\n if (e instanceof TouchEvent) {\n e.preventDefault()\n }\n}\n\nfunction handleMove(e: MouseEvent | TouchEvent) {\n // Only prevent default if we're in a drag operation\n if (e instanceof TouchEvent && dargPoint.value) {\n e.preventDefault()\n }\n\n const { clientX, clientY } = getClientPos(e)\n const deltaX = clientX - startX\n const deltaY = clientY - startY\n\n if (dargPoint.value === 'bottom-right') {\n if (props.zoomType === 'free') {\n const { width, height } = checkBoundaries(\n startWidth + deltaX,\n startHeight + deltaY,\n )\n cropInfo.value.width = width\n cropInfo.value.height = height\n }\n else if (props.zoomType === 'fixed') {\n const aspectRatio\n = Number.parseFloat(props.aspectRatio.split(' / ')[0])\n / Number.parseFloat(props.aspectRatio.split(' / ')[1])\n let newWidth = startWidth + deltaX\n let newHeight = newWidth / aspectRatio\n const { width, height } = checkBoundaries(newWidth, newHeight)\n if (height > (containerBoxRef.value?.clientHeight || Infinity)) {\n newHeight = containerBoxRef.value?.clientHeight || Infinity\n newWidth = newHeight * aspectRatio\n }\n cropInfo.value.width = width\n cropInfo.value.height = height\n }\n }\n else if (dargPoint.value === 'top-left') {\n if (props.zoomType === 'free') {\n const { width, height } = checkBoundaries(\n startWidth - deltaX,\n startHeight - deltaY,\n )\n cropInfo.value.width = width\n cropInfo.value.height = height\n }\n else if (props.zoomType === 'fixed') {\n const aspectRatio\n = Number.parseFloat(props.aspectRatio.split(' / ')[0])\n / Number.parseFloat(props.aspectRatio.split(' / ')[1])\n let newWidth = startWidth - deltaX\n let newHeight = newWidth / aspectRatio\n const { width, height } = checkBoundaries(newWidth, newHeight)\n if (height > (containerBoxRef.value?.clientHeight || Infinity)) {\n newHeight = containerBoxRef.value?.clientHeight || Infinity\n newWidth = newHeight * aspectRatio\n }\n cropInfo.value.width = width\n cropInfo.value.height = height\n }\n x.value = customStyle.value.left\n y.value = customStyle.value.top\n }\n else if (dargPoint.value === 'top-right') {\n if (props.zoomType === 'free') {\n const { width, height } = checkBoundaries(\n startWidth + deltaX,\n startHeight - deltaY,\n )\n cropInfo.value.width = width\n cropInfo.value.height = height\n }\n else if (props.zoomType === 'fixed') {\n const aspectRatio\n = Number.parseFloat(props.aspectRatio.split(' / ')[0])\n / Number.parseFloat(props.aspectRatio.split(' / ')[1])\n let newWidth = startWidth + deltaX\n let newHeight = newWidth / aspectRatio\n const { width, height } = checkBoundaries(newWidth, newHeight)\n if (height > (containerBoxRef.value?.clientHeight || Infinity)) {\n newHeight = containerBoxRef.value?.clientHeight || Infinity\n newWidth = newHeight * aspectRatio\n }\n cropInfo.value.width = width\n cropInfo.value.height = height\n }\n x.value = customStyle.value.left\n y.value = customStyle.value.top\n }\n else if (dargPoint.value === 'bottom-left') {\n if (props.zoomType === 'free') {\n const { width, height } = checkBoundaries(\n startWidth - deltaX,\n startHeight + deltaY,\n )\n cropInfo.value.width = width\n cropInfo.value.height = height\n }\n else if (props.zoomType === 'fixed') {\n const aspectRatio\n = Number.parseFloat(props.aspectRatio.split(' / ')[0])\n / Number.parseFloat(props.aspectRatio.split(' / ')[1])\n let newWidth = startWidth - deltaX\n let newHeight = newWidth / aspectRatio\n const { width, height } = checkBoundaries(newWidth, newHeight)\n if (height > (containerBoxRef.value?.clientHeight || Infinity)) {\n newHeight = containerBoxRef.value?.clientHeight || Infinity\n newWidth = newHeight * aspectRatio\n }\n cropInfo.value.width = width\n cropInfo.value.height = height\n }\n x.value = customStyle.value.left\n y.value = customStyle.value.top\n }\n}\n\nfunction handleEnd() {\n // 移除移动端事件监听\n document.removeEventListener('touchmove', handleMove)\n document.removeEventListener('touchend', handleEnd)\n\n dargPoint.value = ''\n}\n\nfunction resize() {\n cropInfo.value.width = props.defaultWidth\n cropInfo.value.height = props.defaultHeight\n x.value = 0\n y.value = 0\n}\n\nonMounted(() => {\n nextTick(() => {\n // 初始化位置\n initialValue.value.x\n = (containerBoxRef.value?.offsetWidth || 0) / 2 - cropInfo.value.width / 2\n initialValue.value.y\n = (containerBoxRef.value?.offsetHeight || 0) / 2\n - cropInfo.value.height / 2\n })\n\n // 只添加鼠标事件监听\n document.addEventListener('mouseup', handleEnd)\n document.addEventListener('mousemove', handleMove, { passive: false })\n document.addEventListener('touchmove', handleMove, { passive: false })\n document.addEventListener('touchend', handleEnd)\n})\n\nonUnmounted(() => {\n if (imageUrl.value) {\n URL.revokeObjectURL(imageUrl.value)\n }\n // 确保移除所有事件监听\n document.removeEventListener('mouseup', handleEnd)\n document.removeEventListener('mousemove', handleMove)\n})\n\ndefineExpose({\n crop,\n resize,\n})\n</script>\n\n<template>\n <div\n ref=\"containerBoxRef\"\n :class=\"[ns.e('img-box')]\"\n >\n <div\n v-if=\"errorMessage\"\n :class=\"[ns.e('error-message')]\"\n >\n {{ errorMessage }}\n </div>\n <template v-else>\n <img\n ref=\"imgRef\"\n :class=\"[ns.e('image')]\"\n :src=\"imageUrl\"\n >\n <div\n ref=\"cropBoxRef\"\n :class=\"[ns.e('crop-tool-box')]\"\n :style=\"[\n sizeStyle,\n dargPoint\n ? `left: ${customStyle.left}px;top: ${customStyle.top}px`\n : style,\n ]\"\n @touchstart.stop.prevent\n @touchend.stop.prevent=\"handleEnd\"\n >\n <div\n :class=\"[ns.e('top-left')]\"\n @mousedown.stop.prevent=\"handleStart($event, 'top-left')\"\n @touchstart.stop.prevent=\"handleStart($event, 'top-left')\"\n @touchend.stop.prevent=\"handleEnd\"\n />\n <div\n :class=\"[ns.e('top-right')]\"\n @mousedown.stop.prevent=\"handleStart($event, 'top-right')\"\n @touchstart.stop.prevent=\"handleStart($event, 'top-right')\"\n @touchend.stop.prevent=\"handleEnd\"\n />\n <div\n :class=\"[ns.e('bottom-right')]\"\n @mousedown.stop.prevent=\"handleStart($event, 'bottom-right')\"\n @touchstart.stop.prevent=\"handleStart($event, 'bottom-right')\"\n @touchend.stop.prevent=\"handleEnd\"\n />\n <div\n :class=\"[ns.e('bottom-left')]\"\n @mousedown.stop.prevent=\"handleStart($event, 'bottom-left')\"\n @touchstart.stop.prevent=\"handleStart($event, 'bottom-left')\"\n @touchend.stop.prevent=\"handleEnd\"\n />\n </div>\n </template>\n </div>\n</template>\n"],"names":["props","__props","startX","startY","startWidth","startHeight","ns","useNamespace","cropBoxRef","ref","containerBoxRef","imgRef","errorMessage","dargPoint","initialValue","x","y","cropInfo","width","defaultWidth","height","defaultHeight","useElementSize","imgWidth","style","useDraggable","containerElement","draggingElement","disabled","computed","value","exact","imageUrl","imgFile","URL","createObjectURL","watch","newFile","type","startsWith","ratio","naturalWidth","customStyle","position","left","top","sizeStyle","aspectRatio","zoomType","cssVarBlock","zoom","pixel","checkBoundaries","newWidth","newHeight","maxWidth","clientWidth","Infinity","maxHeight","clientHeight","Math","min","max","getClientPos","e","MouseEvent","clientX","clientY","TouchEvent","touches","length","handleStart","point","document","addEventListener","handleMove","passive","handleEnd","preventDefault","deltaX","deltaY","Number","parseFloat","split","removeEventListener","onMounted","nextTick","offsetWidth","offsetHeight","onUnmounted","revokeObjectURL","__expose","crop","async","img","backgroundColor","window","getComputedStyle","canvas","createElement","drawImage","cropCanvas","drawColor","useCanvas","offsetLeft","offsetTop","naturalHeight","resize"],"mappings":"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"}
1
+ {"version":3,"file":"photo-crop-tool.vue.cjs","sources":["../../../../../../packages/components/src/photo-crop-tool/src/photo-crop-tool.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { PropType } from 'vue'\nimport { useNamespace } from '@qxs-bns/hooks'\nimport { useCanvas } from './composables'\n\ndefineOptions({\n name: 'QxsPhotoCropTool',\n})\n\nconst props = defineProps({\n imgFile: {\n type: Object as PropType<File>,\n default: () => null,\n },\n aspectRatio: {\n type: String,\n default: () => '16 / 9',\n },\n defaultWidth: {\n type: Number,\n default: () => 320,\n },\n defaultHeight: {\n type: Number,\n default: () => 180,\n },\n /**\n * free 自由缩放\n * fixed 固定比例缩放\n */\n zoomType: {\n type: String,\n default: () => 'fixed',\n },\n})\nlet startX = 0\nlet startY = 0\nlet startWidth = 0\nlet startHeight = 0\n\nconst ns = useNamespace('photo-crop-tool')\n\nconst cropBoxRef = ref<HTMLElement | null>(null)\nconst containerBoxRef = ref<HTMLElement | null>(null)\nconst imgRef = ref<HTMLImageElement | null>(null)\nconst errorMessage = ref('')\nconst dargPoint = ref('')\nconst initialValue = ref({\n x: 0,\n y: 0,\n})\nconst cropInfo = ref({\n width: props.defaultWidth,\n height: props.defaultHeight,\n x: 0,\n y: 0,\n})\n\nconst { width, height } = useElementSize(cropBoxRef)\nconst { width: imgWidth } = useElementSize(imgRef)\n\nconst { x, y, style } = useDraggable(cropBoxRef, {\n containerElement: containerBoxRef,\n draggingElement: cropBoxRef,\n disabled: computed(() => !!dargPoint.value),\n exact: true,\n initialValue,\n})\n\nconst imageUrl = computed(() => {\n if (!props.imgFile) {\n return ''\n }\n return URL.createObjectURL(props.imgFile)\n})\n\nwatch(\n () => props.imgFile,\n (newFile: File | null) => {\n if (newFile && !newFile.type.startsWith('image/')) {\n errorMessage.value = '文件类型错误'\n }\n else {\n errorMessage.value = ''\n }\n },\n)\n\nconst ratio = computed(() => {\n return (imgRef.value?.naturalWidth || 0) / imgWidth.value\n})\n\nconst customStyle = computed(() => {\n const position = {\n left: 0,\n top: 0,\n }\n if (dargPoint.value === 'bottom-right') {\n position.left = cropInfo.value.x\n position.top = cropInfo.value.y\n }\n else if (dargPoint.value === 'top-left') {\n position.left = cropInfo.value.x - width.value\n position.top = cropInfo.value.y - height.value\n }\n else if (dargPoint.value === 'top-right') {\n position.top = cropInfo.value.y - height.value\n position.left = cropInfo.value.x\n }\n else if (dargPoint.value === 'bottom-left') {\n position.left = cropInfo.value.x - width.value\n position.top = cropInfo.value.y\n }\n return position\n})\n\nconst sizeStyle = computed(() => {\n const { aspectRatio } = props\n\n const style: {\n 'height'?: string\n 'width': string\n 'aspect-ratio'?: string\n 'top': string\n 'left': string\n } = {\n 'width': `${cropInfo.value.width || props.defaultWidth}`,\n 'height': `${cropInfo.value.height || props.defaultHeight}`,\n 'aspect-ratio': aspectRatio,\n 'top': `${customStyle.value.top}px`,\n 'left': `${customStyle.value.left}px`,\n }\n if (props.zoomType === 'free') {\n delete style['aspect-ratio']\n }\n else if (props.zoomType === 'fixed') {\n delete style.height\n }\n return ns.cssVarBlock(style)\n})\n\nfunction zoom(pixel: number) {\n return pixel * ratio.value\n}\nasync function crop(img: HTMLImageElement = imgRef.value!) {\n let backgroundColor = 'transparent'\n if (containerBoxRef.value) {\n backgroundColor = window.getComputedStyle(\n containerBoxRef.value,\n ).backgroundColor\n }\n const canvas = document.createElement('canvas')\n canvas.width = zoom(containerBoxRef.value?.clientWidth || 0)\n canvas.height = zoom(containerBoxRef.value?.clientHeight || 0)\n const { drawImage, cropCanvas, drawColor } = useCanvas(canvas)\n drawColor(0, 0, canvas.width, canvas.height, backgroundColor)\n drawImage(\n img,\n zoom(img.offsetLeft),\n zoom(img.offsetTop),\n img.naturalWidth,\n img.naturalHeight,\n )\n return await cropCanvas(\n zoom(x.value),\n zoom(y.value),\n zoom(width.value),\n zoom(height.value),\n )\n}\n\nfunction checkBoundaries(\n newWidth: number,\n newHeight: number,\n): { width: number, height: number } {\n const maxWidth = containerBoxRef.value?.clientWidth || Infinity\n const maxHeight = containerBoxRef.value?.clientHeight || Infinity\n\n return {\n width: Math.min(Math.max(newWidth, 0), maxWidth),\n height: Math.min(Math.max(newHeight, 0), maxHeight),\n }\n}\n\nfunction getClientPos(e: MouseEvent | TouchEvent): { clientX: number, clientY: number } {\n if (e instanceof MouseEvent) {\n return { clientX: e.clientX, clientY: e.clientY }\n }\n else if (e instanceof TouchEvent && e.touches.length > 0) {\n return { clientX: e.touches[0].clientX, clientY: e.touches[0].clientY }\n }\n return { clientX: 0, clientY: 0 }\n}\n\nfunction handleStart(e: MouseEvent | TouchEvent, point: string) {\n const { clientX, clientY } = getClientPos(e)\n dargPoint.value = point\n startX = clientX\n startY = clientY\n startWidth = cropInfo.value.width\n startHeight = cropInfo.value.height\n\n // 添加移动端事件监听\n document.addEventListener('touchmove', handleMove, { passive: false })\n document.addEventListener('touchend', handleEnd)\n\n if (point === 'bottom-right') {\n cropInfo.value.x = x.value\n cropInfo.value.y = y.value\n }\n else if (point === 'top-left') {\n cropInfo.value.x = x.value + width.value\n cropInfo.value.y = y.value + height.value\n }\n else if (point === 'top-right') {\n cropInfo.value.x = x.value\n cropInfo.value.y = y.value + height.value\n }\n else if (point === 'bottom-left') {\n cropInfo.value.x = x.value + width.value\n cropInfo.value.y = y.value\n }\n\n // Prevent touch scrolling\n if (e instanceof TouchEvent) {\n e.preventDefault()\n }\n}\n\nfunction handleMove(e: MouseEvent | TouchEvent) {\n // Only prevent default if we're in a drag operation\n if (e instanceof TouchEvent && dargPoint.value) {\n e.preventDefault()\n }\n\n const { clientX, clientY } = getClientPos(e)\n const deltaX = clientX - startX\n const deltaY = clientY - startY\n\n if (dargPoint.value === 'bottom-right') {\n if (props.zoomType === 'free') {\n const { width, height } = checkBoundaries(\n startWidth + deltaX,\n startHeight + deltaY,\n )\n cropInfo.value.width = width\n cropInfo.value.height = height\n }\n else if (props.zoomType === 'fixed') {\n const aspectRatio\n = Number.parseFloat(props.aspectRatio.split(' / ')[0])\n / Number.parseFloat(props.aspectRatio.split(' / ')[1])\n let newWidth = startWidth + deltaX\n let newHeight = newWidth / aspectRatio\n const { width, height } = checkBoundaries(newWidth, newHeight)\n if (height > (containerBoxRef.value?.clientHeight || Infinity)) {\n newHeight = containerBoxRef.value?.clientHeight || Infinity\n newWidth = newHeight * aspectRatio\n }\n cropInfo.value.width = width\n cropInfo.value.height = height\n }\n }\n else if (dargPoint.value === 'top-left') {\n if (props.zoomType === 'free') {\n const { width, height } = checkBoundaries(\n startWidth - deltaX,\n startHeight - deltaY,\n )\n cropInfo.value.width = width\n cropInfo.value.height = height\n }\n else if (props.zoomType === 'fixed') {\n const aspectRatio\n = Number.parseFloat(props.aspectRatio.split(' / ')[0])\n / Number.parseFloat(props.aspectRatio.split(' / ')[1])\n let newWidth = startWidth - deltaX\n let newHeight = newWidth / aspectRatio\n const { width, height } = checkBoundaries(newWidth, newHeight)\n if (height > (containerBoxRef.value?.clientHeight || Infinity)) {\n newHeight = containerBoxRef.value?.clientHeight || Infinity\n newWidth = newHeight * aspectRatio\n }\n cropInfo.value.width = width\n cropInfo.value.height = height\n }\n x.value = customStyle.value.left\n y.value = customStyle.value.top\n }\n else if (dargPoint.value === 'top-right') {\n if (props.zoomType === 'free') {\n const { width, height } = checkBoundaries(\n startWidth + deltaX,\n startHeight - deltaY,\n )\n cropInfo.value.width = width\n cropInfo.value.height = height\n }\n else if (props.zoomType === 'fixed') {\n const aspectRatio\n = Number.parseFloat(props.aspectRatio.split(' / ')[0])\n / Number.parseFloat(props.aspectRatio.split(' / ')[1])\n let newWidth = startWidth + deltaX\n let newHeight = newWidth / aspectRatio\n const { width, height } = checkBoundaries(newWidth, newHeight)\n if (height > (containerBoxRef.value?.clientHeight || Infinity)) {\n newHeight = containerBoxRef.value?.clientHeight || Infinity\n newWidth = newHeight * aspectRatio\n }\n cropInfo.value.width = width\n cropInfo.value.height = height\n }\n x.value = customStyle.value.left\n y.value = customStyle.value.top\n }\n else if (dargPoint.value === 'bottom-left') {\n if (props.zoomType === 'free') {\n const { width, height } = checkBoundaries(\n startWidth - deltaX,\n startHeight + deltaY,\n )\n cropInfo.value.width = width\n cropInfo.value.height = height\n }\n else if (props.zoomType === 'fixed') {\n const aspectRatio\n = Number.parseFloat(props.aspectRatio.split(' / ')[0])\n / Number.parseFloat(props.aspectRatio.split(' / ')[1])\n let newWidth = startWidth - deltaX\n let newHeight = newWidth / aspectRatio\n const { width, height } = checkBoundaries(newWidth, newHeight)\n if (height > (containerBoxRef.value?.clientHeight || Infinity)) {\n newHeight = containerBoxRef.value?.clientHeight || Infinity\n newWidth = newHeight * aspectRatio\n }\n cropInfo.value.width = width\n cropInfo.value.height = height\n }\n x.value = customStyle.value.left\n y.value = customStyle.value.top\n }\n}\n\nfunction handleEnd() {\n // 移除移动端事件监听\n document.removeEventListener('touchmove', handleMove)\n document.removeEventListener('touchend', handleEnd)\n\n dargPoint.value = ''\n}\n\nfunction resize() {\n cropInfo.value.width = props.defaultWidth\n cropInfo.value.height = props.defaultHeight\n x.value = 0\n y.value = 0\n}\n\nonMounted(() => {\n nextTick(() => {\n // 初始化位置\n initialValue.value.x\n = (containerBoxRef.value?.offsetWidth || 0) / 2 - cropInfo.value.width / 2\n initialValue.value.y\n = (containerBoxRef.value?.offsetHeight || 0) / 2\n - cropInfo.value.height / 2\n })\n\n // 只添加鼠标事件监听\n document.addEventListener('mouseup', handleEnd)\n document.addEventListener('mousemove', handleMove, { passive: false })\n document.addEventListener('touchmove', handleMove, { passive: false })\n document.addEventListener('touchend', handleEnd)\n})\n\nonUnmounted(() => {\n if (imageUrl.value) {\n URL.revokeObjectURL(imageUrl.value)\n }\n // 确保移除所有事件监听\n document.removeEventListener('mouseup', handleEnd)\n document.removeEventListener('mousemove', handleMove)\n})\n\ndefineExpose({\n crop,\n resize,\n})\n</script>\n\n<template>\n <div\n ref=\"containerBoxRef\"\n :class=\"[ns.e('img-box')]\"\n >\n <div\n v-if=\"errorMessage\"\n :class=\"[ns.e('error-message')]\"\n >\n {{ errorMessage }}\n </div>\n <template v-else>\n <img\n ref=\"imgRef\"\n :class=\"[ns.e('image')]\"\n :src=\"imageUrl\"\n >\n <div\n ref=\"cropBoxRef\"\n :class=\"[ns.e('crop-tool-box')]\"\n :style=\"[\n sizeStyle,\n dargPoint\n ? `left: ${customStyle.left}px;top: ${customStyle.top}px`\n : style,\n ]\"\n @touchstart.stop.prevent\n @touchend.stop.prevent=\"handleEnd\"\n >\n <div\n :class=\"[ns.e('top-left')]\"\n @mousedown.stop.prevent=\"handleStart($event, 'top-left')\"\n @touchstart.stop.prevent=\"handleStart($event, 'top-left')\"\n @touchend.stop.prevent=\"handleEnd\"\n />\n <div\n :class=\"[ns.e('top-right')]\"\n @mousedown.stop.prevent=\"handleStart($event, 'top-right')\"\n @touchstart.stop.prevent=\"handleStart($event, 'top-right')\"\n @touchend.stop.prevent=\"handleEnd\"\n />\n <div\n :class=\"[ns.e('bottom-right')]\"\n @mousedown.stop.prevent=\"handleStart($event, 'bottom-right')\"\n @touchstart.stop.prevent=\"handleStart($event, 'bottom-right')\"\n @touchend.stop.prevent=\"handleEnd\"\n />\n <div\n :class=\"[ns.e('bottom-left')]\"\n @mousedown.stop.prevent=\"handleStart($event, 'bottom-left')\"\n @touchstart.stop.prevent=\"handleStart($event, 'bottom-left')\"\n @touchend.stop.prevent=\"handleEnd\"\n />\n </div>\n </template>\n </div>\n</template>\n"],"names":["props","__props","startX","startY","startWidth","startHeight","ns","useNamespace","cropBoxRef","ref","containerBoxRef","imgRef","errorMessage","dargPoint","initialValue","x","y","cropInfo","width","defaultWidth","height","defaultHeight","useElementSize","imgWidth","style","useDraggable","containerElement","draggingElement","disabled","computed","value","exact","imageUrl","imgFile","URL","createObjectURL","watch","newFile","type","startsWith","ratio","naturalWidth","customStyle","position","left","top","sizeStyle","aspectRatio","zoomType","cssVarBlock","zoom","pixel","checkBoundaries","newWidth","newHeight","maxWidth","clientWidth","Infinity","maxHeight","clientHeight","Math","min","max","getClientPos","e","MouseEvent","clientX","clientY","TouchEvent","touches","length","handleStart","point","document","addEventListener","handleMove","passive","handleEnd","preventDefault","deltaX","deltaY","Number","parseFloat","split","removeEventListener","onMounted","nextTick","offsetWidth","offsetHeight","onUnmounted","revokeObjectURL","__expose","crop","async","img","backgroundColor","window","getComputedStyle","canvas","createElement","drawImage","cropCanvas","drawColor","useCanvas","offsetLeft","offsetTop","naturalHeight","resize","_createElementBlock","class","_normalizeClass","_unref","_Fragment","key","_createElementVNode","src","_normalizeStyle","onTouchstart","onTouchend","onMousedown","_cache","_withModifiers","$event"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../../../packages/components/src/subject-action/index.ts"],"sourcesContent":["import { withInstall } from '../withInstall'\nimport component from './src/subject-action.vue'\n\nconst QxsSubjectAction = withInstall(component)\n\nexport {\n QxsSubjectAction,\n}\n\nexport default QxsSubjectAction\n"],"names":["QxsSubjectAction","withInstall","component","default"],"mappings":"kJAGA,MAAMA,EAAmBC,cAAYC,EAASC"}
1
+ {"version":3,"file":"index.cjs","sources":["../../../../../packages/components/src/subject-action/index.ts"],"sourcesContent":["import { withInstall } from '../withInstall'\nimport component from './src/subject-action.vue'\n\nconst QxsSubjectAction = withInstall(component)\n\nexport {\n QxsSubjectAction,\n}\n\nexport default QxsSubjectAction\n"],"names":["QxsSubjectAction","withInstall","component"],"mappings":"kJAGA,MAAMA,EAAmBC,EAAAA,YAAYC,EAAAA"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("element-plus/es");require("element-plus/es/components/base/style/index"),require("element-plus/es/components/dialog/style/index"),require("element-plus/es/components/radio-group/style/index"),require("element-plus/es/components/radio/style/index"),require("element-plus/es/components/button/style/index"),require("element-plus/es/components/icon/style/index"),require("element-plus/es/components/checkbox/style/index"),require("element-plus/es/components/popover/style/index"),require("element-plus/es/components/link/style/index");var t=require("vue"),l=require("@element-plus/icons-vue"),o=require("@qxs-bns/hooks"),a=require("../../subject-type/src/subject-type.vue.cjs");const n={key:0,class:"flex-justify-between"},c={class:"flex-justify-between"},r={key:0,class:"has-set"},i={key:1,class:"flex flex-justify-end action-buttons"};var u=t.defineComponent({name:"QxsSubjectAction",__name:"subject-action",props:{isEdit:Boolean,isSet:{type:Boolean,default:!1},isKey:{type:Boolean,default:!1},answerCheckType:{type:Number,default:1},showOtherOption:{type:Boolean,default:!0},examAnswerRelationType:{type:Number,default:null},showRichText:{type:Boolean,default:!0},pageEnd:{type:Boolean,default:!1}},emits:["moveUp","moveDown","delete","save","edit","add","onShowRichText","setKey","setAnswerSetting"],setup(u,{emit:s}){const d=u,m=s,p=t.ref(d.isKey),f=t.ref(!1),x=t.ref(d.answerCheckType),V=o.useNamespace("subject-action"),k=t.ref(!0),y=[{value:2,label:"必须全部都是支持选项,方可下一步"},{value:1,label:"无需判断是否是支持选项"},{value:3,label:"包含全部支持选项,即可下一步"}],C=t.computed((()=>y.find((e=>e.value===x.value))?.label));function h(){f.value=!1,m("setAnswerSetting",x.value)}function v(){m("setKey",p.value)}function N(e,t){m("add",e,t?d.examAnswerRelationType:null)}return(o,s)=>{const d=e.ElLink,w=e.ElPopover,B=e.ElCheckbox,b=e.ElIcon,E=e.ElButton,_=e.ElRadio,g=e.ElRadioGroup,T=e.ElDialog;return t.openBlock(),t.createElementBlock("div",{class:t.normalizeClass(t.unref(V).e("action-exam"))},[t.createElementVNode("div",{class:t.normalizeClass(["action flex flex-justify-between",{active:u.isEdit}])},[t.createCommentVNode(" 编辑模式 "),u.isEdit?(t.openBlock(),t.createElementBlock("div",n,[t.createVNode(w,{trigger:"click"},{reference:t.withCtx((()=>[t.createVNode(d,{type:"primary",class:"btn-margin"},{default:t.withCtx((()=>s[15]||(s[15]=[t.createTextVNode(" +在此题后加入新题 ")]))),_:1})])),default:t.withCtx((()=>[t.createVNode(a.default,{onSelect:N})])),_:1}),u.showRichText?(t.openBlock(),t.createBlock(d,{key:0,type:"primary",class:"btn-margin",onClick:s[0]||(s[0]=e=>m("onShowRichText"))},{default:t.withCtx((()=>s[16]||(s[16]=[t.createTextVNode(" +添加题目描述(图文) ")]))),_:1})):t.createCommentVNode("v-if",!0),u.showOtherOption?(t.openBlock(),t.createBlock(d,{key:1,type:"primary",class:"btn-margin",onClick:s[1]||(s[1]=e=>f.value=!0)},{default:t.withCtx((()=>s[17]||(s[17]=[t.createTextVNode(" 答题设置 ")]))),_:1})):t.createCommentVNode("v-if",!0),u.showOtherOption?(t.openBlock(),t.createBlock(B,{key:2,modelValue:t.unref(p),"onUpdate:modelValue":s[2]||(s[2]=e=>t.isRef(p)?p.value=e:null),label:"核心题",onChange:v},null,8,["modelValue"])):t.createCommentVNode("v-if",!0)])):(t.openBlock(),t.createElementBlock(t.Fragment,{key:1},[t.createCommentVNode(" 非编辑模式 "),t.createElementVNode("div",c,[u.showOtherOption?(t.openBlock(),t.createBlock(B,{key:0,modelValue:t.unref(p),"onUpdate:modelValue":s[3]||(s[3]=e=>t.isRef(p)?p.value=e:null),label:"核心题",disabled:""},null,8,["modelValue"])):t.createCommentVNode("v-if",!0),u.showOtherOption?(t.openBlock(),t.createBlock(B,{key:1,modelValue:t.unref(k),"onUpdate:modelValue":s[4]||(s[4]=e=>t.isRef(k)?k.value=e:null),label:t.unref(C),disabled:"",class:"btn-margin"},null,8,["modelValue","label"])):t.createCommentVNode("v-if",!0)])],2112)),t.createCommentVNode(" 操作按钮 "),t.createElementVNode("div",null,[u.isSet?(t.openBlock(),t.createElementBlock("div",r," *此题设置了跳题逻辑 ")):(t.openBlock(),t.createElementBlock("div",i,[u.isEdit?(t.openBlock(),t.createElementBlock(t.Fragment,{key:1},[t.createVNode(E,{class:"btn-margin",onClick:s[9]||(s[9]=e=>m("delete"))},{default:t.withCtx((()=>s[22]||(s[22]=[t.createTextVNode(" 删除 ")]))),_:1}),t.createVNode(E,{type:"primary",onClick:s[10]||(s[10]=e=>m("save"))},{default:t.withCtx((()=>s[23]||(s[23]=[t.createTextVNode(" 完成编辑 ")]))),_:1})],64)):(t.openBlock(),t.createElementBlock(t.Fragment,{key:0},[u.pageEnd?t.createCommentVNode("v-if",!0):(t.openBlock(),t.createBlock(E,{key:0,onClick:s[5]||(s[5]=e=>m("edit"))},{icon:t.withCtx((()=>[t.createVNode(b,null,{default:t.withCtx((()=>[t.createVNode(t.unref(l.Edit))])),_:1})])),default:t.withCtx((()=>[s[18]||(s[18]=t.createTextVNode(" 编辑 "))])),_:1})),t.createVNode(E,{onClick:s[6]||(s[6]=e=>m("delete"))},{icon:t.withCtx((()=>[t.createVNode(b,null,{default:t.withCtx((()=>[t.createVNode(t.unref(l.Delete))])),_:1})])),default:t.withCtx((()=>[s[19]||(s[19]=t.createTextVNode(" 删除 "))])),_:1}),t.createVNode(E,{onClick:s[7]||(s[7]=e=>m("moveUp"))},{icon:t.withCtx((()=>[t.createVNode(b,null,{default:t.withCtx((()=>[t.createVNode(t.unref(l.Top))])),_:1})])),default:t.withCtx((()=>[s[20]||(s[20]=t.createTextVNode(" 上移 "))])),_:1}),t.createVNode(E,{onClick:s[8]||(s[8]=e=>m("moveDown"))},{icon:t.withCtx((()=>[t.createVNode(b,null,{default:t.withCtx((()=>[t.createVNode(t.unref(l.Bottom))])),_:1})])),default:t.withCtx((()=>[s[21]||(s[21]=t.createTextVNode(" 下移 "))])),_:1})],64))]))]),t.createCommentVNode(" 答题设置弹窗 "),t.createVNode(T,{modelValue:t.unref(f),"onUpdate:modelValue":s[13]||(s[13]=e=>t.isRef(f)?f.value=e:null),title:"答题设置",class:"customize-dialog",onClose:s[14]||(s[14]=e=>f.value=!1)},{footer:t.withCtx((()=>[t.createVNode(E,{class:"customize-button",type:"primary",plain:"",onClick:s[12]||(s[12]=e=>f.value=!1)},{default:t.withCtx((()=>s[24]||(s[24]=[t.createTextVNode(" 取消 ")]))),_:1}),t.createVNode(E,{class:"customize-button",type:"primary",plain:"",onClick:h},{default:t.withCtx((()=>s[25]||(s[25]=[t.createTextVNode(" 保存 ")]))),_:1})])),default:t.withCtx((()=>[t.createVNode(g,{modelValue:t.unref(x),"onUpdate:modelValue":s[11]||(s[11]=e=>t.isRef(x)?x.value=e:null),class:"vertical-radio-group"},{default:t.withCtx((()=>[(t.openBlock(),t.createElementBlock(t.Fragment,null,t.renderList(y,(e=>t.createVNode(_,{key:e.value,value:e.value},{default:t.withCtx((()=>[t.createTextVNode(t.toDisplayString(e.label),1)])),_:2},1032,["value"]))),64))])),_:1},8,["modelValue"])])),_:1},8,["modelValue"])],2)],2)}}});exports.default=u;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("element-plus/es");require("element-plus/es/components/base/style/index"),require("element-plus/es/components/dialog/style/index"),require("element-plus/es/components/radio-group/style/index"),require("element-plus/es/components/radio/style/index"),require("element-plus/es/components/button/style/index"),require("element-plus/es/components/icon/style/index"),require("element-plus/es/components/checkbox/style/index"),require("element-plus/es/components/popover/style/index"),require("element-plus/es/components/link/style/index");var t=require("vue"),l=require("@element-plus/icons-vue"),o=require("@qxs-bns/hooks"),a=require("../../subject-type/src/subject-type.vue.cjs");const n={key:0,class:"flex-justify-between"},c={class:"flex-justify-between"},r={key:0,class:"has-set"},i={key:1,class:"flex flex-justify-end action-buttons"};var u=t.defineComponent({name:"QxsSubjectAction",__name:"subject-action",props:{isEdit:Boolean,isSet:{type:Boolean,default:!1},isKey:{type:Boolean,default:!1},answerCheckType:{type:Number,default:1},showOtherOption:{type:Boolean,default:!0},examAnswerRelationType:{type:Number,default:null},showRichText:{type:Boolean,default:!0},pageEnd:{type:Boolean,default:!1}},emits:["moveUp","moveDown","delete","save","edit","add","onShowRichText","setKey","setAnswerSetting"],setup(u,{emit:s}){const d=u,m=s,p=t.ref(d.isKey),f=t.ref(!1),x=t.ref(d.answerCheckType),V=o.useNamespace("subject-action"),k=t.ref(!0),y=[{value:2,label:"必须全部都是支持选项,方可下一步"},{value:1,label:"无需判断是否是支持选项"},{value:3,label:"包含全部支持选项,即可下一步"}],C=t.computed(()=>y.find(e=>e.value===x.value)?.label);function h(){f.value=!1,m("setAnswerSetting",x.value)}function v(){m("setKey",p.value)}function N(e,t){m("add",e,t?d.examAnswerRelationType:null)}return(o,s)=>{const d=e.ElLink,w=e.ElPopover,_=e.ElCheckbox,B=e.ElIcon,b=e.ElButton,E=e.ElRadio,g=e.ElRadioGroup,T=e.ElDialog;return t.openBlock(),t.createElementBlock("div",{class:t.normalizeClass(t.unref(V).e("action-exam"))},[t.createElementVNode("div",{class:t.normalizeClass(["action flex flex-justify-between",{active:u.isEdit}])},[t.createCommentVNode(" 编辑模式 "),u.isEdit?(t.openBlock(),t.createElementBlock("div",n,[t.createVNode(w,{trigger:"click"},{reference:t.withCtx(()=>[t.createVNode(d,{type:"primary",class:"btn-margin"},{default:t.withCtx(()=>s[15]||(s[15]=[t.createTextVNode(" +在此题后加入新题 ",-1)])),_:1,__:[15]})]),default:t.withCtx(()=>[t.createVNode(a.default,{onSelect:N})]),_:1}),u.showRichText?(t.openBlock(),t.createBlock(d,{key:0,type:"primary",class:"btn-margin",onClick:s[0]||(s[0]=e=>m("onShowRichText"))},{default:t.withCtx(()=>s[16]||(s[16]=[t.createTextVNode(" +添加题目描述(图文) ",-1)])),_:1,__:[16]})):t.createCommentVNode("v-if",!0),u.showOtherOption?(t.openBlock(),t.createBlock(d,{key:1,type:"primary",class:"btn-margin",onClick:s[1]||(s[1]=e=>f.value=!0)},{default:t.withCtx(()=>s[17]||(s[17]=[t.createTextVNode(" 答题设置 ",-1)])),_:1,__:[17]})):t.createCommentVNode("v-if",!0),u.showOtherOption?(t.openBlock(),t.createBlock(_,{key:2,modelValue:t.unref(p),"onUpdate:modelValue":s[2]||(s[2]=e=>t.isRef(p)?p.value=e:null),label:"核心题",onChange:v},null,8,["modelValue"])):t.createCommentVNode("v-if",!0)])):(t.openBlock(),t.createElementBlock(t.Fragment,{key:1},[t.createCommentVNode(" 非编辑模式 "),t.createElementVNode("div",c,[u.showOtherOption?(t.openBlock(),t.createBlock(_,{key:0,modelValue:t.unref(p),"onUpdate:modelValue":s[3]||(s[3]=e=>t.isRef(p)?p.value=e:null),label:"核心题",disabled:""},null,8,["modelValue"])):t.createCommentVNode("v-if",!0),u.showOtherOption?(t.openBlock(),t.createBlock(_,{key:1,modelValue:t.unref(k),"onUpdate:modelValue":s[4]||(s[4]=e=>t.isRef(k)?k.value=e:null),label:t.unref(C),disabled:"",class:"btn-margin"},null,8,["modelValue","label"])):t.createCommentVNode("v-if",!0)])],2112)),t.createCommentVNode(" 操作按钮 "),t.createElementVNode("div",null,[u.isSet?(t.openBlock(),t.createElementBlock("div",r," *此题设置了跳题逻辑 ")):(t.openBlock(),t.createElementBlock("div",i,[u.isEdit?(t.openBlock(),t.createElementBlock(t.Fragment,{key:1},[t.createVNode(b,{class:"btn-margin",onClick:s[9]||(s[9]=e=>m("delete"))},{default:t.withCtx(()=>s[22]||(s[22]=[t.createTextVNode(" 删除 ",-1)])),_:1,__:[22]}),t.createVNode(b,{type:"primary",onClick:s[10]||(s[10]=e=>m("save"))},{default:t.withCtx(()=>s[23]||(s[23]=[t.createTextVNode(" 完成编辑 ",-1)])),_:1,__:[23]})],64)):(t.openBlock(),t.createElementBlock(t.Fragment,{key:0},[u.pageEnd?t.createCommentVNode("v-if",!0):(t.openBlock(),t.createBlock(b,{key:0,onClick:s[5]||(s[5]=e=>m("edit"))},{icon:t.withCtx(()=>[t.createVNode(B,null,{default:t.withCtx(()=>[t.createVNode(t.unref(l.Edit))]),_:1})]),default:t.withCtx(()=>[s[18]||(s[18]=t.createTextVNode(" 编辑 ",-1))]),_:1,__:[18]})),t.createVNode(b,{onClick:s[6]||(s[6]=e=>m("delete"))},{icon:t.withCtx(()=>[t.createVNode(B,null,{default:t.withCtx(()=>[t.createVNode(t.unref(l.Delete))]),_:1})]),default:t.withCtx(()=>[s[19]||(s[19]=t.createTextVNode(" 删除 ",-1))]),_:1,__:[19]}),t.createVNode(b,{onClick:s[7]||(s[7]=e=>m("moveUp"))},{icon:t.withCtx(()=>[t.createVNode(B,null,{default:t.withCtx(()=>[t.createVNode(t.unref(l.Top))]),_:1})]),default:t.withCtx(()=>[s[20]||(s[20]=t.createTextVNode(" 上移 ",-1))]),_:1,__:[20]}),t.createVNode(b,{onClick:s[8]||(s[8]=e=>m("moveDown"))},{icon:t.withCtx(()=>[t.createVNode(B,null,{default:t.withCtx(()=>[t.createVNode(t.unref(l.Bottom))]),_:1})]),default:t.withCtx(()=>[s[21]||(s[21]=t.createTextVNode(" 下移 ",-1))]),_:1,__:[21]})],64))]))]),t.createCommentVNode(" 答题设置弹窗 "),t.createVNode(T,{modelValue:t.unref(f),"onUpdate:modelValue":s[13]||(s[13]=e=>t.isRef(f)?f.value=e:null),title:"答题设置",class:"customize-dialog",onClose:s[14]||(s[14]=e=>f.value=!1)},{footer:t.withCtx(()=>[t.createVNode(b,{class:"customize-button",type:"primary",plain:"",onClick:s[12]||(s[12]=e=>f.value=!1)},{default:t.withCtx(()=>s[24]||(s[24]=[t.createTextVNode(" 取消 ",-1)])),_:1,__:[24]}),t.createVNode(b,{class:"customize-button",type:"primary",plain:"",onClick:h},{default:t.withCtx(()=>s[25]||(s[25]=[t.createTextVNode(" 保存 ",-1)])),_:1,__:[25]})]),default:t.withCtx(()=>[t.createVNode(g,{modelValue:t.unref(x),"onUpdate:modelValue":s[11]||(s[11]=e=>t.isRef(x)?x.value=e:null),class:"vertical-radio-group"},{default:t.withCtx(()=>[(t.openBlock(),t.createElementBlock(t.Fragment,null,t.renderList(y,e=>t.createVNode(E,{key:e.value,value:e.value},{default:t.withCtx(()=>[t.createTextVNode(t.toDisplayString(e.label),1)]),_:2},1032,["value"])),64))]),_:1},8,["modelValue"])]),_:1},8,["modelValue"])],2)],2)}}});exports.default=u;
2
2
  //# sourceMappingURL=subject-action.vue.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"subject-action.vue.cjs","sources":["../../../../../../packages/components/src/subject-action/src/subject-action.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { Bottom, Delete, Edit, Top } from '@element-plus/icons-vue'\nimport { useNamespace } from '@qxs-bns/hooks'\nimport SubjectType from '../../subject-type/src/subject-type.vue'\n\ndefineOptions({\n name: 'QxsSubjectAction',\n})\n\nconst props = defineProps({\n isEdit: Boolean,\n isSet: {\n type: Boolean,\n default: false,\n },\n isKey: {\n type: Boolean,\n default: false,\n },\n answerCheckType: {\n type: Number,\n default: 1,\n },\n showOtherOption: {\n type: Boolean,\n default: true,\n },\n examAnswerRelationType: {\n type: Number,\n default: null,\n },\n showRichText: {\n type: Boolean,\n default: true,\n },\n pageEnd: {\n type: Boolean,\n default: false,\n },\n})\n\nconst emits = defineEmits([\n 'moveUp',\n 'moveDown',\n 'delete',\n 'save',\n 'edit',\n 'add',\n 'onShowRichText',\n 'setKey',\n 'setAnswerSetting',\n])\nconst isKey = ref(props.isKey)\nconst showAnswerSetting = ref(false)\nconst answerType = ref(props.answerCheckType)\nconst ns = useNamespace('subject-action')\nconst checked = ref(true)\nconst answerTextList = [\n {\n value: 2,\n label: '必须全部都是支持选项,方可下一步',\n },\n {\n value: 1,\n label: '无需判断是否是支持选项',\n },\n {\n value: 3,\n label: '包含全部支持选项,即可下一步',\n },\n]\n\nconst answerText = computed(() => {\n return answerTextList.find(item => item.value === answerType.value)?.label\n})\n\nfunction onSaveSetting() {\n showAnswerSetting.value = false\n emits('setAnswerSetting', answerType.value)\n}\n\nfunction setKey() {\n emits('setKey', isKey.value)\n}\n\nfunction selectExam(type: string, canSet: boolean) {\n emits('add', type, canSet ? props.examAnswerRelationType : null)\n}\n</script>\n\n<template>\n <div :class=\"ns.e('action-exam')\">\n <div\n class=\"action flex flex-justify-between\"\n :class=\"{ active: isEdit }\"\n >\n <!-- 编辑模式 -->\n <div\n v-if=\"isEdit\"\n class=\"flex-justify-between\"\n >\n <el-popover trigger=\"click\">\n <template #reference>\n <el-link\n type=\"primary\"\n class=\"btn-margin\"\n >\n +在此题后加入新题\n </el-link>\n </template>\n <SubjectType @select=\"selectExam\" />\n </el-popover>\n <el-link\n v-if=\"showRichText\"\n type=\"primary\"\n class=\"btn-margin\"\n @click=\"emits('onShowRichText')\"\n >\n +添加题目描述(图文)\n </el-link>\n <el-link\n v-if=\"showOtherOption\"\n type=\"primary\"\n class=\"btn-margin\"\n @click=\"showAnswerSetting = true\"\n >\n 答题设置\n </el-link>\n <el-checkbox\n v-if=\"showOtherOption\"\n v-model=\"isKey\"\n label=\"核心题\"\n @change=\"setKey\"\n />\n </div>\n\n <!-- 非编辑模式 -->\n <div\n v-else\n class=\"flex-justify-between\"\n >\n <el-checkbox\n v-if=\"showOtherOption\"\n v-model=\"isKey\"\n label=\"核心题\"\n disabled\n />\n <el-checkbox\n v-if=\"showOtherOption\"\n v-model=\"checked\"\n :label=\"answerText\"\n disabled\n class=\"btn-margin\"\n />\n </div>\n\n <!-- 操作按钮 -->\n <div>\n <div\n v-if=\"isSet\"\n class=\"has-set\"\n >\n *此题设置了跳题逻辑\n </div>\n <div\n v-else\n class=\"flex flex-justify-end action-buttons\"\n >\n <template v-if=\"!isEdit\">\n <el-button\n v-if=\"!pageEnd\"\n @click=\"emits('edit')\"\n >\n <template #icon>\n <el-icon><Edit /></el-icon>\n </template>\n 编辑\n </el-button>\n <el-button @click=\"emits('delete')\">\n <template #icon>\n <el-icon><Delete /></el-icon>\n </template>\n 删除\n </el-button>\n <el-button @click=\"emits('moveUp')\">\n <template #icon>\n <el-icon><Top /></el-icon>\n </template>\n 上移\n </el-button>\n <el-button @click=\"emits('moveDown')\">\n <template #icon>\n <el-icon><Bottom /></el-icon>\n </template>\n 下移\n </el-button>\n </template>\n <template v-else>\n <el-button\n class=\"btn-margin\"\n @click=\"emits('delete')\"\n >\n 删除\n </el-button>\n <el-button\n type=\"primary\"\n @click=\"emits('save')\"\n >\n 完成编辑\n </el-button>\n </template>\n </div>\n </div>\n\n <!-- 答题设置弹窗 -->\n <el-dialog\n v-model=\"showAnswerSetting\"\n title=\"答题设置\"\n class=\"customize-dialog\"\n @close=\"showAnswerSetting = false\"\n >\n <el-radio-group\n v-model=\"answerType\"\n class=\"vertical-radio-group\"\n >\n <el-radio\n v-for=\"item in answerTextList\"\n :key=\"item.value\"\n :value=\"item.value\"\n >\n {{ item.label }}\n </el-radio>\n </el-radio-group>\n <template #footer>\n <el-button\n class=\"customize-button\"\n type=\"primary\"\n plain\n @click=\"showAnswerSetting = false\"\n >\n 取消\n </el-button>\n <el-button\n class=\"customize-button\"\n type=\"primary\"\n plain\n @click=\"onSaveSetting\"\n >\n 保存\n </el-button>\n </template>\n </el-dialog>\n </div>\n </div>\n</template>\n"],"names":["props","__props","emits","__emit","isKey","ref","showAnswerSetting","answerType","answerCheckType","ns","useNamespace","checked","answerTextList","value","label","answerText","computed","find","item","onSaveSetting","setKey","selectExam","type","canSet","examAnswerRelationType"],"mappings":"03CASA,MAAMA,EAAQC,EAgCRC,EAAQC,EAWRC,EAAQC,EAAAA,IAAIL,EAAMI,OAClBE,EAAoBD,OAAI,GACxBE,EAAaF,EAAAA,IAAIL,EAAMQ,iBACvBC,EAAKC,eAAa,kBAClBC,EAAUN,OAAI,GACdO,EAAiB,CACrB,CACEC,MAAO,EACPC,MAAO,oBAET,CACED,MAAO,EACPC,MAAO,eAET,CACED,MAAO,EACPC,MAAO,mBAILC,EAAaC,EAAAA,UAAS,IACnBJ,EAAeK,MAAKC,GAAQA,EAAKL,QAAUN,EAAWM,SAAQC,QAGvE,SAASK,IACPb,EAAkBO,OAAQ,EACpBX,EAAA,mBAAoBK,EAAWM,MAAK,CAG5C,SAASO,IACDlB,EAAA,SAAUE,EAAMS,MAAK,CAGpB,SAAAQ,EAAWC,EAAcC,GAChCrB,EAAM,MAAOoB,EAAMC,EAASvB,EAAMwB,uBAAyB,KAAI"}
1
+ {"version":3,"file":"subject-action.vue.cjs","sources":["../../../../../../packages/components/src/subject-action/src/subject-action.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { Bottom, Delete, Edit, Top } from '@element-plus/icons-vue'\nimport { useNamespace } from '@qxs-bns/hooks'\nimport SubjectType from '../../subject-type/src/subject-type.vue'\n\ndefineOptions({\n name: 'QxsSubjectAction',\n})\n\nconst props = defineProps({\n isEdit: Boolean,\n isSet: {\n type: Boolean,\n default: false,\n },\n isKey: {\n type: Boolean,\n default: false,\n },\n answerCheckType: {\n type: Number,\n default: 1,\n },\n showOtherOption: {\n type: Boolean,\n default: true,\n },\n examAnswerRelationType: {\n type: Number,\n default: null,\n },\n showRichText: {\n type: Boolean,\n default: true,\n },\n pageEnd: {\n type: Boolean,\n default: false,\n },\n})\n\nconst emits = defineEmits([\n 'moveUp',\n 'moveDown',\n 'delete',\n 'save',\n 'edit',\n 'add',\n 'onShowRichText',\n 'setKey',\n 'setAnswerSetting',\n])\nconst isKey = ref(props.isKey)\nconst showAnswerSetting = ref(false)\nconst answerType = ref(props.answerCheckType)\nconst ns = useNamespace('subject-action')\nconst checked = ref(true)\nconst answerTextList = [\n {\n value: 2,\n label: '必须全部都是支持选项,方可下一步',\n },\n {\n value: 1,\n label: '无需判断是否是支持选项',\n },\n {\n value: 3,\n label: '包含全部支持选项,即可下一步',\n },\n]\n\nconst answerText = computed(() => {\n return answerTextList.find(item => item.value === answerType.value)?.label\n})\n\nfunction onSaveSetting() {\n showAnswerSetting.value = false\n emits('setAnswerSetting', answerType.value)\n}\n\nfunction setKey() {\n emits('setKey', isKey.value)\n}\n\nfunction selectExam(type: string, canSet: boolean) {\n emits('add', type, canSet ? props.examAnswerRelationType : null)\n}\n</script>\n\n<template>\n <div :class=\"ns.e('action-exam')\">\n <div\n class=\"action flex flex-justify-between\"\n :class=\"{ active: isEdit }\"\n >\n <!-- 编辑模式 -->\n <div\n v-if=\"isEdit\"\n class=\"flex-justify-between\"\n >\n <el-popover trigger=\"click\">\n <template #reference>\n <el-link\n type=\"primary\"\n class=\"btn-margin\"\n >\n +在此题后加入新题\n </el-link>\n </template>\n <SubjectType @select=\"selectExam\" />\n </el-popover>\n <el-link\n v-if=\"showRichText\"\n type=\"primary\"\n class=\"btn-margin\"\n @click=\"emits('onShowRichText')\"\n >\n +添加题目描述(图文)\n </el-link>\n <el-link\n v-if=\"showOtherOption\"\n type=\"primary\"\n class=\"btn-margin\"\n @click=\"showAnswerSetting = true\"\n >\n 答题设置\n </el-link>\n <el-checkbox\n v-if=\"showOtherOption\"\n v-model=\"isKey\"\n label=\"核心题\"\n @change=\"setKey\"\n />\n </div>\n\n <!-- 非编辑模式 -->\n <div\n v-else\n class=\"flex-justify-between\"\n >\n <el-checkbox\n v-if=\"showOtherOption\"\n v-model=\"isKey\"\n label=\"核心题\"\n disabled\n />\n <el-checkbox\n v-if=\"showOtherOption\"\n v-model=\"checked\"\n :label=\"answerText\"\n disabled\n class=\"btn-margin\"\n />\n </div>\n\n <!-- 操作按钮 -->\n <div>\n <div\n v-if=\"isSet\"\n class=\"has-set\"\n >\n *此题设置了跳题逻辑\n </div>\n <div\n v-else\n class=\"flex flex-justify-end action-buttons\"\n >\n <template v-if=\"!isEdit\">\n <el-button\n v-if=\"!pageEnd\"\n @click=\"emits('edit')\"\n >\n <template #icon>\n <el-icon><Edit /></el-icon>\n </template>\n 编辑\n </el-button>\n <el-button @click=\"emits('delete')\">\n <template #icon>\n <el-icon><Delete /></el-icon>\n </template>\n 删除\n </el-button>\n <el-button @click=\"emits('moveUp')\">\n <template #icon>\n <el-icon><Top /></el-icon>\n </template>\n 上移\n </el-button>\n <el-button @click=\"emits('moveDown')\">\n <template #icon>\n <el-icon><Bottom /></el-icon>\n </template>\n 下移\n </el-button>\n </template>\n <template v-else>\n <el-button\n class=\"btn-margin\"\n @click=\"emits('delete')\"\n >\n 删除\n </el-button>\n <el-button\n type=\"primary\"\n @click=\"emits('save')\"\n >\n 完成编辑\n </el-button>\n </template>\n </div>\n </div>\n\n <!-- 答题设置弹窗 -->\n <el-dialog\n v-model=\"showAnswerSetting\"\n title=\"答题设置\"\n class=\"customize-dialog\"\n @close=\"showAnswerSetting = false\"\n >\n <el-radio-group\n v-model=\"answerType\"\n class=\"vertical-radio-group\"\n >\n <el-radio\n v-for=\"item in answerTextList\"\n :key=\"item.value\"\n :value=\"item.value\"\n >\n {{ item.label }}\n </el-radio>\n </el-radio-group>\n <template #footer>\n <el-button\n class=\"customize-button\"\n type=\"primary\"\n plain\n @click=\"showAnswerSetting = false\"\n >\n 取消\n </el-button>\n <el-button\n class=\"customize-button\"\n type=\"primary\"\n plain\n @click=\"onSaveSetting\"\n >\n 保存\n </el-button>\n </template>\n </el-dialog>\n </div>\n </div>\n</template>\n"],"names":["props","__props","emits","__emit","isKey","ref","showAnswerSetting","answerType","answerCheckType","ns","useNamespace","checked","answerTextList","value","label","answerText","computed","find","item","onSaveSetting","setKey","selectExam","type","canSet","examAnswerRelationType","_createElementBlock","class","_normalizeClass","_unref","e","_createElementVNode","active","isEdit","_createCommentVNode","_openBlock","_hoisted_1","_createVNode","_component_el_popover","trigger","reference","_component_el_link","_cache","SubjectType","onSelect","showRichText","_createBlock","onClick","showOtherOption","_component_el_checkbox","$event","onChange","_Fragment","key","_hoisted_2","disabled","isSet","_hoisted_3","_hoisted_4","_component_el_button","pageEnd","icon","_component_el_icon","Edit","Delete","Top","Bottom","_component_el_dialog","title","onClose","footer","plain","_component_el_radio_group","_renderList","_component_el_radio","_createTextVNode","_toDisplayString"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../../../packages/components/src/subject-layout/index.ts"],"sourcesContent":["import { withInstall } from '../withInstall'\nimport component from './src/subject-layout.vue'\n\nconst QxsSubjectLayout = withInstall(component)\n\nexport {\n QxsSubjectLayout,\n}\n\nexport default QxsSubjectLayout\n"],"names":["QxsSubjectLayout","withInstall","component","default"],"mappings":"kJAGA,MAAMA,EAAmBC,cAAYC,EAASC"}
1
+ {"version":3,"file":"index.cjs","sources":["../../../../../packages/components/src/subject-layout/index.ts"],"sourcesContent":["import { withInstall } from '../withInstall'\nimport component from './src/subject-layout.vue'\n\nconst QxsSubjectLayout = withInstall(component)\n\nexport {\n QxsSubjectLayout,\n}\n\nexport default QxsSubjectLayout\n"],"names":["QxsSubjectLayout","withInstall","component"],"mappings":"kJAGA,MAAMA,EAAmBC,EAAAA,YAAYC,EAAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"subject-layout.vue.cjs","sources":["../../../../../../packages/components/src/subject-layout/src/subject-layout.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useNamespace } from '@qxs-bns/hooks'\n\ndefineOptions({\n name: 'QxsSubjectLayout',\n})\ndefineProps<{\n showEdit: boolean\n}>()\n\nconst ns = useNamespace('subject-layout')\n</script>\n\n<template>\n <div :class=\"ns.e('layout-exam')\">\n <!-- <div class=\"subject-layout\"> -->\n <slot name=\"preview\" />\n <div\n v-if=\"showEdit\"\n class=\"edit\"\n >\n <div class=\"triangle-up\" />\n <slot name=\"edit\" />\n </div>\n <slot />\n <!-- </div> -->\n </div>\n</template>\n"],"names":["ns","useNamespace"],"mappings":"gRAUM,MAAAA,EAAKC,eAAa"}
1
+ {"version":3,"file":"subject-layout.vue.cjs","sources":["../../../../../../packages/components/src/subject-layout/src/subject-layout.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useNamespace } from '@qxs-bns/hooks'\n\ndefineOptions({\n name: 'QxsSubjectLayout',\n})\ndefineProps<{\n showEdit: boolean\n}>()\n\nconst ns = useNamespace('subject-layout')\n</script>\n\n<template>\n <div :class=\"ns.e('layout-exam')\">\n <!-- <div class=\"subject-layout\"> -->\n <slot name=\"preview\" />\n <div\n v-if=\"showEdit\"\n class=\"edit\"\n >\n <div class=\"triangle-up\" />\n <slot name=\"edit\" />\n </div>\n <slot />\n <!-- </div> -->\n </div>\n</template>\n"],"names":["ns","useNamespace","_createElementBlock","class","_normalizeClass","_unref","e","_createCommentVNode","_renderSlot","_ctx","$slots","showEdit","_openBlock","_hoisted_1","_createElementVNode"],"mappings":"gRAUA,MAAMA,EAAKC,EAAAA,aAAa,8CAItBC,EAAAA,mBAYM,MAAA,CAZAC,MAAKC,EAAAA,eAAEC,EAAAA,MAAAL,GAAGM,EAAC,kBACfC,EAAAA,mBAAA,kCACAC,aAAuBC,EAAAC,OAAA,WAEfC,EAAAA,UADRC,EAAAA,YAAAV,EAAAA,mBAMM,MANNW,EAMM,aAFJC,EAAAA,mBAA2B,MAAA,CAAtBX,MAAM,eAAa,MAAA,IACxBK,aAAoBC,EAAAC,OAAA,2CAEtBF,aAAQC,EAAAC,OAAA,WACVH,EAAAA,mBAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../../../packages/components/src/subject-list/index.ts"],"sourcesContent":["import { withInstall } from '../withInstall'\nimport component from './src/subject-list.vue'\n\nconst QxsSubjectList = withInstall(component)\n\nexport {\n QxsSubjectList,\n}\n\nexport default QxsSubjectList\n"],"names":["QxsSubjectList","withInstall","component","default"],"mappings":"gJAGA,MAAMA,EAAiBC,cAAYC,EAASC"}
1
+ {"version":3,"file":"index.cjs","sources":["../../../../../packages/components/src/subject-list/index.ts"],"sourcesContent":["import { withInstall } from '../withInstall'\nimport component from './src/subject-list.vue'\n\nconst QxsSubjectList = withInstall(component)\n\nexport {\n QxsSubjectList,\n}\n\nexport default QxsSubjectList\n"],"names":["QxsSubjectList","withInstall","component"],"mappings":"gJAGA,MAAMA,EAAiBC,EAAAA,YAAYC,EAAAA"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("element-plus/es");require("element-plus/es/components/base/style/index"),require("element-plus/es/components/row/style/index");var t=require("vue"),n=require("@qxs-bns/hooks"),o=require("../../../subject-action/src/subject-action.vue.cjs"),r=t.defineComponent({name:"QxsSubjectScale",__name:"SubjectPageEnd",props:{currentPageIndex:{type:Number,required:!0},totalPage:{type:Number,required:!0},isSave:{type:Boolean,required:!0},showAction:{type:Boolean,required:!1},isEdit:{type:Boolean,required:!0},isSet:{type:Boolean,required:!0},examAnswerRelationType:{type:Number,required:!1}},emits:["move","save","delete","edit","add"],setup(r,{emit:s}){const a=r,l=s;t.onMounted((function(){}));const i=n.useNamespace("subject-end");return(n,r)=>{const s=e.ElRow;return t.openBlock(),t.createElementBlock("div",{class:t.normalizeClass(t.unref(i).e("end-exam"))},[t.createVNode(s,{type:"flex",align:"middle"},{default:t.withCtx((()=>[r[5]||(r[5]=t.createElementVNode("span",{class:"auto-line"},null,-1)),t.createElementVNode("span",null,"第"+t.toDisplayString(a.currentPageIndex)+" / "+t.toDisplayString(n.totalPage)+"页",1),r[6]||(r[6]=t.createElementVNode("span",{class:"auto-line"},null,-1))])),_:1}),t.createVNode(o.default,{"is-edit":!1,"is-set":n.isSet,"page-end":!0,"exam-answer-relation-type":a.examAnswerRelationType,"show-other-option":!1,"show-rich-text":!1,onMoveUp:r[0]||(r[0]=e=>l("move","up")),onMoveDown:r[1]||(r[1]=e=>l("move","down")),onDelete:r[2]||(r[2]=e=>l("delete")),onEdit:r[3]||(r[3]=e=>l("edit")),onAdd:r[4]||(r[4]=e=>l("add",e))},null,8,["is-set","exam-answer-relation-type"])],2)}}});exports.default=r;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("element-plus/es");require("element-plus/es/components/base/style/index"),require("element-plus/es/components/row/style/index");var t=require("vue"),n=require("@qxs-bns/hooks"),o=require("../../../subject-action/src/subject-action.vue.cjs"),r=t.defineComponent({name:"QxsSubjectScale",__name:"SubjectPageEnd",props:{currentPageIndex:{type:Number,required:!0},totalPage:{type:Number,required:!0},isSave:{type:Boolean,required:!0},showAction:{type:Boolean,required:!1},isEdit:{type:Boolean,required:!0},isSet:{type:Boolean,required:!0},examAnswerRelationType:{type:Number,required:!1}},emits:["move","save","delete","edit","add"],setup(r,{emit:s}){const a=r,l=s;t.onMounted(function(){});const i=n.useNamespace("subject-end");return(n,r)=>{const s=e.ElRow;return t.openBlock(),t.createElementBlock("div",{class:t.normalizeClass(t.unref(i).e("end-exam"))},[t.createVNode(s,{type:"flex",align:"middle"},{default:t.withCtx(()=>[r[5]||(r[5]=t.createElementVNode("span",{class:"auto-line"},null,-1)),t.createElementVNode("span",null,"第"+t.toDisplayString(a.currentPageIndex)+" / "+t.toDisplayString(n.totalPage)+"页",1),r[6]||(r[6]=t.createElementVNode("span",{class:"auto-line"},null,-1))]),_:1,__:[5,6]}),t.createVNode(o.default,{"is-edit":!1,"is-set":n.isSet,"page-end":!0,"exam-answer-relation-type":a.examAnswerRelationType,"show-other-option":!1,"show-rich-text":!1,onMoveUp:r[0]||(r[0]=e=>l("move","up")),onMoveDown:r[1]||(r[1]=e=>l("move","down")),onDelete:r[2]||(r[2]=e=>l("delete")),onEdit:r[3]||(r[3]=e=>l("edit")),onAdd:r[4]||(r[4]=e=>l("add",e))},null,8,["is-set","exam-answer-relation-type"])],2)}}});exports.default=r;
2
2
  //# sourceMappingURL=SubjectPageEnd.vue.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"SubjectPageEnd.vue.cjs","sources":["../../../../../../../packages/components/src/subject-list/src/components/SubjectPageEnd.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useNamespace } from '@qxs-bns/hooks'\nimport SubjectAction from '../../../subject-action/src/subject-action.vue'\n\ndefineOptions({\n name: 'QxsSubjectScale',\n})\nconst props = defineProps<{\n currentPageIndex: number\n totalPage: number\n isSave: boolean\n showAction?: boolean\n isEdit: boolean\n isSet: boolean\n examAnswerRelationType?: number\n}>()\nconst emits = defineEmits(['move', 'save', 'delete', 'edit', 'add'])\n\nfunction init() {\n\n}\n\nonMounted(init)\nconst ns = useNamespace('subject-end')\n</script>\n\n<template>\n <div :class=\"ns.e('end-exam')\">\n <el-row\n type=\"flex\"\n align=\"middle\"\n >\n <span class=\"auto-line\" />\n <span>第{{ props.currentPageIndex }} / {{ totalPage }}页</span>\n <span class=\"auto-line\" />\n </el-row>\n <SubjectAction\n :is-edit=\"false\"\n :is-set=\"isSet\"\n :page-end=\"true\"\n :exam-answer-relation-type=\"props.examAnswerRelationType\"\n :show-other-option=\"false\"\n :show-rich-text=\"false\"\n @move-up=\"emits('move', 'up')\"\n @move-down=\"emits('move', 'down')\"\n @delete=\"emits('delete')\"\n @edit=\"emits('edit')\"\n @add=\"type => emits('add', type)\"\n />\n </div>\n</template>\n"],"names":["props","__props","emits","__emit","onMounted","ns","useNamespace"],"mappings":"wtBAOA,MAAMA,EAAQC,EASRC,EAAQC,EAMdC,EAAAA,WAJA,WAAgB,IAKV,MAAAC,EAAKC,eAAa"}
1
+ {"version":3,"file":"SubjectPageEnd.vue.cjs","sources":["../../../../../../../packages/components/src/subject-list/src/components/SubjectPageEnd.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useNamespace } from '@qxs-bns/hooks'\nimport SubjectAction from '../../../subject-action/src/subject-action.vue'\n\ndefineOptions({\n name: 'QxsSubjectScale',\n})\nconst props = defineProps<{\n currentPageIndex: number\n totalPage: number\n isSave: boolean\n showAction?: boolean\n isEdit: boolean\n isSet: boolean\n examAnswerRelationType?: number\n}>()\nconst emits = defineEmits(['move', 'save', 'delete', 'edit', 'add'])\n\nfunction init() {\n\n}\n\nonMounted(init)\nconst ns = useNamespace('subject-end')\n</script>\n\n<template>\n <div :class=\"ns.e('end-exam')\">\n <el-row\n type=\"flex\"\n align=\"middle\"\n >\n <span class=\"auto-line\" />\n <span>第{{ props.currentPageIndex }} / {{ totalPage }}页</span>\n <span class=\"auto-line\" />\n </el-row>\n <SubjectAction\n :is-edit=\"false\"\n :is-set=\"isSet\"\n :page-end=\"true\"\n :exam-answer-relation-type=\"props.examAnswerRelationType\"\n :show-other-option=\"false\"\n :show-rich-text=\"false\"\n @move-up=\"emits('move', 'up')\"\n @move-down=\"emits('move', 'down')\"\n @delete=\"emits('delete')\"\n @edit=\"emits('edit')\"\n @add=\"type => emits('add', type)\"\n />\n </div>\n</template>\n"],"names":["props","__props","emits","__emit","onMounted","ns","useNamespace","_createElementBlock","class","_normalizeClass","_unref","e","_createVNode","_component_el_row","type","align","_createElementVNode","_toDisplayString","currentPageIndex","totalPage","SubjectAction","isSet","examAnswerRelationType","onMoveUp","onMoveDown","onDelete","onEdit","onAdd","_cache"],"mappings":"wtBAOA,MAAMA,EAAQC,EASRC,EAAQC,EAMdC,EAAAA,UAJA,WAEA,GAGA,MAAMC,EAAKC,EAAAA,aAAa,kEAItBC,EAAAA,mBAsBM,MAAA,CAtBAC,MAAKC,EAAAA,eAAEC,EAAAA,MAAAL,GAAGM,EAAC,eACfC,EAAAA,YAOSC,EAAA,CANPC,KAAK,OACLC,MAAM,6BAEN,IAA0B,aAA1BC,EAAAA,mBAA0B,OAAA,CAApBR,MAAM,aAAW,MAAA,IACvBQ,EAAAA,mBAA6D,OAAA,KAAvD,IAACC,EAAAA,gBAAGjB,EAAMkB,kBAAmB,MAAGD,kBAAGE,EAAAA,WAAY,IAAC,eACtDH,EAAAA,mBAA0B,OAAA,CAApBR,MAAM,aAAW,MAAA,qBAEzBI,EAAAA,YAYEQ,EAAAA,QAAA,CAXC,WAAS,EACT,SAAQC,EAAAA,MACR,YAAU,EACV,4BAA2BrB,EAAMsB,uBACjC,qBAAmB,EACnB,kBAAgB,EAChBC,wBAASrB,EAAK,OAAA,OACdsB,0BAAWtB,EAAK,OAAA,SAChBuB,wBAAQvB,EAAK,WACbwB,sBAAMxB,EAAK,SACXyB,MAAGC,EAAA,KAAAA,EAAA,GAAEd,GAAQZ,QAAaY"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("vue"),t=require("@qxs-bns/hooks"),r=require("element-plus"),o=require("../../../subject-action/src/subject-action.vue.cjs"),i=require("../../../subject-layout/src/subject-layout.vue.cjs"),n=require("../../../tiny-mce-editor/src/tiny-mce-editor.vue.cjs");const s={class:"preview"},a=["innerHTML"];var u=e.defineComponent({name:"QxsSubjectScale",__name:"SubjectRichText",props:{orderIndex:{type:Number,required:!0},richTextContent:{type:String,required:!0},title:{type:String,required:!1},isSave:{type:Boolean,required:!0},showAction:{type:Boolean,required:!1},isEdit:{type:Boolean,required:!0},isSet:{type:Boolean,required:!0},examAnswerRelationType:{type:Number,required:!1}},emits:["move","save","delete","edit","add"],setup(u,{emit:l}){const d=u,c=l,p=e.useAttrs(),m=e.ref("");function v(){m.value?c("save",{richTextContent:m.value||""}):r.ElMessage.error("富文本内容不能为空!")}e.onMounted((function(){d.richTextContent&&(m.value=d.richTextContent)}));const x=t.useNamespace("subject-scale");return(t,r)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(e.unref(x).e("scale-exam"))},[e.createVNode(i.default,{"show-edit":t.isEdit},{preview:e.withCtx((()=>[e.createElementVNode("div",s,[e.createTextVNode(e.toDisplayString(t.orderIndex+1)+".",1),e.createElementVNode("div",{innerHTML:e.unref(m)},null,8,a)])])),edit:e.withCtx((()=>[e.createVNode(n.default,e.mergeProps({"model-value":e.unref(m),"onUpdate:modelValue":r[0]||(r[0]=t=>e.isRef(m)?m.value=t:null)},e.unref(p),{style:{width:"100%"}}),null,16,["model-value"])])),default:e.withCtx((()=>[t.showAction?(e.openBlock(),e.createBlock(o.default,{key:0,"is-edit":t.isEdit,"is-set":t.isSet,"exam-answer-relation-type":d.examAnswerRelationType,"show-other-option":!1,"show-rich-text":!1,onMoveUp:r[1]||(r[1]=e=>c("move","up")),onMoveDown:r[2]||(r[2]=e=>c("move","down")),onDelete:r[3]||(r[3]=e=>c("delete")),onSave:v,onEdit:r[4]||(r[4]=e=>c("edit")),onAdd:r[5]||(r[5]=e=>c("add",e))},null,8,["is-edit","is-set","exam-answer-relation-type"])):e.createCommentVNode("v-if",!0)])),_:1},8,["show-edit"])],2))}});exports.default=u;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("vue"),t=require("@qxs-bns/hooks"),r=require("element-plus"),o=require("../../../subject-action/src/subject-action.vue.cjs"),i=require("../../../subject-layout/src/subject-layout.vue.cjs"),n=require("../../../tiny-mce-editor/src/tiny-mce-editor.vue.cjs");const s={class:"preview"},a=["innerHTML"];var u=e.defineComponent({name:"QxsSubjectScale",__name:"SubjectRichText",props:{orderIndex:{type:Number,required:!0},richTextContent:{type:String,required:!0},title:{type:String,required:!1},isSave:{type:Boolean,required:!0},showAction:{type:Boolean,required:!1},isEdit:{type:Boolean,required:!0},isSet:{type:Boolean,required:!0},examAnswerRelationType:{type:Number,required:!1}},emits:["move","save","delete","edit","add"],setup(u,{emit:l}){const d=u,c=l,p=e.useAttrs(),m=e.ref("");function v(){m.value?c("save",{richTextContent:m.value||""}):r.ElMessage.error("富文本内容不能为空!")}e.onMounted(function(){d.richTextContent&&(m.value=d.richTextContent)});const x=t.useNamespace("subject-scale");return(t,r)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(e.unref(x).e("scale-exam"))},[e.createVNode(i.default,{"show-edit":t.isEdit},{preview:e.withCtx(()=>[e.createElementVNode("div",s,[e.createTextVNode(e.toDisplayString(t.orderIndex+1)+".",1),e.createElementVNode("div",{innerHTML:e.unref(m)},null,8,a)])]),edit:e.withCtx(()=>[e.createVNode(n.default,e.mergeProps({"model-value":e.unref(m),"onUpdate:modelValue":r[0]||(r[0]=t=>e.isRef(m)?m.value=t:null)},e.unref(p),{style:{width:"100%"}}),null,16,["model-value"])]),default:e.withCtx(()=>[t.showAction?(e.openBlock(),e.createBlock(o.default,{key:0,"is-edit":t.isEdit,"is-set":t.isSet,"exam-answer-relation-type":d.examAnswerRelationType,"show-other-option":!1,"show-rich-text":!1,onMoveUp:r[1]||(r[1]=e=>c("move","up")),onMoveDown:r[2]||(r[2]=e=>c("move","down")),onDelete:r[3]||(r[3]=e=>c("delete")),onSave:v,onEdit:r[4]||(r[4]=e=>c("edit")),onAdd:r[5]||(r[5]=e=>c("add",e))},null,8,["is-edit","is-set","exam-answer-relation-type"])):e.createCommentVNode("v-if",!0)]),_:1},8,["show-edit"])],2))}});exports.default=u;
2
2
  //# sourceMappingURL=SubjectRichText.vue.cjs.map