mood.page.scss 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373
  1. /* mood.page.scss */
  2. .mood-journal-v2 {
  3. --primary: #8A7BEC;
  4. --secondary: #64C3D3;
  5. --text: #4A4A6A;
  6. --bg: #c06c840f;
  7. background: var(--bg);
  8. padding-bottom: 80px;
  9. .mood-journal {
  10. --primary-color: #ff9a9e;
  11. --secondary-color: #a8edea;
  12. --text-color: #6c5b7b;
  13. // 情绪状态指示样式
  14. .mood-header {
  15. padding: 20px;
  16. background: linear-gradient(135deg, var(--secondary-color) 0%, var(--primary-color) 100%);
  17. border-radius: 0 0 30px 30px;
  18. box-shadow: 0 4px 20px rgba(0,0,0,0.1);
  19. .current-status {
  20. text-align: center;
  21. color: white;
  22. ion-icon {
  23. font-size: 48px;
  24. filter: drop-shadow(0 2px 4px rgba(0,0,0,0.2));
  25. }
  26. .score {
  27. font-size: 42px;
  28. font-weight: bold;
  29. span {
  30. font-size: 16px;
  31. opacity: 0.8;
  32. }
  33. }
  34. }
  35. .emotion-cloud {
  36. margin-top: 15px;
  37. display: flex;
  38. justify-content: center;
  39. gap: 8px;
  40. flex-wrap: wrap;
  41. .tag {
  42. padding: 6px 12px;
  43. border-radius: 20px;
  44. font-size: 14px;
  45. background: rgba(255,255,255,0.2);
  46. backdrop-filter: blur(4px);
  47. &.happy { background: rgba(255,234,167,0.3); }
  48. &.calm { background: rgba(168,237,234,0.3); }
  49. &.anxious { background: rgba(255,154,158,0.3); }
  50. }
  51. }
  52. }
  53. @keyframes pulse {
  54. 0% { transform: scale(1); }
  55. 50% { transform: scale(1.1); }
  56. 100% { transform: scale(1); }
  57. }
  58. }
  59. // 新型情绪仪表盘
  60. .emotion-dashboard {
  61. padding: 20px;
  62. background: #c06c840f;
  63. border-radius: 0 0 40px 40px;
  64. box-shadow: 0 8px 32px rgba(138,123,236,0.1);
  65. /* 环形波浪进度条 */
  66. .circular-progress {
  67. position: relative;
  68. width: 180px;
  69. height: 180px;
  70. margin: 0 auto 30px;
  71. .wave-container {
  72. position: absolute;
  73. width: 100%;
  74. height: 100%;
  75. border-radius: 50%;
  76. overflow: hidden;
  77. background: linear-gradient(145deg, #F0F1FF, #FFFFFF);
  78. box-shadow: 8px 8px 16px #D9DAF0,
  79. -8px -8px 16px #FFFFFF;
  80. .liquid {
  81. position: absolute;
  82. bottom: 0;
  83. width: 100%;
  84. background: var(--primary);
  85. animation: wave 8s infinite linear;
  86. height: calc(var(--progress) * 100%);
  87. opacity: 0.8;
  88. }
  89. .glow {
  90. position: absolute;
  91. width: 120%;
  92. height: 120%;
  93. background: radial-gradient(circle at 50% 0%,
  94. rgba(138,123,236,0.3) 0%,
  95. transparent 60%);
  96. filter: blur(20px);
  97. }
  98. }
  99. .progress-text {
  100. position: absolute;
  101. top: 50%;
  102. left: 50%;
  103. transform: translate(-50%, -50%);
  104. text-align: center;
  105. .score {
  106. font-size: 42px;
  107. font-weight: 700;
  108. color: var(--text);
  109. line-height: 1;
  110. text-shadow: 2px 2px 4px rgba(0,0,0,0.1);
  111. }
  112. .label {
  113. font-size: 14px;
  114. color: #888;
  115. margin-top: 4px;
  116. }
  117. }
  118. }
  119. /* 仪表盘增强样式 */
  120. .vital-stats {
  121. display: grid;
  122. grid-template-columns: repeat(3, 1fr);
  123. gap: 15px;
  124. margin-top: 30px;
  125. .stat-item {
  126. background: rgba(255,255,255,0.9);
  127. padding: 15px;
  128. border-radius: 16px;
  129. transition: transform 0.3s ease;
  130. &:hover {
  131. transform: translateY(-5px);
  132. box-shadow: 0 6px 20px rgba(138,123,236,0.15);
  133. }
  134. }
  135. .heart-beat {
  136. width: 30px;
  137. height: 30px;
  138. background: url('data:image/svg+xml,<svg ...>心跳SVG代码</svg>');
  139. animation: beat 1.2s ease-in-out infinite;
  140. }
  141. }
  142. @keyframes beat {
  143. 0%, 100% { transform: scale(1); }
  144. 50% { transform: scale(1.15); }
  145. }
  146. .ripple-background {
  147. position: absolute;
  148. top: 0;
  149. left: 0;
  150. width: 100%;
  151. height: 100%;
  152. pointer-events: none;
  153. .ripple {
  154. position: absolute;
  155. border: 2px solid rgba(138,123,236,0.3);
  156. border-radius: 50%;
  157. animation: ripple 2s ease-out;
  158. }
  159. }
  160. @keyframes ripple {
  161. from { transform: scale(0); opacity: 0.6; }
  162. to { transform: scale(3); opacity: 0; }
  163. }
  164. /* 时间轴可视化 */
  165. .emotion-timeline {
  166. display: flex;
  167. justify-content: space-between;
  168. padding: 15px 0;
  169. .time-block {
  170. flex: 1;
  171. position: relative;
  172. height: 120px;
  173. .bar {
  174. position: absolute;
  175. bottom: 0;
  176. width: 70%;
  177. left: 15%;
  178. background: linear-gradient(to top, var(--primary), var(--secondary));
  179. height: calc(var(--intensity) * 100%);
  180. border-radius: 8px 8px 0 0;
  181. transition: height 0.6s ease;
  182. }
  183. .time {
  184. position: absolute;
  185. bottom: -25px;
  186. width: 100%;
  187. text-align: center;
  188. font-size: 12px;
  189. color: var(--text);
  190. }
  191. }
  192. }
  193. /* 时间轴滑动样式 */
  194. .timeline-scroller {
  195. overflow-x: auto;
  196. -webkit-overflow-scrolling: touch;
  197. padding: 20px 0;
  198. mask: linear-gradient(
  199. to right,
  200. transparent 0%,
  201. #000 10% 90%,
  202. transparent 100%
  203. );
  204. &::-webkit-scrollbar { display: none; }
  205. .timeline-track {
  206. display: inline-flex;
  207. gap: 15px;
  208. padding: 0 30px;
  209. transition: transform 0.3s cubic-bezier(0.2, 0, 0.2, 1);
  210. }
  211. .time-block {
  212. flex-shrink: 0;
  213. width: 80px;
  214. height: 120px;
  215. opacity: 0.8;
  216. transition: opacity 0.3s;
  217. &:hover {
  218. opacity: 1;
  219. transform: scale(1.05);
  220. }
  221. }
  222. }
  223. }
  224. /* 蜂窝日历 */
  225. .honeycomb-calendar {
  226. padding: 10px;
  227. margin-right: 15px;
  228. --hex-size: 50px;
  229. .hex-row {
  230. display: flex;
  231. justify-content: center;
  232. margin-bottom: -3px;
  233. &:nth-child(even) {
  234. margin-left: calc(var(--hex-size) * 0.4);
  235. margin-right: calc(var(--hex-size) * -0.4);
  236. }
  237. }
  238. .hex-cell {
  239. width: var(--hex-size);
  240. height: calc(var(--hex-size) * 1.2);
  241. clip-path: polygon(25% 0%, 75% 0%, 100% 50%, 75% 100%, 25% 100%, 0% 50%);
  242. margin: 0 2px;
  243. background: rgba(255,255,255,0.9);
  244. transition: all 0.3s ease;
  245. cursor: pointer;
  246. position: relative;
  247. .hex-content {
  248. position: absolute;
  249. width: 100%;
  250. height: 100%;
  251. display: flex;
  252. align-items: center;
  253. justify-content: center;
  254. .date {
  255. font-size: 16px;
  256. font-weight: 500;
  257. color: var(--text);
  258. z-index: 1;
  259. }
  260. .particles {
  261. position: absolute;
  262. width: 100%;
  263. height: 100%;
  264. background: radial-gradient(circle at center,
  265. rgba(138,123,236,0.1) 0%,
  266. transparent 60%);
  267. opacity: 0;
  268. transition: opacity 0.3s ease;
  269. }
  270. }
  271. &:hover {
  272. transform: scale(1.15) rotate(15deg);
  273. z-index: 2;
  274. .particles {
  275. opacity: 1;
  276. }
  277. }
  278. /* 情绪状态颜色 */
  279. &.excellent { background: rgba(100,195,211,0.3); }
  280. &.good { background: rgba(138,123,236,0.2); }
  281. &.normal { background: rgba(255,255,255,0.8); }
  282. &.poor { background: rgba(255,182,193,0.3); }
  283. }
  284. }
  285. /* 智能分析卡片 */
  286. .analysis-card {
  287. margin: 20px;
  288. padding: 16px;
  289. background: rgba(255,255,255,0.95);
  290. border-radius: 20px;
  291. box-shadow: 0 4px 12px rgba(0,0,0,0.08);
  292. .insight {
  293. display: flex;
  294. align-items: center;
  295. color: var(--text);
  296. margin-bottom: 8px;
  297. ion-icon {
  298. color: var(--primary);
  299. margin-right: 8px;
  300. font-size: 20px;
  301. }
  302. }
  303. .suggestion {
  304. font-size: 14px;
  305. color: #666;
  306. padding-left: 28px;
  307. }
  308. }
  309. // 语音输入按钮
  310. .voice-btn {
  311. --background: #ff9a9da2;
  312. --box-shadow: 0 4px 16px rgba(255,154,158,0.3);
  313. &[class*="recording"] {
  314. animation: pulse 1.5s infinite;
  315. }
  316. }
  317. }
  318. @keyframes wave {
  319. 0% { clip-path: polygon(0 20%, 100% 15%, 100% 80%, 0 85%); }
  320. 50% { clip-path: polygon(0 25%, 100% 20%, 100% 75%, 0 80%); }
  321. 100% { clip-path: polygon(0 20%, 100% 15%, 100% 80%, 0 85%); }
  322. }