智能解析
@@ -3,6 +3,7 @@ import { View, Text, Image } from '@tarojs/components'
|
||||
import Taro from '@tarojs/taro'
|
||||
import styles from './index.module.scss'
|
||||
import images from '@/config/images'
|
||||
import AiImportPopup from '@/publish_pages/publishBall/components/AiImportPopup'
|
||||
|
||||
export interface PublishMenuProps {
|
||||
onPersonalPublish?: () => void
|
||||
@@ -11,25 +12,53 @@ export interface PublishMenuProps {
|
||||
|
||||
const PublishMenu: React.FC<PublishMenuProps> = () => {
|
||||
const [isVisible, setIsVisible] = useState(false)
|
||||
|
||||
const [aiImportVisible, setAiImportVisible] = useState(false)
|
||||
|
||||
const handleIconClick = () => {
|
||||
setIsVisible(!isVisible)
|
||||
}
|
||||
|
||||
const handleMenuItemClick = (type: 'individual' | 'group') => {
|
||||
const handleOverlayClick = () => {
|
||||
setIsVisible(false)
|
||||
}
|
||||
const handleMenuItemClick = (type: 'individual' | 'group' | 'ai') => {
|
||||
// 跳转到publishBall页面并传递type参数
|
||||
console.log(type, 'type');
|
||||
if (type === 'ai') {
|
||||
setAiImportVisible(true)
|
||||
setIsVisible(false)
|
||||
return
|
||||
}
|
||||
Taro.navigateTo({
|
||||
url: `/publish_pages/publishBall/index?type=${type}`
|
||||
})
|
||||
setIsVisible(false)
|
||||
}
|
||||
|
||||
const handleAiImportClose = () => {
|
||||
setAiImportVisible(false)
|
||||
}
|
||||
|
||||
const handleManualPublish = () => {
|
||||
Taro.navigateTo({
|
||||
url: '/publish_pages/publishBall/index?type=individual'
|
||||
})
|
||||
}
|
||||
|
||||
const handlePasteAndRecognize = (text: string) => {
|
||||
console.log('识别的文本:', text)
|
||||
// TODO: 实现文本识别逻辑
|
||||
Taro.showToast({
|
||||
title: '文本识别功能开发中',
|
||||
icon: 'none'
|
||||
})
|
||||
}
|
||||
|
||||
return (
|
||||
<View className={styles.publishMenu}>
|
||||
|
||||
{/* 蒙层 */}
|
||||
{isVisible && (
|
||||
<View className={styles.overlay} onClick={handleOverlayClick} />
|
||||
)}
|
||||
{/* 菜单选项 */}
|
||||
{isVisible && (
|
||||
<View className={styles.menuCard}>
|
||||
@@ -37,15 +66,16 @@ const PublishMenu: React.FC<PublishMenuProps> = () => {
|
||||
className={styles.menuItem}
|
||||
onClick={() => handleMenuItemClick('individual')}
|
||||
>
|
||||
<View className={styles.menuIcon}>
|
||||
<Image src={images.ICON_PERSON} />
|
||||
</View>
|
||||
<View className={styles.menuContent}>
|
||||
<Text className={styles.menuTitle}>发布个人约球</Text>
|
||||
<View className={styles.menuTitle}>发布个人约球
|
||||
<View className={styles.menuArrow}>
|
||||
<Image src={images.ICON_ARROW_RIGHT_BLACK} className={styles.img} />
|
||||
</View>
|
||||
</View>
|
||||
<Text className={styles.menuDesc}>已订场,找球友;未订场,找搭子</Text>
|
||||
</View>
|
||||
<View className={styles.menuArrow}>
|
||||
<Image src={images.ICON_ARROW_RIGHT} className={styles.img} />
|
||||
<View className={styles.menuIcon}>
|
||||
<Image src={images.ICON_PERSON} />
|
||||
</View>
|
||||
</View>
|
||||
|
||||
@@ -53,15 +83,34 @@ const PublishMenu: React.FC<PublishMenuProps> = () => {
|
||||
className={styles.menuItem}
|
||||
onClick={() => handleMenuItemClick('group')}
|
||||
>
|
||||
<View className={styles.menuIcon}>
|
||||
<Image src={images.ICON_GROUP} />
|
||||
</View>
|
||||
|
||||
<View className={styles.menuContent}>
|
||||
<Text className={styles.menuTitle}>发布畅打活动</Text>
|
||||
<View className={styles.menuTitle}>发布畅打活动
|
||||
<View className={styles.menuArrow}>
|
||||
<Image src={images.ICON_ARROW_RIGHT_BLACK} className={styles.img} />
|
||||
</View>
|
||||
</View>
|
||||
<Text className={styles.menuDesc}>认证球场官方组织</Text>
|
||||
</View>
|
||||
<View className={styles.menuArrow}>
|
||||
<Image src={images.ICON_ARROW_RIGHT} className={styles.img} />
|
||||
<View className={styles.menuIcon}>
|
||||
<Image src={images.ICON_GROUP} />
|
||||
</View>
|
||||
</View>
|
||||
<View
|
||||
className={`${styles.menuItem} ${styles.aiItem}`}
|
||||
onClick={() => handleMenuItemClick('ai')}
|
||||
>
|
||||
<View className={styles.menuContent}>
|
||||
<View className={styles.menuTitle}>智能导入球局信息
|
||||
<View className={styles.menuArrow}>
|
||||
<Image src={images.ICON_ARROW_RIGHT_WHITE} className={styles.img} />
|
||||
</View>
|
||||
</View>
|
||||
<Text className={styles.menuDesc}>识别文本,快速导入球局信息</Text>
|
||||
</View>
|
||||
|
||||
<View className={styles.menuIcon}>
|
||||
<Image src={images.ICON_IMPORTANT_BTN} />
|
||||
</View>
|
||||
</View>
|
||||
</View>
|
||||
@@ -74,6 +123,14 @@ const PublishMenu: React.FC<PublishMenuProps> = () => {
|
||||
>
|
||||
<Image src={images.ICON_PUBLISH} className={styles.closeIcon} />
|
||||
</View>
|
||||
|
||||
{/* AI导入弹窗 */}
|
||||
<AiImportPopup
|
||||
visible={aiImportVisible}
|
||||
onClose={handleAiImportClose}
|
||||
onManualPublish={handleManualPublish}
|
||||
onPasteAndRecognize={handlePasteAndRecognize}
|
||||
/>
|
||||
</View>
|
||||
)
|
||||
}
|
||||
|
||||
@@ -3,48 +3,53 @@
|
||||
z-index: 1000;
|
||||
}
|
||||
|
||||
|
||||
.overlay {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: rgba(0, 0, 0, 0.5);
|
||||
z-index: 999;
|
||||
}
|
||||
.menuCard {
|
||||
position: absolute;
|
||||
bottom: 80px;
|
||||
right: 0;
|
||||
width: 302px;
|
||||
background: white;
|
||||
border-radius: 16px;
|
||||
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);
|
||||
padding: 12px;
|
||||
width: 278px;
|
||||
animation: slideIn 0.3s ease-out;
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 8px;
|
||||
/* 小三角指示器 */
|
||||
&::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
bottom: -8px;
|
||||
right: 20px;
|
||||
width: 0;
|
||||
height: 0;
|
||||
border-left: 8px solid transparent;
|
||||
border-right: 8px solid transparent;
|
||||
border-top: 8px solid white;
|
||||
/* 移除阴影,避免连接处的黑色 */
|
||||
}
|
||||
z-index: 1001;
|
||||
// /* 小三角指示器 */
|
||||
// &::after {
|
||||
// content: '';
|
||||
// position: absolute;
|
||||
// bottom: -8px;
|
||||
// right: 20px;
|
||||
// width: 0;
|
||||
// height: 0;
|
||||
// border-left: 8px solid transparent;
|
||||
// border-right: 8px solid transparent;
|
||||
// border-top: 8px solid white;
|
||||
// /* 移除阴影,避免连接处的黑色 */
|
||||
// }
|
||||
|
||||
/* 为小三角添加单独的阴影效果 */
|
||||
&::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
bottom: -9px;
|
||||
right: 20px;
|
||||
width: 0;
|
||||
height: 0;
|
||||
border-left: 8px solid transparent;
|
||||
border-right: 8px solid transparent;
|
||||
border-top: 8px solid rgba(0, 0, 0, 0.1);
|
||||
z-index: -1;
|
||||
}
|
||||
// /* 为小三角添加单独的阴影效果 */
|
||||
// &::before {
|
||||
// content: '';
|
||||
// position: absolute;
|
||||
// bottom: -9px;
|
||||
// right: 20px;
|
||||
// width: 0;
|
||||
// height: 0;
|
||||
// border-left: 8px solid transparent;
|
||||
// border-right: 8px solid transparent;
|
||||
// border-top: 8px solid rgba(0, 0, 0, 0.1);
|
||||
// z-index: -1;
|
||||
// }
|
||||
}
|
||||
|
||||
@keyframes slideIn {
|
||||
@@ -71,12 +76,20 @@
|
||||
}
|
||||
|
||||
.menuIcon {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
width: 48px;
|
||||
height: 48px;
|
||||
padding: 10px;
|
||||
justify-content: center;
|
||||
margin-right: 12px;
|
||||
align-items: center;
|
||||
border-radius: 12px;
|
||||
border: 1px solid rgba(0, 0, 0, 0.06);
|
||||
background: rgba(0, 0, 0, 0.03);
|
||||
box-sizing: border-box;
|
||||
image{
|
||||
width: 28px;
|
||||
height: 28px;
|
||||
}
|
||||
}
|
||||
|
||||
.ballIcon {
|
||||
@@ -143,6 +156,7 @@
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
padding-left: 8px;
|
||||
}
|
||||
|
||||
.menuTitle {
|
||||
@@ -151,6 +165,8 @@
|
||||
color: #000;
|
||||
margin-bottom: 2px;
|
||||
line-height: 24px; /* 150% */
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.menuDesc {
|
||||
@@ -162,7 +178,7 @@
|
||||
.menuArrow {
|
||||
font-size: 16px;
|
||||
color: #ccc;
|
||||
margin-left: 8px;
|
||||
margin-left: 4px;
|
||||
.img{
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
@@ -180,6 +196,8 @@
|
||||
justify-content: center;
|
||||
flex-shrink: 0;
|
||||
overflow: hidden;
|
||||
z-index: 1001;
|
||||
position: relative;
|
||||
&.rotated {
|
||||
transform: rotate(-90deg);
|
||||
}
|
||||
@@ -193,3 +211,20 @@
|
||||
font-weight: bold;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.aiItem{
|
||||
border-radius: 20px;
|
||||
border: 0.5px solid rgba(0, 0, 0, 0.08);
|
||||
background: #000;
|
||||
.menuTitle{
|
||||
color: #FFF;
|
||||
}
|
||||
.menuDesc{
|
||||
color: rgba(255, 255, 255, 0.60);
|
||||
}
|
||||
.menuIcon{
|
||||
border-radius: 12px;
|
||||
border: 1px solid rgba(0, 0, 0, 0.06);
|
||||
background: rgba(255, 255, 255, 0.20);
|
||||
}
|
||||
}
|
||||
@@ -56,4 +56,7 @@ export default {
|
||||
ICON_LIST_SEARCH_CLEAR_HISTORY: require('@/static/search/icon-clear-history.svg'),
|
||||
ICON_LIST_SEARCH_SUGGESTION: require('@/static/search/icon-search-suggestion.svg'),
|
||||
ICON_LIST_INPUT_LOGO: require('@/static/list/icon-input-logo.svg'),
|
||||
ICON_IMPORTANT_BTN: require('@/static/publishBall/icon-important-btn.svg'),
|
||||
ICON_ARROW_RIGHT_WHITE: require('@/static/publishBall/icon-arrow-right-white.svg'),
|
||||
ICON_ARROW_RIGHT_BLACK: require('@/static/publishBall/icon-arrow-right-black.svg'),
|
||||
}
|
||||
@@ -0,0 +1,184 @@
|
||||
import React, { useState, useEffect } from 'react'
|
||||
import { View, Text, Textarea, Image } from '@tarojs/components'
|
||||
import Taro from '@tarojs/taro'
|
||||
import { Popup, Toast } from '@nutui/nutui-react-taro'
|
||||
import styles from './index.module.scss'
|
||||
import images from '@/config/images'
|
||||
|
||||
export interface AiImportPopupProps {
|
||||
visible: boolean
|
||||
onClose: () => void
|
||||
onManualPublish?: () => void
|
||||
onPasteAndRecognize?: (text: string) => void
|
||||
}
|
||||
|
||||
const AiImportPopup: React.FC<AiImportPopupProps> = ({
|
||||
visible,
|
||||
onClose,
|
||||
onManualPublish,
|
||||
onPasteAndRecognize
|
||||
}) => {
|
||||
const [text, setText] = useState('')
|
||||
const [uploadFailCount, setUploadFailCount] = useState(0)
|
||||
const maxFailCount = 3
|
||||
|
||||
// 当弹窗显示时,尝试获取剪切板内容
|
||||
useEffect(() => {
|
||||
if (visible) {
|
||||
getClipboardData()
|
||||
}
|
||||
}, [visible])
|
||||
|
||||
const getClipboardData = async () => {
|
||||
try {
|
||||
const res = await Taro.getClipboardData()
|
||||
if (res.data && res.data.trim()) {
|
||||
setText(res.data)
|
||||
Toast.show('toast', {
|
||||
content: '有场读取了你的剪切板信息',
|
||||
duration: 90,
|
||||
wordBreak:'break-word'
|
||||
})
|
||||
// Taro.showToast({
|
||||
// title: '已读取你的剪切板信息',
|
||||
// icon: 'success',
|
||||
// duration: 2000
|
||||
// })
|
||||
} else {
|
||||
Taro.showToast({
|
||||
title: '剪切板为空,请手动输入',
|
||||
icon: 'none',
|
||||
duration: 2000
|
||||
})
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('获取剪切板失败:', error)
|
||||
Taro.showToast({
|
||||
title: '读取剪切板失败,请手动输入',
|
||||
icon: 'error',
|
||||
duration: 2000
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
const handleTextChange = (e: any) => {
|
||||
setText(e.detail.value)
|
||||
}
|
||||
|
||||
const handleImageRecognition = async () => {
|
||||
try {
|
||||
const res = await Taro.chooseMedia({
|
||||
count: 1,
|
||||
mediaType: ['image'],
|
||||
sourceType: ['album', 'camera'],
|
||||
camera: 'back'
|
||||
})
|
||||
|
||||
if (res.tempFiles && res.tempFiles.length > 0) {
|
||||
// 这里可以调用图片识别API
|
||||
console.log('选择的图片:', res.tempFiles[0])
|
||||
// TODO: 实现图片识别逻辑
|
||||
Taro.showToast({
|
||||
title: '图片识别功能开发中',
|
||||
icon: 'none'
|
||||
})
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('选择图片失败:', error)
|
||||
setUploadFailCount(prev => prev + 1)
|
||||
Taro.showToast({
|
||||
title: '上传失败',
|
||||
icon: 'error'
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
const handlePasteAndRecognize = () => {
|
||||
if (!text.trim()) {
|
||||
Taro.showToast({
|
||||
title: '请输入球局信息',
|
||||
icon: 'none'
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
if (onPasteAndRecognize) {
|
||||
onPasteAndRecognize(text)
|
||||
}
|
||||
onClose()
|
||||
}
|
||||
|
||||
const handleManualPublish = () => {
|
||||
if (onManualPublish) {
|
||||
onManualPublish()
|
||||
}
|
||||
onClose()
|
||||
}
|
||||
|
||||
const showManualButton = uploadFailCount >= maxFailCount
|
||||
|
||||
return (
|
||||
<Popup
|
||||
visible={visible}
|
||||
position="bottom"
|
||||
round={true}
|
||||
closeable={false}
|
||||
onClose={onClose}
|
||||
className={styles.aiImportPopup}
|
||||
>
|
||||
<View className={styles.popupContent}>
|
||||
{/* 头部 */}
|
||||
<View className={styles.header}>
|
||||
<View className={styles.titleContainer}>
|
||||
<Image src={images.ICON_STARK} className={styles.lightningIcon} />
|
||||
<Text className={styles.title}>智能导入球局信息</Text>
|
||||
</View>
|
||||
<View className={styles.closeButton} onClick={onClose}>
|
||||
<Text className={styles.closeIcon}>×</Text>
|
||||
</View>
|
||||
</View>
|
||||
|
||||
{/* 文本域 */}
|
||||
<View className={styles.textAreaContainer}>
|
||||
<Textarea
|
||||
className={styles.textArea}
|
||||
value={text}
|
||||
onInput={handleTextChange}
|
||||
placeholder="请输入球局信息..."
|
||||
maxlength={100}
|
||||
showConfirmBar={false}
|
||||
autoHeight
|
||||
/>
|
||||
<View className={styles.charCount}>
|
||||
<Text className={styles.charCountText}>{text.length}/100</Text>
|
||||
</View>
|
||||
</View>
|
||||
|
||||
{/* 图片识别按钮 */}
|
||||
<View className={styles.imageRecognitionContainer}>
|
||||
<View className={styles.imageRecognitionButton} onClick={handleImageRecognition}>
|
||||
<Image src={images.ICON_UPLOAD} className={styles.cameraIcon} />
|
||||
<Text className={styles.imageRecognitionText}>图片识别</Text>
|
||||
<Text className={styles.imageRecognitionDesc}>支持订场截图/小红书笔记截图等图片</Text>
|
||||
</View>
|
||||
</View>
|
||||
|
||||
{/* 底部按钮 */}
|
||||
<View className={styles.bottomButtons}>
|
||||
{showManualButton && (
|
||||
<View className={styles.manualButton} onClick={handleManualPublish}>
|
||||
<Text className={styles.manualButtonText}>手动发布球局</Text>
|
||||
</View>
|
||||
)}
|
||||
<View className={styles.pasteButton} onClick={handlePasteAndRecognize}>
|
||||
<Image src={images.ICON_PLUS} className={styles.clipboardIcon} />
|
||||
<Text className={styles.pasteButtonText}>粘贴并识别</Text>
|
||||
</View>
|
||||
</View>
|
||||
</View>
|
||||
<Toast id="toast" />
|
||||
</Popup>
|
||||
)
|
||||
}
|
||||
|
||||
export default AiImportPopup
|
||||
@@ -0,0 +1,191 @@
|
||||
@use '~@/scss/themeColor.scss' as theme;
|
||||
|
||||
.aiImportPopup {
|
||||
.popupContent {
|
||||
width: 100%;
|
||||
background: #fff;
|
||||
border-radius: 16px 16px 0 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
max-height: 80vh;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
.header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: 16px 20px;
|
||||
border-bottom: 1px solid #f0f1f5;
|
||||
|
||||
.titleContainer {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
|
||||
.lightningIcon {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
}
|
||||
|
||||
.title {
|
||||
font-size: 16px;
|
||||
font-weight: 600;
|
||||
color: #1f2329;
|
||||
}
|
||||
}
|
||||
|
||||
.closeButton {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
cursor: pointer;
|
||||
|
||||
.closeIcon {
|
||||
font-size: 20px;
|
||||
color: #8a8a8a;
|
||||
line-height: 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.textAreaContainer {
|
||||
position: relative;
|
||||
padding: 16px 20px;
|
||||
|
||||
.textArea {
|
||||
width: 100%;
|
||||
min-height: 80px;
|
||||
padding: 12px;
|
||||
border: 1px solid #e5e6eb;
|
||||
border-radius: 8px;
|
||||
font-size: 14px;
|
||||
color: #1f2329;
|
||||
background: #fff;
|
||||
box-sizing: border-box;
|
||||
resize: none;
|
||||
|
||||
&:focus {
|
||||
border-color: #165dff;
|
||||
outline: none;
|
||||
}
|
||||
}
|
||||
|
||||
.charCount {
|
||||
position: absolute;
|
||||
bottom: 20px;
|
||||
right: 32px;
|
||||
|
||||
.charCountText {
|
||||
font-size: 12px;
|
||||
color: #8a8a8a;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.imageRecognitionContainer {
|
||||
padding: 0 20px 16px;
|
||||
|
||||
.imageRecognitionButton {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
padding: 12px;
|
||||
background: #f8f9fa;
|
||||
border-radius: 8px;
|
||||
cursor: pointer;
|
||||
transition: background-color 0.2s;
|
||||
|
||||
&:active {
|
||||
background: #e9ecef;
|
||||
}
|
||||
|
||||
.cameraIcon {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
}
|
||||
|
||||
.imageRecognitionText {
|
||||
font-size: 14px;
|
||||
color: #1f2329;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.imageRecognitionDesc {
|
||||
font-size: 12px;
|
||||
color: #8a8a8a;
|
||||
margin-left: auto;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.bottomButtons {
|
||||
padding: 16px 20px 20px;
|
||||
display: flex;
|
||||
gap: 12px;
|
||||
padding-bottom: calc(20px + env(safe-area-inset-bottom));
|
||||
|
||||
.manualButton {
|
||||
flex: 1;
|
||||
height: 44px;
|
||||
background: #f5f6f7;
|
||||
border: 1px solid #e5e6eb;
|
||||
border-radius: 12px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
cursor: pointer;
|
||||
transition: all 0.2s;
|
||||
|
||||
&:active {
|
||||
background: #e9ecef;
|
||||
}
|
||||
|
||||
.manualButtonText {
|
||||
font-size: 14px;
|
||||
color: #1f2329;
|
||||
font-weight: 500;
|
||||
}
|
||||
}
|
||||
|
||||
.pasteButton {
|
||||
flex: 1;
|
||||
height: 44px;
|
||||
background: #000;
|
||||
border-radius: 12px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 6px;
|
||||
cursor: pointer;
|
||||
transition: all 0.2s;
|
||||
|
||||
&:active {
|
||||
background: #333;
|
||||
}
|
||||
|
||||
.clipboardIcon {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
filter: invert(1);
|
||||
}
|
||||
|
||||
.pasteButtonText {
|
||||
font-size: 14px;
|
||||
color: #fff;
|
||||
font-weight: 500;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
:global {
|
||||
.nut-toast-inner{
|
||||
max-width: 95%;
|
||||
width: auto;
|
||||
white-space: nowrap;
|
||||
display: inline-block;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
export { default } from './AiImportPopup'
|
||||
export type { AiImportPopupProps } from './AiImportPopup'
|
||||
3
src/static/publishBall/icon-arrow-right-black.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M6.33333 4L10.3333 8L6.33333 12" stroke="#3C3C43" stroke-opacity="0.6" stroke-width="1.33333" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 255 B |
3
src/static/publishBall/icon-arrow-right-white.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M6.33334 4L10.3333 8L6.33334 12" stroke="white" stroke-opacity="0.6" stroke-width="1.33333" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 253 B |
4
src/static/publishBall/icon-close.svg
Normal file
@@ -0,0 +1,4 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M7 7L17 17" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M7 17L17 7" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 307 B |
4
src/static/publishBall/icon-copy.svg
Normal file
@@ -0,0 +1,4 @@
|
||||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M5.41663 5.17984V3.25522C5.41663 2.60801 5.94129 2.08334 6.5885 2.08334H16.7448C17.392 2.08334 17.9166 2.60801 17.9166 3.25522V13.4115C17.9166 14.0587 17.392 14.5833 16.7448 14.5833H14.7984" stroke="white" stroke-width="1.66667" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M13.4115 5.41666H3.25525C2.60804 5.41666 2.08337 5.94132 2.08337 6.58853V16.7448C2.08337 17.392 2.60804 17.9167 3.25525 17.9167H13.4115C14.0587 17.9167 14.5834 17.392 14.5834 16.7448V6.58853C14.5834 5.94132 14.0587 5.41666 13.4115 5.41666Z" stroke="white" stroke-width="1.66667" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 704 B |
@@ -1,6 +1,5 @@
|
||||
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M32.0934 7.947C29.0388 5.08557 24.9323 3.3335 20.4166 3.3335C10.9818 3.3335 3.33328 10.982 3.33328 20.4168C3.33328 29.8517 10.9818 37.5002 20.4166 37.5002C25.0956 37.5002 29.3353 35.6191 32.4206 32.5719L19.9999 20.0002L32.0934 7.947Z" stroke="black" stroke-width="2" stroke-linejoin="round"/>
|
||||
<path d="M33.3333 23.3332C35.1742 23.3332 36.6667 21.8408 36.6667 19.9998C36.6667 18.1589 35.1742 16.6665 33.3333 16.6665C31.4924 16.6665 30 18.1589 30 19.9998C30 21.8408 31.4924 23.3332 33.3333 23.3332Z" stroke="black" stroke-width="2" stroke-linejoin="round"/>
|
||||
<path d="M14.1667 10.8335V17.5002" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M10.8333 14.1665H17.4999" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M14 23.8193C15.2384 24.9278 16.8738 25.6018 18.6667 25.6018C22.5326 25.6018 25.6667 22.4677 25.6667 18.6018C25.6667 15.5096 23.6617 12.8857 20.8808 11.9592" stroke="black" stroke-width="2.33333" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M15.8498 16.0412C16.1617 16.8343 16.333 17.6982 16.333 18.602C16.333 22.468 13.199 25.602 9.33303 25.602C5.46704 25.602 2.33304 22.468 2.33304 18.602C2.33304 15.5016 4.34869 12.8719 7.14104 11.9521" stroke="black" stroke-width="2.33333" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M14 16.2687C17.866 16.2687 21 13.1347 21 9.2687C21 5.40268 17.866 2.26868 14 2.26868C10.134 2.26868 7 5.40268 7 9.2687C7 13.1347 10.134 16.2687 14 16.2687Z" stroke="black" stroke-width="2.33333" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 900 B After Width: | Height: | Size: 904 B |
6
src/static/publishBall/icon-group2.svg
Normal file
@@ -0,0 +1,6 @@
|
||||
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M32.0934 7.947C29.0388 5.08557 24.9323 3.3335 20.4166 3.3335C10.9818 3.3335 3.33328 10.982 3.33328 20.4168C3.33328 29.8517 10.9818 37.5002 20.4166 37.5002C25.0956 37.5002 29.3353 35.6191 32.4206 32.5719L19.9999 20.0002L32.0934 7.947Z" stroke="black" stroke-width="2" stroke-linejoin="round"/>
|
||||
<path d="M33.3333 23.3332C35.1742 23.3332 36.6667 21.8408 36.6667 19.9998C36.6667 18.1589 35.1742 16.6665 33.3333 16.6665C31.4924 16.6665 30 18.1589 30 19.9998C30 21.8408 31.4924 23.3332 33.3333 23.3332Z" stroke="black" stroke-width="2" stroke-linejoin="round"/>
|
||||
<path d="M14.1667 10.8335V17.5002" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M10.8333 14.1665H17.4999" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 900 B |
3
src/static/publishBall/icon-important-btn.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M11.0833 2.33331H21.5833L15.1667 10.5H23.9167L9.91666 25.6666L12.8333 14.5833H4.66666L11.0833 2.33331Z" stroke="white" stroke-width="2.33333" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 280 B |
3
src/static/publishBall/icon-important.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M9.5 1.99998H18.5L13 8.99998H20.5L8.5 22L11 12.5H4L9.5 1.99998Z" stroke="black" stroke-width="2" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 235 B |
@@ -1,5 +1,5 @@
|
||||
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M19.9999 36.6663C29.2047 36.6663 36.6666 29.2044 36.6666 19.9997C36.6666 10.7949 29.2047 3.33301 19.9999 3.33301C10.7952 3.33301 3.33325 10.7949 3.33325 19.9997C3.33325 29.2044 10.7952 36.6663 19.9999 36.6663Z" stroke="black" stroke-width="2"/>
|
||||
<path d="M19.9999 3.33301C19.9158 8.88984 18.5515 13.0577 15.9069 15.8367C13.2623 18.6156 9.071 20.0056 3.33325 20.0066" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M36.6402 20.8374C31.2131 20.4651 27.0662 21.6251 24.1996 24.3174C21.3328 27.0096 19.9338 31.1259 20.0024 36.6663" stroke="black" stroke-width="2" stroke-linecap="round"/>
|
||||
<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M14 25.6666C20.4433 25.6666 25.6667 20.4433 25.6667 14C25.6667 7.55665 20.4433 2.33331 14 2.33331C7.55668 2.33331 2.33334 7.55665 2.33334 14C2.33334 20.4433 7.55668 25.6666 14 25.6666Z" stroke="black" stroke-width="2.33333"/>
|
||||
<path d="M14 2.33331C13.9412 6.2231 12.9861 9.14058 11.1349 11.0859C9.28364 13.0311 6.34977 14.0041 2.33334 14.0048" stroke="black" stroke-width="2.33333" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M25.6481 14.5864C21.8491 14.3258 18.9464 15.1378 16.9397 17.0224C14.933 18.9069 13.9537 21.7884 14.0017 25.6666" stroke="black" stroke-width="2.33333" stroke-linecap="round"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 739 B After Width: | Height: | Size: 727 B |
5
src/static/publishBall/icon-person2.svg
Normal file
@@ -0,0 +1,5 @@
|
||||
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M19.9999 36.6663C29.2047 36.6663 36.6666 29.2044 36.6666 19.9997C36.6666 10.7949 29.2047 3.33301 19.9999 3.33301C10.7952 3.33301 3.33325 10.7949 3.33325 19.9997C3.33325 29.2044 10.7952 36.6663 19.9999 36.6663Z" stroke="black" stroke-width="2"/>
|
||||
<path d="M19.9999 3.33301C19.9158 8.88984 18.5515 13.0577 15.9069 15.8367C13.2623 18.6156 9.071 20.0056 3.33325 20.0066" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M36.6402 20.8374C31.2131 20.4651 27.0662 21.6251 24.1996 24.3174C21.3328 27.0096 19.9338 31.1259 20.0024 36.6663" stroke="black" stroke-width="2" stroke-linecap="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 739 B |
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 32 KiB |
BIN
src/static/publishBall/icon-publish2.png
Normal file
|
After Width: | Height: | Size: 31 KiB |
5
src/static/publishBall/icon-upload-img.svg
Normal file
@@ -0,0 +1,5 @@
|
||||
<svg width="17" height="16" viewBox="0 0 17 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M5.5 4L6.5 2H10.5L11.5 4H5.5Z" stroke="black" stroke-width="1.33333" stroke-linejoin="round"/>
|
||||
<path d="M14.1666 4H2.83325C2.28097 4 1.83325 4.44772 1.83325 5V13C1.83325 13.5523 2.28097 14 2.83325 14H14.1666C14.7189 14 15.1666 13.5523 15.1666 13V5C15.1666 4.44772 14.7189 4 14.1666 4Z" stroke="black" stroke-width="1.33333" stroke-linejoin="round"/>
|
||||
<path d="M8.49992 11.6667C9.97269 11.6667 11.1666 10.4728 11.1666 9.00001C11.1666 7.52724 9.97269 6.33334 8.49992 6.33334C7.02715 6.33334 5.83325 7.52724 5.83325 9.00001C5.83325 10.4728 7.02715 11.6667 8.49992 11.6667Z" stroke="black" stroke-width="1.33333" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 746 B |
3
src/static/publishBall/icon-upload-success.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M3.3335 8.00002L6.66683 11.3334L13.3335 4.66669" stroke="#34C759" stroke-width="1.33333" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 250 B |