智能解析

This commit is contained in:
筱野
2025-09-17 20:13:34 +08:00
parent 30935f71df
commit 137a7321c9
20 changed files with 572 additions and 62 deletions

View File

@@ -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>
)
}

View File

@@ -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);
}
}

View File

@@ -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'),
}

View File

@@ -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

View File

@@ -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;
}
}

View File

@@ -0,0 +1,2 @@
export { default } from './AiImportPopup'
export type { AiImportPopupProps } from './AiImportPopup'

View 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

View 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

View 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

View 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

View File

@@ -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

View 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

View 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

View 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

View File

@@ -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

View 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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

View 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

View 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