CharacterPreview.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767
  1. <!-- eslint-disable vue/no-v-html -->
  2. <template>
  3. <div class="character-preview" :style="getAreaStyle()">
  4. <SerialNumberPosition v-if="isEnable(data.property.sn_display_mode)" :property="data.property" />
  5. <div class="main">
  6. <template v-if="data.property.model === 'write'">
  7. <div
  8. v-for="(item, index) in data.option_list"
  9. :key="index"
  10. class="item-box"
  11. :class="[!item.is_margin ? 'item-box-write' : '']"
  12. >
  13. <div
  14. class="number-box"
  15. :style="{
  16. marginTop: isEnable(data.property.view_pinyin) ? '30px' : '',
  17. }"
  18. >
  19. <span class="number">{{ index + 1 }}</span>
  20. </div>
  21. <div class="pinyin-en" :class="[item.is_example ? 'item-example' : '']">
  22. <div v-if="isEnable(data.property.view_pinyin) && item.is_common_pinyin" class="pinyin">
  23. {{ item.pinyin }}
  24. </div>
  25. <div class="items-flex">
  26. <div v-for="(items, indexs) in item.content_list" :key="indexs" class="items">
  27. <div v-if="isEnable(data.property.view_pinyin) && !item.is_common_pinyin" class="pinyin">
  28. {{ items.pinyin }}
  29. </div>
  30. <div class="items-content">
  31. <template v-if="items && items.type === 'img'">
  32. <el-image
  33. v-if="items.file_list[0]"
  34. class="items-image"
  35. :src="items.file_list[0].file_url"
  36. fit="contain"
  37. />
  38. </template>
  39. <template v-else-if="items && items.type === 'lian'">
  40. <span class="items-lian">{{ items.con }}</span>
  41. </template>
  42. <Strockplayredline
  43. v-if="items && items.type === 'hanzi'"
  44. :Book_text="items.con"
  45. :play-storkes="isEnable(data.property.is_enable_play_structure)"
  46. :cur-item="
  47. isEnable(data.property.is_enable_high_strokes)
  48. ? data.property.model === 'input'
  49. ? items.high_strokes
  50. : userAnswer[index].item[indexs]
  51. : null
  52. "
  53. :type="data.property.model === 'input' ? 'newWord-template-input' : data.type"
  54. :target-div="'newWordTemplates' + items.con + index + indexs + Math.random().toString(36)"
  55. :hz_json="items.hz_info[0].hzDetail.hz_json"
  56. :bg-type="data.property.frame_type"
  57. class="hanzi-storck"
  58. :class="[
  59. !item.is_margin && item.content_list.length > 1 && indexs == 0 ? 'leftBorderRadius' : '',
  60. !item.is_margin && item.content_list.length > 1 && indexs == item.content_list.length - 1
  61. ? 'rightBorderRadius'
  62. : '',
  63. !item.is_margin &&
  64. item.content_list.length > 1 &&
  65. indexs != item.content_list.length - 1 &&
  66. indexs != 0
  67. ? 'NoborderRadius'
  68. : '',
  69. !item.is_margin && item.content_list.length > 1 && indexs != item.content_list.length - 1
  70. ? 'NoborderRight'
  71. : '',
  72. ]"
  73. />
  74. <div
  75. v-if="items && items.type === 'write'"
  76. :class="[
  77. 'strockplay-newWord',
  78. !item.is_margin && item.content_list.length > 1 && indexs == 0 ? 'leftBorderRadius' : '',
  79. !item.is_margin && item.content_list.length > 1 && indexs == item.content_list.length - 1
  80. ? 'rightBorderRadius'
  81. : '',
  82. !item.is_margin &&
  83. item.content_list.length > 1 &&
  84. indexs != item.content_list.length - 1 &&
  85. indexs != 0
  86. ? 'NoborderRadius'
  87. : '',
  88. !item.is_margin && item.content_list.length > 1 && indexs != item.content_list.length - 1
  89. ? 'NoborderRight'
  90. : '',
  91. ]"
  92. @click="
  93. freeWrite(
  94. userAnswer[index][indexs].imgArr ? userAnswer[index][indexs].imgArr : null,
  95. index,
  96. indexs,
  97. )
  98. "
  99. >
  100. <SvgIcon
  101. v-if="data.property.frame_type === 'tian'"
  102. icon-class="hanzi-writer-bg"
  103. class="character-target-bg"
  104. />
  105. <SvgIcon
  106. v-else-if="data.property.frame_type === 'mi'"
  107. icon-class="mi"
  108. class="character-target-bg"
  109. />
  110. <img
  111. v-if="
  112. !play_status &&
  113. userAnswer[index][indexs].imgArr &&
  114. userAnswer[index][indexs].imgArr.strokes_image
  115. "
  116. class="hanzi-writer-img"
  117. :src="userAnswer[index][indexs].imgArr.strokes_image"
  118. alt=""
  119. />
  120. </div>
  121. </div>
  122. </div>
  123. </div>
  124. <div class="en-common">{{ item.shiyi }}</div>
  125. </div>
  126. </div>
  127. </template>
  128. <template v-else>
  129. <div :class="['words-box']">
  130. <div v-for="(item, index) in data.option_list" :key="index" :class="['words-item']">
  131. <div class="words-top">
  132. <div class="words-left" :style="{}">
  133. <AudioPlay
  134. v-if="isEnable(data.property.is_enable_voice)"
  135. :file-id="item.audio_file_id"
  136. theme-color="gray"
  137. />
  138. <span v-if="isEnable(data.property.view_pinyin) && item.is_common_pinyin" class="pinyin">{{
  139. item.pinyin
  140. }}</span>
  141. </div>
  142. </div>
  143. <div class="card-box">
  144. <!-- 描红 -->
  145. <template v-for="(items, indexs) in item.content_list">
  146. <div v-if="item.is_show_ben" :key="'miao' + indexs">
  147. <!-- <div v-if="isEnable(data.property.view_pinyin) && !item.is_common_pinyin" class="pinyin">
  148. {{ items.pinyin }}
  149. </div> -->
  150. <Strockplayredline
  151. :Book_text="items.con"
  152. :play-storkes="isEnable(data.property.is_enable_stroke)"
  153. :cur-item="null"
  154. :target-div="'newWordTemplates' + items.con + index + indexs + Math.random().toString(36)"
  155. :hz_json="items.hz_info[0].hzDetail.hz_json"
  156. class="hanzi-storck"
  157. :class="['strock-chinese', 'border-right-none']"
  158. :bg-type="data.property.frame_type"
  159. />
  160. </div>
  161. </template>
  162. <div
  163. v-for="(itemI, indexI) in item.miao_arr"
  164. :key="indexI + index"
  165. style="display: flex"
  166. @click="miaoStorkes(index, indexI, item.mark, item.content, itemI.strokes)"
  167. >
  168. <Strockplayredlines
  169. v-if="
  170. userAnswer[index].strokes_content_list[indexI] &&
  171. userAnswer[index].strokes_content_list[indexI].flag === 'true'
  172. "
  173. :play-storkes="false"
  174. :book-text="item.content"
  175. :target-div="'write-praT' + Math.random().toString(36).substring(2, 10)"
  176. :book-strokes="itemI.strokes"
  177. :class="['strock-chinese']"
  178. :bg-type="data.property.frame_type"
  179. />
  180. <Strockplayredlines
  181. v-else
  182. :play-storkes="false"
  183. :book-text="item.content"
  184. :target-div="'write-praT' + Math.random().toString(36).substring(2, 10)"
  185. :book-strokes="itemI.strokes"
  186. :stroke-color="'#ddd'"
  187. :class="['strock-chinese']"
  188. :bg-type="data.property.frame_type"
  189. />
  190. </div>
  191. <!-- 书写 -->
  192. <div v-for="(items, indexs) in item.imgArr" :key="'write' + indexs" class="con-box">
  193. <div
  194. :class="['strockplay-newWord']"
  195. @click="
  196. freeWrite(
  197. userAnswer[index].strokes_content_list[indexs].imgArr
  198. ? userAnswer[index].strokes_content_list[indexs].imgArr
  199. : null,
  200. index,
  201. indexs,
  202. )
  203. "
  204. >
  205. <SvgIcon
  206. v-if="data.property.frame_type === 'tian'"
  207. icon-class="hanzi-writer-bg"
  208. class="character-target-bg"
  209. />
  210. <SvgIcon v-else-if="data.property.frame_type === 'mi'" icon-class="mi" class="character-target-bg" />
  211. <img
  212. v-if="
  213. !play_status &&
  214. items &&
  215. userAnswer[index].strokes_content_list[indexs].imgArr &&
  216. userAnswer[index].strokes_content_list[indexs].imgArr.strokes_image
  217. "
  218. class="hanzi-writer-img"
  219. :src="userAnswer[index].strokes_content_list[indexs].imgArr.strokes_image"
  220. alt=""
  221. />
  222. </div>
  223. </div>
  224. </div>
  225. <div v-if="item.shiyi && isEnable(data.property.is_enable_shiyi)" class="words-bottom">
  226. {{ item.shiyi }}
  227. </div>
  228. </div>
  229. </div>
  230. </template>
  231. <div v-if="if_free_show" class="practiceBox practice-box-strock">
  232. <FreewriteLettle
  233. ref="freePaint"
  234. :current-tree-i-d="'1234456'"
  235. :current-hz="current_hz"
  236. :curren-hz-data="current_hz_data"
  237. :row-index="active_index"
  238. :col-index="active_col_index"
  239. :disabled="disabled"
  240. :show-play="isEnable(data.property.is_enable_play_back)"
  241. :bg-type="data.property.frame_type"
  242. @closeIfFreeShow="closeIfFreeShow"
  243. @changePraShow="changePraShow"
  244. @changeCurQue="changeCurQue"
  245. @deleteWriteRecord="deleteWriteRecord"
  246. />
  247. </div>
  248. <div v-if="if_miao_show" class="practiceBox practice-box-strock">
  249. <div class="miao-box">
  250. <i class="el-icon-close close-icon" @click="if_miao_show = false"></i>
  251. <Strockplayredlines
  252. v-if="
  253. (userAnswer[active_index].strokes_content_list[active_col_index].flag &&
  254. userAnswer[active_index].strokes_content_list[active_col_index].flag === 'true') ||
  255. disabled
  256. "
  257. :play-storkes="false"
  258. :book-text="current_hz"
  259. :target-div="'write-praT' + current_hz + active_col_index + Math.random().toString(36).substring(2, 10)"
  260. :book-strokes="current_hz_data"
  261. :stroke-color="
  262. disabled &&
  263. (!userAnswer[active_index].strokes_content_list[active_col_index].flag ||
  264. (userAnswer[active_index].strokes_content_list[active_col_index].flag &&
  265. userAnswer[active_index].strokes_content_list[active_col_index].flag === 'false'))
  266. ? '#ddd'
  267. : ''
  268. "
  269. :bg-type="data.property.frame_type"
  270. />
  271. <Strockred
  272. ref="strockRed"
  273. :class="[
  274. 'strock-red',
  275. userAnswer[active_index].strokes_content_list[active_col_index].flag &&
  276. userAnswer[active_index].strokes_content_list[active_col_index].flag === 'true'
  277. ? 'strock-red-zindex'
  278. : '',
  279. ]"
  280. :book-text="current_hz"
  281. :hanzi-color="hanzi_color"
  282. :target-div="'write-praT' + current_hz + active_col_index + Math.random().toString(36).substring(2, 10)"
  283. :book-strokes="current_hz_data"
  284. :is-answer.sync="userAnswer[active_index].strokes_content_list[active_col_index].flag"
  285. :show-error-tip="isEnable(data.property.is_enable_error)"
  286. :bg-type="data.property.frame_type"
  287. />
  288. <div v-if="!disabled" :class="['reset-box']" @click="resetHanzi">
  289. <SvgIcon icon-class="reset" class="reset-btn" />
  290. </div>
  291. </div>
  292. </div>
  293. </div>
  294. </div>
  295. </template>
  296. <script>
  297. import { getCharacterData } from '@/views/book/courseware/data/character';
  298. import PreviewMixin from '../common/PreviewMixin';
  299. import AudioPlay from '../character_base/components/AudioPlay.vue';
  300. import Strockplayredline from '../newWord_template/components/Strockplayredline.vue';
  301. import Strockplayredlines from '../character_base/components/Strockplayredline.vue';
  302. import Strockred from '../character_base/components/Strockred.vue';
  303. import FreewriteLettle from '../character_base/components/FreewriteLettle.vue';
  304. export default {
  305. name: 'CharacterPreview',
  306. components: {
  307. AudioPlay,
  308. Strockplayredline,
  309. Strockred,
  310. FreewriteLettle,
  311. Strockplayredlines,
  312. },
  313. mixins: [PreviewMixin],
  314. data() {
  315. return {
  316. data: getCharacterData(),
  317. userAnswer: [],
  318. hanzi_color: '#404040', // 描红汉字底色
  319. writer_number_yuan: 15,
  320. writer_number: null, // 书写个数
  321. miao_number: null, // 描红个数
  322. if_free_show: false,
  323. free_img: [],
  324. active_index: null,
  325. active_col_index: null,
  326. current_hz: '', // 当前汉字
  327. current_hz_data: null, // 当前汉字数据
  328. play_status: false, // 播放状态
  329. active_mark: '',
  330. option_list: [],
  331. show_preview: false,
  332. miao_arr: [],
  333. if_miao_show: false, // 描红模块
  334. };
  335. },
  336. computed: {},
  337. watch: {
  338. 'data.option_list': {
  339. handler(val) {
  340. if (val) {
  341. this.handleData();
  342. }
  343. },
  344. deep: true,
  345. immediate: true,
  346. },
  347. },
  348. created() {},
  349. methods: {
  350. handleData() {
  351. let answer_list = [];
  352. this.data.option_list.forEach((item, index) => {
  353. if (this.data.property.model === 'write') {
  354. let arr = [];
  355. item.content_list.forEach((items) => {
  356. let obj = null;
  357. if (items.type === 'write') {
  358. obj = {
  359. imgArr: null,
  360. };
  361. }
  362. arr.push(obj);
  363. });
  364. answer_list.push(arr);
  365. } else {
  366. let miao_arr = [];
  367. let arr = [];
  368. if (item.content.trim()) {
  369. for (let i = 0; i < this.data.property.write_number; i++) {
  370. item.content_list.forEach((items) => {
  371. arr.push({ imgArr: null, flag: null });
  372. });
  373. }
  374. for (let i = 0; i < this.data.property.miao_number; i++) {
  375. item.content_list.forEach((items) => {
  376. miao_arr.push({
  377. strokes: items && items.hz_info && items.hz_info[0] ? items.hz_info[0].hzDetail.hz_json : null,
  378. length: item.content_list.length,
  379. });
  380. });
  381. }
  382. item.imgArr = arr;
  383. item.miao_arr = miao_arr;
  384. // if (this.isJudgingRightWrong) {
  385. // item.imgArr = this.userAnswer.find(
  386. // (items) => items.mark === item.mark,
  387. // )?.strokes_content_list;
  388. // }
  389. }
  390. let obj = {
  391. // mark: item.mark,
  392. strokes_content_list: arr,
  393. miao_arr,
  394. };
  395. // if (!this.isJudgingRightWrong) {
  396. // this.userAnswer.push(obj);
  397. // }
  398. answer_list.push(obj);
  399. }
  400. });
  401. this.userAnswer = answer_list;
  402. },
  403. changePraShow() {
  404. this.if_free_show = false;
  405. },
  406. closeIfFreeShow(data, rowIndex, colIndex, mark) {
  407. // this.option_list[rowIndex].imgArr[colIndex] = JSON.stringify(data);
  408. this.if_free_show = false;
  409. this.freeWrite(data, rowIndex, colIndex);
  410. this.$forceUpdate();
  411. },
  412. freeWrite(imgUrl, index, indexs) {
  413. this.if_free_show = true;
  414. this.active_index = index;
  415. this.active_col_index = indexs;
  416. this.current_hz = this.data.option_list[index].content_list[indexs].con;
  417. this.current_hz_data = imgUrl;
  418. },
  419. // 删除记录
  420. deleteWriteRecord(rowIndex, colIndex) {
  421. this.$set(this.option_list[rowIndex].imgArr, colIndex, JSON.stringify({}));
  422. this.changeCurQue(null, rowIndex, colIndex);
  423. this.current_hz_data = null;
  424. this.active_mark = '';
  425. this.$forceUpdate();
  426. },
  427. changeCurQue(answer, rowIndex, colIndex) {
  428. if (answer) {
  429. if (this.data.property.model === 'write') {
  430. this.userAnswer[rowIndex][colIndex].imgArr = answer;
  431. } else {
  432. this.userAnswer[rowIndex].strokes_content_list[colIndex].imgArr = answer;
  433. }
  434. this.$forceUpdate();
  435. }
  436. },
  437. // 点击描红模块
  438. miaoStorkes(index, indexs, mark, content, storkes) {
  439. this.if_miao_show = true;
  440. this.active_index = index;
  441. this.active_col_index = indexs;
  442. this.current_hz = content;
  443. this.current_hz_data = storkes;
  444. },
  445. // 保存描红
  446. saveComplete(flag) {
  447. this.answer.answer_list[this.active_index].strokes_content_list[this.active_col_index] = flag;
  448. },
  449. resetHanzi() {
  450. this.$refs.strockRed.resetHanzi();
  451. },
  452. updateColor(color) {
  453. this.writer.updateColor('strokeColor', color);
  454. this.writer.updateColor('drawingColor', color);
  455. },
  456. },
  457. };
  458. </script>
  459. <style lang="scss" scoped>
  460. @use '@/styles/mixin.scss' as *;
  461. .character-preview {
  462. @include preview-base;
  463. display: block;
  464. .main {
  465. display: flex;
  466. flex-wrap: wrap;
  467. column-gap: 16px;
  468. justify-content: start;
  469. }
  470. .content-box {
  471. width: max-content;
  472. }
  473. .audio-wrapper-nobg {
  474. height: 16px;
  475. :deep .audio-play {
  476. width: 16px;
  477. height: 16px;
  478. color: #000;
  479. background-color: initial;
  480. }
  481. :deep .audio-play.not-url {
  482. color: #a1a1a1;
  483. }
  484. :deep .voice-play {
  485. width: 16px;
  486. height: 16px;
  487. }
  488. }
  489. .main-top {
  490. display: flex;
  491. column-gap: 4px;
  492. align-items: center;
  493. justify-content: center;
  494. }
  495. .pinyin {
  496. font-family: 'League';
  497. font-size: 12px;
  498. font-weight: 500;
  499. color: #000;
  500. }
  501. .strock-chinese-box {
  502. display: flex;
  503. flex-wrap: wrap;
  504. margin: 8px 0;
  505. }
  506. .strockplay-newWord {
  507. position: relative;
  508. box-sizing: border-box;
  509. flex-shrink: 0;
  510. width: 80px;
  511. height: 80px;
  512. border: 2px solid #346cda;
  513. border-radius: 8px;
  514. .character-target-bg,
  515. .hanzi-writer-img {
  516. position: absolute;
  517. top: 0;
  518. left: 0;
  519. width: 100%;
  520. height: 100%;
  521. color: #dedede;
  522. }
  523. .hanzi-writer-img {
  524. z-index: 1;
  525. }
  526. }
  527. .border-right-none {
  528. border-right: none;
  529. }
  530. .item-box {
  531. display: flex;
  532. gap: 5px;
  533. }
  534. .number-box {
  535. display: flex;
  536. align-items: center;
  537. height: 80px;
  538. margin-right: 16px;
  539. .number {
  540. display: block;
  541. width: 24px;
  542. height: 24px;
  543. font-family: 'arial';
  544. font-size: 14px;
  545. font-weight: bold;
  546. line-height: 24px;
  547. color: #fff;
  548. text-align: center;
  549. background: #346cda;
  550. border-radius: 100%;
  551. }
  552. }
  553. .items {
  554. font-size: 0;
  555. }
  556. .pinyin {
  557. height: 30px;
  558. min-height: 16px;
  559. font-family: 'League';
  560. font-size: 20px;
  561. font-weight: 400;
  562. color: rgba(0, 0, 0, 50%);
  563. text-align: center;
  564. }
  565. .items-image,
  566. .hanzi-storck {
  567. width: 80px;
  568. height: 80px;
  569. overflow: hidden;
  570. border: 2px solid #346cda;
  571. border-radius: 8px;
  572. }
  573. .items-lian {
  574. display: block;
  575. height: 80px;
  576. padding: 0 10px;
  577. font-size: 34px;
  578. line-height: 80px;
  579. color: #346cda;
  580. }
  581. .items-flex {
  582. display: flex;
  583. gap: 5px;
  584. }
  585. .item-box-write {
  586. .items-flex {
  587. gap: 0;
  588. }
  589. .NoborderRadius {
  590. border-radius: 0;
  591. }
  592. .rightBorderRadius {
  593. border-radius: 0;
  594. border-top-right-radius: 8px;
  595. border-bottom-right-radius: 8px;
  596. }
  597. .leftBorderRadius {
  598. border-radius: 0;
  599. border-top-left-radius: 8px;
  600. border-bottom-left-radius: 8px;
  601. }
  602. .NoborderRight {
  603. border-right: none;
  604. }
  605. }
  606. .pinyin-common {
  607. margin-bottom: 5px;
  608. :deep .edit-div {
  609. font-family: 'League';
  610. }
  611. }
  612. .en-common {
  613. margin-top: 8px;
  614. // text-align: center;
  615. word-break: break-word;
  616. }
  617. .practiceBox {
  618. position: fixed;
  619. top: 0;
  620. left: 0;
  621. z-index: 101;
  622. box-sizing: border-box;
  623. width: 100%;
  624. height: 100vh;
  625. overflow: hidden;
  626. overflow-y: auto;
  627. background: rgba(0, 0, 0, 19%);
  628. &.practice-box-strock {
  629. display: flex;
  630. align-items: center;
  631. justify-content: center;
  632. padding-top: 0;
  633. }
  634. .miao-box {
  635. position: relative;
  636. width: 332px;
  637. height: 360px;
  638. padding: 30px 16px;
  639. margin: 0 auto;
  640. background: #f3f3f3;
  641. border-radius: 8px;
  642. box-shadow: 0 4px 16px rgba(0, 0, 0, 15%);
  643. .close-icon {
  644. position: absolute;
  645. top: 0;
  646. right: 8px;
  647. z-index: 2;
  648. width: 32px;
  649. height: 32px;
  650. padding: 8px;
  651. cursor: pointer;
  652. }
  653. .strockredBox,
  654. .strockplay-redInner {
  655. width: 300px;
  656. height: 300px;
  657. margin: 0 auto;
  658. }
  659. .strock-red {
  660. position: absolute;
  661. top: 30px;
  662. left: 16px;
  663. &-zindex {
  664. z-index: -1;
  665. }
  666. }
  667. .reset-box {
  668. position: absolute;
  669. right: 22px;
  670. bottom: 22px;
  671. z-index: 100;
  672. display: flex;
  673. align-items: center;
  674. justify-content: center;
  675. width: 11px;
  676. height: 11px;
  677. color: $text-color;
  678. cursor: pointer;
  679. &:hover {
  680. color: #000;
  681. }
  682. }
  683. }
  684. }
  685. .card-box {
  686. display: flex;
  687. flex-flow: wrap;
  688. gap: 5px;
  689. }
  690. .words-left {
  691. display: flex;
  692. gap: 10px;
  693. align-items: center;
  694. margin-bottom: 5px;
  695. }
  696. :deep .strockplay-redInner {
  697. width: 80px;
  698. height: 80px;
  699. border: 2px solid #346cda !important;
  700. border-radius: 8px;
  701. }
  702. .words-item {
  703. margin-bottom: 10px;
  704. }
  705. .words-bottom {
  706. margin-top: 3px;
  707. word-break: break-word;
  708. }
  709. }
  710. </style>