From 9611fafe0b453e52c4ff5ce10ef7c46720f24aab Mon Sep 17 00:00:00 2001 From: 134 Date: Mon, 5 Oct 2026 11:46:46 +0800 Subject: [PATCH] feat(flow-board): add native XMind markers and bulk editing --- components/flow-board/drawnix-workspace.tsx | 447 +----- components/flow-board/mind-marker-board.ts | 30 + components/flow-board/xmind-editor-chrome.tsx | 7 +- components/flow-board/xmind-marker-panel.tsx | 46 + components/flow-board/xmind-native.css | 19 + docs/XMind-26.04-客户端界面对照.md | 9 + docs/XMind-复刻功能对照.md | 2 +- lib/flow-board/xmind-export.ts | 14 +- lib/flow-board/xmind-import.ts | 14 +- lib/flow-board/xmind-marker-catalog.json | 1428 +++++++++++++++++ lib/flow-board/xmind-markers.ts | 42 + public/icons/xmind/README.md | 2 + public/icons/xmind/marker.svg | 1 + public/icons/xmind/markers/README.md | 3 + .../academicMarkers/c_symbol_apostrophe.svg | 28 + .../academicMarkers/c_symbol_quote.svg | 22 + .../markers/academicMarkers/symbol-about.svg | 24 + .../academicMarkers/symbol-attention.svg | 27 + .../markers/academicMarkers/symbol-code.svg | 23 + .../markers/academicMarkers/symbol-divide.svg | 28 + .../academicMarkers/symbol-equality.svg | 27 + .../markers/academicMarkers/symbol-minus.svg | 26 + .../academicMarkers/symbol-not-equality.svg | 23 + .../markers/academicMarkers/symbol-pause.svg | 27 + .../markers/academicMarkers/symbol-plus.svg | 21 + .../academicMarkers/symbol-question.svg | 27 + .../markers/academicMarkers/symbol-right.svg | 21 + .../markers/academicMarkers/symbol-wrong.svg | 21 + .../markers/arrowMarkers/arrow-down-left.svg | 17 + .../markers/arrowMarkers/arrow-down-right.svg | 17 + .../xmind/markers/arrowMarkers/arrow-down.svg | 6 + .../markers/arrowMarkers/arrow-left-right.svg | 6 + .../xmind/markers/arrowMarkers/arrow-left.svg | 6 + .../markers/arrowMarkers/arrow-refresh.svg | 9 + .../markers/arrowMarkers/arrow-right.svg | 6 + .../markers/arrowMarkers/arrow-up-down.svg | 6 + .../markers/arrowMarkers/arrow-up-left.svg | 17 + .../markers/arrowMarkers/arrow-up-right.svg | 17 + .../xmind/markers/arrowMarkers/arrow-up.svg | 6 + .../celebrationMarkers/celebration-100.svg | 30 + .../celebration-birthday.svg | 24 + .../celebrationMarkers/celebration-boom.svg | 25 + .../celebrationMarkers/celebration-cheers.svg | 27 + .../celebrationMarkers/celebration-clap.svg | 25 + .../celebrationMarkers/celebration-five.svg | 23 + .../celebrationMarkers/celebration-king.svg | 25 + .../celebrationMarkers/celebration-kiss.svg | 23 + .../celebrationMarkers/celebration-ribbon.svg | 26 + .../xmind/markers/flagMarkers/flag-blue.svg | 4 + .../markers/flagMarkers/flag-dark-blue.svg | 12 + .../markers/flagMarkers/flag-dark-gray.svg | 21 + .../markers/flagMarkers/flag-dark-green.svg | 17 + .../xmind/markers/flagMarkers/flag-gray.svg | 4 + .../xmind/markers/flagMarkers/flag-green.svg | 4 + .../xmind/markers/flagMarkers/flag-orange.svg | 4 + .../xmind/markers/flagMarkers/flag-purple.svg | 4 + .../xmind/markers/flagMarkers/flag-red.svg | 4 + .../xmind/markers/flagMarkers/flag-yellow.svg | 4 + .../halfStarMarkers/half-star-blue.png | Bin 0 -> 1099 bytes .../halfStarMarkers/half-star-gray.png | Bin 0 -> 899 bytes .../halfStarMarkers/half-star-green.png | Bin 0 -> 895 bytes .../halfStarMarkers/half-star-purple.png | Bin 0 -> 990 bytes .../markers/halfStarMarkers/half-star-red.png | Bin 0 -> 1437 bytes .../halfStarMarkers/half-star-yellow.png | Bin 0 -> 965 bytes public/icons/xmind/markers/manifest.json | 221 +++ .../xmind/markers/monthMarkers/month-apr.svg | 22 + .../xmind/markers/monthMarkers/month-aug.svg | 22 + .../xmind/markers/monthMarkers/month-dec.svg | 13 + .../xmind/markers/monthMarkers/month-feb.svg | 22 + .../xmind/markers/monthMarkers/month-jan.svg | 22 + .../xmind/markers/monthMarkers/month-jul.svg | 13 + .../xmind/markers/monthMarkers/month-jun.svg | 22 + .../xmind/markers/monthMarkers/month-mar.svg | 22 + .../xmind/markers/monthMarkers/month-may.svg | 22 + .../xmind/markers/monthMarkers/month-nov.svg | 13 + .../xmind/markers/monthMarkers/month-oct.svg | 13 + .../xmind/markers/monthMarkers/month-sep.svg | 13 + .../markers/otherMarkers/c_simbol-info.svg | 6 + .../markers/otherMarkers/c_simbol-minus.svg | 26 + .../markers/otherMarkers/c_simbol-pause.svg | 27 + .../markers/otherMarkers/c_simbol-plus.svg | 21 + .../otherMarkers/c_simbol-question.svg | 11 + .../markers/otherMarkers/c_simbol-right.svg | 21 + .../markers/otherMarkers/c_simbol-wrong.svg | 11 + .../otherMarkers/c_symbol_exercise.svg | 12 + .../otherMarkers/c_symbol_line_graph.svg | 6 + .../markers/otherMarkers/c_symbol_medals.svg | 9 + .../otherMarkers/c_symbol_shopping_cart.svg | 24 + .../otherMarkers/c_symbol_thermometer.svg | 28 + .../markers/otherMarkers/c_symbol_trophy.svg | 28 + .../xmind/markers/otherMarkers/other-bomb.png | Bin 0 -> 1031 bytes .../otherMarkers/other-businesscard.png | Bin 0 -> 941 bytes .../markers/otherMarkers/other-calendar.png | Bin 0 -> 1147 bytes .../xmind/markers/otherMarkers/other-chat.png | Bin 0 -> 1090 bytes .../markers/otherMarkers/other-clock.png | Bin 0 -> 1314 bytes .../markers/otherMarkers/other-coffee-cup.png | Bin 0 -> 1045 bytes .../markers/otherMarkers/other-email.png | Bin 0 -> 680 bytes .../markers/otherMarkers/other-exclam.svg | 11 + .../xmind/markers/otherMarkers/other-fax.png | Bin 0 -> 1130 bytes .../markers/otherMarkers/other-lightbulb.png | Bin 0 -> 860 bytes .../xmind/markers/otherMarkers/other-lock.png | Bin 0 -> 1343 bytes .../xmind/markers/otherMarkers/other-no.svg | 21 + .../xmind/markers/otherMarkers/other-note.png | Bin 0 -> 1185 bytes .../markers/otherMarkers/other-people.png | Bin 0 -> 1001 bytes .../markers/otherMarkers/other-people2.png | Bin 0 -> 987 bytes .../markers/otherMarkers/other-phone.png | Bin 0 -> 810 bytes .../markers/otherMarkers/other-phone2.png | Bin 0 -> 1395 bytes .../markers/otherMarkers/other-question.svg | 27 + .../markers/otherMarkers/other-social.png | Bin 0 -> 1525 bytes .../markers/otherMarkers/other-unlock.png | Bin 0 -> 1231 bytes .../xmind/markers/otherMarkers/other-yes.svg | 21 + .../markers/otherMarkers/symbol-image.svg | 17 + .../markers/otherMarkers/symbol-info.svg | 6 + .../markers/peopleMarkers/people-blue.svg | 4 + .../peopleMarkers/people-dark-blue.svg | 12 + .../peopleMarkers/people-dark-gray.svg | 21 + .../peopleMarkers/people-dark-green.svg | 17 + .../markers/peopleMarkers/people-gray.svg | 4 + .../markers/peopleMarkers/people-green.svg | 4 + .../markers/peopleMarkers/people-orange.svg | 4 + .../markers/peopleMarkers/people-purple.svg | 16 + .../markers/peopleMarkers/people-red.svg | 4 + .../markers/peopleMarkers/people-yellow.svg | 4 + .../markers/priorityMarkers/priority-1.svg | 4 + .../markers/priorityMarkers/priority-2.svg | 4 + .../markers/priorityMarkers/priority-3.svg | 16 + .../markers/priorityMarkers/priority-4.svg | 4 + .../markers/priorityMarkers/priority-5.svg | 4 + .../markers/priorityMarkers/priority-6.svg | 4 + .../markers/priorityMarkers/priority-7.svg | 4 + .../markers/priorityMarkers/priority-8.svg | 20 + .../markers/priorityMarkers/priority-9.svg | 20 + .../markers/smileyMarkers/smiley-adore.svg | 25 + .../markers/smileyMarkers/smiley-angry.svg | 25 + .../markers/smileyMarkers/smiley-boring.svg | 25 + .../smileyMarkers/smiley-cry-laugh.svg | 32 + .../markers/smileyMarkers/smiley-cry.svg | 25 + .../markers/smileyMarkers/smiley-devil.svg | 41 + .../smileyMarkers/smiley-embarrass.svg | 23 + .../markers/smileyMarkers/smiley-laugh.svg | 25 + .../markers/smileyMarkers/smiley-love.svg | 17 + .../markers/smileyMarkers/smiley-sad.svg | 23 + .../markers/smileyMarkers/smiley-smile.svg | 23 + .../markers/smileyMarkers/smiley-surprise.svg | 28 + .../markers/smileyMarkers/smiley-think.svg | 32 + .../markers/smileyMarkers/smiley-upset.svg | 23 + .../socialMarkers/c_symbol_broken_heart.svg | 12 + .../socialMarkers/c_symbol_contact.svg | 13 + .../markers/socialMarkers/symbol-comment.svg | 21 + .../markers/socialMarkers/symbol-no-entry.svg | 12 + .../markers/socialMarkers/symbol-notice.svg | 22 + .../markers/socialMarkers/symbol-rss.svg | 23 + .../markers/socialMarkers/symbol-share.svg | 25 + .../markers/socialMarkers/symbol_forward.svg | 22 + .../xmind/markers/starMarkers/star-blue.svg | 4 + .../markers/starMarkers/star-dark-blue.svg | 12 + .../markers/starMarkers/star-dark-gray.svg | 21 + .../markers/starMarkers/star-dark-green.svg | 17 + .../xmind/markers/starMarkers/star-gray.svg | 4 + .../xmind/markers/starMarkers/star-green.svg | 4 + .../xmind/markers/starMarkers/star-orange.svg | 4 + .../xmind/markers/starMarkers/star-purple.svg | 16 + .../xmind/markers/starMarkers/star-red.svg | 4 + .../xmind/markers/starMarkers/star-yellow.svg | 4 + .../markers/symbolMarkers/c_simbol-exclam.svg | 10 + .../markers/symbolMarkers/c_simbol-info.svg | 11 + .../markers/symbolMarkers/c_simbol-minus.svg | 11 + .../markers/symbolMarkers/c_simbol-pause.svg | 11 + .../markers/symbolMarkers/c_simbol-plus.svg | 11 + .../symbolMarkers/c_simbol-question.svg | 11 + .../markers/symbolMarkers/c_simbol-right.svg | 11 + .../markers/symbolMarkers/c_simbol-wrong.svg | 11 + .../symbolMarkers/c_symbol_bar_chart.svg | 14 + .../symbolMarkers/c_symbol_contact.svg | 13 + .../symbolMarkers/c_symbol_dislike.svg | 4 + .../markers/symbolMarkers/c_symbol_drink.svg | 24 + .../symbolMarkers/c_symbol_exercise.svg | 12 + .../markers/symbolMarkers/c_symbol_flight.svg | 4 + .../markers/symbolMarkers/c_symbol_heart.svg | 4 + .../symbolMarkers/c_symbol_hourglass.svg | 6 + .../markers/symbolMarkers/c_symbol_like.svg | 4 + .../symbolMarkers/c_symbol_line_graph.svg | 6 + .../markers/symbolMarkers/c_symbol_lock.svg | 21 + .../markers/symbolMarkers/c_symbol_medals.svg | 9 + .../markers/symbolMarkers/c_symbol_money.svg | 20 + .../markers/symbolMarkers/c_symbol_music.svg | 4 + .../markers/symbolMarkers/c_symbol_pen.svg | 6 + .../symbolMarkers/c_symbol_pie_chart.svg | 18 + .../symbolMarkers/c_symbol_shopping_cart.svg | 24 + .../symbolMarkers/c_symbol_telephone.svg | 4 + .../symbolMarkers/c_symbol_thermometer.svg | 28 + .../markers/symbolMarkers/c_symbol_trophy.svg | 28 + .../markers/symbolMarkers/symbol-100.svg | 16 + .../symbolMarkers/symbol-attention.svg | 27 + .../markers/symbolMarkers/symbol-diamond.svg | 24 + .../symbolMarkers/symbol-entertainment.svg | 9 + .../markers/symbolMarkers/symbol-exclam.svg | 10 + .../markers/symbolMarkers/symbol-idea.svg | 5 + .../markers/symbolMarkers/symbol-info.svg | 6 + .../symbolMarkers/symbol-lightning.svg | 9 + .../markers/symbolMarkers/symbol-minus.svg | 26 + .../markers/symbolMarkers/symbol-pause.svg | 27 + .../markers/symbolMarkers/symbol-pin.svg | 10 + .../markers/symbolMarkers/symbol-plus.svg | 21 + .../markers/symbolMarkers/symbol-question.svg | 10 + .../markers/symbolMarkers/symbol-right.svg | 21 + .../markers/symbolMarkers/symbol-run.svg | 8 + .../markers/symbolMarkers/symbol-unlock.svg | 24 + .../markers/symbolMarkers/symbol-wrong.svg | 21 + .../xmind/markers/tagMarkers/tag-blue.svg | 4 + .../markers/tagMarkers/tag-dark-blue.svg | 12 + .../markers/tagMarkers/tag-dark-purple.svg | 4 + .../xmind/markers/tagMarkers/tag-green.svg | 4 + .../xmind/markers/tagMarkers/tag-grey.svg | 4 + .../xmind/markers/tagMarkers/tag-orange.svg | 4 + .../xmind/markers/tagMarkers/tag-red.svg | 4 + .../xmind/markers/tagMarkers/tag-yellow.svg | 4 + .../xmind/markers/taskMarkers/task-3oct.svg | 5 + .../xmind/markers/taskMarkers/task-3quar.svg | 17 + .../xmind/markers/taskMarkers/task-5oct.svg | 5 + .../xmind/markers/taskMarkers/task-7oct.svg | 5 + .../xmind/markers/taskMarkers/task-done.svg | 5 + .../xmind/markers/taskMarkers/task-half.svg | 5 + .../xmind/markers/taskMarkers/task-oct.svg | 5 + .../xmind/markers/taskMarkers/task-pause.png | Bin 0 -> 531 bytes .../markers/taskMarkers/task-quarter.svg | 17 + .../xmind/markers/taskMarkers/task-start.svg | 5 + .../xmind/markers/weekMarkers/week-fri.svg | 22 + .../xmind/markers/weekMarkers/week-mon.svg | 22 + .../xmind/markers/weekMarkers/week-sat.svg | 22 + .../xmind/markers/weekMarkers/week-sun.svg | 22 + .../xmind/markers/weekMarkers/week-thu.svg | 22 + .../xmind/markers/weekMarkers/week-tue.svg | 22 + .../xmind/markers/weekMarkers/week-wed.svg | 22 + tests/flow-board/image-paste.spec.ts | 4 +- tests/flow-board/markers.spec.ts | 109 ++ tests/routes/flow-board-markers.test.ts | 37 + 237 files changed, 4998 insertions(+), 407 deletions(-) create mode 100644 components/flow-board/mind-marker-board.ts create mode 100644 components/flow-board/xmind-marker-panel.tsx create mode 100644 lib/flow-board/xmind-marker-catalog.json create mode 100644 lib/flow-board/xmind-markers.ts create mode 100644 public/icons/xmind/marker.svg create mode 100644 public/icons/xmind/markers/README.md create mode 100644 public/icons/xmind/markers/academicMarkers/c_symbol_apostrophe.svg create mode 100644 public/icons/xmind/markers/academicMarkers/c_symbol_quote.svg create mode 100644 public/icons/xmind/markers/academicMarkers/symbol-about.svg create mode 100644 public/icons/xmind/markers/academicMarkers/symbol-attention.svg create mode 100644 public/icons/xmind/markers/academicMarkers/symbol-code.svg create mode 100644 public/icons/xmind/markers/academicMarkers/symbol-divide.svg create mode 100644 public/icons/xmind/markers/academicMarkers/symbol-equality.svg create mode 100644 public/icons/xmind/markers/academicMarkers/symbol-minus.svg create mode 100644 public/icons/xmind/markers/academicMarkers/symbol-not-equality.svg create mode 100644 public/icons/xmind/markers/academicMarkers/symbol-pause.svg create mode 100644 public/icons/xmind/markers/academicMarkers/symbol-plus.svg create mode 100644 public/icons/xmind/markers/academicMarkers/symbol-question.svg create mode 100644 public/icons/xmind/markers/academicMarkers/symbol-right.svg create mode 100644 public/icons/xmind/markers/academicMarkers/symbol-wrong.svg create mode 100644 public/icons/xmind/markers/arrowMarkers/arrow-down-left.svg create mode 100644 public/icons/xmind/markers/arrowMarkers/arrow-down-right.svg create mode 100644 public/icons/xmind/markers/arrowMarkers/arrow-down.svg create mode 100644 public/icons/xmind/markers/arrowMarkers/arrow-left-right.svg create mode 100644 public/icons/xmind/markers/arrowMarkers/arrow-left.svg create mode 100644 public/icons/xmind/markers/arrowMarkers/arrow-refresh.svg create mode 100644 public/icons/xmind/markers/arrowMarkers/arrow-right.svg create mode 100644 public/icons/xmind/markers/arrowMarkers/arrow-up-down.svg create mode 100644 public/icons/xmind/markers/arrowMarkers/arrow-up-left.svg create mode 100644 public/icons/xmind/markers/arrowMarkers/arrow-up-right.svg create mode 100644 public/icons/xmind/markers/arrowMarkers/arrow-up.svg create mode 100644 public/icons/xmind/markers/celebrationMarkers/celebration-100.svg create mode 100644 public/icons/xmind/markers/celebrationMarkers/celebration-birthday.svg create mode 100644 public/icons/xmind/markers/celebrationMarkers/celebration-boom.svg create mode 100644 public/icons/xmind/markers/celebrationMarkers/celebration-cheers.svg create mode 100644 public/icons/xmind/markers/celebrationMarkers/celebration-clap.svg create mode 100644 public/icons/xmind/markers/celebrationMarkers/celebration-five.svg create mode 100644 public/icons/xmind/markers/celebrationMarkers/celebration-king.svg create mode 100644 public/icons/xmind/markers/celebrationMarkers/celebration-kiss.svg create mode 100644 public/icons/xmind/markers/celebrationMarkers/celebration-ribbon.svg create mode 100644 public/icons/xmind/markers/flagMarkers/flag-blue.svg create mode 100644 public/icons/xmind/markers/flagMarkers/flag-dark-blue.svg create mode 100644 public/icons/xmind/markers/flagMarkers/flag-dark-gray.svg create mode 100644 public/icons/xmind/markers/flagMarkers/flag-dark-green.svg create mode 100644 public/icons/xmind/markers/flagMarkers/flag-gray.svg create mode 100644 public/icons/xmind/markers/flagMarkers/flag-green.svg create mode 100644 public/icons/xmind/markers/flagMarkers/flag-orange.svg create mode 100644 public/icons/xmind/markers/flagMarkers/flag-purple.svg create mode 100644 public/icons/xmind/markers/flagMarkers/flag-red.svg create mode 100644 public/icons/xmind/markers/flagMarkers/flag-yellow.svg create mode 100644 public/icons/xmind/markers/halfStarMarkers/half-star-blue.png create mode 100644 public/icons/xmind/markers/halfStarMarkers/half-star-gray.png create mode 100644 public/icons/xmind/markers/halfStarMarkers/half-star-green.png create mode 100644 public/icons/xmind/markers/halfStarMarkers/half-star-purple.png create mode 100644 public/icons/xmind/markers/halfStarMarkers/half-star-red.png create mode 100644 public/icons/xmind/markers/halfStarMarkers/half-star-yellow.png create mode 100644 public/icons/xmind/markers/manifest.json create mode 100644 public/icons/xmind/markers/monthMarkers/month-apr.svg create mode 100644 public/icons/xmind/markers/monthMarkers/month-aug.svg create mode 100644 public/icons/xmind/markers/monthMarkers/month-dec.svg create mode 100644 public/icons/xmind/markers/monthMarkers/month-feb.svg create mode 100644 public/icons/xmind/markers/monthMarkers/month-jan.svg create mode 100644 public/icons/xmind/markers/monthMarkers/month-jul.svg create mode 100644 public/icons/xmind/markers/monthMarkers/month-jun.svg create mode 100644 public/icons/xmind/markers/monthMarkers/month-mar.svg create mode 100644 public/icons/xmind/markers/monthMarkers/month-may.svg create mode 100644 public/icons/xmind/markers/monthMarkers/month-nov.svg create mode 100644 public/icons/xmind/markers/monthMarkers/month-oct.svg create mode 100644 public/icons/xmind/markers/monthMarkers/month-sep.svg create mode 100644 public/icons/xmind/markers/otherMarkers/c_simbol-info.svg create mode 100644 public/icons/xmind/markers/otherMarkers/c_simbol-minus.svg create mode 100644 public/icons/xmind/markers/otherMarkers/c_simbol-pause.svg create mode 100644 public/icons/xmind/markers/otherMarkers/c_simbol-plus.svg create mode 100644 public/icons/xmind/markers/otherMarkers/c_simbol-question.svg create mode 100644 public/icons/xmind/markers/otherMarkers/c_simbol-right.svg create mode 100644 public/icons/xmind/markers/otherMarkers/c_simbol-wrong.svg create mode 100644 public/icons/xmind/markers/otherMarkers/c_symbol_exercise.svg create mode 100644 public/icons/xmind/markers/otherMarkers/c_symbol_line_graph.svg create mode 100644 public/icons/xmind/markers/otherMarkers/c_symbol_medals.svg create mode 100644 public/icons/xmind/markers/otherMarkers/c_symbol_shopping_cart.svg create mode 100644 public/icons/xmind/markers/otherMarkers/c_symbol_thermometer.svg create mode 100644 public/icons/xmind/markers/otherMarkers/c_symbol_trophy.svg create mode 100644 public/icons/xmind/markers/otherMarkers/other-bomb.png create mode 100644 public/icons/xmind/markers/otherMarkers/other-businesscard.png create mode 100644 public/icons/xmind/markers/otherMarkers/other-calendar.png create mode 100644 public/icons/xmind/markers/otherMarkers/other-chat.png create mode 100644 public/icons/xmind/markers/otherMarkers/other-clock.png create mode 100644 public/icons/xmind/markers/otherMarkers/other-coffee-cup.png create mode 100644 public/icons/xmind/markers/otherMarkers/other-email.png create mode 100644 public/icons/xmind/markers/otherMarkers/other-exclam.svg create mode 100644 public/icons/xmind/markers/otherMarkers/other-fax.png create mode 100644 public/icons/xmind/markers/otherMarkers/other-lightbulb.png create mode 100644 public/icons/xmind/markers/otherMarkers/other-lock.png create mode 100644 public/icons/xmind/markers/otherMarkers/other-no.svg create mode 100644 public/icons/xmind/markers/otherMarkers/other-note.png create mode 100644 public/icons/xmind/markers/otherMarkers/other-people.png create mode 100644 public/icons/xmind/markers/otherMarkers/other-people2.png create mode 100644 public/icons/xmind/markers/otherMarkers/other-phone.png create mode 100644 public/icons/xmind/markers/otherMarkers/other-phone2.png create mode 100644 public/icons/xmind/markers/otherMarkers/other-question.svg create mode 100644 public/icons/xmind/markers/otherMarkers/other-social.png create mode 100644 public/icons/xmind/markers/otherMarkers/other-unlock.png create mode 100644 public/icons/xmind/markers/otherMarkers/other-yes.svg create mode 100644 public/icons/xmind/markers/otherMarkers/symbol-image.svg create mode 100644 public/icons/xmind/markers/otherMarkers/symbol-info.svg create mode 100644 public/icons/xmind/markers/peopleMarkers/people-blue.svg create mode 100644 public/icons/xmind/markers/peopleMarkers/people-dark-blue.svg create mode 100644 public/icons/xmind/markers/peopleMarkers/people-dark-gray.svg create mode 100644 public/icons/xmind/markers/peopleMarkers/people-dark-green.svg create mode 100644 public/icons/xmind/markers/peopleMarkers/people-gray.svg create mode 100644 public/icons/xmind/markers/peopleMarkers/people-green.svg create mode 100644 public/icons/xmind/markers/peopleMarkers/people-orange.svg create mode 100644 public/icons/xmind/markers/peopleMarkers/people-purple.svg create mode 100644 public/icons/xmind/markers/peopleMarkers/people-red.svg create mode 100644 public/icons/xmind/markers/peopleMarkers/people-yellow.svg create mode 100644 public/icons/xmind/markers/priorityMarkers/priority-1.svg create mode 100644 public/icons/xmind/markers/priorityMarkers/priority-2.svg create mode 100644 public/icons/xmind/markers/priorityMarkers/priority-3.svg create mode 100644 public/icons/xmind/markers/priorityMarkers/priority-4.svg create mode 100644 public/icons/xmind/markers/priorityMarkers/priority-5.svg create mode 100644 public/icons/xmind/markers/priorityMarkers/priority-6.svg create mode 100644 public/icons/xmind/markers/priorityMarkers/priority-7.svg create mode 100644 public/icons/xmind/markers/priorityMarkers/priority-8.svg create mode 100644 public/icons/xmind/markers/priorityMarkers/priority-9.svg create mode 100644 public/icons/xmind/markers/smileyMarkers/smiley-adore.svg create mode 100644 public/icons/xmind/markers/smileyMarkers/smiley-angry.svg create mode 100644 public/icons/xmind/markers/smileyMarkers/smiley-boring.svg create mode 100644 public/icons/xmind/markers/smileyMarkers/smiley-cry-laugh.svg create mode 100644 public/icons/xmind/markers/smileyMarkers/smiley-cry.svg create mode 100644 public/icons/xmind/markers/smileyMarkers/smiley-devil.svg create mode 100644 public/icons/xmind/markers/smileyMarkers/smiley-embarrass.svg create mode 100644 public/icons/xmind/markers/smileyMarkers/smiley-laugh.svg create mode 100644 public/icons/xmind/markers/smileyMarkers/smiley-love.svg create mode 100644 public/icons/xmind/markers/smileyMarkers/smiley-sad.svg create mode 100644 public/icons/xmind/markers/smileyMarkers/smiley-smile.svg create mode 100644 public/icons/xmind/markers/smileyMarkers/smiley-surprise.svg create mode 100644 public/icons/xmind/markers/smileyMarkers/smiley-think.svg create mode 100644 public/icons/xmind/markers/smileyMarkers/smiley-upset.svg create mode 100644 public/icons/xmind/markers/socialMarkers/c_symbol_broken_heart.svg create mode 100644 public/icons/xmind/markers/socialMarkers/c_symbol_contact.svg create mode 100644 public/icons/xmind/markers/socialMarkers/symbol-comment.svg create mode 100644 public/icons/xmind/markers/socialMarkers/symbol-no-entry.svg create mode 100644 public/icons/xmind/markers/socialMarkers/symbol-notice.svg create mode 100644 public/icons/xmind/markers/socialMarkers/symbol-rss.svg create mode 100644 public/icons/xmind/markers/socialMarkers/symbol-share.svg create mode 100644 public/icons/xmind/markers/socialMarkers/symbol_forward.svg create mode 100644 public/icons/xmind/markers/starMarkers/star-blue.svg create mode 100644 public/icons/xmind/markers/starMarkers/star-dark-blue.svg create mode 100644 public/icons/xmind/markers/starMarkers/star-dark-gray.svg create mode 100644 public/icons/xmind/markers/starMarkers/star-dark-green.svg create mode 100644 public/icons/xmind/markers/starMarkers/star-gray.svg create mode 100644 public/icons/xmind/markers/starMarkers/star-green.svg create mode 100644 public/icons/xmind/markers/starMarkers/star-orange.svg create mode 100644 public/icons/xmind/markers/starMarkers/star-purple.svg create mode 100644 public/icons/xmind/markers/starMarkers/star-red.svg create mode 100644 public/icons/xmind/markers/starMarkers/star-yellow.svg create mode 100644 public/icons/xmind/markers/symbolMarkers/c_simbol-exclam.svg create mode 100644 public/icons/xmind/markers/symbolMarkers/c_simbol-info.svg create mode 100644 public/icons/xmind/markers/symbolMarkers/c_simbol-minus.svg create mode 100644 public/icons/xmind/markers/symbolMarkers/c_simbol-pause.svg create mode 100644 public/icons/xmind/markers/symbolMarkers/c_simbol-plus.svg create mode 100644 public/icons/xmind/markers/symbolMarkers/c_simbol-question.svg create mode 100644 public/icons/xmind/markers/symbolMarkers/c_simbol-right.svg create mode 100644 public/icons/xmind/markers/symbolMarkers/c_simbol-wrong.svg create mode 100644 public/icons/xmind/markers/symbolMarkers/c_symbol_bar_chart.svg create mode 100644 public/icons/xmind/markers/symbolMarkers/c_symbol_contact.svg create mode 100644 public/icons/xmind/markers/symbolMarkers/c_symbol_dislike.svg create mode 100644 public/icons/xmind/markers/symbolMarkers/c_symbol_drink.svg create mode 100644 public/icons/xmind/markers/symbolMarkers/c_symbol_exercise.svg create mode 100644 public/icons/xmind/markers/symbolMarkers/c_symbol_flight.svg create mode 100644 public/icons/xmind/markers/symbolMarkers/c_symbol_heart.svg create mode 100644 public/icons/xmind/markers/symbolMarkers/c_symbol_hourglass.svg create mode 100644 public/icons/xmind/markers/symbolMarkers/c_symbol_like.svg create mode 100644 public/icons/xmind/markers/symbolMarkers/c_symbol_line_graph.svg create mode 100644 public/icons/xmind/markers/symbolMarkers/c_symbol_lock.svg create mode 100644 public/icons/xmind/markers/symbolMarkers/c_symbol_medals.svg create mode 100644 public/icons/xmind/markers/symbolMarkers/c_symbol_money.svg create mode 100644 public/icons/xmind/markers/symbolMarkers/c_symbol_music.svg create mode 100644 public/icons/xmind/markers/symbolMarkers/c_symbol_pen.svg create mode 100644 public/icons/xmind/markers/symbolMarkers/c_symbol_pie_chart.svg create mode 100644 public/icons/xmind/markers/symbolMarkers/c_symbol_shopping_cart.svg create mode 100644 public/icons/xmind/markers/symbolMarkers/c_symbol_telephone.svg create mode 100644 public/icons/xmind/markers/symbolMarkers/c_symbol_thermometer.svg create mode 100644 public/icons/xmind/markers/symbolMarkers/c_symbol_trophy.svg create mode 100644 public/icons/xmind/markers/symbolMarkers/symbol-100.svg create mode 100644 public/icons/xmind/markers/symbolMarkers/symbol-attention.svg create mode 100644 public/icons/xmind/markers/symbolMarkers/symbol-diamond.svg create mode 100644 public/icons/xmind/markers/symbolMarkers/symbol-entertainment.svg create mode 100644 public/icons/xmind/markers/symbolMarkers/symbol-exclam.svg create mode 100644 public/icons/xmind/markers/symbolMarkers/symbol-idea.svg create mode 100644 public/icons/xmind/markers/symbolMarkers/symbol-info.svg create mode 100644 public/icons/xmind/markers/symbolMarkers/symbol-lightning.svg create mode 100644 public/icons/xmind/markers/symbolMarkers/symbol-minus.svg create mode 100644 public/icons/xmind/markers/symbolMarkers/symbol-pause.svg create mode 100644 public/icons/xmind/markers/symbolMarkers/symbol-pin.svg create mode 100644 public/icons/xmind/markers/symbolMarkers/symbol-plus.svg create mode 100644 public/icons/xmind/markers/symbolMarkers/symbol-question.svg create mode 100644 public/icons/xmind/markers/symbolMarkers/symbol-right.svg create mode 100644 public/icons/xmind/markers/symbolMarkers/symbol-run.svg create mode 100644 public/icons/xmind/markers/symbolMarkers/symbol-unlock.svg create mode 100644 public/icons/xmind/markers/symbolMarkers/symbol-wrong.svg create mode 100644 public/icons/xmind/markers/tagMarkers/tag-blue.svg create mode 100644 public/icons/xmind/markers/tagMarkers/tag-dark-blue.svg create mode 100644 public/icons/xmind/markers/tagMarkers/tag-dark-purple.svg create mode 100644 public/icons/xmind/markers/tagMarkers/tag-green.svg create mode 100644 public/icons/xmind/markers/tagMarkers/tag-grey.svg create mode 100644 public/icons/xmind/markers/tagMarkers/tag-orange.svg create mode 100644 public/icons/xmind/markers/tagMarkers/tag-red.svg create mode 100644 public/icons/xmind/markers/tagMarkers/tag-yellow.svg create mode 100644 public/icons/xmind/markers/taskMarkers/task-3oct.svg create mode 100644 public/icons/xmind/markers/taskMarkers/task-3quar.svg create mode 100644 public/icons/xmind/markers/taskMarkers/task-5oct.svg create mode 100644 public/icons/xmind/markers/taskMarkers/task-7oct.svg create mode 100644 public/icons/xmind/markers/taskMarkers/task-done.svg create mode 100644 public/icons/xmind/markers/taskMarkers/task-half.svg create mode 100644 public/icons/xmind/markers/taskMarkers/task-oct.svg create mode 100644 public/icons/xmind/markers/taskMarkers/task-pause.png create mode 100644 public/icons/xmind/markers/taskMarkers/task-quarter.svg create mode 100644 public/icons/xmind/markers/taskMarkers/task-start.svg create mode 100644 public/icons/xmind/markers/weekMarkers/week-fri.svg create mode 100644 public/icons/xmind/markers/weekMarkers/week-mon.svg create mode 100644 public/icons/xmind/markers/weekMarkers/week-sat.svg create mode 100644 public/icons/xmind/markers/weekMarkers/week-sun.svg create mode 100644 public/icons/xmind/markers/weekMarkers/week-thu.svg create mode 100644 public/icons/xmind/markers/weekMarkers/week-tue.svg create mode 100644 public/icons/xmind/markers/weekMarkers/week-wed.svg create mode 100644 tests/flow-board/markers.spec.ts create mode 100644 tests/routes/flow-board-markers.test.ts diff --git a/components/flow-board/drawnix-workspace.tsx b/components/flow-board/drawnix-workspace.tsx index 45fee97a2..b2b0d0d18 100644 --- a/components/flow-board/drawnix-workspace.tsx +++ b/components/flow-board/drawnix-workspace.tsx @@ -1,6 +1,9 @@ "use client"; import "./xmind-native.css"; +import { XmindMarkerPanel } from "./xmind-marker-panel"; +import { withXmindMarkers } from "./mind-marker-board"; +import { getXmindMarker, getXmindMarkerIds, toggleXmindMarker, type XmindMarker } from "@/lib/flow-board/xmind-markers"; import { XmindSearchPanel } from "./xmind-search-panel"; import { XmindPresentation } from "./xmind-presentation"; import { replaceTopicText, type TopicSearchResult } from "@/lib/flow-board/topic-search"; @@ -82,17 +85,10 @@ import { XmindSheetBar, } from "@/components/flow-board/xmind-editor-chrome"; import { - CheckCircle2, - ChevronDown, FileText, - Flag, Loader2, - type LucideIcon, Plus, - Star, - Tag, Trash2, - UserRound, X, } from "lucide-react"; import { useTheme } from "next-themes"; @@ -105,7 +101,7 @@ import { useRef, useState, } from "react"; -import { toast } from "sonner"; +import { toast as appToast } from "sonner"; import { insertMindAnnotation, withMindAnnotations } from "./mind-annotation-board"; import { isMindAnnotation, validateTopicRange } from "@/lib/flow-board/mind-annotations"; import { XmindAnnotationPanel } from "./xmind-annotation-panel"; @@ -116,6 +112,15 @@ import { SPECIAL_MIND_LAYOUTS, isSpecialMindLayout } from "@/lib/flow-board/mind import { applyOutlineCommand, renameOutlineTopic, type OutlineCommand, type OutlineDrop } from "@/lib/flow-board/mind-outline"; import { getTopicEntries, patchTopicDetails, type TopicDetails } from "@/lib/flow-board/topic-details"; +// Keep editor feedback away from the floating tools and their hover targets. +const toast = { + ...appToast, + success: (message: Parameters[0], options?: Parameters[1]) => appToast.success(message, { position: "bottom-center", ...options }), + info: (message: Parameters[0], options?: Parameters[1]) => appToast.info(message, { position: "bottom-center", ...options }), + error: (message: Parameters[0], options?: Parameters[1]) => appToast.error(message, { position: "bottom-center", ...options }), + warning: (message: Parameters[0], options?: Parameters[1]) => appToast.warning(message, { position: "bottom-center", ...options }), +}; + type FlowBoardWorkspaceProps = { siteName: string; siteLogo: string | null; @@ -161,30 +166,10 @@ type FlowBoardCloudFilePayload = FlowBoardCloudFile & { snapshot?: unknown; }; -type FlowBoardMarkerGroupId = - | "tag" - | "priority" - | "task" - | "flag" - | "star" - | "avatar" - | "symbol"; - -type FlowBoardMarkerItem = { - name: string; - label: string; -}; - -type FlowBoardMarkerGroup = { - id: FlowBoardMarkerGroupId; - label: string; - icon: LucideIcon; - markers: FlowBoardMarkerItem[]; -}; - type FlowBoardMarkerSelectionState = { count: number; names: string[]; + mixedNames: string[]; }; type FlowBoardSelectionStyleState = { @@ -228,7 +213,7 @@ const FLOW_BOARD_LAYOUT_OPTIONS: FlowBoardLayoutOption[] = [ }, ...Object.entries(SPECIAL_MIND_LAYOUTS).map(([id, value]) => ({ id, label: value.label, preview: value.preview })), ]; -const FLOW_BOARD_PLUGINS = [withSpecialMindLayouts]; +const FLOW_BOARD_PLUGINS = [withSpecialMindLayouts, withXmindMarkers]; const FLOW_BOARD_THEME_OPTIONS: FlowBoardThemeOption[] = [ { id: "default", label: "经典", colors: ["#2f6feb", "#8fb3ff", "#dbe7ff"] }, { id: "colorful", label: "彩虹", colors: ["#ef6461", "#f4c95d", "#5abf90"] }, @@ -237,108 +222,6 @@ const FLOW_BOARD_THEME_OPTIONS: FlowBoardThemeOption[] = [ { id: "dark", label: "深色", colors: ["#24272d", "#59616e", "#9aa4b2"] }, { id: "starry", label: "星空", colors: ["#243b74", "#5471c6", "#9cadf0"] }, ]; -const FLOW_BOARD_MARKER_GROUPS: FlowBoardMarkerGroup[] = [ - { - id: "tag", - label: "标签", - icon: Tag, - markers: [ - { name: "🔴", label: "红色" }, - { name: "🟠", label: "橙色" }, - { name: "🟡", label: "黄色" }, - { name: "🟢", label: "绿色" }, - { name: "🔵", label: "蓝色" }, - { name: "🟣", label: "紫色" }, - { name: "⚪", label: "灰色" }, - ], - }, - { - id: "priority", - label: "优先级", - icon: CheckCircle2, - markers: [ - { name: "1️⃣", label: "优先级 1" }, - { name: "2️⃣", label: "优先级 2" }, - { name: "3️⃣", label: "优先级 3" }, - { name: "4️⃣", label: "优先级 4" }, - { name: "5️⃣", label: "优先级 5" }, - { name: "6️⃣", label: "优先级 6" }, - { name: "7️⃣", label: "优先级 7" }, - ], - }, - { - id: "task", - label: "任务", - icon: CheckCircle2, - markers: [ - { name: "▶️", label: "开始" }, - { name: "◔", label: "25%" }, - { name: "◑", label: "50%" }, - { name: "◕", label: "75%" }, - { name: "🚧", label: "处理中" }, - { name: "✅", label: "完成" }, - ], - }, - { - id: "flag", - label: "旗帜", - icon: Flag, - markers: [ - { name: "🚩", label: "红旗" }, - { name: "🏁", label: "终点" }, - { name: "🏳️", label: "白旗" }, - { name: "🎯", label: "目标" }, - { name: "📍", label: "定位" }, - { name: "📌", label: "固定" }, - ], - }, - { - id: "star", - label: "星星", - icon: Star, - markers: [ - { name: "⭐", label: "星标" }, - { name: "🌟", label: "重点" }, - { name: "✨", label: "亮点" }, - { name: "💫", label: "灵感" }, - { name: "🔥", label: "高热" }, - { name: "💎", label: "价值" }, - ], - }, - { - id: "avatar", - label: "人像", - icon: UserRound, - markers: [ - { name: "👤", label: "成员" }, - { name: "🙋", label: "负责人" }, - { name: "👥", label: "多人" }, - { name: "🧑‍💻", label: "执行" }, - { name: "🧑‍🎨", label: "创意" }, - { name: "🧑‍💼", label: "业务" }, - ], - }, - { - id: "symbol", - label: "符号", - icon: Tag, - markers: [ - { name: "❗", label: "注意" }, - { name: "❓", label: "疑问" }, - { name: "💡", label: "想法" }, - { name: "❤️", label: "喜欢" }, - { name: "⚡", label: "快速" }, - { name: "🔗", label: "关联" }, - ], - }, -]; -const FLOW_BOARD_MARKER_NAMES_BY_GROUP = new Map( - FLOW_BOARD_MARKER_GROUPS.map((group) => [ - group.id, - new Set(group.markers.map((marker) => marker.name)), - ]) -); - function isFlowBoardRecord(value: unknown): value is Record { return Boolean(value) && typeof value === "object" && !Array.isArray(value); } @@ -645,15 +528,6 @@ function sortCloudFiles(files: FlowBoardCloudFile[]) { ); } -function getFlowBoardElementEmojiNames(element: MindElement) { - const emojis = Array.isArray(element.data?.emojis) - ? element.data.emojis - : []; - return emojis - .map((emoji) => String(emoji?.name || "").trim()) - .filter(Boolean); -} - function getExistingFlowBoardMindElements( board: PlaitBoard, elements: MindElement[] @@ -718,20 +592,18 @@ function getFlowBoardMarkerSelectionState( selectedElements?: MindElement[] ): FlowBoardMarkerSelectionState { if (!board) { - return { count: 0, names: [] }; + return { count: 0, names: [], mixedNames: [] }; } - const targetElements = selectedElements || getSelectedMindElements(board); - const names = new Set(); - targetElements.forEach((element) => { - getFlowBoardElementEmojiNames(element).forEach((name) => { - names.add(name); - }); + const targetElements = uniqueFlowBoardMindElements(getExistingFlowBoardMindElements(board, selectedElements || getSelectedMindElements(board))); + const counts = new Map(); + targetElements.forEach(element => { + getXmindMarkerIds(element.data?.emojis).forEach(id => counts.set(id, (counts.get(id) || 0) + 1)); }); - return { count: targetElements.length, - names: Array.from(names), + names: [...counts].filter(([, count]) => count === targetElements.length).map(([id]) => id), + mixedNames: [...counts].filter(([, count]) => count < targetElements.length).map(([id]) => id), }; } @@ -802,43 +674,6 @@ function persistFlowBoardTopicEditors( ); } -function updateFlowBoardElementMarker( - board: PlaitBoard, - element: MindElement, - group: FlowBoardMarkerGroup, - marker: FlowBoardMarkerItem -) { - const groupMarkerNames = - FLOW_BOARD_MARKER_NAMES_BY_GROUP.get(group.id) || new Set(); - const currentEmojis = Array.isArray(element.data?.emojis) - ? element.data.emojis - : []; - const isAlreadyApplied = currentEmojis.some( - (emoji) => emoji.name === marker.name - ); - const nextEmojis = isAlreadyApplied - ? currentEmojis.filter((emoji) => !groupMarkerNames.has(emoji.name)) - : [ - ...currentEmojis.filter((emoji) => !groupMarkerNames.has(emoji.name)), - { name: marker.name }, - ]; - const nextData = { ...element.data }; - - if (nextEmojis.length > 0) { - nextData.emojis = nextEmojis; - } else { - delete nextData.emojis; - } - - Transforms.setNode( - board, - { - data: nextData, - }, - PlaitBoard.findPath(board, element) - ); -} - function getFlowBoardPastePoint(board: PlaitBoard): Point { const movingPoint = PlaitBoard.getMovingPointInBoard(board); if (movingPoint) { @@ -981,6 +816,7 @@ export function DrawnixWorkspace({ useState({ count: 0, names: [], + mixedNames: [], }); const [selectionStyleState, setSelectionStyleState] = useState(() => @@ -1042,7 +878,7 @@ export function DrawnixWorkspace({ const board = boardRef.current; if (!board) { selectedMindElementsRef.current = []; - setMarkerSelectionState({ count: 0, names: [] }); + setMarkerSelectionState({ count: 0, names: [], mixedNames: [] }); setSelectionStyleState(getFlowBoardSelectionStyleState(null, [])); return; } @@ -1054,7 +890,7 @@ export function DrawnixWorkspace({ if (annotation) { setSelectedTopicId(null); selectedMindElementsRef.current = []; - setMarkerSelectionState({ count: 0, names: [] }); + setMarkerSelectionState({ count: 0, names: [], mixedNames: [] }); return; } const selectedElements = getFlowBoardSelectedMindElements( @@ -1078,7 +914,7 @@ export function DrawnixWorkspace({ if (!options.preserveFallback) { setSelectedTopicId(null); selectedMindElementsRef.current = []; - setMarkerSelectionState({ count: 0, names: [] }); + setMarkerSelectionState({ count: 0, names: [], mixedNames: [] }); setSelectionStyleState(getFlowBoardSelectionStyleState(null, [])); return; } @@ -1185,7 +1021,7 @@ export function DrawnixWorkspace({ ? new Date(nextSnapshot.updatedAt) : null ); - setMarkerSelectionState({ count: 0, names: [] }); + setMarkerSelectionState({ count: 0, names: [], mixedNames: [] }); setSelectionStyleState(getFlowBoardSelectionStyleState(null, [])); selectedMindElementsRef.current = []; updateBrowserFileParam(file.id); @@ -1300,7 +1136,7 @@ export function DrawnixWorkspace({ setCurrentFileId(null); setCurrentTitle("流程白板"); setLastSavedAt(null); - setMarkerSelectionState({ count: 0, names: [] }); + setMarkerSelectionState({ count: 0, names: [], mixedNames: [] }); setSelectionStyleState( getFlowBoardSelectionStyleState(null, []) ); @@ -1401,6 +1237,7 @@ export function DrawnixWorkspace({ theme: value.theme, viewport: value.viewport, }); + refreshMarkerSelectionState({ preserveFallback: shellControlInteractionRef.current }); }, [refreshMarkerSelectionState, updateSnapshot] ); @@ -1515,70 +1352,35 @@ export function DrawnixWorkspace({ } }, [handleJumpToTopic]); - const handleApplyFlowBoardMarker = useCallback( - (group: FlowBoardMarkerGroup, marker: FlowBoardMarkerItem) => { - const board = boardRef.current; - if (!board) { - return; - } - - const selectedElements = getActiveMarkerElements(); - if (selectedElements.length === 0) { - toast.info("请先选中一个思维导图节点"); - return; - } - - selectedElements.forEach((element) => { - updateFlowBoardElementMarker(board, element, group, marker); + const handleApplyFlowBoardMarker = useCallback((marker: XmindMarker) => { + const board = boardRef.current; + if (!board) return; + const elements = uniqueFlowBoardMindElements(getExistingFlowBoardMindElements(board, getActiveMarkerElements())); + if (!elements.length) { toast.info("请先选中一个主题"); return; } + const remove = elements.every(element => getXmindMarkerIds(element.data?.emojis).includes(marker.id)); + PlaitHistoryBoard.withNewBatch(board, () => { + elements.forEach(element => { + const data = { ...element.data, emojis: toggleXmindMarker(element.data?.emojis || [], marker.id, remove) }; + Transforms.setNode(board, { data }, PlaitBoard.findPath(board, element)); }); - refreshMarkerSelectionState({ preserveFallback: true }); - }, - [getActiveMarkerElements, refreshMarkerSelectionState] - ); + }); + refreshMarkerSelectionState({ preserveFallback: true }); + }, [getActiveMarkerElements, refreshMarkerSelectionState]); const handleClearFlowBoardMarkers = useCallback(() => { const board = boardRef.current; - if (!board) { - return; - } - - const selectedElements = getActiveMarkerElements(); - if (selectedElements.length === 0) { - toast.info("请先选中一个思维导图节点"); - return; - } - - const allMarkerNames = new Set( - FLOW_BOARD_MARKER_GROUPS.flatMap((group) => - group.markers.map((marker) => marker.name) - ) - ); - - selectedElements.forEach((element) => { - const currentEmojis = Array.isArray(element.data?.emojis) - ? element.data.emojis - : []; - const nextEmojis = currentEmojis.filter( - (emoji) => !allMarkerNames.has(emoji.name) - ); - if (nextEmojis.length === currentEmojis.length) { - return; - } - - const nextData = { ...element.data }; - if (nextEmojis.length > 0) { - nextData.emojis = nextEmojis; - } else { - delete nextData.emojis; - } - Transforms.setNode( - board, - { data: nextData }, - PlaitBoard.findPath(board, element) - ); + if (!board) return; + const elements = uniqueFlowBoardMindElements(getExistingFlowBoardMindElements(board, getActiveMarkerElements())); + if (!elements.length) { toast.info("请先选中一个主题"); return; } + PlaitHistoryBoard.withNewBatch(board, () => { + elements.forEach(element => { + const data = { ...element.data, emojis: (element.data?.emojis || []).filter(emoji => !getXmindMarker(emoji.name)) }; + const xmind = isFlowBoardRecord(element.xmind) ? { ...element.xmind } : {}; + delete xmind.markers; + Transforms.setNode(board, { data, xmind }, PlaitBoard.findPath(board, element)); + }); }); refreshMarkerSelectionState({ preserveFallback: true }); - toast.success("已清空所选节点标记"); }, [getActiveMarkerElements, refreshMarkerSelectionState]); const handleInsertFlowBoardAbstract = useCallback(() => { @@ -2021,7 +1823,7 @@ export function DrawnixWorkspace({ }); selectedMindElementsRef.current = []; selectedMindSelectionRef.current = null; - setMarkerSelectionState({ count: 0, names: [] }); + setMarkerSelectionState({ count: 0, names: [], mixedNames: [] }); setSelectionStyleState(getFlowBoardSelectionStyleState(null, [])); }, [updateSnapshot] @@ -2087,7 +1889,7 @@ export function DrawnixWorkspace({ }); selectedMindElementsRef.current = []; selectedMindSelectionRef.current = null; - setMarkerSelectionState({ count: 0, names: [] }); + setMarkerSelectionState({ count: 0, names: [], mixedNames: [] }); setSelectionStyleState(getFlowBoardSelectionStyleState(null, [])); }, [updateSnapshot]); @@ -2132,7 +1934,7 @@ export function DrawnixWorkspace({ }); selectedMindElementsRef.current = []; selectedMindSelectionRef.current = null; - setMarkerSelectionState({ count: 0, names: [] }); + setMarkerSelectionState({ count: 0, names: [], mixedNames: [] }); setSelectionStyleState(getFlowBoardSelectionStyleState(null, [])); }, [updateSnapshot] @@ -2165,7 +1967,7 @@ export function DrawnixWorkspace({ }); selectedMindElementsRef.current = []; selectedMindSelectionRef.current = null; - setMarkerSelectionState({ count: 0, names: [] }); + setMarkerSelectionState({ count: 0, names: [], mixedNames: [] }); setSelectionStyleState(getFlowBoardSelectionStyleState(null, [])); }, [updateSnapshot] @@ -2230,7 +2032,8 @@ export function DrawnixWorkspace({ toast.success( insertedCount === 1 ? topicId ? "已插入主题图片" : "已粘贴图片到白板" - : `已粘贴 ${insertedCount} 张图片到白板` + : `已粘贴 ${insertedCount} 张图片到白板`, + { position: "bottom-center" } ); } }, [previewMode]); @@ -2632,7 +2435,7 @@ export function DrawnixWorkspace({ setCurrentFileId(null); setCurrentTitle("流程白板"); setLastSavedAt(null); - setMarkerSelectionState({ count: 0, names: [] }); + setMarkerSelectionState({ count: 0, names: [], mixedNames: [] }); setSelectionStyleState(getFlowBoardSelectionStyleState(null, [])); selectedMindElementsRef.current = []; updateBrowserFileParam(null); @@ -2782,6 +2585,7 @@ export function DrawnixWorkspace({ canEditMind={markerSelectionState.count > 0} currentTitle={currentTitle} formatPanelOpen={isFormatPanelVisible} + markerPanelOpen={isMarkerPanelOpen} isSaving={isSavingNow || isImportingMindMap} onBack={() => { window.location.href = "/"; @@ -3001,129 +2805,14 @@ export function DrawnixWorkspace({ ) : null} - {!isZenMode && isMarkerPanelOpen ? ( - - ) : null} + {!isZenMode && isMarkerPanelOpen ? { setIsMarkerPanelOpen(false); setIsFormatPanelOpen(true); }} + /> : null}
; + const renderEmoji = markerBoard.renderEmoji; + markerBoard.renderEmoji = (container, props) => { + const marker = getXmindMarker(props.emojiItem.name); + if (!marker) return renderEmoji(container, props); + const image = document.createElement("img"); + image.className = "mind-node-emoji xmind-topic-marker"; + image.draggable = false; + let currentProps = props; + const update = (next: Partial) => { + currentProps = { ...currentProps, ...next }; + const current = getXmindMarker(currentProps.emojiItem.name); + image.src = current?.asset || marker.asset; + image.alt = current?.name || marker.name; + image.dataset.markerId = current?.id || marker.id; + image.style.width = `${currentProps.fontSize}px`; + image.style.height = `${currentProps.fontSize}px`; + }; + update(props); + container.append(image); + return { update, destroy: () => image.remove() }; + }; + return board; +} diff --git a/components/flow-board/xmind-editor-chrome.tsx b/components/flow-board/xmind-editor-chrome.tsx index 095d3a452..985acd108 100644 --- a/components/flow-board/xmind-editor-chrome.tsx +++ b/components/flow-board/xmind-editor-chrome.tsx @@ -152,7 +152,7 @@ function LayoutPreview({ } export function XmindEditorTopBar({ - activeTool, canEditMind, currentTitle, formatPanelOpen, isSaving, onBack, + activeTool, canEditMind, currentTitle, formatPanelOpen, markerPanelOpen, isSaving, onBack, onImport, onExport, isExporting, onInsertChild, onInsertSibling, onRelationship, onBoundary, relationshipPending, onOpenFiles, onRedo, onSave, onSummary, onTopicDetails, onTitleChange, onTitleCommit, @@ -163,6 +163,7 @@ export function XmindEditorTopBar({ canEditMind: boolean; currentTitle: string; formatPanelOpen: boolean; + markerPanelOpen: boolean; isSaving: boolean; onBack: () => void; onImport: () => void; @@ -191,7 +192,7 @@ export function XmindEditorTopBar({ onToggleOutline: () => void; onPresentation: () => void; }) { - const nativeIcons: Record = {"同级主题":"topic","子主题":"subtopic","联系":"relationship","概要":"summary","外框":"boundary","ZEN 模式":"zen","演示":"pitch","格式":"sidebar","导出 XMind":"export"}; + const nativeIcons: Record = {"同级主题":"topic","子主题":"subtopic","联系":"relationship","概要":"summary","外框":"boundary","ZEN 模式":"zen","演示":"pitch","格式":"sidebar","标记":"marker","导出 XMind":"export"}; const action = (label: string, Icon: LucideIcon, run: () => void, disabled = false, active = false) => ( @@ -251,7 +252,7 @@ export function XmindEditorTopBar({ {action("演示", Presentation, onPresentation)}
- {action("标记", Smile, onToggleMarkers)} + {action("标记", Smile, onToggleMarkers, false, markerPanelOpen)} {action("格式", PanelRight, onToggleFormat, false, formatPanelOpen)}
diff --git a/components/flow-board/xmind-marker-panel.tsx b/components/flow-board/xmind-marker-panel.tsx new file mode 100644 index 000000000..0b6ee632f --- /dev/null +++ b/components/flow-board/xmind-marker-panel.tsx @@ -0,0 +1,46 @@ +"use client"; + +import { useState } from "react"; +import { ChevronDown, Search, X } from "lucide-react"; +import { XMIND_MARKER_GROUPS, type XmindMarker } from "@/lib/flow-board/xmind-markers"; + +export function XmindMarkerPanel({ selectedCount, activeIds, mixedIds, onApply, onClear, onClose }: { + selectedCount: number; + activeIds: string[]; + mixedIds: string[]; + onApply: (marker: XmindMarker) => void; + onClear: () => void; + onClose: () => void; +}) { + const [query, setQuery] = useState(""); + const [showAll, setShowAll] = useState(false); + const [collapsed, setCollapsed] = useState([]); + const needle = query.trim().toLowerCase(); + const groups = XMIND_MARKER_GROUPS.filter(group => showAll || needle || !group.hidden).map(group => ({ + ...group, markers: group.markers.filter(marker => (showAll || needle || !marker.hidden) && (!needle || `${group.label} ${marker.name} ${marker.id}`.toLowerCase().includes(needle))), + })).filter(group => group.markers.length); + return ; +} diff --git a/components/flow-board/xmind-native.css b/components/flow-board/xmind-native.css index b3a62f294..0f5b9d99c 100644 --- a/components/flow-board/xmind-native.css +++ b/components/flow-board/xmind-native.css @@ -15,6 +15,25 @@ .xmind-workspace :is(button,input,textarea,select) { font-family: inherit; } .xmind-workspace button:disabled { cursor: default; opacity: .3; } .xmind-workspace button:focus-visible { outline: 2px solid #35b5ff; outline-offset: 2px; } +.xmind-topic-marker { display:inline-block; object-fit:contain; flex-shrink:0; vertical-align:middle; } +.xmind-marker-search { display:flex; align-items:center; gap:6px; margin:4px 12px; padding:6px 8px; border:1px solid var(--xmind-border); border-radius:7px; background:white; } +.xmind-marker-search input { width:100%; min-width:0; outline:none; background:transparent; font-size:12px; } +.xmind-marker-selection { margin:6px 12px 10px; font-size:11px; color:var(--xmind-muted); } +.xmind-marker-panel .xmind-panel-content { flex:1; overflow-x:hidden; } +.xmind-marker-group { margin-bottom:12px; } +.xmind-marker-group-heading { display:flex; align-items:center; gap:5px; width:100%; height:26px; font-size:12px; font-weight:600; } +.xmind-marker-group-heading > span:last-child { margin-left:auto; font-size:10px; font-weight:400; color:var(--xmind-muted); } +.xmind-marker-group-heading[aria-expanded=false] svg { transform:rotate(-90deg); } +.xmind-marker-grid { display:grid; grid-template-columns:repeat(7,minmax(0,1fr)); gap:3px; } +.xmind-marker-grid button { display:grid; place-items:center; width:100%; height:28px; border:1px solid transparent; border-radius:5px; background:transparent; } +.xmind-marker-grid button:hover:not(:disabled) { background:#e3e6ea; } +.xmind-marker-grid button[aria-pressed=true] { border-color:#387cff; background:#e9f0ff; } +.xmind-marker-grid button[aria-pressed=mixed] { border:1px dashed #387cff; background:#e9f0ff80; } +.xmind-marker-grid img { width:20px; height:20px; object-fit:contain; } +.xmind-marker-more { width:100%; padding:7px; border-radius:6px; color:#3569e8; background:#e9edf4; font-size:12px; } +.xmind-marker-empty { padding:24px 0; text-align:center; color:var(--xmind-muted); } +.xmind-marker-footer { padding:10px 12px; border-top:1px solid var(--xmind-border); } +.xmind-marker-footer button { width:100%; padding:7px; border:1px solid var(--xmind-border); border-radius:6px; background:white; font-size:12px; } .xmind-topbar { position:absolute; top:0; left:0; right:var(--xmind-panel-offset,0px); height:56px; z-index:50; display:flex; align-items:flex-start; padding:12px 12px 0; gap:8px; pointer-events:none; } .xmind-topbar > * { pointer-events:auto; } .xmind-document-heading { display:flex; align-items:center; gap:8px; min-width:200px; } diff --git a/docs/XMind-26.04-客户端界面对照.md b/docs/XMind-26.04-客户端界面对照.md index 5fdb2f872..4029ffa79 100644 --- a/docs/XMind-26.04-客户端界面对照.md +++ b/docs/XMind-26.04-客户端界面对照.md @@ -35,3 +35,12 @@ - 图片按比例缩放,主题图片宽度上限 240px。异步读取/上传后重新查找目标主题,切换画布或目标已删除时不插入其他位置。文字、标题、备注等文本粘贴保留各自原有处理。 - 开发预览直接保存图片数据,避免依赖登录上传;正式页面继续使用原有上传接口。支持 JPEG、PNG、WebP,保留原有大小限制。 - 4 项浏览器用例通过,使用实际剪贴板和粘贴快捷键验证编辑状态、选中状态、空白画布及文字粘贴;同时覆盖图片撤销/重做、XMind 导出嵌入资源和标题/备注不拦截。TypeScript 与本轮文件 Biome 检查通过。正式账号上传接口未在此轮实测。 + +## 2026-10-05 原生标记面板与文件往返 + +- 原先采用少量系统 Emoji 代替原生标记,大部分标记不能导出;旧面板在 240px 侧栏中使用固定宽度网格,会溢出。现使用安装包的标记目录、原生 SVG/PNG 和标记入口图标,默认显示标签、优先级、任务、旗帜、星星、人像、符号 7 组 58 个标记。 +- 提取客户端目录中的 219 份标记资源,包含 197 个不同 ID;共享 ID 按客户端目录顺序解析。搜索可查找隐藏标记,“更多标记”展示完整目录,并用于旧文档导入显示。资源来源和哈希记录在 `public/icons/xmind/markers/`。 +- 选中主题后添加标记,同组替换,再次点击移除;多选显示混合状态,点击后为全部选中主题应用同一值。批量修改和清空各作为一次撤销操作。清空同时移除保留的未知原生标记,撤销可恢复;普通自定义 Emoji 不受影响。 +- 标记在主题上以客户端图标呈现,支持 XMind 导入导出。未识别的 ID 继续作为元数据保留,不能宣称所有第三方自定义标记都可显示。贴纸、插画、自定义标记库及图例交互仍未实现;原先禁用的占位页签已移除。 +- 3 项标记浏览器测试覆盖面板尺寸、实际图标加载、增删替换、清空、批量撤销/重做、搜索和更多标记;2 项数据测试覆盖全部目录资源存在、197 个 ID 文件往返及旧 Emoji 兼容。TypeScript 与本轮文件的 Biome 检查通过。 +- 连续操作发现成功提示会盖住顶部插入菜单;将白板内的提示移至底部,并取消清空标记后的遮挡提示。图片粘贴用例等待画布字体加载后再操作,避免加载中的坐标变化影响双击。 diff --git a/docs/XMind-复刻功能对照.md b/docs/XMind-复刻功能对照.md index fe883ab16..1df2b8ba6 100644 --- a/docs/XMind-复刻功能对照.md +++ b/docs/XMind-复刻功能对照.md @@ -18,7 +18,7 @@ | 联系线 | 基础 | 控制点编辑、箭头、虚线、复杂布局、双向联系 | | 外框 | 基础 | 标题、全形状、嵌套、填充、范围调整 | | 概要 | 基础 | 范围调整、多重概要、完整样式 | -| 图标/标记、贴纸 | 部分标记 | 全标记映射、自定义图标、贴纸库 | +| 图标/标记、贴纸 | 原生标记可用,贴纸/插画待实现 | 自定义标记、图例交互及贴纸/插画库 | | 备注、外链、主题链接、标签 | 基础 | 已验证纯文本备注、标签和外链编辑、撤销、工作表切换、快照序列化;同画布链接可展开折叠分支定位。待补富文本备注、跨画布链接、画布内容标识、真实云端保存重载 | | 图片、附件、音频、公式 | 部分支持 | 新旧 XMind 内嵌 PNG/JPEG/GIF/WebP 导入;附件新增/替换/下载/移除/撤销。待补 SVG、音频、公式、资源导出和真实样本覆盖 | | 任务、待办、进度、日期、负责人、甘特图 | 待实现 | 任务模型、视图和筛选,不能用普通图标替代 | diff --git a/lib/flow-board/xmind-export.ts b/lib/flow-board/xmind-export.ts index 32310716a..832051bc7 100644 --- a/lib/flow-board/xmind-export.ts +++ b/lib/flow-board/xmind-export.ts @@ -1,3 +1,4 @@ +import { getXmindMarker } from "./xmind-markers"; import type { PlaitElement } from "@plait/core"; import { getTopicDetails, @@ -33,15 +34,6 @@ const layouts: Record = { "right-bottom-indented": "org.xmind.ui.tree.right", "left-bottom-indented": "org.xmind.ui.tree.left", }; -const markerIds: Record = { - "✅": "task-done", - "▶️": "task-start", - "🚩": "flag-red", - "⭐": "star-red", - ...Object.fromEntries( - [1, 2, 3, 4, 5, 6, 7].map((n) => [`${n}️⃣`, `priority-${n}`]) - ), -}; const summary = (element: PlaitElement) => Number.isInteger(element.start) && Number.isInteger(element.end); function textOf(value: unknown): string { @@ -192,7 +184,7 @@ export async function exportXmind( if (details.labels.length) topic.labels = details.labels; const markerSet = new Set(); for (const emoji of array(data.emojis)) { - const marker = markerIds[String(emoji.name)]; + const marker = getXmindMarker(String(emoji.name))?.id; if (marker) markerSet.add(marker); else warnings.add("部分自定义图标尚不能写入 XMind 标记"); } @@ -200,7 +192,7 @@ export async function exportXmind( for (const marker of array(metadata.markers)) if ( typeof marker.markerId === "string" && - !Object.values(markerIds).includes(marker.markerId) + !getXmindMarker(marker.markerId) ) markerSet.add(marker.markerId); if (markerSet.size) diff --git a/lib/flow-board/xmind-import.ts b/lib/flow-board/xmind-import.ts index 64bea43aa..d6398d81e 100644 --- a/lib/flow-board/xmind-import.ts +++ b/lib/flow-board/xmind-import.ts @@ -1,4 +1,5 @@ import type JSZip from "jszip"; +import { getXmindMarker, xmindMarkerName } from "./xmind-markers"; import { getTopicEntries } from "./topic-details"; import { SPECIAL_MIND_LAYOUTS, @@ -345,18 +346,7 @@ function convertSheets(sheets: Data[], fallbackTitle: string): ImportedMindMap { const emojis: string[] = []; for (const marker of list(topic.markers)) { const id = text(marker.markerId); - const priority = id.match(/^priority-([1-7])$/); - const mapped = priority - ? `${priority[1]}️⃣` - : ( - { - "task-done": "✅", - "task-start": "▶️", - "flag-red": "🚩", - "star-red": "⭐", - } as Record - )[id]; - if (mapped) emojis.push(mapped); + if (getXmindMarker(id)) emojis.push(xmindMarkerName(id)); else warnings.add("部分图标已保留为数据,暂不显示"); } if (emojis.length) diff --git a/lib/flow-board/xmind-marker-catalog.json b/lib/flow-board/xmind-marker-catalog.json new file mode 100644 index 000000000..28750ffa6 --- /dev/null +++ b/lib/flow-board/xmind-marker-catalog.json @@ -0,0 +1,1428 @@ +[ + { + "id": "tagMarkers", + "label": "标签", + "hidden": false, + "markers": [ + { + "id": "tag-red", + "name": "红色", + "asset": "/icons/xmind/markers/tagMarkers/tag-red.svg", + "hidden": false + }, + { + "id": "tag-orange", + "name": "橙色", + "asset": "/icons/xmind/markers/tagMarkers/tag-orange.svg", + "hidden": false + }, + { + "id": "tag-yellow", + "name": "黄色", + "asset": "/icons/xmind/markers/tagMarkers/tag-yellow.svg", + "hidden": false + }, + { + "id": "tag-green", + "name": "绿色", + "asset": "/icons/xmind/markers/tagMarkers/tag-green.svg", + "hidden": false + }, + { + "id": "tag-blue", + "name": "蓝色", + "asset": "/icons/xmind/markers/tagMarkers/tag-blue.svg", + "hidden": false + }, + { + "id": "tag-dark-purple", + "name": "深紫色", + "asset": "/icons/xmind/markers/tagMarkers/tag-dark-purple.svg", + "hidden": false + }, + { + "id": "tag-grey", + "name": "灰色", + "asset": "/icons/xmind/markers/tagMarkers/tag-grey.svg", + "hidden": false + }, + { + "id": "tag-dark-blue", + "name": "深蓝色", + "asset": "/icons/xmind/markers/tagMarkers/tag-dark-blue.svg", + "hidden": true + } + ] + }, + { + "id": "priorityMarkers", + "label": "优先级", + "hidden": false, + "markers": [ + { + "id": "priority-1", + "name": "优先级 1", + "asset": "/icons/xmind/markers/priorityMarkers/priority-1.svg", + "hidden": false + }, + { + "id": "priority-2", + "name": "优先级 2", + "asset": "/icons/xmind/markers/priorityMarkers/priority-2.svg", + "hidden": false + }, + { + "id": "priority-3", + "name": "优先级 3", + "asset": "/icons/xmind/markers/priorityMarkers/priority-3.svg", + "hidden": false + }, + { + "id": "priority-4", + "name": "优先级 4", + "asset": "/icons/xmind/markers/priorityMarkers/priority-4.svg", + "hidden": false + }, + { + "id": "priority-5", + "name": "优先级 5", + "asset": "/icons/xmind/markers/priorityMarkers/priority-5.svg", + "hidden": false + }, + { + "id": "priority-6", + "name": "优先级 6", + "asset": "/icons/xmind/markers/priorityMarkers/priority-6.svg", + "hidden": false + }, + { + "id": "priority-7", + "name": "优先级 7", + "asset": "/icons/xmind/markers/priorityMarkers/priority-7.svg", + "hidden": false + }, + { + "id": "priority-8", + "name": "优先级 8", + "asset": "/icons/xmind/markers/priorityMarkers/priority-8.svg", + "hidden": true + }, + { + "id": "priority-9", + "name": "优先级 9", + "asset": "/icons/xmind/markers/priorityMarkers/priority-9.svg", + "hidden": true + } + ] + }, + { + "id": "taskMarkers", + "label": "任务", + "hidden": false, + "markers": [ + { + "id": "task-start", + "name": "未开始", + "asset": "/icons/xmind/markers/taskMarkers/task-start.svg", + "hidden": false + }, + { + "id": "task-oct", + "name": "进度 12.5%", + "asset": "/icons/xmind/markers/taskMarkers/task-oct.svg", + "hidden": false + }, + { + "id": "task-quarter", + "name": "进度 25%", + "asset": "/icons/xmind/markers/taskMarkers/task-quarter.svg", + "hidden": true + }, + { + "id": "task-3oct", + "name": "进度 37.5%", + "asset": "/icons/xmind/markers/taskMarkers/task-3oct.svg", + "hidden": false + }, + { + "id": "task-half", + "name": "进度 50%", + "asset": "/icons/xmind/markers/taskMarkers/task-half.svg", + "hidden": false + }, + { + "id": "task-5oct", + "name": "进度 62.5%", + "asset": "/icons/xmind/markers/taskMarkers/task-5oct.svg", + "hidden": false + }, + { + "id": "task-3quar", + "name": "进度 75%", + "asset": "/icons/xmind/markers/taskMarkers/task-3quar.svg", + "hidden": true + }, + { + "id": "task-7oct", + "name": "进度 87.5%", + "asset": "/icons/xmind/markers/taskMarkers/task-7oct.svg", + "hidden": false + }, + { + "id": "task-done", + "name": "完成", + "asset": "/icons/xmind/markers/taskMarkers/task-done.svg", + "hidden": false + }, + { + "id": "task-pause", + "name": "暂停", + "asset": "/icons/xmind/markers/taskMarkers/task-pause.png", + "hidden": true + } + ] + }, + { + "id": "flagMarkers", + "label": "旗帜", + "hidden": false, + "markers": [ + { + "id": "flag-red", + "name": "红色", + "asset": "/icons/xmind/markers/flagMarkers/flag-red.svg", + "hidden": false + }, + { + "id": "flag-orange", + "name": "橙色", + "asset": "/icons/xmind/markers/flagMarkers/flag-orange.svg", + "hidden": false + }, + { + "id": "flag-yellow", + "name": "黄色", + "asset": "/icons/xmind/markers/flagMarkers/flag-yellow.svg", + "hidden": false + }, + { + "id": "flag-green", + "name": "绿色", + "asset": "/icons/xmind/markers/flagMarkers/flag-green.svg", + "hidden": false + }, + { + "id": "flag-blue", + "name": "蓝色", + "asset": "/icons/xmind/markers/flagMarkers/flag-blue.svg", + "hidden": false + }, + { + "id": "flag-purple", + "name": "紫色", + "asset": "/icons/xmind/markers/flagMarkers/flag-purple.svg", + "hidden": false + }, + { + "id": "flag-gray", + "name": "灰色", + "asset": "/icons/xmind/markers/flagMarkers/flag-gray.svg", + "hidden": false + }, + { + "id": "flag-dark-blue", + "name": "深蓝色", + "asset": "/icons/xmind/markers/flagMarkers/flag-dark-blue.svg", + "hidden": true + }, + { + "id": "flag-dark-green", + "name": "深绿色", + "asset": "/icons/xmind/markers/flagMarkers/flag-dark-green.svg", + "hidden": true + }, + { + "id": "flag-dark-gray", + "name": "深灰色", + "asset": "/icons/xmind/markers/flagMarkers/flag-dark-gray.svg", + "hidden": true + } + ] + }, + { + "id": "starMarkers", + "label": "星星", + "hidden": false, + "markers": [ + { + "id": "star-red", + "name": "红色", + "asset": "/icons/xmind/markers/starMarkers/star-red.svg", + "hidden": false + }, + { + "id": "star-orange", + "name": "橙色", + "asset": "/icons/xmind/markers/starMarkers/star-orange.svg", + "hidden": false + }, + { + "id": "star-yellow", + "name": "黄色", + "asset": "/icons/xmind/markers/starMarkers/star-yellow.svg", + "hidden": false + }, + { + "id": "star-green", + "name": "绿色", + "asset": "/icons/xmind/markers/starMarkers/star-green.svg", + "hidden": false + }, + { + "id": "star-blue", + "name": "蓝色", + "asset": "/icons/xmind/markers/starMarkers/star-blue.svg", + "hidden": false + }, + { + "id": "star-purple", + "name": "紫色", + "asset": "/icons/xmind/markers/starMarkers/star-purple.svg", + "hidden": false + }, + { + "id": "star-gray", + "name": "灰色", + "asset": "/icons/xmind/markers/starMarkers/star-gray.svg", + "hidden": false + }, + { + "id": "star-dark-blue", + "name": "深蓝色", + "asset": "/icons/xmind/markers/starMarkers/star-dark-blue.svg", + "hidden": true + }, + { + "id": "star-dark-green", + "name": "深绿色", + "asset": "/icons/xmind/markers/starMarkers/star-dark-green.svg", + "hidden": true + }, + { + "id": "star-dark-gray", + "name": "深灰色", + "asset": "/icons/xmind/markers/starMarkers/star-dark-gray.svg", + "hidden": true + } + ] + }, + { + "id": "peopleMarkers", + "label": "人像", + "hidden": false, + "markers": [ + { + "id": "people-red", + "name": "红色", + "asset": "/icons/xmind/markers/peopleMarkers/people-red.svg", + "hidden": false + }, + { + "id": "people-orange", + "name": "橙色", + "asset": "/icons/xmind/markers/peopleMarkers/people-orange.svg", + "hidden": false + }, + { + "id": "people-yellow", + "name": "黄色", + "asset": "/icons/xmind/markers/peopleMarkers/people-yellow.svg", + "hidden": false + }, + { + "id": "people-green", + "name": "绿色", + "asset": "/icons/xmind/markers/peopleMarkers/people-green.svg", + "hidden": false + }, + { + "id": "people-blue", + "name": "蓝色", + "asset": "/icons/xmind/markers/peopleMarkers/people-blue.svg", + "hidden": false + }, + { + "id": "people-purple", + "name": "紫色", + "asset": "/icons/xmind/markers/peopleMarkers/people-purple.svg", + "hidden": false + }, + { + "id": "people-gray", + "name": "灰色", + "asset": "/icons/xmind/markers/peopleMarkers/people-gray.svg", + "hidden": false + }, + { + "id": "people-dark-blue", + "name": "深蓝色", + "asset": "/icons/xmind/markers/peopleMarkers/people-dark-blue.svg", + "hidden": true + }, + { + "id": "people-dark-green", + "name": "深绿色", + "asset": "/icons/xmind/markers/peopleMarkers/people-dark-green.svg", + "hidden": true + }, + { + "id": "people-dark-gray", + "name": "深灰色", + "asset": "/icons/xmind/markers/peopleMarkers/people-dark-gray.svg", + "hidden": true + } + ] + }, + { + "id": "symbolMarkers", + "label": "符号", + "hidden": false, + "markers": [ + { + "id": "c_symbol_heart", + "name": "喜欢", + "asset": "/icons/xmind/markers/symbolMarkers/c_symbol_heart.svg", + "hidden": false + }, + { + "id": "c_symbol_like", + "name": "赞", + "asset": "/icons/xmind/markers/symbolMarkers/c_symbol_like.svg", + "hidden": false + }, + { + "id": "c_symbol_dislike", + "name": "不赞", + "asset": "/icons/xmind/markers/symbolMarkers/c_symbol_dislike.svg", + "hidden": false + }, + { + "id": "symbol-pin", + "name": "固定", + "asset": "/icons/xmind/markers/symbolMarkers/symbol-pin.svg", + "hidden": false + }, + { + "id": "symbol-idea", + "name": "想法", + "asset": "/icons/xmind/markers/symbolMarkers/symbol-idea.svg", + "hidden": false + }, + { + "id": "symbol-lightning", + "name": "闪电", + "asset": "/icons/xmind/markers/symbolMarkers/symbol-lightning.svg", + "hidden": false + }, + { + "id": "c_symbol_hourglass", + "name": "沙漏", + "asset": "/icons/xmind/markers/symbolMarkers/c_symbol_hourglass.svg", + "hidden": false + }, + { + "id": "c_symbol_telephone", + "name": "c_symbol_telephone", + "asset": "/icons/xmind/markers/symbolMarkers/c_symbol_telephone.svg", + "hidden": false + }, + { + "id": "c_symbol_pen", + "name": "笔", + "asset": "/icons/xmind/markers/symbolMarkers/c_symbol_pen.svg", + "hidden": false + }, + { + "id": "c_symbol_music", + "name": "音乐", + "asset": "/icons/xmind/markers/symbolMarkers/c_symbol_music.svg", + "hidden": false + }, + { + "id": "symbol-entertainment", + "name": "娱乐", + "asset": "/icons/xmind/markers/symbolMarkers/symbol-entertainment.svg", + "hidden": false + }, + { + "id": "symbol-100", + "name": "百分百", + "asset": "/icons/xmind/markers/symbolMarkers/symbol-100.svg", + "hidden": false + }, + { + "id": "c_symbol_flight", + "name": "航班", + "asset": "/icons/xmind/markers/symbolMarkers/c_symbol_flight.svg", + "hidden": false + }, + { + "id": "symbol-run", + "name": "运行", + "asset": "/icons/xmind/markers/symbolMarkers/symbol-run.svg", + "hidden": false + }, + { + "id": "symbol-exclam", + "name": "注意", + "asset": "/icons/xmind/markers/symbolMarkers/symbol-exclam.svg", + "hidden": false + }, + { + "id": "symbol-question", + "name": "疑问", + "asset": "/icons/xmind/markers/symbolMarkers/symbol-question.svg", + "hidden": false + }, + { + "id": "symbol-plus", + "name": "加号", + "asset": "/icons/xmind/markers/symbolMarkers/symbol-plus.svg", + "hidden": true + }, + { + "id": "symbol-minus", + "name": "减号", + "asset": "/icons/xmind/markers/symbolMarkers/symbol-minus.svg", + "hidden": true + }, + { + "id": "symbol-info", + "name": "信息", + "asset": "/icons/xmind/markers/symbolMarkers/symbol-info.svg", + "hidden": true + }, + { + "id": "symbol-attention", + "name": "提醒", + "asset": "/icons/xmind/markers/symbolMarkers/symbol-attention.svg", + "hidden": true + }, + { + "id": "symbol-wrong", + "name": "错误", + "asset": "/icons/xmind/markers/symbolMarkers/symbol-wrong.svg", + "hidden": true + }, + { + "id": "symbol-right", + "name": "正确", + "asset": "/icons/xmind/markers/symbolMarkers/symbol-right.svg", + "hidden": true + }, + { + "id": "symbol-pause", + "name": "暂停", + "asset": "/icons/xmind/markers/symbolMarkers/symbol-pause.svg", + "hidden": true + }, + { + "id": "c_simbol-plus", + "name": "加号", + "asset": "/icons/xmind/markers/symbolMarkers/c_simbol-plus.svg", + "hidden": true + }, + { + "id": "c_simbol-minus", + "name": "减号", + "asset": "/icons/xmind/markers/symbolMarkers/c_simbol-minus.svg", + "hidden": true + }, + { + "id": "c_simbol-question", + "name": "疑问", + "asset": "/icons/xmind/markers/symbolMarkers/c_simbol-question.svg", + "hidden": true + }, + { + "id": "c_simbol-info", + "name": "信息", + "asset": "/icons/xmind/markers/symbolMarkers/c_simbol-info.svg", + "hidden": true + }, + { + "id": "c_simbol-wrong", + "name": "错误", + "asset": "/icons/xmind/markers/symbolMarkers/c_simbol-wrong.svg", + "hidden": true + }, + { + "id": "c_simbol-right", + "name": "正确", + "asset": "/icons/xmind/markers/symbolMarkers/c_simbol-right.svg", + "hidden": true + }, + { + "id": "c_simbol-pause", + "name": "暂停", + "asset": "/icons/xmind/markers/symbolMarkers/c_simbol-pause.svg", + "hidden": true + }, + { + "id": "c_symbol_contact", + "name": "联系人", + "asset": "/icons/xmind/markers/symbolMarkers/c_symbol_contact.svg", + "hidden": true + }, + { + "id": "c_symbol_drink", + "name": "饮料", + "asset": "/icons/xmind/markers/symbolMarkers/c_symbol_drink.svg", + "hidden": true + }, + { + "id": "c_symbol_line_graph", + "name": "折线图", + "asset": "/icons/xmind/markers/symbolMarkers/c_symbol_line_graph.svg", + "hidden": true + }, + { + "id": "c_symbol_medals", + "name": "奖牌", + "asset": "/icons/xmind/markers/symbolMarkers/c_symbol_medals.svg", + "hidden": true + }, + { + "id": "c_symbol_thermometer", + "name": "温度", + "asset": "/icons/xmind/markers/symbolMarkers/c_symbol_thermometer.svg", + "hidden": true + }, + { + "id": "c_symbol_money", + "name": "金钱", + "asset": "/icons/xmind/markers/symbolMarkers/c_symbol_money.svg", + "hidden": true + }, + { + "id": "c_symbol_bar_chart", + "name": "柱状图", + "asset": "/icons/xmind/markers/symbolMarkers/c_symbol_bar_chart.svg", + "hidden": true + }, + { + "id": "c_simbol-exclam", + "name": "注意", + "asset": "/icons/xmind/markers/symbolMarkers/c_simbol-exclam.svg", + "hidden": true + }, + { + "id": "c_symbol_pie_chart", + "name": "饼图", + "asset": "/icons/xmind/markers/symbolMarkers/c_symbol_pie_chart.svg", + "hidden": true + }, + { + "id": "c_symbol_shopping_cart", + "name": "购物", + "asset": "/icons/xmind/markers/symbolMarkers/c_symbol_shopping_cart.svg", + "hidden": true + }, + { + "id": "c_symbol_exercise", + "name": "运动", + "asset": "/icons/xmind/markers/symbolMarkers/c_symbol_exercise.svg", + "hidden": true + }, + { + "id": "c_symbol_trophy", + "name": "奖杯", + "asset": "/icons/xmind/markers/symbolMarkers/c_symbol_trophy.svg", + "hidden": true + }, + { + "id": "symbol-unlock", + "name": "解锁", + "asset": "/icons/xmind/markers/symbolMarkers/symbol-unlock.svg", + "hidden": true + }, + { + "id": "c_symbol_lock", + "name": "锁定", + "asset": "/icons/xmind/markers/symbolMarkers/c_symbol_lock.svg", + "hidden": true + }, + { + "id": "symbol-diamond", + "name": "钻石", + "asset": "/icons/xmind/markers/symbolMarkers/symbol-diamond.svg", + "hidden": true + } + ] + }, + { + "id": "smileyMarkers", + "label": "情绪", + "hidden": true, + "markers": [ + { + "id": "smiley-laugh", + "name": "smiley-laugh", + "asset": "/icons/xmind/markers/smileyMarkers/smiley-laugh.svg", + "hidden": false + }, + { + "id": "smiley-smile", + "name": "smiley-smile", + "asset": "/icons/xmind/markers/smileyMarkers/smiley-smile.svg", + "hidden": false + }, + { + "id": "smiley-cry", + "name": "smiley-cry", + "asset": "/icons/xmind/markers/smileyMarkers/smiley-cry.svg", + "hidden": false + }, + { + "id": "smiley-surprise", + "name": "smiley-surprise", + "asset": "/icons/xmind/markers/smileyMarkers/smiley-surprise.svg", + "hidden": false + }, + { + "id": "smiley-boring", + "name": "smiley-boring", + "asset": "/icons/xmind/markers/smileyMarkers/smiley-boring.svg", + "hidden": false + }, + { + "id": "smiley-angry", + "name": "smiley-angry", + "asset": "/icons/xmind/markers/smileyMarkers/smiley-angry.svg", + "hidden": false + }, + { + "id": "smiley-embarrass", + "name": "smiley-embarrass", + "asset": "/icons/xmind/markers/smileyMarkers/smiley-embarrass.svg", + "hidden": false + }, + { + "id": "smiley-think", + "name": "smiley-think", + "asset": "/icons/xmind/markers/smileyMarkers/smiley-think.svg", + "hidden": false + }, + { + "id": "smiley-love", + "name": "smiley-love", + "asset": "/icons/xmind/markers/smileyMarkers/smiley-love.svg", + "hidden": false + }, + { + "id": "smiley-sad", + "name": "smiley-sad", + "asset": "/icons/xmind/markers/smileyMarkers/smiley-sad.svg", + "hidden": false + }, + { + "id": "smiley-cry-laugh", + "name": "smiley-cry-laugh", + "asset": "/icons/xmind/markers/smileyMarkers/smiley-cry-laugh.svg", + "hidden": false + }, + { + "id": "smiley-adore", + "name": "smiley-adore", + "asset": "/icons/xmind/markers/smileyMarkers/smiley-adore.svg", + "hidden": false + }, + { + "id": "smiley-devil", + "name": "smiley-devil", + "asset": "/icons/xmind/markers/smileyMarkers/smiley-devil.svg", + "hidden": false + }, + { + "id": "smiley-upset", + "name": "smiley-upset", + "asset": "/icons/xmind/markers/smileyMarkers/smiley-upset.svg", + "hidden": false + } + ] + }, + { + "id": "arrowMarkers", + "label": "箭头", + "hidden": true, + "markers": [ + { + "id": "arrow-left", + "name": "arrow-left", + "asset": "/icons/xmind/markers/arrowMarkers/arrow-left.svg", + "hidden": false + }, + { + "id": "arrow-right", + "name": "arrow-right", + "asset": "/icons/xmind/markers/arrowMarkers/arrow-right.svg", + "hidden": false + }, + { + "id": "arrow-up", + "name": "arrow-up", + "asset": "/icons/xmind/markers/arrowMarkers/arrow-up.svg", + "hidden": false + }, + { + "id": "arrow-down", + "name": "arrow-down", + "asset": "/icons/xmind/markers/arrowMarkers/arrow-down.svg", + "hidden": false + }, + { + "id": "arrow-left-right", + "name": "arrow-left-right", + "asset": "/icons/xmind/markers/arrowMarkers/arrow-left-right.svg", + "hidden": false + }, + { + "id": "arrow-up-down", + "name": "arrow-up-down", + "asset": "/icons/xmind/markers/arrowMarkers/arrow-up-down.svg", + "hidden": false + }, + { + "id": "arrow-refresh", + "name": "arrow-refresh", + "asset": "/icons/xmind/markers/arrowMarkers/arrow-refresh.svg", + "hidden": false + }, + { + "id": "arrow-up-right", + "name": "arrow-up-right", + "asset": "/icons/xmind/markers/arrowMarkers/arrow-up-right.svg", + "hidden": true + }, + { + "id": "arrow-down-right", + "name": "arrow-down-right", + "asset": "/icons/xmind/markers/arrowMarkers/arrow-down-right.svg", + "hidden": true + }, + { + "id": "arrow-down-left", + "name": "arrow-down-left", + "asset": "/icons/xmind/markers/arrowMarkers/arrow-down-left.svg", + "hidden": true + }, + { + "id": "arrow-up-left", + "name": "arrow-up-left", + "asset": "/icons/xmind/markers/arrowMarkers/arrow-up-left.svg", + "hidden": true + } + ] + }, + { + "id": "academicMarkers", + "label": "学术", + "hidden": true, + "markers": [ + { + "id": "c_symbol_quote", + "name": "c_symbol_quote", + "asset": "/icons/xmind/markers/academicMarkers/c_symbol_quote.svg", + "hidden": false + }, + { + "id": "c_symbol_apostrophe", + "name": "c_symbol_apostrophe", + "asset": "/icons/xmind/markers/academicMarkers/c_symbol_apostrophe.svg", + "hidden": false + }, + { + "id": "symbol-question", + "name": "疑问", + "asset": "/icons/xmind/markers/academicMarkers/symbol-question.svg", + "hidden": false + }, + { + "id": "symbol-attention", + "name": "提醒", + "asset": "/icons/xmind/markers/academicMarkers/symbol-attention.svg", + "hidden": false + }, + { + "id": "symbol-pause", + "name": "暂停", + "asset": "/icons/xmind/markers/academicMarkers/symbol-pause.svg", + "hidden": false + }, + { + "id": "symbol-wrong", + "name": "错误", + "asset": "/icons/xmind/markers/academicMarkers/symbol-wrong.svg", + "hidden": false + }, + { + "id": "symbol-about", + "name": "symbol-about", + "asset": "/icons/xmind/markers/academicMarkers/symbol-about.svg", + "hidden": false + }, + { + "id": "symbol-plus", + "name": "加号", + "asset": "/icons/xmind/markers/academicMarkers/symbol-plus.svg", + "hidden": false + }, + { + "id": "symbol-minus", + "name": "减号", + "asset": "/icons/xmind/markers/academicMarkers/symbol-minus.svg", + "hidden": false + }, + { + "id": "symbol-divide", + "name": "symbol-divide", + "asset": "/icons/xmind/markers/academicMarkers/symbol-divide.svg", + "hidden": false + }, + { + "id": "symbol-equality", + "name": "symbol-equality", + "asset": "/icons/xmind/markers/academicMarkers/symbol-equality.svg", + "hidden": false + }, + { + "id": "symbol-right", + "name": "正确", + "asset": "/icons/xmind/markers/academicMarkers/symbol-right.svg", + "hidden": false + }, + { + "id": "symbol-code", + "name": "symbol-code", + "asset": "/icons/xmind/markers/academicMarkers/symbol-code.svg", + "hidden": false + }, + { + "id": "symbol-not-equality", + "name": "symbol-not-equality", + "asset": "/icons/xmind/markers/academicMarkers/symbol-not-equality.svg", + "hidden": false + } + ] + }, + { + "id": "socialMarkers", + "label": "社交", + "hidden": true, + "markers": [ + { + "id": "c_symbol_broken_heart", + "name": "c_symbol_broken_heart", + "asset": "/icons/xmind/markers/socialMarkers/c_symbol_broken_heart.svg", + "hidden": false + }, + { + "id": "c_symbol_contact", + "name": "c_symbol_contact", + "asset": "/icons/xmind/markers/socialMarkers/c_symbol_contact.svg", + "hidden": false + }, + { + "id": "symbol-no-entry", + "name": "symbol-no-entry", + "asset": "/icons/xmind/markers/socialMarkers/symbol-no-entry.svg", + "hidden": false + }, + { + "id": "symbol-notice", + "name": "symbol-notice", + "asset": "/icons/xmind/markers/socialMarkers/symbol-notice.svg", + "hidden": false + }, + { + "id": "symbol-rss", + "name": "symbol-rss", + "asset": "/icons/xmind/markers/socialMarkers/symbol-rss.svg", + "hidden": false + }, + { + "id": "symbol_forward", + "name": "symbol_forward", + "asset": "/icons/xmind/markers/socialMarkers/symbol_forward.svg", + "hidden": false + }, + { + "id": "symbol-share", + "name": "symbol-share", + "asset": "/icons/xmind/markers/socialMarkers/symbol-share.svg", + "hidden": false + }, + { + "id": "symbol-comment", + "name": "symbol-comment", + "asset": "/icons/xmind/markers/socialMarkers/symbol-comment.svg", + "hidden": false + } + ] + }, + { + "id": "celebrationMarkers", + "label": "庆祝", + "hidden": true, + "markers": [ + { + "id": "celebration-ribbon", + "name": "celebration-ribbon", + "asset": "/icons/xmind/markers/celebrationMarkers/celebration-ribbon.svg", + "hidden": true + }, + { + "id": "celebration-clap", + "name": "celebration-clap", + "asset": "/icons/xmind/markers/celebrationMarkers/celebration-clap.svg", + "hidden": true + }, + { + "id": "celebration-100", + "name": "celebration-100", + "asset": "/icons/xmind/markers/celebrationMarkers/celebration-100.svg", + "hidden": true + }, + { + "id": "celebration-birthday", + "name": "celebration-birthday", + "asset": "/icons/xmind/markers/celebrationMarkers/celebration-birthday.svg", + "hidden": true + }, + { + "id": "celebration-king", + "name": "celebration-king", + "asset": "/icons/xmind/markers/celebrationMarkers/celebration-king.svg", + "hidden": true + }, + { + "id": "celebration-cheers", + "name": "celebration-cheers", + "asset": "/icons/xmind/markers/celebrationMarkers/celebration-cheers.svg", + "hidden": true + }, + { + "id": "celebration-boom", + "name": "celebration-boom", + "asset": "/icons/xmind/markers/celebrationMarkers/celebration-boom.svg", + "hidden": true + }, + { + "id": "celebration-kiss", + "name": "celebration-kiss", + "asset": "/icons/xmind/markers/celebrationMarkers/celebration-kiss.svg", + "hidden": true + }, + { + "id": "celebration-five", + "name": "celebration-five", + "asset": "/icons/xmind/markers/celebrationMarkers/celebration-five.svg", + "hidden": true + } + ] + }, + { + "id": "monthMarkers", + "label": "月份", + "hidden": true, + "markers": [ + { + "id": "month-jan", + "name": "month-jan", + "asset": "/icons/xmind/markers/monthMarkers/month-jan.svg", + "hidden": false + }, + { + "id": "month-feb", + "name": "month-feb", + "asset": "/icons/xmind/markers/monthMarkers/month-feb.svg", + "hidden": false + }, + { + "id": "month-mar", + "name": "month-mar", + "asset": "/icons/xmind/markers/monthMarkers/month-mar.svg", + "hidden": false + }, + { + "id": "month-apr", + "name": "month-apr", + "asset": "/icons/xmind/markers/monthMarkers/month-apr.svg", + "hidden": false + }, + { + "id": "month-may", + "name": "month-may", + "asset": "/icons/xmind/markers/monthMarkers/month-may.svg", + "hidden": false + }, + { + "id": "month-jun", + "name": "month-jun", + "asset": "/icons/xmind/markers/monthMarkers/month-jun.svg", + "hidden": false + }, + { + "id": "month-jul", + "name": "month-jul", + "asset": "/icons/xmind/markers/monthMarkers/month-jul.svg", + "hidden": false + }, + { + "id": "month-aug", + "name": "month-aug", + "asset": "/icons/xmind/markers/monthMarkers/month-aug.svg", + "hidden": false + }, + { + "id": "month-sep", + "name": "month-sep", + "asset": "/icons/xmind/markers/monthMarkers/month-sep.svg", + "hidden": false + }, + { + "id": "month-oct", + "name": "month-oct", + "asset": "/icons/xmind/markers/monthMarkers/month-oct.svg", + "hidden": false + }, + { + "id": "month-nov", + "name": "month-nov", + "asset": "/icons/xmind/markers/monthMarkers/month-nov.svg", + "hidden": false + }, + { + "id": "month-dec", + "name": "month-dec", + "asset": "/icons/xmind/markers/monthMarkers/month-dec.svg", + "hidden": false + } + ] + }, + { + "id": "weekMarkers", + "label": "星期", + "hidden": true, + "markers": [ + { + "id": "week-sun", + "name": "week-sun", + "asset": "/icons/xmind/markers/weekMarkers/week-sun.svg", + "hidden": false + }, + { + "id": "week-mon", + "name": "week-mon", + "asset": "/icons/xmind/markers/weekMarkers/week-mon.svg", + "hidden": false + }, + { + "id": "week-tue", + "name": "week-tue", + "asset": "/icons/xmind/markers/weekMarkers/week-tue.svg", + "hidden": false + }, + { + "id": "week-wed", + "name": "week-wed", + "asset": "/icons/xmind/markers/weekMarkers/week-wed.svg", + "hidden": false + }, + { + "id": "week-thu", + "name": "week-thu", + "asset": "/icons/xmind/markers/weekMarkers/week-thu.svg", + "hidden": false + }, + { + "id": "week-fri", + "name": "week-fri", + "asset": "/icons/xmind/markers/weekMarkers/week-fri.svg", + "hidden": false + }, + { + "id": "week-sat", + "name": "week-sat", + "asset": "/icons/xmind/markers/weekMarkers/week-sat.svg", + "hidden": false + } + ] + }, + { + "id": "halfStarMarkers", + "label": "半星", + "hidden": true, + "markers": [ + { + "id": "half-star-green", + "name": "half-star-green", + "asset": "/icons/xmind/markers/halfStarMarkers/half-star-green.png", + "hidden": true + }, + { + "id": "half-star-red", + "name": "half-star-red", + "asset": "/icons/xmind/markers/halfStarMarkers/half-star-red.png", + "hidden": true + }, + { + "id": "half-star-yellow", + "name": "half-star-yellow", + "asset": "/icons/xmind/markers/halfStarMarkers/half-star-yellow.png", + "hidden": true + }, + { + "id": "half-star-purple", + "name": "half-star-purple", + "asset": "/icons/xmind/markers/halfStarMarkers/half-star-purple.png", + "hidden": true + }, + { + "id": "half-star-blue", + "name": "half-star-blue", + "asset": "/icons/xmind/markers/halfStarMarkers/half-star-blue.png", + "hidden": true + }, + { + "id": "half-star-gray", + "name": "half-star-gray", + "asset": "/icons/xmind/markers/halfStarMarkers/half-star-gray.png", + "hidden": true + } + ] + }, + { + "id": "otherMarkers", + "label": "其他", + "hidden": true, + "markers": [ + { + "id": "other-calendar", + "name": "other-calendar", + "asset": "/icons/xmind/markers/otherMarkers/other-calendar.png", + "hidden": true + }, + { + "id": "other-email", + "name": "other-email", + "asset": "/icons/xmind/markers/otherMarkers/other-email.png", + "hidden": true + }, + { + "id": "other-phone", + "name": "other-phone", + "asset": "/icons/xmind/markers/otherMarkers/other-phone.png", + "hidden": true + }, + { + "id": "other-phone2", + "name": "other-phone2", + "asset": "/icons/xmind/markers/otherMarkers/other-phone2.png", + "hidden": true + }, + { + "id": "other-fax", + "name": "other-fax", + "asset": "/icons/xmind/markers/otherMarkers/other-fax.png", + "hidden": true + }, + { + "id": "other-people", + "name": "other-people", + "asset": "/icons/xmind/markers/otherMarkers/other-people.png", + "hidden": true + }, + { + "id": "other-people2", + "name": "other-people2", + "asset": "/icons/xmind/markers/otherMarkers/other-people2.png", + "hidden": true + }, + { + "id": "other-clock", + "name": "other-clock", + "asset": "/icons/xmind/markers/otherMarkers/other-clock.png", + "hidden": true + }, + { + "id": "other-coffee-cup", + "name": "other-coffee-cup", + "asset": "/icons/xmind/markers/otherMarkers/other-coffee-cup.png", + "hidden": true + }, + { + "id": "other-question", + "name": "other-question", + "asset": "/icons/xmind/markers/otherMarkers/other-question.svg", + "hidden": true + }, + { + "id": "other-exclam", + "name": "other-exclam", + "asset": "/icons/xmind/markers/otherMarkers/other-exclam.svg", + "hidden": true + }, + { + "id": "other-lightbulb", + "name": "other-lightbulb", + "asset": "/icons/xmind/markers/otherMarkers/other-lightbulb.png", + "hidden": true + }, + { + "id": "other-businesscard", + "name": "other-businesscard", + "asset": "/icons/xmind/markers/otherMarkers/other-businesscard.png", + "hidden": true + }, + { + "id": "other-social", + "name": "other-social", + "asset": "/icons/xmind/markers/otherMarkers/other-social.png", + "hidden": true + }, + { + "id": "other-chat", + "name": "other-chat", + "asset": "/icons/xmind/markers/otherMarkers/other-chat.png", + "hidden": true + }, + { + "id": "other-note", + "name": "other-note", + "asset": "/icons/xmind/markers/otherMarkers/other-note.png", + "hidden": true + }, + { + "id": "other-lock", + "name": "other-lock", + "asset": "/icons/xmind/markers/otherMarkers/other-lock.png", + "hidden": true + }, + { + "id": "other-unlock", + "name": "other-unlock", + "asset": "/icons/xmind/markers/otherMarkers/other-unlock.png", + "hidden": true + }, + { + "id": "other-yes", + "name": "other-yes", + "asset": "/icons/xmind/markers/otherMarkers/other-yes.svg", + "hidden": true + }, + { + "id": "other-no", + "name": "other-no", + "asset": "/icons/xmind/markers/otherMarkers/other-no.svg", + "hidden": true + }, + { + "id": "other-bomb", + "name": "other-bomb", + "asset": "/icons/xmind/markers/otherMarkers/other-bomb.png", + "hidden": true + }, + { + "id": "symbol-info", + "name": "symbol-info", + "asset": "/icons/xmind/markers/otherMarkers/symbol-info.svg", + "hidden": true + }, + { + "id": "c_symbol_line_graph", + "name": "c_symbol_line_graph", + "asset": "/icons/xmind/markers/otherMarkers/c_symbol_line_graph.svg", + "hidden": true + }, + { + "id": "c_symbol_shopping_cart", + "name": "c_symbol_shopping_cart", + "asset": "/icons/xmind/markers/otherMarkers/c_symbol_shopping_cart.svg", + "hidden": true + }, + { + "id": "c_symbol_medals", + "name": "c_symbol_medals", + "asset": "/icons/xmind/markers/otherMarkers/c_symbol_medals.svg", + "hidden": true + }, + { + "id": "c_symbol_trophy", + "name": "c_symbol_trophy", + "asset": "/icons/xmind/markers/otherMarkers/c_symbol_trophy.svg", + "hidden": true + }, + { + "id": "symbol-image", + "name": "symbol-image", + "asset": "/icons/xmind/markers/otherMarkers/symbol-image.svg", + "hidden": true + }, + { + "id": "c_symbol_exercise", + "name": "c_symbol_exercise", + "asset": "/icons/xmind/markers/otherMarkers/c_symbol_exercise.svg", + "hidden": true + }, + { + "id": "c_simbol-plus", + "name": "c_simbol-plus", + "asset": "/icons/xmind/markers/otherMarkers/c_simbol-plus.svg", + "hidden": true + }, + { + "id": "c_simbol-minus", + "name": "c_simbol-minus", + "asset": "/icons/xmind/markers/otherMarkers/c_simbol-minus.svg", + "hidden": true + }, + { + "id": "c_simbol-question", + "name": "c_simbol-question", + "asset": "/icons/xmind/markers/otherMarkers/c_simbol-question.svg", + "hidden": true + }, + { + "id": "c_simbol-info", + "name": "c_simbol-info", + "asset": "/icons/xmind/markers/otherMarkers/c_simbol-info.svg", + "hidden": true + }, + { + "id": "c_simbol-wrong", + "name": "c_simbol-wrong", + "asset": "/icons/xmind/markers/otherMarkers/c_simbol-wrong.svg", + "hidden": true + }, + { + "id": "c_simbol-right", + "name": "c_simbol-right", + "asset": "/icons/xmind/markers/otherMarkers/c_simbol-right.svg", + "hidden": true + }, + { + "id": "c_simbol-pause", + "name": "c_simbol-pause", + "asset": "/icons/xmind/markers/otherMarkers/c_simbol-pause.svg", + "hidden": true + }, + { + "id": "c_symbol_thermometer", + "name": "c_symbol_thermometer", + "asset": "/icons/xmind/markers/otherMarkers/c_symbol_thermometer.svg", + "hidden": true + } + ] + } +] diff --git a/lib/flow-board/xmind-markers.ts b/lib/flow-board/xmind-markers.ts new file mode 100644 index 000000000..33c694a6c --- /dev/null +++ b/lib/flow-board/xmind-markers.ts @@ -0,0 +1,42 @@ +import catalog from "./xmind-marker-catalog.json" with { type: "json" }; + +export type XmindMarker = { id: string; name: string; asset: string; hidden: boolean }; +export type XmindMarkerGroup = { id: string; label: string; hidden: boolean; markers: XmindMarker[] }; +export const XMIND_MARKER_GROUPS: XmindMarkerGroup[] = catalog; +// The client resolves shared IDs to their first catalog entry. +const markers = new Map(); +for (const group of catalog) { + for (const marker of group.markers) { + if (!markers.has(marker.id)) markers.set(marker.id, { ...marker, groupId: group.id }); + } +} +const aliases: Record = { + "🔴": "tag-red", "🟠": "tag-orange", "🟡": "tag-yellow", "🟢": "tag-green", "🔵": "tag-blue", "🟣": "tag-dark-purple", "⚪": "tag-grey", + "✅": "task-done", "▶️": "task-start", "◔": "task-quarter", "◑": "task-half", "◕": "task-3quar", "🚧": "task-5oct", + "🚩": "flag-red", "⭐": "star-red", "🌟": "star-yellow", "👤": "people-blue", + "❗": "c_simbol-exclam", "❓": "c_simbol-question", "💡": "symbol-idea", "❤️": "c_symbol_heart", "⚡": "symbol-lightning", "📌": "symbol-pin", + ...Object.fromEntries(Array.from({ length: 9 }, (_, index) => [`${index + 1}️⃣`, `priority-${index + 1}`])), +}; + +export function getXmindMarker(name: string) { + return markers.get(name.startsWith("xmind:") ? name.slice(6) : aliases[name] || name); +} + +export function xmindMarkerName(id: string) { + return `xmind:${id}`; +} + +export function getXmindMarkerIds(emojis: { name: string }[] = []) { + return [...new Set(emojis.flatMap(emoji => { + const marker = getXmindMarker(emoji.name); + return marker ? [marker.id] : []; + }))]; +} + +/** Native markers are mutually exclusive within each group. Unrelated emoji stay intact. */ +export function toggleXmindMarker(emojis: { name: string }[], markerId: string, remove: boolean) { + const marker = getXmindMarker(markerId); + if (!marker) return emojis; + const remaining = emojis.filter(emoji => getXmindMarker(emoji.name)?.groupId !== marker.groupId); + return remove ? remaining : [...remaining, { name: xmindMarkerName(markerId) }]; +} diff --git a/public/icons/xmind/README.md b/public/icons/xmind/README.md index e011d83cf..327effa1f 100644 --- a/public/icons/xmind/README.md +++ b/public/icons/xmind/README.md @@ -14,3 +14,5 @@ | summary.svg | `1b1744acc95b53aca30c45263701a6b614784759d146bd0ad57bd99aff1c1ccc` | | topic.svg | `011c9c671caa4a936210d408aa0d28b992eb69f42599edba1c2ab099e32ee683` | | zen.svg | `03537495a95775356831ffd43ad3c29c63d9113f577eba70213110049a88c83e` | + +2026-10-05 新增客户端标记入口 `marker.svg`,SHA-256:`48e5cef2dd2e2a1320a832e110f6a20f145f4ac915b046f7f61023af565442d3`。完整标记资源及校验清单见 [标记资源](./markers/README.md)。 diff --git a/public/icons/xmind/marker.svg b/public/icons/xmind/marker.svg new file mode 100644 index 000000000..cf2cc550c --- /dev/null +++ b/public/icons/xmind/marker.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/icons/xmind/markers/README.md b/public/icons/xmind/markers/README.md new file mode 100644 index 000000000..44b576381 --- /dev/null +++ b/public/icons/xmind/markers/README.md @@ -0,0 +1,3 @@ +# Xmind 标记资源 + +来自用户已安装的 Xmind 26.04.01337 `Contents/Resources/app.asar` 中 `/static/snowbird/resource/markers/`,按客户端标记目录提取。目录顺序及隐藏状态来自 `renderer/9834.js`;完整第三方代码保留在临时目录。客户端默认显示 7 组 58 个标记;其余资源用于旧文档显示和更多标记。文件哈希见 `manifest.json`。 diff --git a/public/icons/xmind/markers/academicMarkers/c_symbol_apostrophe.svg b/public/icons/xmind/markers/academicMarkers/c_symbol_apostrophe.svg new file mode 100644 index 000000000..5ecdfb265 --- /dev/null +++ b/public/icons/xmind/markers/academicMarkers/c_symbol_apostrophe.svg @@ -0,0 +1,28 @@ + + + + symbol_apostrophe + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/academicMarkers/c_symbol_quote.svg b/public/icons/xmind/markers/academicMarkers/c_symbol_quote.svg new file mode 100644 index 000000000..0904e98a3 --- /dev/null +++ b/public/icons/xmind/markers/academicMarkers/c_symbol_quote.svg @@ -0,0 +1,22 @@ + + + + symbol_quote@16 + Created with Sketch. + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/academicMarkers/symbol-about.svg b/public/icons/xmind/markers/academicMarkers/symbol-about.svg new file mode 100644 index 000000000..5b88d6cc8 --- /dev/null +++ b/public/icons/xmind/markers/academicMarkers/symbol-about.svg @@ -0,0 +1,24 @@ + + + + symbol_about@16 + Created with Sketch. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/academicMarkers/symbol-attention.svg b/public/icons/xmind/markers/academicMarkers/symbol-attention.svg new file mode 100644 index 000000000..bbadb95fc --- /dev/null +++ b/public/icons/xmind/markers/academicMarkers/symbol-attention.svg @@ -0,0 +1,27 @@ + + + + symbol_attention@16 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/academicMarkers/symbol-code.svg b/public/icons/xmind/markers/academicMarkers/symbol-code.svg new file mode 100644 index 000000000..faac85fb5 --- /dev/null +++ b/public/icons/xmind/markers/academicMarkers/symbol-code.svg @@ -0,0 +1,23 @@ + + + + symbol_code@16 + Created with Sketch. + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/academicMarkers/symbol-divide.svg b/public/icons/xmind/markers/academicMarkers/symbol-divide.svg new file mode 100644 index 000000000..5b0be3493 --- /dev/null +++ b/public/icons/xmind/markers/academicMarkers/symbol-divide.svg @@ -0,0 +1,28 @@ + + + + symbol_divide@16 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/academicMarkers/symbol-equality.svg b/public/icons/xmind/markers/academicMarkers/symbol-equality.svg new file mode 100644 index 000000000..611dad454 --- /dev/null +++ b/public/icons/xmind/markers/academicMarkers/symbol-equality.svg @@ -0,0 +1,27 @@ + + + + symbol_equality@16 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/academicMarkers/symbol-minus.svg b/public/icons/xmind/markers/academicMarkers/symbol-minus.svg new file mode 100644 index 000000000..3939cf4b1 --- /dev/null +++ b/public/icons/xmind/markers/academicMarkers/symbol-minus.svg @@ -0,0 +1,26 @@ + + + + symbol_minus@16 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/academicMarkers/symbol-not-equality.svg b/public/icons/xmind/markers/academicMarkers/symbol-not-equality.svg new file mode 100644 index 000000000..ab241021d --- /dev/null +++ b/public/icons/xmind/markers/academicMarkers/symbol-not-equality.svg @@ -0,0 +1,23 @@ + + + + symbol_not_equality@16 + Created with Sketch. + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/academicMarkers/symbol-pause.svg b/public/icons/xmind/markers/academicMarkers/symbol-pause.svg new file mode 100644 index 000000000..858307e6e --- /dev/null +++ b/public/icons/xmind/markers/academicMarkers/symbol-pause.svg @@ -0,0 +1,27 @@ + + + + symbol_pause@16 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/academicMarkers/symbol-plus.svg b/public/icons/xmind/markers/academicMarkers/symbol-plus.svg new file mode 100644 index 000000000..c0a3953fd --- /dev/null +++ b/public/icons/xmind/markers/academicMarkers/symbol-plus.svg @@ -0,0 +1,21 @@ + + + + symbol_plus@16 + Created with Sketch. + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/academicMarkers/symbol-question.svg b/public/icons/xmind/markers/academicMarkers/symbol-question.svg new file mode 100644 index 000000000..37f19ef65 --- /dev/null +++ b/public/icons/xmind/markers/academicMarkers/symbol-question.svg @@ -0,0 +1,27 @@ + + + + symbol_question@16 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/academicMarkers/symbol-right.svg b/public/icons/xmind/markers/academicMarkers/symbol-right.svg new file mode 100644 index 000000000..847bda337 --- /dev/null +++ b/public/icons/xmind/markers/academicMarkers/symbol-right.svg @@ -0,0 +1,21 @@ + + + + symbol_right@16 + Created with Sketch. + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/academicMarkers/symbol-wrong.svg b/public/icons/xmind/markers/academicMarkers/symbol-wrong.svg new file mode 100644 index 000000000..411244248 --- /dev/null +++ b/public/icons/xmind/markers/academicMarkers/symbol-wrong.svg @@ -0,0 +1,21 @@ + + + + symbol_wrong@16 + Created with Sketch. + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/arrowMarkers/arrow-down-left.svg b/public/icons/xmind/markers/arrowMarkers/arrow-down-left.svg new file mode 100644 index 000000000..381c377e2 --- /dev/null +++ b/public/icons/xmind/markers/arrowMarkers/arrow-down-left.svg @@ -0,0 +1,17 @@ + + + + arr_dl + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/arrowMarkers/arrow-down-right.svg b/public/icons/xmind/markers/arrowMarkers/arrow-down-right.svg new file mode 100644 index 000000000..f12a33c48 --- /dev/null +++ b/public/icons/xmind/markers/arrowMarkers/arrow-down-right.svg @@ -0,0 +1,17 @@ + + + + arr_dr + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/arrowMarkers/arrow-down.svg b/public/icons/xmind/markers/arrowMarkers/arrow-down.svg new file mode 100644 index 000000000..5a66526f2 --- /dev/null +++ b/public/icons/xmind/markers/arrowMarkers/arrow-down.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/icons/xmind/markers/arrowMarkers/arrow-left-right.svg b/public/icons/xmind/markers/arrowMarkers/arrow-left-right.svg new file mode 100644 index 000000000..1be3ee938 --- /dev/null +++ b/public/icons/xmind/markers/arrowMarkers/arrow-left-right.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/icons/xmind/markers/arrowMarkers/arrow-left.svg b/public/icons/xmind/markers/arrowMarkers/arrow-left.svg new file mode 100644 index 000000000..6612f9630 --- /dev/null +++ b/public/icons/xmind/markers/arrowMarkers/arrow-left.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/icons/xmind/markers/arrowMarkers/arrow-refresh.svg b/public/icons/xmind/markers/arrowMarkers/arrow-refresh.svg new file mode 100644 index 000000000..3f50e99e3 --- /dev/null +++ b/public/icons/xmind/markers/arrowMarkers/arrow-refresh.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/icons/xmind/markers/arrowMarkers/arrow-right.svg b/public/icons/xmind/markers/arrowMarkers/arrow-right.svg new file mode 100644 index 000000000..c5f376b8e --- /dev/null +++ b/public/icons/xmind/markers/arrowMarkers/arrow-right.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/icons/xmind/markers/arrowMarkers/arrow-up-down.svg b/public/icons/xmind/markers/arrowMarkers/arrow-up-down.svg new file mode 100644 index 000000000..653de173c --- /dev/null +++ b/public/icons/xmind/markers/arrowMarkers/arrow-up-down.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/icons/xmind/markers/arrowMarkers/arrow-up-left.svg b/public/icons/xmind/markers/arrowMarkers/arrow-up-left.svg new file mode 100644 index 000000000..25961c0f7 --- /dev/null +++ b/public/icons/xmind/markers/arrowMarkers/arrow-up-left.svg @@ -0,0 +1,17 @@ + + + + arr_ul + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/arrowMarkers/arrow-up-right.svg b/public/icons/xmind/markers/arrowMarkers/arrow-up-right.svg new file mode 100644 index 000000000..80baa5906 --- /dev/null +++ b/public/icons/xmind/markers/arrowMarkers/arrow-up-right.svg @@ -0,0 +1,17 @@ + + + + arr_upr + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/arrowMarkers/arrow-up.svg b/public/icons/xmind/markers/arrowMarkers/arrow-up.svg new file mode 100644 index 000000000..4942a0901 --- /dev/null +++ b/public/icons/xmind/markers/arrowMarkers/arrow-up.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/icons/xmind/markers/celebrationMarkers/celebration-100.svg b/public/icons/xmind/markers/celebrationMarkers/celebration-100.svg new file mode 100644 index 000000000..ce2d963f8 --- /dev/null +++ b/public/icons/xmind/markers/celebrationMarkers/celebration-100.svg @@ -0,0 +1,30 @@ + + + + celebration_100 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/celebrationMarkers/celebration-birthday.svg b/public/icons/xmind/markers/celebrationMarkers/celebration-birthday.svg new file mode 100644 index 000000000..776ed3c48 --- /dev/null +++ b/public/icons/xmind/markers/celebrationMarkers/celebration-birthday.svg @@ -0,0 +1,24 @@ + + + + celebration_birthday + Created with Sketch. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/celebrationMarkers/celebration-boom.svg b/public/icons/xmind/markers/celebrationMarkers/celebration-boom.svg new file mode 100644 index 000000000..b7d8bf406 --- /dev/null +++ b/public/icons/xmind/markers/celebrationMarkers/celebration-boom.svg @@ -0,0 +1,25 @@ + + + + celebration_boom + Created with Sketch. + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/celebrationMarkers/celebration-cheers.svg b/public/icons/xmind/markers/celebrationMarkers/celebration-cheers.svg new file mode 100644 index 000000000..cc71a80de --- /dev/null +++ b/public/icons/xmind/markers/celebrationMarkers/celebration-cheers.svg @@ -0,0 +1,27 @@ + + + + celebration_cheers + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/celebrationMarkers/celebration-clap.svg b/public/icons/xmind/markers/celebrationMarkers/celebration-clap.svg new file mode 100644 index 000000000..9c7f6236e --- /dev/null +++ b/public/icons/xmind/markers/celebrationMarkers/celebration-clap.svg @@ -0,0 +1,25 @@ + + + + celebration_clap + Created with Sketch. + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/celebrationMarkers/celebration-five.svg b/public/icons/xmind/markers/celebrationMarkers/celebration-five.svg new file mode 100644 index 000000000..12d658760 --- /dev/null +++ b/public/icons/xmind/markers/celebrationMarkers/celebration-five.svg @@ -0,0 +1,23 @@ + + + + celebration_five + Created with Sketch. + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/celebrationMarkers/celebration-king.svg b/public/icons/xmind/markers/celebrationMarkers/celebration-king.svg new file mode 100644 index 000000000..f44000f6e --- /dev/null +++ b/public/icons/xmind/markers/celebrationMarkers/celebration-king.svg @@ -0,0 +1,25 @@ + + + + celebration_king + Created with Sketch. + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/celebrationMarkers/celebration-kiss.svg b/public/icons/xmind/markers/celebrationMarkers/celebration-kiss.svg new file mode 100644 index 000000000..4e775b474 --- /dev/null +++ b/public/icons/xmind/markers/celebrationMarkers/celebration-kiss.svg @@ -0,0 +1,23 @@ + + + + celebration_kiss + Created with Sketch. + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/celebrationMarkers/celebration-ribbon.svg b/public/icons/xmind/markers/celebrationMarkers/celebration-ribbon.svg new file mode 100644 index 000000000..048aef7fc --- /dev/null +++ b/public/icons/xmind/markers/celebrationMarkers/celebration-ribbon.svg @@ -0,0 +1,26 @@ + + + + celebration_ribbon + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/flagMarkers/flag-blue.svg b/public/icons/xmind/markers/flagMarkers/flag-blue.svg new file mode 100644 index 000000000..5d34f33e2 --- /dev/null +++ b/public/icons/xmind/markers/flagMarkers/flag-blue.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/xmind/markers/flagMarkers/flag-dark-blue.svg b/public/icons/xmind/markers/flagMarkers/flag-dark-blue.svg new file mode 100644 index 000000000..ad59332a3 --- /dev/null +++ b/public/icons/xmind/markers/flagMarkers/flag-dark-blue.svg @@ -0,0 +1,12 @@ + + + + flag_dark_blue@16 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/flagMarkers/flag-dark-gray.svg b/public/icons/xmind/markers/flagMarkers/flag-dark-gray.svg new file mode 100644 index 000000000..e01748945 --- /dev/null +++ b/public/icons/xmind/markers/flagMarkers/flag-dark-gray.svg @@ -0,0 +1,21 @@ + + + + flags_bla + Created with Sketch. + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/flagMarkers/flag-dark-green.svg b/public/icons/xmind/markers/flagMarkers/flag-dark-green.svg new file mode 100644 index 000000000..32bb70185 --- /dev/null +++ b/public/icons/xmind/markers/flagMarkers/flag-dark-green.svg @@ -0,0 +1,17 @@ + + + + flags_gra + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/flagMarkers/flag-gray.svg b/public/icons/xmind/markers/flagMarkers/flag-gray.svg new file mode 100644 index 000000000..9ae2ab098 --- /dev/null +++ b/public/icons/xmind/markers/flagMarkers/flag-gray.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/xmind/markers/flagMarkers/flag-green.svg b/public/icons/xmind/markers/flagMarkers/flag-green.svg new file mode 100644 index 000000000..3c23f55c1 --- /dev/null +++ b/public/icons/xmind/markers/flagMarkers/flag-green.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/xmind/markers/flagMarkers/flag-orange.svg b/public/icons/xmind/markers/flagMarkers/flag-orange.svg new file mode 100644 index 000000000..e71519137 --- /dev/null +++ b/public/icons/xmind/markers/flagMarkers/flag-orange.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/xmind/markers/flagMarkers/flag-purple.svg b/public/icons/xmind/markers/flagMarkers/flag-purple.svg new file mode 100644 index 000000000..743234e6e --- /dev/null +++ b/public/icons/xmind/markers/flagMarkers/flag-purple.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/xmind/markers/flagMarkers/flag-red.svg b/public/icons/xmind/markers/flagMarkers/flag-red.svg new file mode 100644 index 000000000..0f66b1ef9 --- /dev/null +++ b/public/icons/xmind/markers/flagMarkers/flag-red.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/xmind/markers/flagMarkers/flag-yellow.svg b/public/icons/xmind/markers/flagMarkers/flag-yellow.svg new file mode 100644 index 000000000..9ea98a8e9 --- /dev/null +++ b/public/icons/xmind/markers/flagMarkers/flag-yellow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/xmind/markers/halfStarMarkers/half-star-blue.png b/public/icons/xmind/markers/halfStarMarkers/half-star-blue.png new file mode 100644 index 0000000000000000000000000000000000000000..ecb155a5159cc8cc53aa811c28266c207cfe04eb GIT binary patch literal 1099 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy%*9TgAsieWw;%dHU|?X34DbnY z{r~^JNBIUK5m51u-+$kH`}O4G_j_-@U4QrW`in1T-h4U!`tzA*ACEl!aQN=Kjdx$~ zxcPeP)mLk7yj*(i#j5i!7N2{z^5l~#7oN;H{bcF!$Ni_COgZsr#<7R>obR}ZPwZL81b2eV~-gP~3^W}i;SA4f!NnU@kcEvfzZC8wT zU5#3M-g?XBq9tdtmY%6xaLQ=&C52BR0prCw-YeY$Kep*R+Vo@rCZ(?#$er{??W}<>y zW>IQ+eo=O@g2mR1OBFz+A|R#CMX8A;nfZANA(^?U3>NyP`UV!v9MN{bG_>E-#WBR9 zxAszY_$>zkwg(ej9!s65Vq6`X^MNU3*T%1Hm%NUwS}XA}>f)kpW=q#LT{`ps|ARay zh1ZrTcF$_h&6#mfr)#fa&AQ6>uVstC!|Uf(XPppv z@v`N?*88^69R-``9!hSvjb5~Z&E+x$q(!#08)r`rO|;Dym~`03$LE~h z1^?aGOgWg(U2n>qrE`9LK%=#(j5*gfxAf(ULSA*~9mv0y+uPeX=X~X6!;V|xyFSlKMtK&XSNhAaJhBpyuHcdgVjna1oDIQ<(FIj|90j5lWy%A2BZ3S z5l1z4A7WOPeDRpE=8i>4D|_3f?_ASQPq=GWcyxk#(Dpy_Z_9(87HgRmR~=#vo~pq< zrFw6et-f$=X}z80sbw*&b)DU3?yg*@e^v3BjPaxj?jV7TqhDtITgT@iB63#q)p}v8 z?QSgh)Sv4+l$Q5vL~WkobFDf1gu&zEc9C{r%npnCyLZp&VAye7f3Jm(>RbKueW_`s U@oQ(j21Yf5r>mdKI;Vst06Cmg1^@s6 literal 0 HcmV?d00001 diff --git a/public/icons/xmind/markers/halfStarMarkers/half-star-gray.png b/public/icons/xmind/markers/halfStarMarkers/half-star-gray.png new file mode 100644 index 0000000000000000000000000000000000000000..64c2bcdfca7e3d64089687aba8b99864ed16d59a GIT binary patch literal 899 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy%*9TgAsieWw;%dH0CH~x_=LFr z|Nq~ZXaH3F?c4XyU%tG1|NhnMH!okke){bBz55Su+`N7D`i)Chubnw_=J1hY`wt!2 zd*IOSz5BQB*u7=Twso7ftXaQl^}3DAR2nv(oH?_1(zKrb zNiAJ{Eo~i5t?f0<9o0>374Jj4jv*GkwO3w;H93f|J`nVDdbDWf^&>tW>za7d+GeO0-uvGxCFQhy>ytls@4q=3 zBgV1uFgI_Axy+m+Q3`5S1zTDD|JKH~&fxoX-c(d3V(~eRy>W_Zj|-RoFWTC~+|Q6( zv?EM0?efVTi}~hgi~2^qyzCi%^-I6mY?B|;6z($CoKO3;W%Vj$c87^B50^zQ(dA_L z^!WF+(r3j=92cIo?Y_6nUFbxvifs73Lk1@$ju{KGOxP*UBmcGaX)eRvXX`R|_vPxw zpK%IsNKaGa`uXinv{iax{ki$ms+a!YG2~yfc}0WS_6$FkoHt%y{(WklJFQZ2TVHgS zP)6JAP)jGKJv)~!a4_C`dd?iSH(rhhZ=8Q}T1N5Z;l+<0iu2SwxcPXWca4_Di=P*g z829`N30Uw;{o#GzM-5$qtlu1y4)C@lD*jQ3`No}~V#M5%BirgIu&$glZuS$qW!4D} zzl{$Cio7+NpxC?EwOnHJ?Fru{9$y#skjc_4IB?_G8?y(tb-$TjmIpcqd{XJ#e7k#2 zyVg36&Afd!ddoH{G8yP^|M@=Qq}05B>~#z`Wj%JyPq}Ogj7|nmS3j3^P6KYe%p@!M^8UY@`6V*AC%M=m{Dedhj-llOLjL zb!@#bW$XEly;p7aUh&v`AM6_M+;XT zw_kSDe$k=G`A6(#?oXY)&tcM@qP|^4Q+GS`Y;$bd6xF)Pv2LqP^9IN2HBP0g9rM=M z7O!y5Uh15@&?#|&Q`AEH=($dT^K64=IR(sc@}6n$HOi@ju{ zy;wcSo5f92zXSaqP!i-9%pj;_>=K$*-Z694?lX7a0ewdqV2(5Znax??5n0T@z%2yA zjF;}#{Q(Nfm$*ih1m~xflqVLYGWaGY7v<-srer26xMdclmgg5`7b{q7&A3znR4M{e z>RgnXSdy8arx22vo62CJZ>n!#!ORhD$H2f?@9E+gV$oZBDKosuL4@rAquNEcSw^|{ zb#ECQc42C|Q>47}|Nr|Yj~AHCQT~2=&i99M_ZVBAXue!gV4%~@Dp~tZvz0q;-Qz`~ zDVO&A)QV_ac-LkN*S#j6GirNfb7C70n)%+!P`@2EVP)#fDfjZD8yDVwv>@?$_=})9=P1^{Becp5}z&Fx>miIQ)5%_ZEEnv^$dR(pZBw+QcF{IFf3ZzpT+t}ekB{5 o!lk1IOhNv>&N~Ayv;Sk5uN;1@^J{P{Fsc|lUHx3vIVCg!0EsoPiU0rr literal 0 HcmV?d00001 diff --git a/public/icons/xmind/markers/halfStarMarkers/half-star-purple.png b/public/icons/xmind/markers/halfStarMarkers/half-star-purple.png new file mode 100644 index 0000000000000000000000000000000000000000..4ea75a3e9775c20c79d0c6f88a78d6173e0ede54 GIT binary patch literal 990 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy%*9TgAsieWw;%dHU|?Vr4DbnY z{r~@etU>~j2&nky*B@Wseg63D{kw;+-`sog>dy0L*B(DUbMN8lI}c9YzIXJ-?Om6z zZaaH<<;io4j+|U_;PkwMCuZ$CJafm9$vgH<*}11@!@jOfyIR+6ZCkgsamAMUm0N0; zudQCTws`59!g;In=PWLmyF7c=@~jz4Qm4*Ln>jyj!osM@bEA4^hjvX4@0t+WIX$4Q zFQ9d*PfMpyQ=3;qyGQ*5=ek~}+G>~TW{0XC>#9cE@=nw83agT0i=sxO;##A^665?* zgS=MFqH4{&V(si^m4aOD%tpn$RIT(H#hi4Fv|`1~6s6=Wg;ZcT1Q?v12Mnv|k|4ie z203T~N2spa`a*~JPLTQe?I0F{b>lsXrsCYEI8=P86_=B6@O z=$q;rSTJ)$+X3Tvlc$Sgh(&Mh;WMQ^gijo&Ux@@Pp7%W4x_J89bM zKmX+~9eS4f`b15w{IfZdX_kGujy;8eM-NBzv1q>MX*t36G{?Ow%fQZN2ZP!Vs8GJ>{gm)+4<4$`zq~ajKa{&L=FIcb(*ISi+;N5Hx>+(>|IK$ya&nq-iQ)03 zr2(>0$nz?5`Wss}+qt z?@9T7*hWC#FIg?kLEC!soE(n0SH>T?O%}g9TWqAg$81(ez=F`(^SvuIW`*RmKiKj0 z>=POF+HFw_7bNWG&3?1%X}_7M$ctQ$4Gi~o1C^HTpIqFY?Q6gBed4?y`~I7S;q{k=YO_ zph}2#hww}w^MQr{-T(K; z_dj1g{(Sx7$MZ)&pWgre=-!Xp7e8M;|LyXzkLON(K7aW8nLXc6Z2Nq2*VhAU-tOD> zZtuEJ+n2oFw&wk&*)KOQeZOJmyERjvubKU3dH?gp{dbqlc)D=P%ek!&=JdXt)qQWy zl;<<+pG>ZNI-&M)U&-}}jgPuZ?zd)NZY#grRCuo;?R;bLotmVx^+k6pGjCVKovF^b zT$y^KF!g3()cL}g>v>Vf3zDyA2VKofypR=gB_-%sM)=ia?{ldEyVIi2CHh>B^E{Fi zbScv5T(rx@kbqOc4qL+mjtAMF^S3_kXT2%N=d8Eo+CY!P-d3Ca-1d1{9CI~2?P9#t z%YC`0>n<0wGxnA{TrJnSI&O6|J!Y-9!QT9Yxz0vgLtsd*v(PR%oe1f_J8t>Kav5NRUEe4Uz`7d{|crOgURig8YIR1ff6) z1dM^e1qedZz@QumI)Gp%2&`JQd-v`$U~m@#-T?tHs^|~qcHWBxdVsUQBeIx*fm;ZK z886+f`vVk|FL8}13C>R|DNig)W$;Z*F3QhMP037DaLX)8Ezd8?E>^JEnsKQDs8j@` z)VU}%u_QA;Paz~THbjJGV z^v3HArl+T^pMEU;z^awH+Pa0Oz1Pf~|7>dlbDr`Uv2u3HkOyW?Nng*L5nx|GQ#z$U z>Vlx;y9WVVZg5R!6yCH*NmhnQEoXxJ)Q2LIrd~CT-I$aYoRl-Ax!L*Zo?hv-U#Ez= zusUw)V&fLqjj|{|Hs#*AzCTNjL@a1(=sWk%^7FO48+$4@cXA!RllgY7uP?8u>CvAr zGc`Rs`4k?!5tNx6dF#r({VCkd|JJm%waxnU>CvA#Iup3qSqjeO-%B`jAj4qwzGZ9+ znH1lLMeRS>(%jg1G9j_n(uvi{ZhzKZL+cYWecHIQyB}&Ld|GEYHCy2m56>AZZtc&B zS_?kuMRHUs1jI&6Vh&}T>c9R@#*sdeuvOh&MGAF|8Xa0UGmf+g&Dz#$>6;)bz}k3q zcED4~FcGoxhENBQ3h}&0t`o(hCSJL~7{>V3`H`BS2#mK%33*3>n+#J@&miMzCGqhI8wH#6@>K1^g~O-!8E$H(`t)J=mc$H*xCc`Hk* z{+7+rv!tKAfA?VCF3!k#m4Pue6Y68mOO=X+S^i#n^WQ!@!PzVmY&V{`ZoVvgtCV=h z;k6qJi<;KIS2IlU_uDqShrQrZzI}4>_Dta}`=37~FElWi bEMQpt^kU_&YwMQ)6Ago>tDnm{r-UW|L#nm8 literal 0 HcmV?d00001 diff --git a/public/icons/xmind/markers/halfStarMarkers/half-star-yellow.png b/public/icons/xmind/markers/halfStarMarkers/half-star-yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..d83704e12e1ca5f6c45b942132b483ad555e3a32 GIT binary patch literal 965 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy%*9TgAsieWw;%dHU|?Wm4e$wZ z{r~^}&54>sBB0`5U*G)tcKhes`@i4s{rzdquh-{)y*Tje*}=c>CZb`f8Ad8=Vsggrwo7ZIsCh0@c%x;ziTG{t||XK)BW$V+5hVdU$1ff zJ8Sj-Ec@S+)?d$Y{n(fPYk$JOqg?+F^L{_d{oyG8ubn~P_w)VRBk*gx^M}3sf42(% zSRe9dljytc!XGw?{a!2nVV%UUm6G332xsy_dx zzqDPoE+;MJ|JyzM@83j9a0pIc6XtPqlEOu=Mzg(aE4Mt@WvsjU!m_#jsiF}VYH!bc zyZ%Dj-Fc;3_B%D*mfL#k?q1QTOG~d9_5Z5YT2ranyu}S0->yF@ zwPl~>NAGj3o5k8^+uVH8a^>N4agjv~Yo+tekKcAMe7J~Ve!FL~xw=dI4@L3!mKI+f z#n$f@WET`?t$3bpDtO?%!J|bCX&Zv#_j;b$`6Hy^cdK55R7>WpZi79KW$nd$8CR^< zc$&1YW6}G3pU+u*j|5J?;QaiPYt~I8_4J7rZpEFfFS$xOHP{|JQ)G3Ocx321-|;zr zXo&LRwFYfG|F3;)vw7dA`0%)@Ntg-4!^i9Q?TV;z)BDH#pV6c<_H@*ZR!d-{GI+ZB KxvX + + + month_apr@16 + Created with Sketch. + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/monthMarkers/month-aug.svg b/public/icons/xmind/markers/monthMarkers/month-aug.svg new file mode 100644 index 000000000..1d7e77328 --- /dev/null +++ b/public/icons/xmind/markers/monthMarkers/month-aug.svg @@ -0,0 +1,22 @@ + + + + month_aug@16 + Created with Sketch. + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/monthMarkers/month-dec.svg b/public/icons/xmind/markers/monthMarkers/month-dec.svg new file mode 100644 index 000000000..cf04a443c --- /dev/null +++ b/public/icons/xmind/markers/monthMarkers/month-dec.svg @@ -0,0 +1,13 @@ + + + + month_dec@16 + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/monthMarkers/month-feb.svg b/public/icons/xmind/markers/monthMarkers/month-feb.svg new file mode 100644 index 000000000..419ea8884 --- /dev/null +++ b/public/icons/xmind/markers/monthMarkers/month-feb.svg @@ -0,0 +1,22 @@ + + + + month_feb@16 + Created with Sketch. + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/monthMarkers/month-jan.svg b/public/icons/xmind/markers/monthMarkers/month-jan.svg new file mode 100644 index 000000000..aeba92eb5 --- /dev/null +++ b/public/icons/xmind/markers/monthMarkers/month-jan.svg @@ -0,0 +1,22 @@ + + + + month_jan@16 + Created with Sketch. + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/monthMarkers/month-jul.svg b/public/icons/xmind/markers/monthMarkers/month-jul.svg new file mode 100644 index 000000000..c63d36cca --- /dev/null +++ b/public/icons/xmind/markers/monthMarkers/month-jul.svg @@ -0,0 +1,13 @@ + + + + month_jul@16 + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/monthMarkers/month-jun.svg b/public/icons/xmind/markers/monthMarkers/month-jun.svg new file mode 100644 index 000000000..8064a88d4 --- /dev/null +++ b/public/icons/xmind/markers/monthMarkers/month-jun.svg @@ -0,0 +1,22 @@ + + + + month_jun@16 + Created with Sketch. + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/monthMarkers/month-mar.svg b/public/icons/xmind/markers/monthMarkers/month-mar.svg new file mode 100644 index 000000000..5888b933b --- /dev/null +++ b/public/icons/xmind/markers/monthMarkers/month-mar.svg @@ -0,0 +1,22 @@ + + + + month_mar@16 + Created with Sketch. + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/monthMarkers/month-may.svg b/public/icons/xmind/markers/monthMarkers/month-may.svg new file mode 100644 index 000000000..05020d030 --- /dev/null +++ b/public/icons/xmind/markers/monthMarkers/month-may.svg @@ -0,0 +1,22 @@ + + + + month_may@16 + Created with Sketch. + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/monthMarkers/month-nov.svg b/public/icons/xmind/markers/monthMarkers/month-nov.svg new file mode 100644 index 000000000..99c6d3884 --- /dev/null +++ b/public/icons/xmind/markers/monthMarkers/month-nov.svg @@ -0,0 +1,13 @@ + + + + month_nov@16 + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/monthMarkers/month-oct.svg b/public/icons/xmind/markers/monthMarkers/month-oct.svg new file mode 100644 index 000000000..161208d61 --- /dev/null +++ b/public/icons/xmind/markers/monthMarkers/month-oct.svg @@ -0,0 +1,13 @@ + + + + month_oct@16 + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/monthMarkers/month-sep.svg b/public/icons/xmind/markers/monthMarkers/month-sep.svg new file mode 100644 index 000000000..b9711ff40 --- /dev/null +++ b/public/icons/xmind/markers/monthMarkers/month-sep.svg @@ -0,0 +1,13 @@ + + + + month_sep@16 + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/otherMarkers/c_simbol-info.svg b/public/icons/xmind/markers/otherMarkers/c_simbol-info.svg new file mode 100644 index 000000000..5ddd55fb0 --- /dev/null +++ b/public/icons/xmind/markers/otherMarkers/c_simbol-info.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/icons/xmind/markers/otherMarkers/c_simbol-minus.svg b/public/icons/xmind/markers/otherMarkers/c_simbol-minus.svg new file mode 100644 index 000000000..3939cf4b1 --- /dev/null +++ b/public/icons/xmind/markers/otherMarkers/c_simbol-minus.svg @@ -0,0 +1,26 @@ + + + + symbol_minus@16 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/otherMarkers/c_simbol-pause.svg b/public/icons/xmind/markers/otherMarkers/c_simbol-pause.svg new file mode 100644 index 000000000..858307e6e --- /dev/null +++ b/public/icons/xmind/markers/otherMarkers/c_simbol-pause.svg @@ -0,0 +1,27 @@ + + + + symbol_pause@16 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/otherMarkers/c_simbol-plus.svg b/public/icons/xmind/markers/otherMarkers/c_simbol-plus.svg new file mode 100644 index 000000000..c0a3953fd --- /dev/null +++ b/public/icons/xmind/markers/otherMarkers/c_simbol-plus.svg @@ -0,0 +1,21 @@ + + + + symbol_plus@16 + Created with Sketch. + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/otherMarkers/c_simbol-question.svg b/public/icons/xmind/markers/otherMarkers/c_simbol-question.svg new file mode 100644 index 000000000..91254ffd6 --- /dev/null +++ b/public/icons/xmind/markers/otherMarkers/c_simbol-question.svg @@ -0,0 +1,11 @@ + + + + Oval 1 Copy 37 + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/otherMarkers/c_simbol-right.svg b/public/icons/xmind/markers/otherMarkers/c_simbol-right.svg new file mode 100644 index 000000000..847bda337 --- /dev/null +++ b/public/icons/xmind/markers/otherMarkers/c_simbol-right.svg @@ -0,0 +1,21 @@ + + + + symbol_right@16 + Created with Sketch. + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/otherMarkers/c_simbol-wrong.svg b/public/icons/xmind/markers/otherMarkers/c_simbol-wrong.svg new file mode 100644 index 000000000..1f8771c4c --- /dev/null +++ b/public/icons/xmind/markers/otherMarkers/c_simbol-wrong.svg @@ -0,0 +1,11 @@ + + + + Oval 1 Copy 38 + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/otherMarkers/c_symbol_exercise.svg b/public/icons/xmind/markers/otherMarkers/c_symbol_exercise.svg new file mode 100644 index 000000000..7b8c5d507 --- /dev/null +++ b/public/icons/xmind/markers/otherMarkers/c_symbol_exercise.svg @@ -0,0 +1,12 @@ + + + + symbol_exercise + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/otherMarkers/c_symbol_line_graph.svg b/public/icons/xmind/markers/otherMarkers/c_symbol_line_graph.svg new file mode 100644 index 000000000..d4e01b96b --- /dev/null +++ b/public/icons/xmind/markers/otherMarkers/c_symbol_line_graph.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/icons/xmind/markers/otherMarkers/c_symbol_medals.svg b/public/icons/xmind/markers/otherMarkers/c_symbol_medals.svg new file mode 100644 index 000000000..462f3bac5 --- /dev/null +++ b/public/icons/xmind/markers/otherMarkers/c_symbol_medals.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/icons/xmind/markers/otherMarkers/c_symbol_shopping_cart.svg b/public/icons/xmind/markers/otherMarkers/c_symbol_shopping_cart.svg new file mode 100644 index 000000000..c84f529a5 --- /dev/null +++ b/public/icons/xmind/markers/otherMarkers/c_symbol_shopping_cart.svg @@ -0,0 +1,24 @@ + + + + symbol_shopping_cart + Created with Sketch. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/otherMarkers/c_symbol_thermometer.svg b/public/icons/xmind/markers/otherMarkers/c_symbol_thermometer.svg new file mode 100644 index 000000000..300fb560d --- /dev/null +++ b/public/icons/xmind/markers/otherMarkers/c_symbol_thermometer.svg @@ -0,0 +1,28 @@ + + + + sym_温度计 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/otherMarkers/c_symbol_trophy.svg b/public/icons/xmind/markers/otherMarkers/c_symbol_trophy.svg new file mode 100644 index 000000000..dde0c1f98 --- /dev/null +++ b/public/icons/xmind/markers/otherMarkers/c_symbol_trophy.svg @@ -0,0 +1,28 @@ + + + + symbol_trophy + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/otherMarkers/other-bomb.png b/public/icons/xmind/markers/otherMarkers/other-bomb.png new file mode 100644 index 0000000000000000000000000000000000000000..aeb723bb60c5e9ac922e85b90e47c9c6789751c2 GIT binary patch literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy%*9TgAsieWw;%dHU|?Y63-AeX z{r~^}zhgWKy754S#(;2vq=j85vI4j=1?@;6Ti+%NLISzc%AP<2KYslB@57;g&!zyy zKkN})z2WfO#XDEeO7EYxzO!{vL+zZ}s+r}bQ%j2{7v%L9`6`ONJ?r8Pi&8h zYKVxa3k|Og465=Bsr3pf_V6xo@ho<5EwFYkvUkn5a?AnRsBM;_VVtaK6rp06sHhhU za-Mdiyk?M`x{r)nfUL4J&?OQIPEzt#;?m|4QU>A@TEgP`qM|B7V!DDNnxaCA0s@Lc ze3INeVglTve4IjDTtb{|oZfxk<$wVdRTAVE%pfSJWNhq`mR4Tg(a|w;)vDdQ&z!k? z_Z<)b{YVKYTXf?E&=$@DkH}&M25un`X1sK_?hjBTh$5*IxS{y1tyDT*whryqRZ+CYu@2}p=?yGD0H&SQ%_RT7XbfS-lKYwmi zzh=t4sk5IZO?+PI_NXTI-oGDJM?PL&bSTnn{n1Chk?Z_!%fwH8?P@mP&`mRS!IGH0 z?@Snj0zXPF=2R^7;Yc;9{oElPz3VCGK@A?~7K4QmPoz$jOFs}Pcu>7S!A0fax(lAC zQ|;1O+V?%TQn=17;ONWxP@Khp>rScKwA7oy>@pEQk_Ea;?Uu9re0Rl&_prg*&d04Q zG!@rPD{XjwW7)c1le-(1t=pgN5%9pzr*_Fbp3u8n6q}4ixL0)4a9p^u`t-rxw1|4i zmda!aKD+q1{$o=YYToqR#wM<{;(GJy#JK{6lcyEGXkgxPBqF%|)rwaSKJR{~W^nwi z?y*_RUaH+udQsFi?Z_%)rt2H`&uohk|W3caGOz{(Ags5BE*waY__9dDnKwyyJg2+c)sPGXEG>tn&M0W+N~uFnGH9 KxvXdkGr zH#g+gUw;4VqRiS0?|z+;TY2i$@1qKDk1PHVee!dY z+MBJaGk4tjxkhcumV48-UcJ9o^Y9k!A4}9HZ8*PRoOx%We%-9YhbJ3#&0JA5 z`*7RL1x+*8RZcsSH}lYvY0m5W)6aDoHBOsbF=hXu9@ANqW3#3nJk)Ml+`o5GXLib@ z{Rdl3Cr$`%?WvjH5!}`_xw>)gIibq~*4y2Ynb z(v2fBhbvLBQvJxY|Nq(V_}|`ad-|s3KFf9Mub0-Hx4W}=#eWBdq+dn?O$+YlY&V#0 zrrwdY^;aUBW>;SSq@IMf218-B7h&NB45v5A9RFOyHiPxq;xq~NzULhNEIpzH6$d`K z1l*3<75l^R0o&G-E=F7DzLqU$wyJQv)2?v)CkxNwW+qAYGh&}E>G3?#&6hZ_`=ITo zONr;1T{dh~_sZ6nd@p{gNRa*4smEVm9{w3T@40t8-*HzN8DF0D&u*M5*~Q1)wP@9< zb+6AZd&5%R>GEmOCcTd0)bq?oWvwgZ{QZ`Sv2IkDa#CM~>4WiurA?1y4;)VB|^b1orngQ+ceW9Mt<*VI$U^cJW}#Uw@%KBL;WLt_yWvSpWZ; c{!8`#49)6Kt2^sv0t1}E)78&qol`;+0A#=M+yDRo literal 0 HcmV?d00001 diff --git a/public/icons/xmind/markers/otherMarkers/other-calendar.png b/public/icons/xmind/markers/otherMarkers/other-calendar.png new file mode 100644 index 0000000000000000000000000000000000000000..8623cae5e7030612d11c5c56fa1c0005b151898f GIT binary patch literal 1147 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy%*9TgAsieWw;%dHU|?Wu4)6(a z{r~^}mTfyqYZ{-+s4_%2^dvh{$wJ^%hC#RhA||E>LmLq-o2| zjFuSdzm-t|>H?|+iqF^A0qUKltqD{N)ILF3xmQuKO-2@|u}(xBs0*U(x|AYNwoX(W zCs6@1wav?r8g8o2JTT+J*=X-O-&Wzq&YBM5XH-uuY@=cs4*=q4Pq3~WFQyl z7oZmo96GvZ-$4i$VkX1^n8rff15xQ05D4@X!~sBiftCVg7fMJ&!eO11EKpfnM;Ee< zK)(P5XU?1n43^HWUZCxzWfed}AOQ$83gR}b_V$TO0<~XooWBPcJB=kle!&ca5TFDG z#>OrfAQS?CPAEqO9UuU7$IO|lR;}8N2F}32-Me?+K>#r7F+ojJ2n*0LoCO|{#S9GG zLLkg|>2BR0prCw-YeY$Kep*R+Vo@rCZ(?#$er{??W}<>yW>IQ+eo=O@g2mR1OBFz+ zA|R#CMX8A;nfZANA(^?U3>NyP`UV!v9MN{bw71>U#WBR9ckQL0!M7Yl*gu5(+Fl5A z$o;_3U$tf9#$6Q&`YR?zF-wRXS-dQ2PpR+J#obKX>Z{^6xH(OpS$6C_zh~L^$B`YDRVAYxAc? zk?gTYU%z%*SWr6k^1;nH-;Rq%)H6@m#6FXc*(4`x{V|>kG8gaJnK$3Gy8d`Q+mC?f zO}WMzy64`B@=oaX%X^;furg!~)6SZI^#?LnpZ!1cKXZ`M(kq?9N~X={ss)7RCPs>^ z{Bw>iK+0}HW`|r{o*=uPU{4V590mE7Cm)_({ONwI;(_EcHlCneALrHHuP8aBqOfX_ z#uK?awZidF6wY!8+`H3!ajHsVvmyJo1E1%JUf|_s;%Hg&F^~1uhV5P(CMB?jOfB9L zI1Xw#(e+*4f!7Q;a5htXX&L@yDrCGfbqqk4~H3Z*1=_XtL}LpHEr+mu+8yx8J^d y@7>3WUAwERs;c+Ktv~<#_3PL5NtHcWpQW3!PtK7Qc-9Y$Vg^rFKbLh*2~7Z)K=3F4 literal 0 HcmV?d00001 diff --git a/public/icons/xmind/markers/otherMarkers/other-chat.png b/public/icons/xmind/markers/otherMarkers/other-chat.png new file mode 100644 index 0000000000000000000000000000000000000000..9997abdf67748b39120f852eedf9af706fc001da GIT binary patch literal 1090 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy%*9TgAsieWw;%dHU|?YM3h)VW z{r~^Jf^Ixkq-T?(VVMn-atNq1bt{9gV{@l?#&kOdH(3R@8GF?LWj(?gfeIk9K}o$9 zZY4lLpfVuaD{&%FC6IgW!KV|qKODXBe*e|CyDq-jbN>1EbFa6YdAZ@#%dICLZ$EK= z&9Ucek33p_RxfFX2q?lfM#le>%J8Xj0Fyvep&FZEGUCjwiS72yZp9P+n$XU?|D-eQ`u$tZ0D&}%mS_2xdcz<>h!QMpM$ z85qcUB|(0{41!9=E}?1V9W!UnTm=NX!Qc!K+`W7E9S8u!ooYZ$_)s&@X3heS$YKTt zZXpn6ymYtj4^U9P#5JNMI6tkVJh3R1!8b9vC_gtfB{NaMEwd=KJijQrSixdz#-$3N zQW20+=c3falFa-(g^Eak-(R(y7y84oX$eF3VZnIa# zZn;(E?W`#3-0axn7R=&$Das}IQbv!f&$ZM4{)d+bcSYOT-TyOZ`Ca49#cAgs?)c9h zIO(6;X=#ba)k~i)S@N)S4W|tMhBMb#Q%k=JRVpX@hD}+tWRu*|@3)ub+UtIvv*3)v-xOrWkRh)qTri)kY z?T<#-S~s^(b=xhzEK;uCUN?t9boFNznHy`Z?Mxj`-hHIEIw1MD!v5S{e+>;CE8eg@mmPv`!+_u$!1)syk1cUMGSb6E5z&t_)YdbAS3S_`?500=)wB)1bY+@GzkB>zeAnYC5>G6v&OT`fT^zN2?zZcd+swVVm|J%B zJm`uvlsbGi5=4*DO@ zvRdcQ^C;yS!$M`Z52v$t&%6JU^`HSy|7GE>55~#?4=iJ}H*CsL{?E0aagJBq+}us) RcK~CZ!PC{xWt~$(697(A9q9l7 literal 0 HcmV?d00001 diff --git a/public/icons/xmind/markers/otherMarkers/other-clock.png b/public/icons/xmind/markers/otherMarkers/other-clock.png new file mode 100644 index 0000000000000000000000000000000000000000..a7dc740dcfb0f2f4674830ecf53db0dca0efbece GIT binary patch literal 1314 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy%*9TgAsieWw;%dHU|?We8{iY- z`v3ob;Y?E^5m523KcBw+{QU3hrw<_X{N0z^f8RcP{qFhG_qQLtz5V>fi^p%a-Fvy} z#`6nzUTnYh{P5kEb1yx*dG*Qmo6jcRxpU|Iqa&9et-knh(&_sub)O zIkV&P!b8`scV6t+d8vB;HS0Z>!;T(3w)L9TmUFhtj&0s}#%seFyC3V@79ZB;y{5B(R(oU=I(-V8P`SxygY}u05yUqIB#HjX7R$qHlS~fa9oRnO(s`qPm z$c!bCHEW$J*7$vCjh{JlX3c8LFRi|1tDL?x1{SYyE?pFzy|5u?sq^=0uY$!kX^Wgc zS2!fhb4r|L6EnRedbZ=IT(ig-4l&a$K4lq)PPMOZYz&@c>(`h5F-gy7f}MZAg=deo zW2cRCyQNL5jX||VT3VWRrG;&=lSY}DexZX>v3YD@7ba4!^=Mj4L8Kj@(KE(Ls)g$J7**!WPybEF!`0|e`xQEOCJi0((T0^Nh!(xSbu8bc{ zR`hi};$Ogdz+r2^3+^|w^_#h3^{3n^-ZV{RZsyMN`&&*qPug-)u)$d6Wy0yb|JQ}` zc?8LxXl)A9dMo+;?8W)@=YFTE{oN3v+P=U+d;0!c+ikx~AGp7D>v{S3x94u0)lOyS zus+cJ%#y!?|3h|WX5q(U>%P42&DIlOik-&Z^!=NCrR^=N7M=B04yzPT9}nc`J-LZ* zNo5&BSl(AAKh3V0MfFRUJy`f|&-`^Yg1yu73Ev{vYCZ{DKXoS6B&dDVRzd|udp<-h5_ba|?PT_Z3>F?hQAxvXt?BljmZSz0+23sm7EA_LE>H@nWo=h7PyvvH zn}cBp$Z%9c5XM66LQ(*93`iDeGQ=eyx3xt;xDYE~MnwZH1o~s+H&#Z1f zzbx~>^17po8%``PJGmfp--5zJbIVT73Ew{>=g{<+ol`4!Pfj{K$#uh|h)ul}+j?Vw zRsc=g+ieeY#w1Odh%-~s}nX&_Jz0Ucm4bLOg5t9FCI84$R8_wG9o0LB~{z-4lfHP8{91s;*b z3=G^tAk28_ZrvZCpnQpIL`iUdT1k0gQ7VIPVscS_ZfZ(qqJmpyQEGX9QFgI{#ny~V z6+opTAf?Vlsfi_-`FRQS#Z(T^|4Gj-BVd%S;y7SX0bglreApeVIIS0ojYFv};4>1J>yuFZR>vF=+UdiNWI;oIRIcmL%R;SLeFHc3xcE{no`7D{Rhv-ZSM?$|lWe z#TvXH9(?%m>K~_a*Q4rR#`@wx`SLOTt^o%Zvo-D&h#t_IcA9x#n-PhDhHZE}`vfOlR+Yy*!m?frK2( zdBfN%sD+UxlZI;?H2^cvHp00i_>zopr0CLapIRF3v literal 0 HcmV?d00001 diff --git a/public/icons/xmind/markers/otherMarkers/other-email.png b/public/icons/xmind/markers/otherMarkers/other-email.png new file mode 100644 index 0000000000000000000000000000000000000000..02fce6d53c6b2076dba08a2c4dba862874cea20e GIT binary patch literal 680 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy%*9TgAsieWw;%dH0CML9_=LFr z|Nnn+t`su*bye!uS-G$0r2ZdO{Bly}>rwgtdlkR#QTVz;@##LvpPSX5Y?ryeUGnEz zwWnKTpRSYtu~hx@Qq`MlrQR)3d9qaT))KiFb5+hSmb^7r{^nfy=TlXmPgOfVN9N=l z$w!k_ZcJ9Z(W`WLvec0tnX~N*hg;RgnXSdy8arx22vo62CJ zZ>n!#!ORhD$H2fS;pyTSV$pl{a(;M|fdp&8r6fPGz!xk_*NAMHBJl0+{^)Y){y!5B zpZ5EH)?&B4MSJ^0i~ov~Uq&#-MR5~ub(QdL459be+8J*=Te=lJ3 zc2v6b*Jk-Yt{nmbhR=j{zT^2j{cZDPR_?qbp69=~eqZHP@}8T?r+aabeTC(h^rfe! zzT>np=J=9s{m&;&V*k5J<{KC5_&Y?rxgK)+Jvdof{>Ajs4V@^PqB7Qr`xZ~uEwh<+ zUBPJI?B1ZCd)U}xs@Kf-fAg$l(WjZ!vz=f2yo+lOGEMjr;(z?t@7?x4jO!U6U5)y< TP2H9S7={d + + + Triangle 29 + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/otherMarkers/other-fax.png b/public/icons/xmind/markers/otherMarkers/other-fax.png new file mode 100644 index 0000000000000000000000000000000000000000..da6df11bbd4dbd5de65c355d23cb1a4be4494402 GIT binary patch literal 1130 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy%*9TgAsieWw;%dHU|?XJ7vK}( z`v3p`8S@sUrKN4(wRictO-om-nY(lqknEc}bJ^;3rDf%Zj~+j8^wi$HdpB?04is51 z*|M|Q7N~gh_TB3@Zv|=r3eH=y{OF1EKxO+5AA^{1j`}8yNrt=ggVAci+7OMlLNthyJ!ApsP3wJR*x37`TN%nDNrx zx<5cc`4ZQNlHmNblJdl&R0iL~|zCrtr?dpfJ#L`N}Y>R z6H7Al^Atidb5j{C^iA~*ESNc>?SSdC$Akm$ zkC)aal}$WGDcXvMQcg?KifS&V_mFwVEv=aMWP`hy#l&gpTC?l zT;#pUva80?bE?JjQ*P#N(YN;AyLRH0uy=|5 lbiI6~-kpmXLifJ-$?9k=5UaCWwE!4f44$rjF6*2UngAt@UcdkV literal 0 HcmV?d00001 diff --git a/public/icons/xmind/markers/otherMarkers/other-lightbulb.png b/public/icons/xmind/markers/otherMarkers/other-lightbulb.png new file mode 100644 index 0000000000000000000000000000000000000000..554dd82bfa6d149c5363ed02b21418dbe1eb69d4 GIT binary patch literal 860 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy%*9TgAsieWw;%dH0CFD&_=LFr z|Nnn+t`r`$qCgrb3n4d^$*e5~arf5A0T~cMpb7tee*E|4@!vNm{yy9N_vxCyPv-u8 zIN{ITb${>A|Mgtz&z+{z#hCHTk(#?fY8A_iL4ZELHzLPxI3p^~ZCR-%MA3K1J=u zG^IOzD%ZP}&vq)D=#oF%s(8FfVQ-V%p?Z0s+jdmS!kyZ5=(HTrv)&~^e!&caO2#gs zY2_U=SMA|zCrtr?dpfJ#L`N}Y>R6H7Al^Atidb5j{C z^iA~*ESNc>?HCvs3p`yMLo9k*CwB%l8wj)sp9>OnWzAo!6tOVr!i^=| zAUK-o>-@yFlXXAK&1WlY(K_q0_L2;%V(@|ax#mn=8|oN*Pnc!xOsU?%q{A2%5zlCK z=-5?11}*igx+_&@9y+)p`t6~%rjYZOvpjijtede-d(OJX4bN8=3Getk)!%Zyjp({{ zrwd!=&M9VlRP!s-q~zt9pMP(Pp4CXrx#BQ`b^q<}{g+KtB~vHc#<1VHc(}3NP-Cjl zsZYNmSIWP+WiP2xD5I`wxNiQoZ$ABhW?OI_HegapUdJQz>#qh+lR}U1h7YeaxvJj9 zyE(4E&V8VXXK7>J<=dD4$s0^&%R0v~WrxQ`<*l9D<$@I!8ED;}z`Nj#c#u#b)5nL) zWZJC_*%sL>pR&jF4A-PLmwF~lnUHfQv+MBG8OBjvd%Z>fMTy9;@y)*~!aj zW+uBQU7eK3xW!)Yuf2nz_Er5qo0`>I3a;&mPq|fA?z_YDzHq+LKj(YrrU2uH!PC{x JWt~$(698A(rNjUL literal 0 HcmV?d00001 diff --git a/public/icons/xmind/markers/otherMarkers/other-lock.png b/public/icons/xmind/markers/otherMarkers/other-lock.png new file mode 100644 index 0000000000000000000000000000000000000000..56a04996ba4ed52acba2fe52dbb786cbaee53aad GIT binary patch literal 1343 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy%*9TgAsieWw;%dHU|?Y44e$wZ z{r~^}s#5)kh$tXAKU)jJfRIazH5V5eF3iz}h+~p)jcI9Va1+*5n*mi87M0}Y=Ep^a z0mZv(GD^!Ufn1=n`ufJQvI-!(t-TXyI7A%ihHu}$fBO98?Ys9cU%!6w^7Wsmd;dJ% z_T=fahmW6pd${}my|worKKgxk`PbWPe&3w`>Bj0`*QPzaapKF>c~`IB_;s=S?!`Sf zFCF`Ie!|al&F{|7I)CxX-Sb<2o~iwDqUhtv<}+u`+&I1a{HcSlPW1dZn)TyI+JocM zKO8ALdhGbMBa1&C%6)OD@%zE}OGnn6J+k%r!MeMLdLQnuxw^OS@vee*J0o`Q*?(-$ zii^7^UEI}kV&}XoJ6iVdTzh3(?ZF*O&u;H|uqE;6_8Hr@@4T|L`02)wZCkgT+0?XQ z^R^=!ySHpwyKi0p>9u*=*G}KPcH+s^*=yFWKfbDP>)M{>tJfV~mT`1x%C_Yl+n2SR zS)8zV`Kp!67c5=6{M3S&^^3drFHD}lc-ir}QOg!iUcazu&%F4(b7MBltDH4&;m%pn zD`qzwnie#3=FF{AL-tM%oIbT@TaS0o#A&m7>w5cp*K~VN?yK+Yo7CPraYAp?x@PC5 z&R$@EH@7v{G`H6@ca+yP1LLltDz~bt1`-RvNC8Hf@l-7*U^-b}666=mASkG$q-1RD z0tTU>X=&x<9UVX`SFPF&2Eb4~bNBAucR&D)z<~yjcD)59an1sd$YKTtZXpn6ymYtj z4^U9P#5JNMI6tkVJh3R1!8b9vC_gtfB{NaMEwd=KJijQrSixdz#-$3NQW20+=c3fa zlFa-(g^3RYp zz7roGRXe}#*}C<~8A(Yi7H8kk>~h^dskQI$8PiRhqKutOzDEBv6ydOb@gt+T^=9a* z65gwZA}d}=>ZG+xEqk}%cGo+eYhkkTg%a)?B9FUE_%esJdeSP=#?Yr0aYuBkwHzG1yY(78Pb8la#@N%YuG72-SN|W;4W8K81V;J3|*_Sn) zGUIzBT2Pu8eBmf-_<_z?Ms=ryDLGtf%03U2RwPK7v0fJ7+Objlft$vRM&E-xDXg}< zOCu!%$A%gu}Q%5;Gvy~^G*hCJ%$ ztlr{Z-79>fwq;BT|KX&_rgA`8wV7?n4~Y(DhS&Tb#3U`OG=b60;OXk;vd$@?2>`P- B;uZh^ literal 0 HcmV?d00001 diff --git a/public/icons/xmind/markers/otherMarkers/other-no.svg b/public/icons/xmind/markers/otherMarkers/other-no.svg new file mode 100644 index 000000000..411244248 --- /dev/null +++ b/public/icons/xmind/markers/otherMarkers/other-no.svg @@ -0,0 +1,21 @@ + + + + symbol_wrong@16 + Created with Sketch. + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/otherMarkers/other-note.png b/public/icons/xmind/markers/otherMarkers/other-note.png new file mode 100644 index 0000000000000000000000000000000000000000..b074e33c49575975074019851fda8a7514c780fa GIT binary patch literal 1185 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy%*9TgAsieWw;%dHU|?W85#STz z`v3p`ms6F}($e0@s7%pN*%3Go$ha@B($&_!z1eyS}YhIZXP%%(s z*Unu)*(;5GGwu2oS%U0>=mk3I@86Fz#`ipIlu0>bB0Kn|3d+>YO=q=H{7omricF zaCrHlLx(=@DLr`T@asbgSNHbq-Mjb3{>U3!x4qt)|7y1q&>63{DQwxg_2njwJsW54 z*s%WI%A{AT6@YGgwM_Bl0!5(9*DqRpb?OYD zRYiMi>+^i&1=W??GMCIun^{y)P>`R$EItMp0#oB+f&Sg-HG6~SY+!I5c5pgn@3hC! z>8!2eGW+RUoSfD;IW2Q>n(6Lx%ED@%i{ou0?K8&4Pqb8Cs3@OT(*_0_Fl2xsKhxOw zqLS)WMb&+(s)tonx2dVF)=-5+2QV<5RhWMQqj*M1kY6x^AP^`iDH$6ZyFfr_D9{Pz zU;uRcs#U9Y?*<0YnRieC3~_pZthFf>KsRz0ctjR6FmMZjFyp1Wb$@_@@+GbjCBgY= zCFO}lsSLh}$wm3OsVSL>3T~N2spa`a*~JPLTQe?!^oxL$Iv1rTmSpDVDTHL^rZQOQ zo9Y`_FmpuP0n>G(r;B5VMQ?I~1Cz`h8J-^vi`tvpjpQm7`&~G7`33KA9kDffYGiw4 z<0(!qE{@Y#RTV5u6Pqmb?d7ezOuCP4$xOB5b2xdx!G3}DrCqyrADtko;XD7DjD&*p;4QwOJH;JvtO%Z}|3o#H-&(Q^$~K$FyVPJxE2EFli7n3!|8CS2Zo=F7fo z*Oo0icI;SN+pSx-UcH*NE6+Afg_Y;huglB)W*Vh_deSMZ?)&OJyIPc}9$OM4L&v5g Vd$h8j@&hA_!PC{xWt~$(69CG&Qbqs( literal 0 HcmV?d00001 diff --git a/public/icons/xmind/markers/otherMarkers/other-people.png b/public/icons/xmind/markers/otherMarkers/other-people.png new file mode 100644 index 0000000000000000000000000000000000000000..33ee0b7ddeafad309885f9dd8f000ec27c7dce71 GIT binary patch literal 1001 zcmV0$Qp@G}~VVFav%24(yk&OG}2)1^xuIPI%uR4G=S_?^-gwwJq%)Xc~w z0PHvdYCVV}vecY&`ErdH*9_p$w}$ML^wuqax=o%iKM#a)sX67cc{46ysteTNM! z_4t`oU$T9aBwCf9OQFC_o5r~EZL5zORS4kFcS;x8ZtlqTgaXO7BY^yzBtp`pdk4lZSD7#fR8b+{VxGEeg@%m^0UY*L=~Gy@C@K^LfAZXpYz{m|OzuuUf5sx|*zn z2fjFLS7Uh_rb5bi-c@VY9bdCvaKQ8B4~_LpR^vi~jrgkHOjjQAV_GwS1D_qb1QPo$ zq;4QXy(nLZBp!RsI{#i!uo(p)o+)1?s{lM> zpQnp%n7S6b?DZS}^;xX}a_#rz4BHv&@9m-+K7Q>6|89zi3IXi%#LSx+wmcGQJ`^9k zW}|<${$Bugdu6tsJw|2wnk3s>;DR9+5NLvM)A*6&FT7*du}w7r*!STX7p2vS0M-|L z-+bW-l%NyEkdx%`oJn}vH5>l*X%rxwc&05tcLIpT0ho~KD%x*;&OEF9mNU*VlU73yu?vf)fa1zP&xYvC%{Rm*ru&Jsoakv7pcqBjN9{0?g0=|1>*E>xK zqNV{-?s?Bl@5*CYgcSKc;?ejYHT;a5+&r}3uJdVT*Vt~q7_O%DYVSPaJN=Pb79#IT{&4j+8#S3)J*W9#A-7o0s)z+#EP5P`Q`W4w~ zP+=x74lz_;FZ3o%H&Vt+mS85RnP4g^ZCi$+2>|Oz{3)7m4c%Lxjw`+M(Y_zGphEuv Xc;@}Mk{r^^00000NkvXXu0mjfx!dKQ literal 0 HcmV?d00001 diff --git a/public/icons/xmind/markers/otherMarkers/other-people2.png b/public/icons/xmind/markers/otherMarkers/other-people2.png new file mode 100644 index 0000000000000000000000000000000000000000..fba6da3898b000c458077f373e869a78175fe8f1 GIT binary patch literal 987 zcmV<110?*3P)9c@RG?1nn&-n8erQu|6O#U zbkXiK&LaUNAY~V45U~VRMybBU_Xn;xvJ}9+Z}q&}5_d6T#W~193O-!<(ILyXC{WY$a{VA$)PLkQwm`3w|lg7wDt4dDQm>MrVK$pe0=B%JCp`6U@Ab|193uP z0Pn+(pB}!__N4&!db9gyB=*R25T`r_6!F%lhpu#3DS$m*?RJk#a1olI5OmLHN33#5 zIe^!C>|m^ahbbbnFmpqWey`TG$Ja-%`bFuDXwTQWbOW(ck;8@(Ir#I#S6RGScEa6W z?Qp!Kd%j`U7i|MUp~aU+t$Af>fDGc5j(;1u@r*e*oy;%WXnu zZ+~;_I)}~@fE8}&F~{fVo!Y!bkBPqjSA9Iv9Zp&-j|`a%Vo`@JrA?T;s|{cSP8 z)QDRiCh#W6ub%tw!W88E4vOTTjp)sOic9l0%KjvEQGv{^#80>Hm(hP=8U9iw_({ zN3hs@{7u1;ZK9+0;5JYE-IekyH^D$@Aed{(Z65oh0%$hO5*2l=Dw8wt$M5oCb2LST zB`*-I6<5FG=Xn>MKYdXl?4uBpq7zSvcr#m+JehpuEB@%r@-`3ryqwb6&IQ7rAxzx^ zlE`4T0`kuTagAdnR%z_u%zag<>Cr#W-MmMmJK>b9EHt<6LfX~frS77002ov JPDHLkV1fuX>hk~q literal 0 HcmV?d00001 diff --git a/public/icons/xmind/markers/otherMarkers/other-phone.png b/public/icons/xmind/markers/otherMarkers/other-phone.png new file mode 100644 index 0000000000000000000000000000000000000000..39d317295667d27626285df484926c6b75199f66 GIT binary patch literal 810 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy%*9TgAsieWw;%dH0CMjI_=LFr z|NsAJiwZI5_AK?AQ`F9a6$5qs`~LCY=j;F8pZfFc+V9(YeqC7i|IEx^rxyOc5d8m) z@vq~-Kle}mxu@;-5$#|5+<)w>{C+_D!yc`lTXlY{&;Guq;?-u&A8WL~Ey?<^TlEj&ll{L=)&yGpb)xCBDH?YtsekFx_|mFz zw@2+`tH$*nwTs=VcUsk+H>rQ90lDp7tt!wjpUTvqRjFOARSmZKv#iRWF{)OWfrBD=NDxcD_CsJxKsgDDgsjKT$Gwvl9`{U5R#dj%3z^y zs&8Py%n@zJz`*F_>Eak-(c63Zby$;w2y22vs>2H=;c1$woRW^>2bP!!r`Wvsy+42> z)L0qI%cr_0vK%W~0-me?Wzt({pK)_`%MD;?GkCiC KxvX>MTy3DptW*u4;HFw*h?-?Zx)8xB z@v1&=8<9ps_$hfGXi8Lqy<;AyUZB zK(-oUBiy1@rTRcGKum@^8)!bz84v@JRl*fOq<{_pYKL0{43?kYK7M)k^xc!|Z|U7tg6YHNHYq@oJ$)iI}cMi?Ev2W((y$kQ|uDQB< z`i^IO*iv zkfU>=_Rr4SKO=e9%*een!wyc5+&3lQ@Dz_NlY{n6^xZMhdwYNU-d=m4Q+M|G?C5da z)D;W#`-ZllZS9W0Al=yP2@0qN=QVY%kT73WWwWBf8WJE&ip_yxvM>+fJ76HMFy1i- zm?Tz|1o;Is2!eqU1QoZQ*H zKsR$1ctjR6FmMZjFyp1Wb$@_@@+GbjCBgY=CFO}lsSLh}$wm3OsVSL>3T~N2spa`a z*~JPLTQe?I0F{b>lsXrsCYEI8=P86_=B6@O=$q;rSTJ)$+c7XO346LYhFJ7oo%}Lf zC{UvPzSw4+TRu@f(Hf`AbZ={TxH#r)Ji6x1T&|8uJ#8%7rxvZevcf^?sH2Bi`nx}~ z?^++0u|010WhuYy{db>#&#k^!EZ*?H`;}Gq(yM8kBXxL7y)VnEukY&K_&$EGMcy7Y z-KDv`g6sFs`EBf5weO+dyiK=r*5z9ru(*|DHak2f{gcV*@O!!jc?@@^NzL3a=`(}0 zX{3eQ_2Z|lW-F+EwVE5dj`0$6!G@%4h8UyAKD=*EJ>_mq+Ng8dd^?lL{mXy+7`89c zNWbn>o3E#QW=fj((vxd+qE|0C<;9%Je}J_pPxipXm}k2Gz5n&x(K*TItHnHR{fr(TQyTPbnAf3l{M{~mq;%X9Xj zJ;u(zzBsLxxPGEXscpV(r^3G(*IdHxE)rd*^7YUSbH0}{cJCg3nV}~1Dsk-uulkEW z^`5>En13p0km_15$wfZk-VWc$FcGJaQ2mhGZ@ziI zeaqLrc=6$vZ{EBq3cT~~U0(n3%b&{sKaBq@eZP}=esS@~v%uuT;OXk;vd$@?2>>W| BxnKYQ literal 0 HcmV?d00001 diff --git a/public/icons/xmind/markers/otherMarkers/other-question.svg b/public/icons/xmind/markers/otherMarkers/other-question.svg new file mode 100644 index 000000000..37f19ef65 --- /dev/null +++ b/public/icons/xmind/markers/otherMarkers/other-question.svg @@ -0,0 +1,27 @@ + + + + symbol_question@16 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/otherMarkers/other-social.png b/public/icons/xmind/markers/otherMarkers/other-social.png new file mode 100644 index 0000000000000000000000000000000000000000..33909fcedb136c5151397ba76e73900b70abb125 GIT binary patch literal 1525 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy%*9TgAsieWw;%dHU|?X<4)6(a z{r~^JaHgq(Zajp9Gmr&=Y%}LVpp>Rn4ve-+O+6Of`_*R+K zTSR6}F{-oDDmV3w@9~Q1_K9kN=mLuCRha_Cf#xU_ngi9#CfHjwSwOUym)RAyuJY-% zOevlT6bVh~1FCcksXTM<JzPN zPsOY_);#~v;raU>uRakz@4%_0M{8&Ad9?g!>e3_Oi;p@?+5TYOf$Z7)isl^%pMAi6 z);|BKyR&*W-J7=8d-|TRskre#tlKui_SG~u&G^qwRFk#>UEw~Yn>|A1eLAvtXXYYx+)}h-j&i- zPI(Jf=dW}wT;W+d>uli)r|f0UX*16hEwN6SwJ~RrclJW_s=m#c6AmR#IGr@tA+L8& zO3$&%j+JRMjibAdN46h}Y1b5iHlYo>^J*3V!!w|EzjtSB zWX-0u%0=#NF_AT0-j#d2E4O==?RIRl3@BP|USDM06ksaaSrX(I%pfSJq-5;k5*nJ8R$gA-(J>POR)N577&rp~cY)v? z1OSuUz=GFo$7cXN!CBxDS#iR zWF{)OWfrBD=NDxcD_CsJxKsgDDgsjKT$Gwvl9`{U5R#dj%3z^ys&8Py%n@w|%v*t; zE{-7E#49{-H9N}CH_g`}3HWV&@miI@BTf54=>Ky%HpX>oZG{-{QMkVywHRh+*;+!+1qi=~c>!h3N%??UD z!?Lllw|Ay@_T^b?C*{1+c2eH6hc{AkhR>}D5ww9NEJ|Vz% zdim7rSGK3FdA%x%$0)&FJfLxvzDMJ7e{*qWe{+w0`?eprK+^SQe#tqUqYTOHaGQ^BGP$ukm0x)hwct z^1NAxL3@Tp?J*sJ8Js+VS4%n=IW>Q(3NS}y^ZrO+kO)}yF@V{K`=B0+<^%%$|A#ag@qwQ_+t#; TqM46@iI2h4)z4*}Q$iB}BaZ7? literal 0 HcmV?d00001 diff --git a/public/icons/xmind/markers/otherMarkers/other-unlock.png b/public/icons/xmind/markers/otherMarkers/other-unlock.png new file mode 100644 index 0000000000000000000000000000000000000000..5db185f860e637ec1ca5110a81f6ee8aadd39109 GIT binary patch literal 1231 zcmcgqiBB3<7)Onc(zw-W)oocunvJPV>%HolbyZQJ2cn?$STl*jwA4~L#M;hUw5^K8 zW2mTAa0r4YQt+gLI=p~6oj9q-JZaLdZaU{tUEDKGw*O$i~@8x}Y-^;^dLTzF1 z!ypidEgFT401wD@fj8hOO=Gjm^#VjXz)g{>Q#qy}W9Exir4JAm977 zX<=!3Z&oxnzp!WG@0h+{Hfg6#GqclUuO~}Zrh2D-nVui--u*FWS9klRjytPw-WjIp z_4+a0z|@F*XMnh>%{B}@H4L_E2Zw(CL1gT&S=W$e`-_MBm1<4@{L?#wYMH86GpZ7r zdT#4_9*=bu4t7?nyIQ8&8O9D~N0&<7QLkw49GBAu6kMY$WlWZ;lJiH~vNdho`DR>8 zn?m1ot)r!~xwTEw*rJtO6HA*6!uTikMcTRqkyxUr%aMsVeL^B%DDD*y#I@Y6nxrbe zu(5{KQk|iyiqn;&2Fh@{Qe-nhGw;^TYEv zCB>Y3>;g`9K1ad&JoA2D`rVx3TXBWyvEVVqjL!-fS2zqDp`&dQtot!N0)vCt*_}Ay zjYJ|NNhIbWa&y5Q4Gj%F|3R;xTRQ~U!~cpiFq<(j=aHMJ7#aj}^xZ?Vn3&7l2joZe z;AlFILZUMXR3hXuA%RLsAtojh;33IWB9lTT)8Kx}q=|GObvTp;QHcb4GUWywpPWL3 z___PKd-z#F}84IQx`a1}XN^F;R23BQHe8eerQ>kZIJ>rokEJ z_ctBk6=1Sl%&_-#fI2(tv)cSGFyj1WF4(M-Nk&&KR*)!ge~TH`h=HOks-kgrFsu_P zN0MZ;c8w=*aM!VO8lz(k*Zfz-)KKRHw(FWY) zR`H-#0Cxxucw5XuC0a+Uxa2+$j(}gylEOJfti(iXuTOZei5*lpoDDSjtQY$?Luo;U z$CzaMpm)Ax#@PoY+;y<7R(htH38o`8Wr#lX;<+gC)>`;5Y~@p~|BUF0W5{$2qRc$> zET$WAzh2-XS*M;}yJ4Wqbt%mThWw~Rzik^BCE%?_o{_5c2B}Kj^UUDd-QzpwpmqA{ zyR%}9beq~(%r&CsvsSzT=yTsBa^OfmI + + + symbol_right@16 + Created with Sketch. + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/otherMarkers/symbol-image.svg b/public/icons/xmind/markers/otherMarkers/symbol-image.svg new file mode 100644 index 000000000..8e5bea156 --- /dev/null +++ b/public/icons/xmind/markers/otherMarkers/symbol-image.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/public/icons/xmind/markers/otherMarkers/symbol-info.svg b/public/icons/xmind/markers/otherMarkers/symbol-info.svg new file mode 100644 index 000000000..5ddd55fb0 --- /dev/null +++ b/public/icons/xmind/markers/otherMarkers/symbol-info.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/icons/xmind/markers/peopleMarkers/people-blue.svg b/public/icons/xmind/markers/peopleMarkers/people-blue.svg new file mode 100644 index 000000000..70e5fb58b --- /dev/null +++ b/public/icons/xmind/markers/peopleMarkers/people-blue.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/xmind/markers/peopleMarkers/people-dark-blue.svg b/public/icons/xmind/markers/peopleMarkers/people-dark-blue.svg new file mode 100644 index 000000000..47dcbb607 --- /dev/null +++ b/public/icons/xmind/markers/peopleMarkers/people-dark-blue.svg @@ -0,0 +1,12 @@ + + + + people_dark_blue@16 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/peopleMarkers/people-dark-gray.svg b/public/icons/xmind/markers/peopleMarkers/people-dark-gray.svg new file mode 100644 index 000000000..fc7d03381 --- /dev/null +++ b/public/icons/xmind/markers/peopleMarkers/people-dark-gray.svg @@ -0,0 +1,21 @@ + + + + peo_bla + Created with Sketch. + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/peopleMarkers/people-dark-green.svg b/public/icons/xmind/markers/peopleMarkers/people-dark-green.svg new file mode 100644 index 000000000..d894053b4 --- /dev/null +++ b/public/icons/xmind/markers/peopleMarkers/people-dark-green.svg @@ -0,0 +1,17 @@ + + + + peo_gra + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/peopleMarkers/people-gray.svg b/public/icons/xmind/markers/peopleMarkers/people-gray.svg new file mode 100644 index 000000000..a25e7d094 --- /dev/null +++ b/public/icons/xmind/markers/peopleMarkers/people-gray.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/xmind/markers/peopleMarkers/people-green.svg b/public/icons/xmind/markers/peopleMarkers/people-green.svg new file mode 100644 index 000000000..59c15314f --- /dev/null +++ b/public/icons/xmind/markers/peopleMarkers/people-green.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/xmind/markers/peopleMarkers/people-orange.svg b/public/icons/xmind/markers/peopleMarkers/people-orange.svg new file mode 100644 index 000000000..3a8288921 --- /dev/null +++ b/public/icons/xmind/markers/peopleMarkers/people-orange.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/xmind/markers/peopleMarkers/people-purple.svg b/public/icons/xmind/markers/peopleMarkers/people-purple.svg new file mode 100644 index 000000000..a493ee17f --- /dev/null +++ b/public/icons/xmind/markers/peopleMarkers/people-purple.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/public/icons/xmind/markers/peopleMarkers/people-red.svg b/public/icons/xmind/markers/peopleMarkers/people-red.svg new file mode 100644 index 000000000..335ff521a --- /dev/null +++ b/public/icons/xmind/markers/peopleMarkers/people-red.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/xmind/markers/peopleMarkers/people-yellow.svg b/public/icons/xmind/markers/peopleMarkers/people-yellow.svg new file mode 100644 index 000000000..4854633d2 --- /dev/null +++ b/public/icons/xmind/markers/peopleMarkers/people-yellow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/xmind/markers/priorityMarkers/priority-1.svg b/public/icons/xmind/markers/priorityMarkers/priority-1.svg new file mode 100644 index 000000000..6f5bce1cf --- /dev/null +++ b/public/icons/xmind/markers/priorityMarkers/priority-1.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/xmind/markers/priorityMarkers/priority-2.svg b/public/icons/xmind/markers/priorityMarkers/priority-2.svg new file mode 100644 index 000000000..062886d29 --- /dev/null +++ b/public/icons/xmind/markers/priorityMarkers/priority-2.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/xmind/markers/priorityMarkers/priority-3.svg b/public/icons/xmind/markers/priorityMarkers/priority-3.svg new file mode 100644 index 000000000..cbab34e5b --- /dev/null +++ b/public/icons/xmind/markers/priorityMarkers/priority-3.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/public/icons/xmind/markers/priorityMarkers/priority-4.svg b/public/icons/xmind/markers/priorityMarkers/priority-4.svg new file mode 100644 index 000000000..9166f74d2 --- /dev/null +++ b/public/icons/xmind/markers/priorityMarkers/priority-4.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/xmind/markers/priorityMarkers/priority-5.svg b/public/icons/xmind/markers/priorityMarkers/priority-5.svg new file mode 100644 index 000000000..e2e384e86 --- /dev/null +++ b/public/icons/xmind/markers/priorityMarkers/priority-5.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/xmind/markers/priorityMarkers/priority-6.svg b/public/icons/xmind/markers/priorityMarkers/priority-6.svg new file mode 100644 index 000000000..7a615a60b --- /dev/null +++ b/public/icons/xmind/markers/priorityMarkers/priority-6.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/xmind/markers/priorityMarkers/priority-7.svg b/public/icons/xmind/markers/priorityMarkers/priority-7.svg new file mode 100644 index 000000000..6aab421aa --- /dev/null +++ b/public/icons/xmind/markers/priorityMarkers/priority-7.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/xmind/markers/priorityMarkers/priority-8.svg b/public/icons/xmind/markers/priorityMarkers/priority-8.svg new file mode 100644 index 000000000..8e9ced2dd --- /dev/null +++ b/public/icons/xmind/markers/priorityMarkers/priority-8.svg @@ -0,0 +1,20 @@ + + + + task_8 + Created with Sketch. + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/priorityMarkers/priority-9.svg b/public/icons/xmind/markers/priorityMarkers/priority-9.svg new file mode 100644 index 000000000..9e621d972 --- /dev/null +++ b/public/icons/xmind/markers/priorityMarkers/priority-9.svg @@ -0,0 +1,20 @@ + + + + task_9 + Created with Sketch. + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/smileyMarkers/smiley-adore.svg b/public/icons/xmind/markers/smileyMarkers/smiley-adore.svg new file mode 100644 index 000000000..509898a42 --- /dev/null +++ b/public/icons/xmind/markers/smileyMarkers/smiley-adore.svg @@ -0,0 +1,25 @@ + + + + emotion_adore@16 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/smileyMarkers/smiley-angry.svg b/public/icons/xmind/markers/smileyMarkers/smiley-angry.svg new file mode 100644 index 000000000..f05301012 --- /dev/null +++ b/public/icons/xmind/markers/smileyMarkers/smiley-angry.svg @@ -0,0 +1,25 @@ + + + + emotion_angry@16 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/smileyMarkers/smiley-boring.svg b/public/icons/xmind/markers/smileyMarkers/smiley-boring.svg new file mode 100644 index 000000000..8e0bf0936 --- /dev/null +++ b/public/icons/xmind/markers/smileyMarkers/smiley-boring.svg @@ -0,0 +1,25 @@ + + + + emotion_boring@16 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/smileyMarkers/smiley-cry-laugh.svg b/public/icons/xmind/markers/smileyMarkers/smiley-cry-laugh.svg new file mode 100644 index 000000000..75b120e93 --- /dev/null +++ b/public/icons/xmind/markers/smileyMarkers/smiley-cry-laugh.svg @@ -0,0 +1,32 @@ + + + + emotion_cry_laugh@16 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/smileyMarkers/smiley-cry.svg b/public/icons/xmind/markers/smileyMarkers/smiley-cry.svg new file mode 100644 index 000000000..a201ecb20 --- /dev/null +++ b/public/icons/xmind/markers/smileyMarkers/smiley-cry.svg @@ -0,0 +1,25 @@ + + + + emotion_cry@16 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + diff --git a/public/icons/xmind/markers/smileyMarkers/smiley-devil.svg b/public/icons/xmind/markers/smileyMarkers/smiley-devil.svg new file mode 100644 index 000000000..58660945a --- /dev/null +++ b/public/icons/xmind/markers/smileyMarkers/smiley-devil.svg @@ -0,0 +1,41 @@ + + + + emotion_devil@16 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/smileyMarkers/smiley-embarrass.svg b/public/icons/xmind/markers/smileyMarkers/smiley-embarrass.svg new file mode 100644 index 000000000..3c51ee56e --- /dev/null +++ b/public/icons/xmind/markers/smileyMarkers/smiley-embarrass.svg @@ -0,0 +1,23 @@ + + + + emotion_embrrass@16 + Created with Sketch. + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/smileyMarkers/smiley-laugh.svg b/public/icons/xmind/markers/smileyMarkers/smiley-laugh.svg new file mode 100644 index 000000000..a48859214 --- /dev/null +++ b/public/icons/xmind/markers/smileyMarkers/smiley-laugh.svg @@ -0,0 +1,25 @@ + + + + emotion_laugh@16 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/smileyMarkers/smiley-love.svg b/public/icons/xmind/markers/smileyMarkers/smiley-love.svg new file mode 100644 index 000000000..1aded9cb5 --- /dev/null +++ b/public/icons/xmind/markers/smileyMarkers/smiley-love.svg @@ -0,0 +1,17 @@ + + + + emotion_love@16 + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/smileyMarkers/smiley-sad.svg b/public/icons/xmind/markers/smileyMarkers/smiley-sad.svg new file mode 100644 index 000000000..7b40662e9 --- /dev/null +++ b/public/icons/xmind/markers/smileyMarkers/smiley-sad.svg @@ -0,0 +1,23 @@ + + + + emotion_sad@16 + Created with Sketch. + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/smileyMarkers/smiley-smile.svg b/public/icons/xmind/markers/smileyMarkers/smiley-smile.svg new file mode 100644 index 000000000..4166e9734 --- /dev/null +++ b/public/icons/xmind/markers/smileyMarkers/smiley-smile.svg @@ -0,0 +1,23 @@ + + + + emotion_smile@16 + Created with Sketch. + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/smileyMarkers/smiley-surprise.svg b/public/icons/xmind/markers/smileyMarkers/smiley-surprise.svg new file mode 100644 index 000000000..ca84170ef --- /dev/null +++ b/public/icons/xmind/markers/smileyMarkers/smiley-surprise.svg @@ -0,0 +1,28 @@ + + + + emotion_surprise@16 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/smileyMarkers/smiley-think.svg b/public/icons/xmind/markers/smileyMarkers/smiley-think.svg new file mode 100644 index 000000000..d268f8052 --- /dev/null +++ b/public/icons/xmind/markers/smileyMarkers/smiley-think.svg @@ -0,0 +1,32 @@ + + + + emotion_think@16 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/smileyMarkers/smiley-upset.svg b/public/icons/xmind/markers/smileyMarkers/smiley-upset.svg new file mode 100644 index 000000000..90577f07d --- /dev/null +++ b/public/icons/xmind/markers/smileyMarkers/smiley-upset.svg @@ -0,0 +1,23 @@ + + + + emotion_upset@16 + Created with Sketch. + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/socialMarkers/c_symbol_broken_heart.svg b/public/icons/xmind/markers/socialMarkers/c_symbol_broken_heart.svg new file mode 100644 index 000000000..58461bf53 --- /dev/null +++ b/public/icons/xmind/markers/socialMarkers/c_symbol_broken_heart.svg @@ -0,0 +1,12 @@ + + + + symbol_broken_heart + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/socialMarkers/c_symbol_contact.svg b/public/icons/xmind/markers/socialMarkers/c_symbol_contact.svg new file mode 100644 index 000000000..c15b7f97e --- /dev/null +++ b/public/icons/xmind/markers/socialMarkers/c_symbol_contact.svg @@ -0,0 +1,13 @@ + + + + symbol_contact + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/socialMarkers/symbol-comment.svg b/public/icons/xmind/markers/socialMarkers/symbol-comment.svg new file mode 100644 index 000000000..7acb9d433 --- /dev/null +++ b/public/icons/xmind/markers/socialMarkers/symbol-comment.svg @@ -0,0 +1,21 @@ + + + + symbol_comment + Created with Sketch. + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/socialMarkers/symbol-no-entry.svg b/public/icons/xmind/markers/socialMarkers/symbol-no-entry.svg new file mode 100644 index 000000000..c55bee780 --- /dev/null +++ b/public/icons/xmind/markers/socialMarkers/symbol-no-entry.svg @@ -0,0 +1,12 @@ + + + + symbol_no_entry + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/socialMarkers/symbol-notice.svg b/public/icons/xmind/markers/socialMarkers/symbol-notice.svg new file mode 100644 index 000000000..037011fe2 --- /dev/null +++ b/public/icons/xmind/markers/socialMarkers/symbol-notice.svg @@ -0,0 +1,22 @@ + + + + symbol_notice + Created with Sketch. + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/socialMarkers/symbol-rss.svg b/public/icons/xmind/markers/socialMarkers/symbol-rss.svg new file mode 100644 index 000000000..df132c76a --- /dev/null +++ b/public/icons/xmind/markers/socialMarkers/symbol-rss.svg @@ -0,0 +1,23 @@ + + + + symbol_rss + Created with Sketch. + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/socialMarkers/symbol-share.svg b/public/icons/xmind/markers/socialMarkers/symbol-share.svg new file mode 100644 index 000000000..f0759cee6 --- /dev/null +++ b/public/icons/xmind/markers/socialMarkers/symbol-share.svg @@ -0,0 +1,25 @@ + + + + symbol_share + Created with Sketch. + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/socialMarkers/symbol_forward.svg b/public/icons/xmind/markers/socialMarkers/symbol_forward.svg new file mode 100644 index 000000000..751ad9260 --- /dev/null +++ b/public/icons/xmind/markers/socialMarkers/symbol_forward.svg @@ -0,0 +1,22 @@ + + + + symbol_forward + Created with Sketch. + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/starMarkers/star-blue.svg b/public/icons/xmind/markers/starMarkers/star-blue.svg new file mode 100644 index 000000000..512355521 --- /dev/null +++ b/public/icons/xmind/markers/starMarkers/star-blue.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/xmind/markers/starMarkers/star-dark-blue.svg b/public/icons/xmind/markers/starMarkers/star-dark-blue.svg new file mode 100644 index 000000000..b60ac2800 --- /dev/null +++ b/public/icons/xmind/markers/starMarkers/star-dark-blue.svg @@ -0,0 +1,12 @@ + + + + star_dark_blue@16 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/starMarkers/star-dark-gray.svg b/public/icons/xmind/markers/starMarkers/star-dark-gray.svg new file mode 100644 index 000000000..7047fd385 --- /dev/null +++ b/public/icons/xmind/markers/starMarkers/star-dark-gray.svg @@ -0,0 +1,21 @@ + + + + star_bla + Created with Sketch. + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/starMarkers/star-dark-green.svg b/public/icons/xmind/markers/starMarkers/star-dark-green.svg new file mode 100644 index 000000000..347d97212 --- /dev/null +++ b/public/icons/xmind/markers/starMarkers/star-dark-green.svg @@ -0,0 +1,17 @@ + + + + star_gra + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/starMarkers/star-gray.svg b/public/icons/xmind/markers/starMarkers/star-gray.svg new file mode 100644 index 000000000..38564e304 --- /dev/null +++ b/public/icons/xmind/markers/starMarkers/star-gray.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/xmind/markers/starMarkers/star-green.svg b/public/icons/xmind/markers/starMarkers/star-green.svg new file mode 100644 index 000000000..8132f6afe --- /dev/null +++ b/public/icons/xmind/markers/starMarkers/star-green.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/xmind/markers/starMarkers/star-orange.svg b/public/icons/xmind/markers/starMarkers/star-orange.svg new file mode 100644 index 000000000..5ee0812a6 --- /dev/null +++ b/public/icons/xmind/markers/starMarkers/star-orange.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/xmind/markers/starMarkers/star-purple.svg b/public/icons/xmind/markers/starMarkers/star-purple.svg new file mode 100644 index 000000000..73a84c535 --- /dev/null +++ b/public/icons/xmind/markers/starMarkers/star-purple.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/public/icons/xmind/markers/starMarkers/star-red.svg b/public/icons/xmind/markers/starMarkers/star-red.svg new file mode 100644 index 000000000..1db133723 --- /dev/null +++ b/public/icons/xmind/markers/starMarkers/star-red.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/xmind/markers/starMarkers/star-yellow.svg b/public/icons/xmind/markers/starMarkers/star-yellow.svg new file mode 100644 index 000000000..ab4fef98f --- /dev/null +++ b/public/icons/xmind/markers/starMarkers/star-yellow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/xmind/markers/symbolMarkers/c_simbol-exclam.svg b/public/icons/xmind/markers/symbolMarkers/c_simbol-exclam.svg new file mode 100644 index 000000000..27cb761c1 --- /dev/null +++ b/public/icons/xmind/markers/symbolMarkers/c_simbol-exclam.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/icons/xmind/markers/symbolMarkers/c_simbol-info.svg b/public/icons/xmind/markers/symbolMarkers/c_simbol-info.svg new file mode 100644 index 000000000..f06474e64 --- /dev/null +++ b/public/icons/xmind/markers/symbolMarkers/c_simbol-info.svg @@ -0,0 +1,11 @@ + + + + Oval 1 Copy 35 + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/symbolMarkers/c_simbol-minus.svg b/public/icons/xmind/markers/symbolMarkers/c_simbol-minus.svg new file mode 100644 index 000000000..c481960ce --- /dev/null +++ b/public/icons/xmind/markers/symbolMarkers/c_simbol-minus.svg @@ -0,0 +1,11 @@ + + + + Oval 1 Copy 40 + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/symbolMarkers/c_simbol-pause.svg b/public/icons/xmind/markers/symbolMarkers/c_simbol-pause.svg new file mode 100644 index 000000000..e7e3dee3e --- /dev/null +++ b/public/icons/xmind/markers/symbolMarkers/c_simbol-pause.svg @@ -0,0 +1,11 @@ + + + + Oval 1 Copy 39 + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/symbolMarkers/c_simbol-plus.svg b/public/icons/xmind/markers/symbolMarkers/c_simbol-plus.svg new file mode 100644 index 000000000..8ce7c63f4 --- /dev/null +++ b/public/icons/xmind/markers/symbolMarkers/c_simbol-plus.svg @@ -0,0 +1,11 @@ + + + + Oval 1 Copy 41 + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/symbolMarkers/c_simbol-question.svg b/public/icons/xmind/markers/symbolMarkers/c_simbol-question.svg new file mode 100644 index 000000000..91254ffd6 --- /dev/null +++ b/public/icons/xmind/markers/symbolMarkers/c_simbol-question.svg @@ -0,0 +1,11 @@ + + + + Oval 1 Copy 37 + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/symbolMarkers/c_simbol-right.svg b/public/icons/xmind/markers/symbolMarkers/c_simbol-right.svg new file mode 100644 index 000000000..3ea125349 --- /dev/null +++ b/public/icons/xmind/markers/symbolMarkers/c_simbol-right.svg @@ -0,0 +1,11 @@ + + + + Oval 1 Copy 36 + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/symbolMarkers/c_simbol-wrong.svg b/public/icons/xmind/markers/symbolMarkers/c_simbol-wrong.svg new file mode 100644 index 000000000..1f8771c4c --- /dev/null +++ b/public/icons/xmind/markers/symbolMarkers/c_simbol-wrong.svg @@ -0,0 +1,11 @@ + + + + Oval 1 Copy 38 + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/symbolMarkers/c_symbol_bar_chart.svg b/public/icons/xmind/markers/symbolMarkers/c_symbol_bar_chart.svg new file mode 100644 index 000000000..164a991d5 --- /dev/null +++ b/public/icons/xmind/markers/symbolMarkers/c_symbol_bar_chart.svg @@ -0,0 +1,14 @@ + + + + symbol_bar_chart + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/symbolMarkers/c_symbol_contact.svg b/public/icons/xmind/markers/symbolMarkers/c_symbol_contact.svg new file mode 100644 index 000000000..c15b7f97e --- /dev/null +++ b/public/icons/xmind/markers/symbolMarkers/c_symbol_contact.svg @@ -0,0 +1,13 @@ + + + + symbol_contact + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/symbolMarkers/c_symbol_dislike.svg b/public/icons/xmind/markers/symbolMarkers/c_symbol_dislike.svg new file mode 100644 index 000000000..90ef2236a --- /dev/null +++ b/public/icons/xmind/markers/symbolMarkers/c_symbol_dislike.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/symbolMarkers/c_symbol_drink.svg b/public/icons/xmind/markers/symbolMarkers/c_symbol_drink.svg new file mode 100644 index 000000000..19877e505 --- /dev/null +++ b/public/icons/xmind/markers/symbolMarkers/c_symbol_drink.svg @@ -0,0 +1,24 @@ + + + + sym_饮用 + Created with Sketch. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/symbolMarkers/c_symbol_exercise.svg b/public/icons/xmind/markers/symbolMarkers/c_symbol_exercise.svg new file mode 100644 index 000000000..7b8c5d507 --- /dev/null +++ b/public/icons/xmind/markers/symbolMarkers/c_symbol_exercise.svg @@ -0,0 +1,12 @@ + + + + symbol_exercise + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/symbolMarkers/c_symbol_flight.svg b/public/icons/xmind/markers/symbolMarkers/c_symbol_flight.svg new file mode 100644 index 000000000..eabd93ac2 --- /dev/null +++ b/public/icons/xmind/markers/symbolMarkers/c_symbol_flight.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/xmind/markers/symbolMarkers/c_symbol_heart.svg b/public/icons/xmind/markers/symbolMarkers/c_symbol_heart.svg new file mode 100644 index 000000000..57db094c4 --- /dev/null +++ b/public/icons/xmind/markers/symbolMarkers/c_symbol_heart.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/xmind/markers/symbolMarkers/c_symbol_hourglass.svg b/public/icons/xmind/markers/symbolMarkers/c_symbol_hourglass.svg new file mode 100644 index 000000000..00df48d0f --- /dev/null +++ b/public/icons/xmind/markers/symbolMarkers/c_symbol_hourglass.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/icons/xmind/markers/symbolMarkers/c_symbol_like.svg b/public/icons/xmind/markers/symbolMarkers/c_symbol_like.svg new file mode 100644 index 000000000..6012c9289 --- /dev/null +++ b/public/icons/xmind/markers/symbolMarkers/c_symbol_like.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/xmind/markers/symbolMarkers/c_symbol_line_graph.svg b/public/icons/xmind/markers/symbolMarkers/c_symbol_line_graph.svg new file mode 100644 index 000000000..d4e01b96b --- /dev/null +++ b/public/icons/xmind/markers/symbolMarkers/c_symbol_line_graph.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/icons/xmind/markers/symbolMarkers/c_symbol_lock.svg b/public/icons/xmind/markers/symbolMarkers/c_symbol_lock.svg new file mode 100644 index 000000000..031997450 --- /dev/null +++ b/public/icons/xmind/markers/symbolMarkers/c_symbol_lock.svg @@ -0,0 +1,21 @@ + + + + symbol_lock + Created with Sketch. + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/symbolMarkers/c_symbol_medals.svg b/public/icons/xmind/markers/symbolMarkers/c_symbol_medals.svg new file mode 100644 index 000000000..462f3bac5 --- /dev/null +++ b/public/icons/xmind/markers/symbolMarkers/c_symbol_medals.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/icons/xmind/markers/symbolMarkers/c_symbol_money.svg b/public/icons/xmind/markers/symbolMarkers/c_symbol_money.svg new file mode 100644 index 000000000..ede36f2eb --- /dev/null +++ b/public/icons/xmind/markers/symbolMarkers/c_symbol_money.svg @@ -0,0 +1,20 @@ + + + + symbol_money + Created with Sketch. + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/symbolMarkers/c_symbol_music.svg b/public/icons/xmind/markers/symbolMarkers/c_symbol_music.svg new file mode 100644 index 000000000..ab87ab37c --- /dev/null +++ b/public/icons/xmind/markers/symbolMarkers/c_symbol_music.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/xmind/markers/symbolMarkers/c_symbol_pen.svg b/public/icons/xmind/markers/symbolMarkers/c_symbol_pen.svg new file mode 100644 index 000000000..4f3eaa979 --- /dev/null +++ b/public/icons/xmind/markers/symbolMarkers/c_symbol_pen.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/icons/xmind/markers/symbolMarkers/c_symbol_pie_chart.svg b/public/icons/xmind/markers/symbolMarkers/c_symbol_pie_chart.svg new file mode 100644 index 000000000..4a71a5cab --- /dev/null +++ b/public/icons/xmind/markers/symbolMarkers/c_symbol_pie_chart.svg @@ -0,0 +1,18 @@ + + + + symbol_pie_chart + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/symbolMarkers/c_symbol_shopping_cart.svg b/public/icons/xmind/markers/symbolMarkers/c_symbol_shopping_cart.svg new file mode 100644 index 000000000..c84f529a5 --- /dev/null +++ b/public/icons/xmind/markers/symbolMarkers/c_symbol_shopping_cart.svg @@ -0,0 +1,24 @@ + + + + symbol_shopping_cart + Created with Sketch. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/symbolMarkers/c_symbol_telephone.svg b/public/icons/xmind/markers/symbolMarkers/c_symbol_telephone.svg new file mode 100644 index 000000000..e26efd906 --- /dev/null +++ b/public/icons/xmind/markers/symbolMarkers/c_symbol_telephone.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/xmind/markers/symbolMarkers/c_symbol_thermometer.svg b/public/icons/xmind/markers/symbolMarkers/c_symbol_thermometer.svg new file mode 100644 index 000000000..300fb560d --- /dev/null +++ b/public/icons/xmind/markers/symbolMarkers/c_symbol_thermometer.svg @@ -0,0 +1,28 @@ + + + + sym_温度计 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/symbolMarkers/c_symbol_trophy.svg b/public/icons/xmind/markers/symbolMarkers/c_symbol_trophy.svg new file mode 100644 index 000000000..dde0c1f98 --- /dev/null +++ b/public/icons/xmind/markers/symbolMarkers/c_symbol_trophy.svg @@ -0,0 +1,28 @@ + + + + symbol_trophy + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/symbolMarkers/symbol-100.svg b/public/icons/xmind/markers/symbolMarkers/symbol-100.svg new file mode 100644 index 000000000..0c054bdc6 --- /dev/null +++ b/public/icons/xmind/markers/symbolMarkers/symbol-100.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/public/icons/xmind/markers/symbolMarkers/symbol-attention.svg b/public/icons/xmind/markers/symbolMarkers/symbol-attention.svg new file mode 100644 index 000000000..bbadb95fc --- /dev/null +++ b/public/icons/xmind/markers/symbolMarkers/symbol-attention.svg @@ -0,0 +1,27 @@ + + + + symbol_attention@16 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/symbolMarkers/symbol-diamond.svg b/public/icons/xmind/markers/symbolMarkers/symbol-diamond.svg new file mode 100644 index 000000000..86fa76a0a --- /dev/null +++ b/public/icons/xmind/markers/symbolMarkers/symbol-diamond.svg @@ -0,0 +1,24 @@ + + + + symbol_diamond + Created with Sketch. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/symbolMarkers/symbol-entertainment.svg b/public/icons/xmind/markers/symbolMarkers/symbol-entertainment.svg new file mode 100644 index 000000000..e48773fde --- /dev/null +++ b/public/icons/xmind/markers/symbolMarkers/symbol-entertainment.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/icons/xmind/markers/symbolMarkers/symbol-exclam.svg b/public/icons/xmind/markers/symbolMarkers/symbol-exclam.svg new file mode 100644 index 000000000..27cb761c1 --- /dev/null +++ b/public/icons/xmind/markers/symbolMarkers/symbol-exclam.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/icons/xmind/markers/symbolMarkers/symbol-idea.svg b/public/icons/xmind/markers/symbolMarkers/symbol-idea.svg new file mode 100644 index 000000000..499aa621f --- /dev/null +++ b/public/icons/xmind/markers/symbolMarkers/symbol-idea.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/icons/xmind/markers/symbolMarkers/symbol-info.svg b/public/icons/xmind/markers/symbolMarkers/symbol-info.svg new file mode 100644 index 000000000..5ddd55fb0 --- /dev/null +++ b/public/icons/xmind/markers/symbolMarkers/symbol-info.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/icons/xmind/markers/symbolMarkers/symbol-lightning.svg b/public/icons/xmind/markers/symbolMarkers/symbol-lightning.svg new file mode 100644 index 000000000..c738c5f84 --- /dev/null +++ b/public/icons/xmind/markers/symbolMarkers/symbol-lightning.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/icons/xmind/markers/symbolMarkers/symbol-minus.svg b/public/icons/xmind/markers/symbolMarkers/symbol-minus.svg new file mode 100644 index 000000000..3939cf4b1 --- /dev/null +++ b/public/icons/xmind/markers/symbolMarkers/symbol-minus.svg @@ -0,0 +1,26 @@ + + + + symbol_minus@16 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/symbolMarkers/symbol-pause.svg b/public/icons/xmind/markers/symbolMarkers/symbol-pause.svg new file mode 100644 index 000000000..858307e6e --- /dev/null +++ b/public/icons/xmind/markers/symbolMarkers/symbol-pause.svg @@ -0,0 +1,27 @@ + + + + symbol_pause@16 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/symbolMarkers/symbol-pin.svg b/public/icons/xmind/markers/symbolMarkers/symbol-pin.svg new file mode 100644 index 000000000..c9ae5dc3b --- /dev/null +++ b/public/icons/xmind/markers/symbolMarkers/symbol-pin.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/icons/xmind/markers/symbolMarkers/symbol-plus.svg b/public/icons/xmind/markers/symbolMarkers/symbol-plus.svg new file mode 100644 index 000000000..c0a3953fd --- /dev/null +++ b/public/icons/xmind/markers/symbolMarkers/symbol-plus.svg @@ -0,0 +1,21 @@ + + + + symbol_plus@16 + Created with Sketch. + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/symbolMarkers/symbol-question.svg b/public/icons/xmind/markers/symbolMarkers/symbol-question.svg new file mode 100644 index 000000000..68cbcfd11 --- /dev/null +++ b/public/icons/xmind/markers/symbolMarkers/symbol-question.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/icons/xmind/markers/symbolMarkers/symbol-right.svg b/public/icons/xmind/markers/symbolMarkers/symbol-right.svg new file mode 100644 index 000000000..847bda337 --- /dev/null +++ b/public/icons/xmind/markers/symbolMarkers/symbol-right.svg @@ -0,0 +1,21 @@ + + + + symbol_right@16 + Created with Sketch. + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/symbolMarkers/symbol-run.svg b/public/icons/xmind/markers/symbolMarkers/symbol-run.svg new file mode 100644 index 000000000..22db7e23e --- /dev/null +++ b/public/icons/xmind/markers/symbolMarkers/symbol-run.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/public/icons/xmind/markers/symbolMarkers/symbol-unlock.svg b/public/icons/xmind/markers/symbolMarkers/symbol-unlock.svg new file mode 100644 index 000000000..b1adc80cc --- /dev/null +++ b/public/icons/xmind/markers/symbolMarkers/symbol-unlock.svg @@ -0,0 +1,24 @@ + + + + symbol_unlock + Created with Sketch. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/symbolMarkers/symbol-wrong.svg b/public/icons/xmind/markers/symbolMarkers/symbol-wrong.svg new file mode 100644 index 000000000..411244248 --- /dev/null +++ b/public/icons/xmind/markers/symbolMarkers/symbol-wrong.svg @@ -0,0 +1,21 @@ + + + + symbol_wrong@16 + Created with Sketch. + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/tagMarkers/tag-blue.svg b/public/icons/xmind/markers/tagMarkers/tag-blue.svg new file mode 100644 index 000000000..0435a1a8e --- /dev/null +++ b/public/icons/xmind/markers/tagMarkers/tag-blue.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/xmind/markers/tagMarkers/tag-dark-blue.svg b/public/icons/xmind/markers/tagMarkers/tag-dark-blue.svg new file mode 100644 index 000000000..7b19a67da --- /dev/null +++ b/public/icons/xmind/markers/tagMarkers/tag-dark-blue.svg @@ -0,0 +1,12 @@ + + + + color_dark_blue@16 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/tagMarkers/tag-dark-purple.svg b/public/icons/xmind/markers/tagMarkers/tag-dark-purple.svg new file mode 100644 index 000000000..4fc3ce7c1 --- /dev/null +++ b/public/icons/xmind/markers/tagMarkers/tag-dark-purple.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/xmind/markers/tagMarkers/tag-green.svg b/public/icons/xmind/markers/tagMarkers/tag-green.svg new file mode 100644 index 000000000..211a183c2 --- /dev/null +++ b/public/icons/xmind/markers/tagMarkers/tag-green.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/xmind/markers/tagMarkers/tag-grey.svg b/public/icons/xmind/markers/tagMarkers/tag-grey.svg new file mode 100644 index 000000000..636bdd933 --- /dev/null +++ b/public/icons/xmind/markers/tagMarkers/tag-grey.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/xmind/markers/tagMarkers/tag-orange.svg b/public/icons/xmind/markers/tagMarkers/tag-orange.svg new file mode 100644 index 000000000..ab7a14061 --- /dev/null +++ b/public/icons/xmind/markers/tagMarkers/tag-orange.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/xmind/markers/tagMarkers/tag-red.svg b/public/icons/xmind/markers/tagMarkers/tag-red.svg new file mode 100644 index 000000000..a55176e6f --- /dev/null +++ b/public/icons/xmind/markers/tagMarkers/tag-red.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/xmind/markers/tagMarkers/tag-yellow.svg b/public/icons/xmind/markers/tagMarkers/tag-yellow.svg new file mode 100644 index 000000000..c73053ee4 --- /dev/null +++ b/public/icons/xmind/markers/tagMarkers/tag-yellow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/xmind/markers/taskMarkers/task-3oct.svg b/public/icons/xmind/markers/taskMarkers/task-3oct.svg new file mode 100644 index 000000000..4796204d1 --- /dev/null +++ b/public/icons/xmind/markers/taskMarkers/task-3oct.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/icons/xmind/markers/taskMarkers/task-3quar.svg b/public/icons/xmind/markers/taskMarkers/task-3quar.svg new file mode 100644 index 000000000..cd21237fe --- /dev/null +++ b/public/icons/xmind/markers/taskMarkers/task-3quar.svg @@ -0,0 +1,17 @@ + + + + task pro_3/4d + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/taskMarkers/task-5oct.svg b/public/icons/xmind/markers/taskMarkers/task-5oct.svg new file mode 100644 index 000000000..beaf92516 --- /dev/null +++ b/public/icons/xmind/markers/taskMarkers/task-5oct.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/icons/xmind/markers/taskMarkers/task-7oct.svg b/public/icons/xmind/markers/taskMarkers/task-7oct.svg new file mode 100644 index 000000000..8ffebada9 --- /dev/null +++ b/public/icons/xmind/markers/taskMarkers/task-7oct.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/icons/xmind/markers/taskMarkers/task-done.svg b/public/icons/xmind/markers/taskMarkers/task-done.svg new file mode 100644 index 000000000..be996f810 --- /dev/null +++ b/public/icons/xmind/markers/taskMarkers/task-done.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/icons/xmind/markers/taskMarkers/task-half.svg b/public/icons/xmind/markers/taskMarkers/task-half.svg new file mode 100644 index 000000000..aa1354bde --- /dev/null +++ b/public/icons/xmind/markers/taskMarkers/task-half.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/icons/xmind/markers/taskMarkers/task-oct.svg b/public/icons/xmind/markers/taskMarkers/task-oct.svg new file mode 100644 index 000000000..0eedc4917 --- /dev/null +++ b/public/icons/xmind/markers/taskMarkers/task-oct.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/icons/xmind/markers/taskMarkers/task-pause.png b/public/icons/xmind/markers/taskMarkers/task-pause.png new file mode 100644 index 0000000000000000000000000000000000000000..3f981ad26790bdbeed509a006fb5c7cfc2eb481d GIT binary patch literal 531 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyO9OmDT!HilSIe*A_CWHLp5eDh z5aYFxF%SU-Kl|Ezi*|s>zA-iV9Ax{(-1J+N!?zg6x7KDrsZahkA3dzzJ6XKcH3TA{ z_(xCccMcYBElpqQ8NIVJ2MWG1GkK+N1d;t3VgJg|7%271!07+~|6hV_-@!c2B7~LJYD@<);T3K F0Ra8|?+X9` literal 0 HcmV?d00001 diff --git a/public/icons/xmind/markers/taskMarkers/task-quarter.svg b/public/icons/xmind/markers/taskMarkers/task-quarter.svg new file mode 100644 index 000000000..744f65686 --- /dev/null +++ b/public/icons/xmind/markers/taskMarkers/task-quarter.svg @@ -0,0 +1,17 @@ + + + + task pro_1/8d copy 3 + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/taskMarkers/task-start.svg b/public/icons/xmind/markers/taskMarkers/task-start.svg new file mode 100644 index 000000000..087e7dbcf --- /dev/null +++ b/public/icons/xmind/markers/taskMarkers/task-start.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/icons/xmind/markers/weekMarkers/week-fri.svg b/public/icons/xmind/markers/weekMarkers/week-fri.svg new file mode 100644 index 000000000..7b40fc290 --- /dev/null +++ b/public/icons/xmind/markers/weekMarkers/week-fri.svg @@ -0,0 +1,22 @@ + + + + week_fri@16 + Created with Sketch. + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/weekMarkers/week-mon.svg b/public/icons/xmind/markers/weekMarkers/week-mon.svg new file mode 100644 index 000000000..9042e939a --- /dev/null +++ b/public/icons/xmind/markers/weekMarkers/week-mon.svg @@ -0,0 +1,22 @@ + + + + week_mon@16 + Created with Sketch. + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/weekMarkers/week-sat.svg b/public/icons/xmind/markers/weekMarkers/week-sat.svg new file mode 100644 index 000000000..5534a859a --- /dev/null +++ b/public/icons/xmind/markers/weekMarkers/week-sat.svg @@ -0,0 +1,22 @@ + + + + week_sat@16 + Created with Sketch. + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/weekMarkers/week-sun.svg b/public/icons/xmind/markers/weekMarkers/week-sun.svg new file mode 100644 index 000000000..57fdd64a4 --- /dev/null +++ b/public/icons/xmind/markers/weekMarkers/week-sun.svg @@ -0,0 +1,22 @@ + + + + week_sun@16 + Created with Sketch. + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/weekMarkers/week-thu.svg b/public/icons/xmind/markers/weekMarkers/week-thu.svg new file mode 100644 index 000000000..7042b3197 --- /dev/null +++ b/public/icons/xmind/markers/weekMarkers/week-thu.svg @@ -0,0 +1,22 @@ + + + + week_thu@16 + Created with Sketch. + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/weekMarkers/week-tue.svg b/public/icons/xmind/markers/weekMarkers/week-tue.svg new file mode 100644 index 000000000..bae6a7c97 --- /dev/null +++ b/public/icons/xmind/markers/weekMarkers/week-tue.svg @@ -0,0 +1,22 @@ + + + + week_tue@16 + Created with Sketch. + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/xmind/markers/weekMarkers/week-wed.svg b/public/icons/xmind/markers/weekMarkers/week-wed.svg new file mode 100644 index 000000000..21b6292f4 --- /dev/null +++ b/public/icons/xmind/markers/weekMarkers/week-wed.svg @@ -0,0 +1,22 @@ + + + + week_wed@16 + Created with Sketch. + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/flow-board/image-paste.spec.ts b/tests/flow-board/image-paste.spec.ts index 56f60cf81..682aa2a79 100644 --- a/tests/flow-board/image-paste.spec.ts +++ b/tests/flow-board/image-paste.spec.ts @@ -18,6 +18,7 @@ async function openMap(page: Page) { buffer: await zip.generateAsync({ type: "nodebuffer" }), }); await expect(page.locator(".drawnix").getByText("设计方案", { exact: true })).toBeVisible(); + await page.evaluate(() => document.fonts.ready); } async function writeClipboardImage(page: Page) { @@ -77,8 +78,9 @@ test("selected topic accepts clipboard and Insert image, replacing its single pi await writeClipboardImage(page); await page.keyboard.press("ControlOrMeta+v"); await expect(canvasImages(page)).toHaveCount(1); + const chooserPending = page.waitForEvent("filechooser"); await clickXmindAction(page, "图片"); - await page.locator('input[data-flow-board-shell-control="true"][accept="image/jpeg,image/png,image/webp"]').setInputFiles(picture); + await (await chooserPending).setFiles(picture); await expect(canvasImages(page)).toHaveCount(1); const { sheets } = await exportedSheets(page); expect(sheets[0].rootTopic.children.attached.find((item: { title: string }) => item.title === "设计方案").image).toBeDefined(); diff --git a/tests/flow-board/markers.spec.ts b/tests/flow-board/markers.spec.ts new file mode 100644 index 000000000..2dbd9d9cb --- /dev/null +++ b/tests/flow-board/markers.spec.ts @@ -0,0 +1,109 @@ +import { expect, test, type Page } from "@playwright/test"; +import JSZip from "jszip"; +import { clickXmindAction } from "./editor-actions"; + +async function openMap(page: Page, markers = false) { + await page.goto("/dev/flow-board-preview", { waitUntil: "commit" }); + const zip = new JSZip(); + zip.file("content.json", JSON.stringify([{ title: "标记验证", rootTopic: { + id: "root", title: "项目", children: { attached: [ + { id: "a", title: "设计", ...(markers ? { markers: [{ markerId: "priority-1" }] } : {}) }, + { id: "b", title: "开发", ...(markers ? { markers: [{ markerId: "priority-2" }, { markerId: "unknown-marker" }] } : {}) }, + ] }, + } }])); + await page.locator("input[accept*=xmind]").setInputFiles({ name: "markers.xmind", mimeType: "application/octet-stream", buffer: await zip.generateAsync({ type: "nodebuffer" }) }); + await expect(page.locator(".drawnix").getByText("设计", { exact: true })).toBeVisible(); + await page.getByRole("button", { name: "标记", exact: true }).click(); +} +const markerImages = (page: Page, id?: string) => page.locator(`.drawnix .xmind-topic-marker${id ? `[data-marker-id="${id}"]` : ""}`); +const markerButton = (page: Page, id: string) => page.getByLabel("标记面板", { exact: true }).locator(`button[data-marker-id="${id}"]`); + +test("native marker palette fits the panel and adds, replaces, toggles, clears and undoes", async ({ page }) => { + const errors: string[] = []; + page.on("pageerror", error => errors.push(error.message)); + await openMap(page); + const panel = page.getByLabel("标记面板", { exact: true }); + await expect(page.getByRole("button", { name: "标记", exact: true })).toHaveAttribute("aria-pressed", "true"); + await expect(panel.locator("button[data-marker-id]")).toHaveCount(58); + await expect(panel).toHaveCSS("width", "240px"); + expect(await panel.evaluate(element => element.scrollWidth <= element.clientWidth)).toBe(true); + await page.mouse.click(130, 150); + await expect(markerButton(page, "priority-1")).toBeDisabled(); + await page.locator(".drawnix").getByText("设计", { exact: true }).click(); + await markerButton(page, "priority-1").click(); + await expect(markerImages(page, "priority-1")).toHaveCount(1); + await expect(markerButton(page, "priority-1")).toHaveAttribute("aria-pressed", "true"); + await expect.poll(() => markerImages(page, "priority-1").evaluate((image: HTMLImageElement) => image.complete && image.naturalWidth > 0)).toBe(true); + await markerButton(page, "priority-2").click(); + await expect(markerImages(page, "priority-1")).toHaveCount(0); + await expect(markerImages(page, "priority-2")).toHaveCount(1); + await markerButton(page, "task-half").click(); + await markerButton(page, "flag-green").click(); + await expect(markerImages(page)).toHaveCount(3); + await markerButton(page, "flag-green").click(); + await expect(markerImages(page)).toHaveCount(2); + await panel.getByRole("button", { name: "清空所选节点标记", exact: true }).click(); + await expect(markerImages(page)).toHaveCount(0); + await clickXmindAction(page, "撤销"); + await expect(markerImages(page)).toHaveCount(2); + await expect(markerButton(page, "priority-2")).toHaveAttribute("aria-pressed", "true"); + await expect(markerButton(page, "task-half")).toHaveAttribute("aria-pressed", "true"); + await page.setViewportSize({ width: 800, height: 700 }); + expect(await panel.evaluate(element => element.scrollWidth <= element.clientWidth)).toBe(true); + await page.setViewportSize({ width: 1440, height: 900 }); + await expect(markerImages(page, "priority-2")).toBeVisible(); + await page.screenshot({ path: "test-results/flow-board-ui/marker-panel.png" }); + expect(errors).toEqual([]); +}); + +test("mixed multi-selection applies one value consistently and undo restores the batch", async ({ page }) => { + await openMap(page, true); + const canvas = page.locator(".drawnix"); + await canvas.getByText("设计", { exact: true }).click(); + await canvas.getByText("开发", { exact: true }).click({ modifiers: ["Shift"] }); + await expect(page.getByLabel("标记面板", { exact: true }).getByRole("status")).toHaveText("已选中 2 个主题"); + await expect(markerButton(page, "priority-1")).toHaveAttribute("aria-pressed", "mixed"); + await markerButton(page, "priority-1").click(); + await expect(markerImages(page, "priority-1")).toHaveCount(2); + await expect(markerImages(page, "priority-2")).toHaveCount(0); + await clickXmindAction(page, "撤销"); + await expect(markerImages(page, "priority-1")).toHaveCount(1); + await expect(markerImages(page, "priority-2")).toHaveCount(1); + await clickXmindAction(page, "重做"); + await expect(markerImages(page, "priority-1")).toHaveCount(2); + await expect(markerButton(page, "priority-1")).toHaveAttribute("aria-pressed", "true"); + await page.getByRole("button", { name: "清空所选节点标记", exact: true }).click(); + await expect(markerImages(page)).toHaveCount(0); + const downloadPending = page.waitForEvent("download"); + await page.getByRole("button", { name: "导出 XMind", exact: true }).click(); + const stream = await (await downloadPending).createReadStream(); + const chunks: Buffer[] = []; + for await (const chunk of stream!) chunks.push(chunk); + const zip = await JSZip.loadAsync(Buffer.concat(chunks)); + const sheets = JSON.parse(await zip.file("content.json")!.async("string")); + expect(sheets[0].rootTopic.children.attached.every((topic: { markers?: unknown }) => !topic.markers)).toBe(true); + await clickXmindAction(page, "撤销"); + await expect(markerImages(page, "priority-1")).toHaveCount(2); + await expect(markerButton(page, "priority-1")).toHaveAttribute("aria-pressed", "true"); +}); + +test("search, group collapse and additional installed marker resources are usable", async ({ page }) => { + await openMap(page); + const panel = page.getByLabel("标记面板", { exact: true }); + await page.locator(".drawnix").getByText("设计", { exact: true }).click(); + await panel.getByRole("button", { name: "标签 7", exact: true }).click(); + await expect(markerButton(page, "tag-red")).toHaveCount(0); + await panel.getByLabel("搜索标记").fill("priority-9"); + await expect(panel.locator("button[data-marker-id]")).toHaveCount(1); + await markerButton(page, "priority-9").click(); + await expect(markerImages(page, "priority-9")).toHaveCount(1); + await panel.getByLabel("搜索标记").fill("没有这个标记"); + await expect(panel.getByText("没有匹配的标记", { exact: true })).toBeVisible(); + await panel.getByLabel("搜索标记").fill(""); + await panel.getByRole("button", { name: "标签 7", exact: true }).click(); + await panel.getByRole("button", { name: "更多标记", exact: true }).click(); + await expect(panel.locator("button[data-marker-id]")).toHaveCount(219); + await page.getByRole("button", { name: "关闭标记面板", exact: true }).click(); + await expect(panel).toHaveCount(0); + await expect(page.getByLabel("格式面板", { exact: true })).toBeVisible(); +}); diff --git a/tests/routes/flow-board-markers.test.ts b/tests/routes/flow-board-markers.test.ts new file mode 100644 index 000000000..96360901a --- /dev/null +++ b/tests/routes/flow-board-markers.test.ts @@ -0,0 +1,37 @@ +import { expect, test } from "@playwright/test"; +import JSZip from "jszip"; +import { readFile } from "node:fs/promises"; +import { exportXmind } from "@/lib/flow-board/xmind-export"; +import { importXmind } from "@/lib/flow-board/xmind-import"; +import { getTopicEntries } from "@/lib/flow-board/topic-details"; +import { getXmindMarkerIds, toggleXmindMarker, XMIND_MARKER_GROUPS } from "@/lib/flow-board/xmind-markers"; + +test("all installed marker IDs and artwork exist and round-trip through XMind", async () => { + const markers = XMIND_MARKER_GROUPS.flatMap(group => group.markers); + expect(markers).toHaveLength(219); + expect(new Set(markers.map(marker => marker.id)).size).toBe(197); + expect(XMIND_MARKER_GROUPS.filter(group => !group.hidden).flatMap(group => group.markers.filter(marker => !marker.hidden))).toHaveLength(58); + for (const marker of markers) expect((await readFile(`public${marker.asset}`)).length).toBeGreaterThan(50); + const zip = new JSZip(); + zip.file("content.json", JSON.stringify([{ title: "标记", rootTopic: { + id: "root", title: "全标记验证", children: { attached: markers.map(marker => ({ id: marker.id, title: marker.id, markers: [{ markerId: marker.id }] })) }, + } }])); + const imported = await importXmind(new File([await zip.generateAsync({ type: "uint8array" })], "markers.xmind"), "标记"); + const entries = getTopicEntries(imported.sheets[0].children).slice(1); + expect(entries.map(entry => getXmindMarkerIds(entry.element.data.emojis)[0])).toEqual(markers.map(marker => marker.id)); + expect(imported.warnings).not.toContain("部分图标已保留为数据,暂不显示"); + const exported = await exportXmind({ children: imported.sheets[0].children }, "标记"); + const output = await JSZip.loadAsync(await exported.blob.arrayBuffer()); + const sheets = JSON.parse(await output.file("content.json")!.async("string")); + expect(sheets[0].rootTopic.children.attached.map((topic: { markers: { markerId: string }[] }) => topic.markers[0].markerId)).toEqual(markers.map(marker => marker.id)); + expect(exported.warnings).toEqual([]); +}); + +test("legacy emoji markers replace within their group and preserve other groups and custom emoji", () => { + const original = [{ name: "1️⃣" }, { name: "✅" }, { name: "🦄" }]; + const replaced = toggleXmindMarker(original, "priority-2", false); + expect(getXmindMarkerIds(replaced)).toEqual(["task-done", "priority-2"]); + expect(replaced).toContainEqual({ name: "🦄" }); + expect(getXmindMarkerIds(toggleXmindMarker(replaced, "priority-2", true))).toEqual(["task-done"]); + expect(original).toEqual([{ name: "1️⃣" }, { name: "✅" }, { name: "🦄" }]); +});