SixHatDetail.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795
  1. <template>
  2. <div class="six-hat-detail">
  3. <!-- 头部导航 -->
  4. <div class="detail-header">
  5. <div class="back-btn" @click="$emit('back')">
  6. <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
  7. <path d="M15 18l-6-6 6-6" />
  8. </svg>
  9. </div>
  10. <div class="detail-title">{{ lang.ssSixHatTitle }}</div>
  11. </div>
  12. <!-- Banner 区域 -->
  13. <div class="detail-banner">
  14. <img :src="sixHat" :alt="lang.ssSixHatTitle" />
  15. <div class="tool-overly"></div>
  16. <div class="tool-icon-badge">
  17. <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
  18. <path d="M9 18h6M10 22h4M12 2a7 7 0 00-4 12.7c.6.5 1 1.3 1 2.3h6c0-1 .4-1.8 1-2.3A7 7 0 0012 2z"></path>
  19. </svg>
  20. </div>
  21. </div>
  22. <!-- 描述与标签 -->
  23. <div class="detail-desc-row">
  24. <div class="detail-desc-text">{{ lang.ssSixHatDesc }}</div>
  25. <div class="help-icon" @mouseenter="showHelp = true" @mouseleave="showHelp = false">
  26. <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
  27. <circle cx="12" cy="12" r="10" />
  28. <path d="M9.09 9a3 3 0 015.83 1c0 2-3 3-3 3" />
  29. <line x1="12" y1="17" x2="12.01" y2="17" />
  30. </svg>
  31. <!-- 帮助气泡 -->
  32. <div v-if="showHelp" class="help-tooltip">
  33. <div class="help-title">{{ lang.ssSixHatUsageScenario }}</div>
  34. <div class="help-text">{{ lang.ssSixHatScenarioText }}</div>
  35. <div class="help-title">{{ lang.ssSixHatSteps }}</div>
  36. <div class="help-list">
  37. <div class="help-step"><span class="step-num">1</span><span>{{ lang.ssSixHatStep1 }}</span></div>
  38. <div class="help-step"><span class="step-num">2</span><span>{{ lang.ssSixHatStep2 }}</span></div>
  39. <div class="help-step"><span class="step-num">3</span><span>{{ lang.ssSixHatStep3 }}</span></div>
  40. <div class="help-step"><span class="step-num">4</span><span>{{ lang.ssSixHatStep4 }}</span></div>
  41. <div class="help-step"><span class="step-num">5</span><span>{{ lang.ssSixHatStep5 }}</span></div>
  42. <div class="help-step"><span class="step-num">6</span><span>{{ lang.ssSixHatStep6 }}</span></div>
  43. </div>
  44. <div class="help-source">{{ lang.ssSixHatSource }}</div>
  45. <div class="help-purpose">{{ lang.ssSixHatPurpose }}</div>
  46. </div>
  47. </div>
  48. </div>
  49. <div class="detail-tags">
  50. <span class="detail-tag">{{ lang.ssSixHatGradeRange }}</span>
  51. </div>
  52. <!-- 工具配置区 -->
  53. <div class="config-section">
  54. <div class="config-title">{{ lang.ssKwlToolConfig }}</div>
  55. <div class="config-subtitle">{{ lang.ssKwlConfigSubtitle }}</div>
  56. </div>
  57. <!-- 配置项卡片 -->
  58. <div class="config-card">
  59. <!-- 工具内容由使用者配置 -->
  60. <div class="config-row config-row-highlight">
  61. <div class="form-text-block">
  62. <div class="form-label">{{ lang.ssSixHatUserConfig }}</div>
  63. <div class="form-sublabel">{{ lang.ssSixHatUserConfigDesc }}</div>
  64. </div>
  65. <div class="toggle-switch" :class="{ active: formData.enableContentConfigurable }"
  66. @click="formData.enableContentConfigurable = !formData.enableContentConfigurable">
  67. <div class="toggle-thumb"></div>
  68. </div>
  69. </div>
  70. <!-- 小组合作 -->
  71. <div class="config-row">
  72. <div class="form-text-block">
  73. <div class="form-label">{{ lang.ssSixHatGroupWork }}</div>
  74. <div class="form-sublabel">{{ lang.ssSixHatGroupWorkDesc }}</div>
  75. </div>
  76. <div class="toggle-switch" :class="{ active: formData.enableMemberSelect }"
  77. @click="formData.enableMemberSelect = !formData.enableMemberSelect">
  78. <div class="toggle-thumb"></div>
  79. </div>
  80. </div>
  81. <!-- 默认展开操作提示 -->
  82. <div class="config-row">
  83. <div class="form-text-block">
  84. <div class="form-label">{{ lang.ssKwlShowHowTo }}</div>
  85. <div class="form-sublabel">{{ lang.ssKwlShowHowToDesc }}</div>
  86. </div>
  87. <div class="toggle-switch" :class="{ active: formData.autoExpandHowTo }"
  88. @click="formData.autoExpandHowTo = !formData.autoExpandHowTo">
  89. <div class="toggle-thumb"></div>
  90. </div>
  91. </div>
  92. <!-- 高级配置 -->
  93. <div class="advanced-section">
  94. <div class="advanced-header" @click="showAdvanced = !showAdvanced">
  95. <span class="advanced-title">{{ lang.ssKwlAdvanced }}</span>
  96. <svg class="advanced-arrow" :class="{ expanded: showAdvanced }" width="16" height="16" viewBox="0 0 24 24"
  97. fill="none" stroke="currentColor" stroke-width="2">
  98. <polyline points="6 9 12 15 18 9" />
  99. </svg>
  100. </div>
  101. <div v-if="showAdvanced" class="advanced-body">
  102. <!-- 显示计时器 -->
  103. <div class="config-row config-row-borderless">
  104. <div class="form-text-block">
  105. <div class="form-label">{{ lang.ssSixHatShowTimer }}</div>
  106. </div>
  107. <div class="toggle-switch" :class="{ active: formData.timerEnabled }"
  108. @click="formData.timerEnabled = !formData.timerEnabled">
  109. <div class="toggle-thumb"></div>
  110. </div>
  111. </div>
  112. <!-- 计时时长 -->
  113. <div v-if="formData.timerEnabled" class="timer-duration">
  114. <div class="duration-label">{{ lang.ssSixHatTimerDuration }}</div>
  115. <div class="duration-options">
  116. <div v-for="item in timerOptions" :key="item" class="duration-chip"
  117. :class="{ active: !customTimerActive && formData.timerDuration === item }"
  118. @click="selectTimerDuration(item)">
  119. {{ item }}{{ lang.ssSixHatTimerSeconds }}
  120. </div>
  121. <div class="duration-chip" :class="{ active: customTimerActive }" @click="selectCustomTimer">
  122. {{ lang.ssCustom }}
  123. </div>
  124. </div>
  125. <!-- 自定义时长输入 -->
  126. <div v-if="customTimerActive" class="custom-timer">
  127. <input v-model="customTimerInput" type="number" min="10" max="3600" step="10"
  128. @change="handleCustomTimerInput" @keyup.enter="handleCustomTimerInput" />
  129. <span class="custom-unit">{{ lang.ssSixHatTimerSeconds }}</span>
  130. </div>
  131. </div>
  132. <!-- 思考帽选择 -->
  133. <div class="hats-select">
  134. <div class="duration-label">{{ lang.ssSixHatSelectHats }}</div>
  135. <div class="hats-options">
  136. <div v-for="hat in hatList" :key="hat.key" class="hat-chip"
  137. :class="[`hat-${hat.key}`, { active: formData.hats.includes(hat.key) }]"
  138. @click="toggleHat(hat.key)">
  139. <span class="hat-dot"></span>
  140. {{ hat.label }}
  141. </div>
  142. </div>
  143. </div>
  144. </div>
  145. </div>
  146. </div>
  147. <!-- 添加到幻灯片按钮 -->
  148. <div class="footer-btn">
  149. <div class="add-btn" @click="handleAddToSlide">{{ lang.ssKwlAddToSlide }}</div>
  150. </div>
  151. </div>
  152. </template>
  153. <script lang="ts" setup>
  154. import { ref, reactive } from 'vue'
  155. import sixHat from '@/assets/img/sixHatBanner.jpg'
  156. import { lang } from '@/main'
  157. const emit = defineEmits<{
  158. (e: 'back'): void
  159. (e: 'add', data: any): void
  160. }>()
  161. const showHelp = ref(false)
  162. const showAdvanced = ref(false)
  163. const timerOptions = [30, 60, 120, 180, 300]
  164. const customTimerActive = ref(false)
  165. const customTimerInput = ref<number>(60)
  166. const hatList = [
  167. { key: 'white', label: lang.ssSixHatWhite },
  168. { key: 'red', label: lang.ssSixHatRed },
  169. { key: 'black', label: lang.ssSixHatBlack },
  170. { key: 'yellow', label: lang.ssSixHatYellow },
  171. { key: 'green', label: lang.ssSixHatGreen },
  172. { key: 'blue', label: lang.ssSixHatBlue }
  173. ]
  174. const formData = reactive({
  175. stage: 'member',
  176. members: [] as string[],
  177. scenario: '',
  178. timerEnabled: true,
  179. timerDuration: 60,
  180. timerCustomValue: 60,
  181. hats: ['white', 'red', 'black', 'yellow', 'green', 'blue'] as string[],
  182. hatContent: {} as Record<string, string>,
  183. enableMemberSelect: false,
  184. enableContentConfigurable: true,
  185. autoExpandHowTo: false,
  186. customScenario: '',
  187. customTimerEnabled: true,
  188. customTimerDuration: 60,
  189. customHats: null as string[] | null
  190. })
  191. const CUSTOM_TIMER_MIN = 10
  192. const CUSTOM_TIMER_MAX = 3600
  193. const selectTimerDuration = (value: number) => {
  194. customTimerActive.value = false
  195. formData.timerDuration = value
  196. formData.timerCustomValue = value
  197. }
  198. const selectCustomTimer = () => {
  199. customTimerActive.value = true
  200. applyCustomTimer()
  201. }
  202. const applyCustomTimer = () => {
  203. formData.timerCustomValue = customTimerInput.value
  204. formData.timerDuration = customTimerInput.value
  205. }
  206. const handleCustomTimerInput = () => {
  207. let val = Number(customTimerInput.value)
  208. if (!val || Number.isNaN(val)) val = 60
  209. val = Math.round(val)
  210. val = Math.max(CUSTOM_TIMER_MIN, Math.min(CUSTOM_TIMER_MAX, val))
  211. customTimerInput.value = val
  212. applyCustomTimer()
  213. }
  214. const toggleHat = (key: string) => {
  215. const index = formData.hats.indexOf(key)
  216. if (index > -1) {
  217. // 至少保留一顶帽子
  218. if (formData.hats.length === 1) return
  219. formData.hats.splice(index, 1)
  220. }
  221. else {
  222. // 按固定顺序插入,保持帽子次序
  223. const order = hatList.map(h => h.key)
  224. formData.hats.push(key)
  225. formData.hats.sort((a, b) => order.indexOf(a) - order.indexOf(b))
  226. }
  227. }
  228. const handleAddToSlide = () => {
  229. emit('add', {
  230. ...formData,
  231. members: [...formData.members],
  232. hats: [...formData.hats],
  233. hatContent: { ...formData.hatContent }
  234. })
  235. }
  236. </script>
  237. <style lang="scss" scoped>
  238. .six-hat-detail {
  239. display: flex;
  240. flex-direction: column;
  241. height: calc(100% - 75px);
  242. overflow-y: auto;
  243. overflow-x: hidden;
  244. padding: 0 0 20px;
  245. }
  246. /* 头部 */
  247. .detail-header {
  248. display: flex;
  249. align-items: center;
  250. gap: 12px;
  251. padding: 0 14px;
  252. position: sticky;
  253. top: 0;
  254. background: #fff;
  255. z-index: 10;
  256. margin-bottom: 20px;
  257. .back-btn {
  258. width: 32px;
  259. height: 32px;
  260. display: flex;
  261. align-items: center;
  262. justify-content: center;
  263. border-radius: 8px;
  264. cursor: pointer;
  265. color: #6b7280;
  266. transition: all 0.2s ease;
  267. &:hover {
  268. background: #f3f4f6;
  269. color: #374151;
  270. }
  271. }
  272. .detail-title {
  273. font-size: 16px;
  274. font-weight: 600;
  275. color: #1f2937;
  276. }
  277. }
  278. /* Banner */
  279. .detail-banner {
  280. margin: 0 14px 14px;
  281. border-radius: 12px;
  282. overflow: hidden;
  283. height: 140px;
  284. min-height: 140px;
  285. position: relative;
  286. box-sizing: border-box;
  287. .tool-overly {
  288. position: absolute;
  289. inset: 0;
  290. background-color: #f59e0b;
  291. opacity: .35;
  292. pointer-events: none;
  293. }
  294. .tool-icon-badge {
  295. position: absolute;
  296. top: 10px;
  297. left: 10px;
  298. width: 32px;
  299. height: 32px;
  300. border-radius: 8px;
  301. background: rgba(255, 255, 255, 0.95);
  302. display: flex;
  303. align-items: center;
  304. justify-content: center;
  305. box-shadow: 0 2px 6px rgba(0, 0, 0, 0.12);
  306. svg {
  307. width: 18px;
  308. height: 18px;
  309. color: #f59e0b;
  310. }
  311. }
  312. img {
  313. width: 100%;
  314. height: 140px;
  315. object-fit: cover;
  316. display: block;
  317. }
  318. }
  319. /* 描述 */
  320. .detail-desc-row {
  321. display: flex;
  322. align-items: flex-start;
  323. gap: 8px;
  324. padding: 0 14px;
  325. .detail-desc-text {
  326. flex: 1;
  327. font-size: 13px;
  328. color: #4b5563;
  329. line-height: 1.6;
  330. }
  331. .help-icon {
  332. position: relative;
  333. color: #9ca3af;
  334. cursor: pointer;
  335. flex-shrink: 0;
  336. margin-top: 2px;
  337. &:hover {
  338. color: #FF9300;
  339. }
  340. .help-tooltip {
  341. position: absolute;
  342. top: 100%;
  343. right: 0;
  344. margin-top: 8px;
  345. width: 250px;
  346. background: #fff;
  347. border: 1px solid #e5e7eb;
  348. border-radius: 10px;
  349. padding: 14px;
  350. box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);
  351. z-index: 100;
  352. .help-title {
  353. font-size: 13px;
  354. font-weight: 600;
  355. color: #1f2937;
  356. margin-bottom: 4px;
  357. margin-top: 8px;
  358. &:first-child {
  359. margin-top: 0;
  360. }
  361. }
  362. .help-text {
  363. font-size: 12px;
  364. color: #6b7280;
  365. margin-bottom: 4px;
  366. }
  367. .help-list {
  368. font-size: 12px;
  369. color: #4b5563;
  370. line-height: 1.6;
  371. .help-step {
  372. display: flex;
  373. align-items: flex-start;
  374. gap: 8px;
  375. padding: 3px 0;
  376. .step-num {
  377. flex-shrink: 0;
  378. width: 18px;
  379. height: 18px;
  380. margin-top: 1px;
  381. border-radius: 50%;
  382. background: #FF9300;
  383. color: #fff;
  384. font-size: 11px;
  385. font-weight: 600;
  386. line-height: 1;
  387. display: flex;
  388. align-items: center;
  389. justify-content: center;
  390. }
  391. }
  392. }
  393. .help-source,
  394. .help-purpose {
  395. font-size: 11px;
  396. color: #9ca3af;
  397. margin-top: 8px;
  398. line-height: 1.5;
  399. }
  400. }
  401. }
  402. }
  403. .detail-tags {
  404. display: flex;
  405. gap: 6px;
  406. padding: 10px 14px 0;
  407. .detail-tag {
  408. display: inline-block;
  409. padding: 3px 10px;
  410. font-size: 11px;
  411. color: #3b82f6;
  412. background: #eff6ff;
  413. border-radius: 4px;
  414. font-weight: 500;
  415. }
  416. }
  417. /* 配置区 */
  418. .config-section {
  419. padding: 20px 14px 12px;
  420. .config-title {
  421. font-size: 16px;
  422. font-weight: 600;
  423. color: #1f2937;
  424. margin-bottom: 6px;
  425. }
  426. .config-subtitle {
  427. font-size: 12px;
  428. color: #6b7280;
  429. line-height: 1.6;
  430. }
  431. }
  432. /* 配置卡片 */
  433. .config-card {
  434. margin: 0 14px;
  435. background: #f8f9fb;
  436. border-radius: 14px;
  437. padding: 8px 14px;
  438. }
  439. .config-row {
  440. display: flex;
  441. align-items: center;
  442. justify-content: space-between;
  443. gap: 12px;
  444. padding: 16px 0;
  445. border-bottom: 1px solid #eceef2;
  446. &:last-child {
  447. border-bottom: none;
  448. }
  449. .form-label {
  450. font-size: 14px;
  451. font-weight: 500;
  452. color: #374151;
  453. }
  454. .form-sublabel {
  455. font-size: 12px;
  456. color: #9ca3af;
  457. margin-top: 3px;
  458. line-height: 1.5;
  459. }
  460. &.config-row-borderless {
  461. border-bottom: none;
  462. padding-bottom: 8px;
  463. }
  464. }
  465. /* 使用者配置高亮行 */
  466. .config-row-highlight {
  467. background: #fff4e8;
  468. border-radius: 12px;
  469. border-bottom: none;
  470. padding: 16px;
  471. margin: 6px 0;
  472. .form-label {
  473. color: #1f2937;
  474. font-weight: 600;
  475. }
  476. .form-sublabel {
  477. color: #b0825c;
  478. }
  479. }
  480. /* 开关 */
  481. .toggle-switch {
  482. width: 44px;
  483. height: 24px;
  484. border-radius: 12px;
  485. background: #d1d5db;
  486. position: relative;
  487. cursor: pointer;
  488. transition: background 0.25s ease;
  489. flex-shrink: 0;
  490. .toggle-thumb {
  491. width: 20px;
  492. height: 20px;
  493. border-radius: 50%;
  494. background: #fff;
  495. position: absolute;
  496. top: 2px;
  497. left: 2px;
  498. box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);
  499. transition: transform 0.25s ease;
  500. }
  501. &.active {
  502. background: #FF9300;
  503. .toggle-thumb {
  504. transform: translateX(20px);
  505. }
  506. }
  507. }
  508. /* 高级配置 */
  509. .advanced-section {
  510. .advanced-header {
  511. display: flex;
  512. align-items: center;
  513. justify-content: space-between;
  514. padding: 12px 0;
  515. cursor: pointer;
  516. .advanced-title {
  517. font-size: 14px;
  518. font-weight: 600;
  519. color: #6b7280;
  520. }
  521. .advanced-arrow {
  522. color: #9ca3af;
  523. transition: transform 0.2s ease;
  524. &.expanded {
  525. transform: rotate(180deg);
  526. }
  527. }
  528. }
  529. .advanced-body {
  530. display: flex;
  531. flex-direction: column;
  532. }
  533. }
  534. /* 计时时长 / 帽子选择 */
  535. .timer-duration,
  536. .hats-select {
  537. padding: 4px 0 14px;
  538. .duration-label {
  539. font-size: 13px;
  540. font-weight: 500;
  541. color: #374151;
  542. margin-bottom: 10px;
  543. }
  544. }
  545. .duration-options {
  546. display: flex;
  547. flex-wrap: wrap;
  548. gap: 8px;
  549. }
  550. .duration-chip {
  551. padding: 6px 14px;
  552. font-size: 12px;
  553. color: #6b7280;
  554. background: #fff;
  555. border: 1px solid #e5e7eb;
  556. border-radius: 999px;
  557. cursor: pointer;
  558. transition: all 0.2s ease;
  559. &:hover {
  560. border-color: #FF9300;
  561. color: #FF9300;
  562. }
  563. &.active {
  564. background: #FF9300;
  565. border-color: #FF9300;
  566. color: #fff;
  567. font-weight: 600;
  568. }
  569. }
  570. /* 自定义时长输入 */
  571. .custom-timer {
  572. display: flex;
  573. align-items: center;
  574. gap: 8px;
  575. margin-top: 10px;
  576. input {
  577. width: 96px;
  578. padding: 8px 12px;
  579. border: 1px solid #e5e7eb;
  580. border-radius: 10px;
  581. font-size: 13px;
  582. color: #374151;
  583. background: #fff;
  584. outline: none;
  585. transition: border-color 0.2s ease;
  586. box-sizing: border-box;
  587. &::placeholder {
  588. color: #9ca3af;
  589. }
  590. &:focus {
  591. border-color: #FF9300;
  592. }
  593. // 隐藏 number 输入框的上下箭头
  594. &::-webkit-outer-spin-button,
  595. &::-webkit-inner-spin-button {
  596. -webkit-appearance: none;
  597. margin: 0;
  598. }
  599. &[type='number'] {
  600. -moz-appearance: textfield;
  601. appearance: textfield;
  602. }
  603. }
  604. .custom-unit {
  605. font-size: 13px;
  606. color: #6b7280;
  607. }
  608. }
  609. .hats-options {
  610. display: flex;
  611. flex-wrap: wrap;
  612. gap: 8px;
  613. }
  614. .hat-chip {
  615. display: inline-flex;
  616. align-items: center;
  617. gap: 6px;
  618. padding: 6px 12px;
  619. font-size: 12px;
  620. color: #9ca3af;
  621. background: #fff;
  622. border: 1px solid #e5e7eb;
  623. border-radius: 999px;
  624. cursor: pointer;
  625. transition: all 0.2s ease;
  626. .hat-dot {
  627. width: 10px;
  628. height: 10px;
  629. border-radius: 50%;
  630. background: #d1d5db;
  631. transition: background 0.2s ease;
  632. }
  633. &.hat-white.active {
  634. color: #374151;
  635. border-color: #d1d5db;
  636. background: #fff;
  637. .hat-dot { background: #f3f4f6; border: 1px solid #d1d5db; }
  638. }
  639. &.hat-red.active {
  640. color: #ef4444;
  641. border-color: #fecaca;
  642. background: #fef2f2;
  643. .hat-dot { background: #ef4444; }
  644. }
  645. &.hat-black.active {
  646. color: #fff;
  647. border-color: #374151;
  648. background: #4b5563;
  649. .hat-dot { background: #1f2937; }
  650. }
  651. &.hat-yellow.active {
  652. color: #b45309;
  653. border-color: #fde68a;
  654. background: #fffbeb;
  655. .hat-dot { background: #f59e0b; }
  656. }
  657. &.hat-green.active {
  658. color: #15803d;
  659. border-color: #bbf7d0;
  660. background: #f0fdf4;
  661. .hat-dot { background: #22c55e; }
  662. }
  663. &.hat-blue.active {
  664. color: #1d4ed8;
  665. border-color: #bfdbfe;
  666. background: #eff6ff;
  667. .hat-dot { background: #3b82f6; }
  668. }
  669. }
  670. /* 底部按钮 */
  671. .footer-btn {
  672. padding: 16px 14px 0;
  673. .add-btn {
  674. width: 100%;
  675. padding: 14px;
  676. background: #FF9300;
  677. color: #fff;
  678. font-size: 15px;
  679. font-weight: 600;
  680. text-align: center;
  681. border-radius: 12px;
  682. cursor: pointer;
  683. transition: all 0.2s ease;
  684. &:hover {
  685. background: #f57c00;
  686. transform: translateY(-1px);
  687. box-shadow: 0 4px 12px rgba(255, 147, 0, 0.3);
  688. }
  689. &:active {
  690. transform: translateY(0);
  691. }
  692. }
  693. }
  694. </style>