This commit is contained in:
aaron 2026-04-07 23:21:47 +08:00
parent 41e75fd0ce
commit 26d73600a5
25 changed files with 272 additions and 333 deletions

View File

@ -1,10 +1,5 @@
{ {
"pages": { "pages": {
"/chat/page": [
"static/chunks/webpack.js",
"static/chunks/main-app.js",
"static/chunks/app/chat/page.js"
],
"/layout": [ "/layout": [
"static/chunks/webpack.js", "static/chunks/webpack.js",
"static/chunks/main-app.js", "static/chunks/main-app.js",
@ -16,10 +11,20 @@
"static/chunks/main-app.js", "static/chunks/main-app.js",
"static/chunks/app/recommendations/page.js" "static/chunks/app/recommendations/page.js"
], ],
"/stock/[code]/page": [ "/page": [
"static/chunks/webpack.js", "static/chunks/webpack.js",
"static/chunks/main-app.js", "static/chunks/main-app.js",
"static/chunks/app/stock/[code]/page.js" "static/chunks/app/page.js"
],
"/sectors/page": [
"static/chunks/webpack.js",
"static/chunks/main-app.js",
"static/chunks/app/sectors/page.js"
],
"/chat/page": [
"static/chunks/webpack.js",
"static/chunks/main-app.js",
"static/chunks/app/chat/page.js"
] ]
} }
} }

File diff suppressed because one or more lines are too long

View File

@ -1,20 +1 @@
{ {}
"components/capital-flow.tsx -> echarts": {
"id": "components/capital-flow.tsx -> echarts",
"files": [
"static/chunks/_app-pages-browser_node_modules_echarts_index_js.js"
]
},
"components/kline-chart.tsx -> echarts": {
"id": "components/kline-chart.tsx -> echarts",
"files": [
"static/chunks/_app-pages-browser_node_modules_echarts_index_js.js"
]
},
"components/score-radar.tsx -> echarts": {
"id": "components/score-radar.tsx -> echarts",
"files": [
"static/chunks/_app-pages-browser_node_modules_echarts_index_js.js"
]
}
}

View File

@ -1,6 +1,6 @@
{ {
"/chat/page": "app/chat/page.js", "/page": "app/page.js",
"/sectors/page": "app/sectors/page.js",
"/recommendations/page": "app/recommendations/page.js", "/recommendations/page": "app/recommendations/page.js",
"/api/chat/stream/route": "app/api/chat/stream/route.js", "/chat/page": "app/chat/page.js"
"/stock/[code]/page": "app/stock/[code]/page.js"
} }

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
self.__REACT_LOADABLE_MANIFEST="{\"components/capital-flow.tsx -> echarts\":{\"id\":\"components/capital-flow.tsx -> echarts\",\"files\":[\"static/chunks/_app-pages-browser_node_modules_echarts_index_js.js\"]},\"components/kline-chart.tsx -> echarts\":{\"id\":\"components/kline-chart.tsx -> echarts\",\"files\":[\"static/chunks/_app-pages-browser_node_modules_echarts_index_js.js\"]},\"components/score-radar.tsx -> echarts\":{\"id\":\"components/score-radar.tsx -> echarts\",\"files\":[\"static/chunks/_app-pages-browser_node_modules_echarts_index_js.js\"]}}" self.__REACT_LOADABLE_MANIFEST="{}"

View File

@ -1,5 +1,5 @@
{ {
"node": {}, "node": {},
"edge": {}, "edge": {},
"encryptionKey": "YesDqzwu7U3Zt5BbI/COWZPvCGzAI5FFxbDk16RGGxQ=" "encryptionKey": "2xwJVyON4j1nUVj9bt2cAd3iPAWZ77oTyEHOq3x+eQU="
} }

View File

@ -10,17 +10,6 @@ exports.id = "vendor-chunks/next";
exports.ids = ["vendor-chunks/next"]; exports.ids = ["vendor-chunks/next"];
exports.modules = { exports.modules = {
/***/ "(ssr)/./node_modules/next/dist/api/navigation.js":
/*!**************************************************!*\
!*** ./node_modules/next/dist/api/navigation.js ***!
\**************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _client_components_navigation__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../client/components/navigation */ \"(ssr)/./node_modules/next/dist/client/components/navigation.js\");\n/* harmony import */ var _client_components_navigation__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_client_components_navigation__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony reexport (unknown) */ var __WEBPACK_REEXPORT_OBJECT__ = {};\n/* harmony reexport (unknown) */ for(const __WEBPACK_IMPORT_KEY__ in _client_components_navigation__WEBPACK_IMPORTED_MODULE_0__) if(__WEBPACK_IMPORT_KEY__ !== \"default\") __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = () => _client_components_navigation__WEBPACK_IMPORTED_MODULE_0__[__WEBPACK_IMPORT_KEY__]\n/* harmony reexport (unknown) */ __webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);\n\n\n//# sourceMappingURL=navigation.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvbmV4dC9kaXN0L2FwaS9uYXZpZ2F0aW9uLmpzIiwibWFwcGluZ3MiOiI7Ozs7OztBQUFnRDs7QUFFaEQiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hc3RvY2stYWdlbnQtZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvbmV4dC9kaXN0L2FwaS9uYXZpZ2F0aW9uLmpzP2MyNzIiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4uL2NsaWVudC9jb21wb25lbnRzL25hdmlnYXRpb25cIjtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bmF2aWdhdGlvbi5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/next/dist/api/navigation.js\n");
/***/ }),
/***/ "(ssr)/./node_modules/next/dist/client/add-base-path.js": /***/ "(ssr)/./node_modules/next/dist/client/add-base-path.js":
/*!********************************************************!*\ /*!********************************************************!*\
!*** ./node_modules/next/dist/client/add-base-path.js ***! !*** ./node_modules/next/dist/client/add-base-path.js ***!
@ -2108,17 +2097,6 @@ eval("\nmodule.exports = __webpack_require__(/*! ../../module.compiled */ \"(ssr
/***/ }), /***/ }),
/***/ "(rsc)/./node_modules/next/dist/server/future/route-modules/app-route/module.compiled.js":
/*!*****************************************************************************************!*\
!*** ./node_modules/next/dist/server/future/route-modules/app-route/module.compiled.js ***!
\*****************************************************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
eval("\nif (false) {} else {\n if (false) {} else {\n if (true) {\n module.exports = __webpack_require__(/*! next/dist/compiled/next-server/app-route.runtime.dev.js */ \"next/dist/compiled/next-server/app-route.runtime.dev.js\");\n } else {}\n }\n}\n\n//# sourceMappingURL=module.compiled.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvbmV4dC9kaXN0L3NlcnZlci9mdXR1cmUvcm91dGUtbW9kdWxlcy9hcHAtcm91dGUvbW9kdWxlLmNvbXBpbGVkLmpzIiwibWFwcGluZ3MiOiJBQUFhO0FBQ2IsSUFBSSxLQUFtQyxFQUFFLEVBRXhDLENBQUM7QUFDRixRQUFRLEtBQXFDLEVBQUUsRUFRMUMsQ0FBQztBQUNOLFlBQVksSUFBc0M7QUFDbEQsWUFBWSw4SkFBbUY7QUFDL0YsVUFBVSxLQUFLLEVBSU47QUFDVDtBQUNBOztBQUVBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYXN0b2NrLWFnZW50LWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL25leHQvZGlzdC9zZXJ2ZXIvZnV0dXJlL3JvdXRlLW1vZHVsZXMvYXBwLXJvdXRlL21vZHVsZS5jb21waWxlZC5qcz8zYmM3Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuaWYgKHByb2Nlc3MuZW52Lk5FWFRfUlVOVElNRSA9PT0gXCJlZGdlXCIpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJuZXh0L2Rpc3Qvc2VydmVyL2Z1dHVyZS9yb3V0ZS1tb2R1bGVzL2FwcC1yb3V0ZS9tb2R1bGUuanNcIik7XG59IGVsc2Uge1xuICAgIGlmIChwcm9jZXNzLmVudi5fX05FWFRfRVhQRVJJTUVOVEFMX1JFQUNUKSB7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJkZXZlbG9wbWVudFwiKSB7XG4gICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJuZXh0L2Rpc3QvY29tcGlsZWQvbmV4dC1zZXJ2ZXIvYXBwLXJvdXRlLWV4cGVyaW1lbnRhbC5ydW50aW1lLmRldi5qc1wiKTtcbiAgICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLmVudi5UVVJCT1BBQ0spIHtcbiAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIm5leHQvZGlzdC9jb21waWxlZC9uZXh0LXNlcnZlci9hcHAtcm91dGUtdHVyYm8tZXhwZXJpbWVudGFsLnJ1bnRpbWUucHJvZC5qc1wiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIm5leHQvZGlzdC9jb21waWxlZC9uZXh0LXNlcnZlci9hcHAtcm91dGUtZXhwZXJpbWVudGFsLnJ1bnRpbWUucHJvZC5qc1wiKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJkZXZlbG9wbWVudFwiKSB7XG4gICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJuZXh0L2Rpc3QvY29tcGlsZWQvbmV4dC1zZXJ2ZXIvYXBwLXJvdXRlLnJ1bnRpbWUuZGV2LmpzXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52LlRVUkJPUEFDSykge1xuICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibmV4dC9kaXN0L2NvbXBpbGVkL25leHQtc2VydmVyL2FwcC1yb3V0ZS10dXJiby5ydW50aW1lLnByb2QuanNcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJuZXh0L2Rpc3QvY29tcGlsZWQvbmV4dC1zZXJ2ZXIvYXBwLXJvdXRlLnJ1bnRpbWUucHJvZC5qc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bW9kdWxlLmNvbXBpbGVkLmpzLm1hcCJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/next/dist/server/future/route-modules/app-route/module.compiled.js\n");
/***/ }),
/***/ "(rsc)/./node_modules/next/dist/server/lib/clone-response.js": /***/ "(rsc)/./node_modules/next/dist/server/lib/clone-response.js":
/*!*************************************************************!*\ /*!*************************************************************!*\
!*** ./node_modules/next/dist/server/lib/clone-response.js ***! !*** ./node_modules/next/dist/server/lib/clone-response.js ***!

View File

@ -125,7 +125,7 @@
/******/ /******/
/******/ /* webpack/runtime/getFullHash */ /******/ /* webpack/runtime/getFullHash */
/******/ (() => { /******/ (() => {
/******/ __webpack_require__.h = () => ("c8994b8599cfdbb2") /******/ __webpack_require__.h = () => ("915ef4ca94558be7")
/******/ })(); /******/ })();
/******/ /******/
/******/ /* webpack/runtime/hasOwnProperty shorthand */ /******/ /* webpack/runtime/hasOwnProperty shorthand */

View File

@ -25,7 +25,7 @@ eval(__webpack_require__.ts("Promise.resolve(/*! import() eager */).then(__webpa
/***/ (function(module, __webpack_exports__, __webpack_require__) { /***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict"; "use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = (\"41402df187ff\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL3NyYy9hcHAvZ2xvYmFscy5jc3MiLCJtYXBwaW5ncyI6IjtBQUFBLCtEQUFlLGNBQWM7QUFDN0IsSUFBSSxJQUFVLElBQUksaUJBQWlCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL3NyYy9hcHAvZ2xvYmFscy5jc3M/OTc1OSJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBcIjQxNDAyZGYxODdmZlwiXG5pZiAobW9kdWxlLmhvdCkgeyBtb2R1bGUuaG90LmFjY2VwdCgpIH1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./src/app/globals.css\n")); eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = (\"d5e60da35bc9\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL3NyYy9hcHAvZ2xvYmFscy5jc3MiLCJtYXBwaW5ncyI6IjtBQUFBLCtEQUFlLGNBQWM7QUFDN0IsSUFBSSxJQUFVLElBQUksaUJBQWlCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL3NyYy9hcHAvZ2xvYmFscy5jc3M/OTc1OSJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBcImQ1ZTYwZGEzNWJjOVwiXG5pZiAobW9kdWxlLmhvdCkgeyBtb2R1bGUuaG90LmFjY2VwdCgpIH1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./src/app/globals.css\n"));
/***/ }) /***/ })

File diff suppressed because one or more lines are too long

View File

@ -163,7 +163,7 @@
/******/ // This function allow to reference async chunks /******/ // This function allow to reference async chunks
/******/ __webpack_require__.u = function(chunkId) { /******/ __webpack_require__.u = function(chunkId) {
/******/ // return url for filenames based on template /******/ // return url for filenames based on template
/******/ return "static/chunks/" + chunkId + ".js"; /******/ return undefined;
/******/ }; /******/ };
/******/ }(); /******/ }();
/******/ /******/
@ -192,7 +192,7 @@
/******/ /******/
/******/ /* webpack/runtime/getFullHash */ /******/ /* webpack/runtime/getFullHash */
/******/ !function() { /******/ !function() {
/******/ __webpack_require__.h = function() { return "18bfcaa4d79c56aa"; } /******/ __webpack_require__.h = function() { return "fde2b42f96686da5"; }
/******/ }(); /******/ }();
/******/ /******/
/******/ /* webpack/runtime/global */ /******/ /* webpack/runtime/global */

View File

@ -512,30 +512,32 @@ video {
display: none; display: none;
} }
.glass-card { .glass-card {
background: linear-gradient(135deg, rgba(30, 41, 59, 0.8) 0%, rgba(15, 23, 42, 0.9) 100%); background: linear-gradient(135deg, rgba(22, 22, 25, 0.85) 0%, rgba(10, 10, 12, 0.95) 100%);
backdrop-filter: blur(20px); backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px);
border: 1px solid rgba(148, 163, 184, 0.08); border: 1px solid rgba(255, 255, 255, 0.05);
border-radius: 16px; border-radius: 16px;
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.03);
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
} }
.glass-card:hover { .glass-card:hover {
border-color: rgba(148, 163, 184, 0.15); border-color: rgba(255, 255, 255, 0.10);
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3), 0 0 0 1px rgba(148, 163, 184, 0.05); box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4), inset 0 1px 0 rgba(255, 255, 255, 0.05);
transform: translateY(-1px); transform: translateY(-1px);
} }
.glass-card-static { .glass-card-static {
background: linear-gradient(135deg, rgba(30, 41, 59, 0.8) 0%, rgba(15, 23, 42, 0.9) 100%); background: linear-gradient(135deg, rgba(22, 22, 25, 0.85) 0%, rgba(10, 10, 12, 0.95) 100%);
backdrop-filter: blur(20px); backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px);
border: 1px solid rgba(148, 163, 184, 0.08); border: 1px solid rgba(255, 255, 255, 0.05);
border-radius: 16px; border-radius: 16px;
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.03);
} }
.glass-sidebar { .glass-sidebar {
background: linear-gradient(180deg, rgba(15, 23, 42, 0.97) 0%, rgba(10, 14, 26, 0.99) 100%); background: linear-gradient(180deg, rgba(16, 16, 19, 0.97) 0%, rgba(10, 10, 12, 0.99) 100%);
backdrop-filter: blur(30px); backdrop-filter: blur(30px);
-webkit-backdrop-filter: blur(30px); -webkit-backdrop-filter: blur(30px);
border-right: 1px solid rgba(148, 163, 184, 0.06); border-right: 1px solid rgba(255, 255, 255, 0.04);
} }
.fixed{ .fixed{
position: fixed; position: fixed;
@ -954,17 +956,26 @@ video {
.border-t{ .border-t{
border-top-width: 1px; border-top-width: 1px;
} }
.border-accent-indigo\/10{ .border-accent-cyan\/10{
border-color: rgb(129 140 248 / 0.1); border-color: rgb(34 211 238 / 0.1);
} }
.border-accent-indigo\/20{ .border-accent-cyan\/20{
border-color: rgb(129 140 248 / 0.2); border-color: rgb(34 211 238 / 0.2);
} }
.border-accent-indigo\/30{ .border-accent-cyan\/30{
border-color: rgb(129 140 248 / 0.3); border-color: rgb(34 211 238 / 0.3);
} }
.border-accent-indigo\/\[0\.12\]{ .border-accent-cyan\/\[0\.12\]{
border-color: rgb(129 140 248 / 0.12); border-color: rgb(34 211 238 / 0.12);
}
.border-amber-400\/40{
border-color: rgb(251 191 36 / 0.4);
}
.border-amber-500\/10{
border-color: rgb(245 158 11 / 0.1);
}
.border-amber-500\/15{
border-color: rgb(245 158 11 / 0.15);
} }
.border-amber-500\/20{ .border-amber-500\/20{
border-color: rgb(245 158 11 / 0.2); border-color: rgb(245 158 11 / 0.2);
@ -972,27 +983,18 @@ video {
.border-amber-500\/\[0\.08\]{ .border-amber-500\/\[0\.08\]{
border-color: rgb(245 158 11 / 0.08); border-color: rgb(245 158 11 / 0.08);
} }
.border-orange-400\/40{ .border-amber-600\/15{
border-color: rgb(251 146 60 / 0.4); border-color: rgb(217 119 6 / 0.15);
} }
.border-orange-500\/10{ .border-orange-500\/10{
border-color: rgb(249 115 22 / 0.1); border-color: rgb(249 115 22 / 0.1);
} }
.border-orange-500\/15{
border-color: rgb(249 115 22 / 0.15);
}
.border-orange-600\/15{
border-color: rgb(234 88 12 / 0.15);
}
.border-red-500\/10{ .border-red-500\/10{
border-color: rgb(239 68 68 / 0.1); border-color: rgb(239 68 68 / 0.1);
} }
.border-slate-400\/15{ .border-slate-400\/15{
border-color: rgb(148 163 184 / 0.15); border-color: rgb(148 163 184 / 0.15);
} }
.border-slate-800\/50{
border-color: rgb(30 41 59 / 0.5);
}
.border-transparent{ .border-transparent{
border-color: transparent; border-color: transparent;
} }
@ -1002,42 +1004,52 @@ video {
.border-white\/\[0\.04\]{ .border-white\/\[0\.04\]{
border-color: rgb(255 255 255 / 0.04); border-color: rgb(255 255 255 / 0.04);
} }
.border-t-accent-indigo\/70{ .border-t-accent-cyan\/70{
border-top-color: rgb(129 140 248 / 0.7); border-top-color: rgb(34 211 238 / 0.7);
} }
.border-t-accent-indigo\/80{ .border-t-accent-cyan\/80{
border-top-color: rgb(129 140 248 / 0.8); border-top-color: rgb(34 211 238 / 0.8);
} }
.border-t-orange-400{ .border-t-amber-400{
--tw-border-opacity: 1; --tw-border-opacity: 1;
border-top-color: rgb(251 146 60 / var(--tw-border-opacity, 1)); border-top-color: rgb(251 191 36 / var(--tw-border-opacity, 1));
} }
.bg-accent-indigo{ .bg-accent-cyan{
--tw-bg-opacity: 1; --tw-bg-opacity: 1;
background-color: rgb(129 140 248 / var(--tw-bg-opacity, 1)); background-color: rgb(34 211 238 / var(--tw-bg-opacity, 1));
} }
.bg-accent-indigo\/60{ .bg-accent-cyan\/60{
background-color: rgb(129 140 248 / 0.6); background-color: rgb(34 211 238 / 0.6);
} }
.bg-accent-indigo\/\[0\.06\]{ .bg-accent-cyan\/\[0\.06\]{
background-color: rgb(129 140 248 / 0.06); background-color: rgb(34 211 238 / 0.06);
}
.bg-amber-400{
--tw-bg-opacity: 1;
background-color: rgb(251 191 36 / var(--tw-bg-opacity, 1));
}
.bg-amber-500\/20{
background-color: rgb(245 158 11 / 0.2);
}
.bg-amber-500\/60{
background-color: rgb(245 158 11 / 0.6);
} }
.bg-amber-500\/\[0\.04\]{ .bg-amber-500\/\[0\.04\]{
background-color: rgb(245 158 11 / 0.04); background-color: rgb(245 158 11 / 0.04);
} }
.bg-bg-card{ .bg-bg-card{
--tw-bg-opacity: 1; --tw-bg-opacity: 1;
background-color: rgb(19 26 46 / var(--tw-bg-opacity, 1)); background-color: rgb(22 22 25 / var(--tw-bg-opacity, 1));
} }
.bg-bg-primary{ .bg-bg-primary{
--tw-bg-opacity: 1; --tw-bg-opacity: 1;
background-color: rgb(10 14 26 / var(--tw-bg-opacity, 1)); background-color: rgb(10 10 12 / var(--tw-bg-opacity, 1));
} }
.bg-bg-primary\/80{ .bg-bg-primary\/80{
background-color: rgb(10 14 26 / 0.8); background-color: rgb(10 10 12 / 0.8);
} }
.bg-bg-secondary\/95{ .bg-bg-secondary\/95{
background-color: rgb(15 23 42 / 0.95); background-color: rgb(16 16 19 / 0.95);
} }
.bg-emerald-400{ .bg-emerald-400{
--tw-bg-opacity: 1; --tw-bg-opacity: 1;
@ -1047,16 +1059,6 @@ video {
--tw-bg-opacity: 1; --tw-bg-opacity: 1;
background-color: rgb(16 185 129 / var(--tw-bg-opacity, 1)); background-color: rgb(16 185 129 / var(--tw-bg-opacity, 1));
} }
.bg-orange-400{
--tw-bg-opacity: 1;
background-color: rgb(251 146 60 / var(--tw-bg-opacity, 1));
}
.bg-orange-500\/20{
background-color: rgb(249 115 22 / 0.2);
}
.bg-orange-500\/60{
background-color: rgb(249 115 22 / 0.6);
}
.bg-red-400{ .bg-red-400{
--tw-bg-opacity: 1; --tw-bg-opacity: 1;
background-color: rgb(248 113 113 / var(--tw-bg-opacity, 1)); background-color: rgb(248 113 113 / var(--tw-bg-opacity, 1));
@ -1065,7 +1067,7 @@ video {
background-color: rgb(239 68 68 / 0.08); background-color: rgb(239 68 68 / 0.08);
} }
.bg-text-muted\/40{ .bg-text-muted\/40{
background-color: rgb(84 99 128 / 0.4); background-color: rgb(88 88 95 / 0.4);
} }
.bg-white\/\[0\.02\]{ .bg-white\/\[0\.02\]{
background-color: rgb(255 255 255 / 0.02); background-color: rgb(255 255 255 / 0.02);
@ -1082,19 +1084,34 @@ video {
.bg-gradient-to-r{ .bg-gradient-to-r{
background-image: linear-gradient(to right, var(--tw-gradient-stops)); background-image: linear-gradient(to right, var(--tw-gradient-stops));
} }
.from-accent-indigo\/15{ .from-accent-cyan\/15{
--tw-gradient-from: rgb(129 140 248 / 0.15) var(--tw-gradient-from-position); --tw-gradient-from: rgb(34 211 238 / 0.15) var(--tw-gradient-from-position);
--tw-gradient-to: rgb(129 140 248 / 0) var(--tw-gradient-to-position); --tw-gradient-to: rgb(34 211 238 / 0) var(--tw-gradient-to-position);
--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
} }
.from-accent-indigo\/20{ .from-accent-cyan\/20{
--tw-gradient-from: rgb(129 140 248 / 0.2) var(--tw-gradient-from-position); --tw-gradient-from: rgb(34 211 238 / 0.2) var(--tw-gradient-from-position);
--tw-gradient-to: rgb(129 140 248 / 0) var(--tw-gradient-to-position); --tw-gradient-to: rgb(34 211 238 / 0) var(--tw-gradient-to-position);
--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
} }
.from-accent-indigo\/30{ .from-accent-cyan\/30{
--tw-gradient-from: rgb(129 140 248 / 0.3) var(--tw-gradient-from-position); --tw-gradient-from: rgb(34 211 238 / 0.3) var(--tw-gradient-from-position);
--tw-gradient-to: rgb(129 140 248 / 0) var(--tw-gradient-to-position); --tw-gradient-to: rgb(34 211 238 / 0) var(--tw-gradient-to-position);
--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
}
.from-amber-500{
--tw-gradient-from: #f59e0b var(--tw-gradient-from-position);
--tw-gradient-to: rgb(245 158 11 / 0) var(--tw-gradient-to-position);
--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
}
.from-amber-500\/20{
--tw-gradient-from: rgb(245 158 11 / 0.2) var(--tw-gradient-from-position);
--tw-gradient-to: rgb(245 158 11 / 0) var(--tw-gradient-to-position);
--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
}
.from-amber-500\/25{
--tw-gradient-from: rgb(245 158 11 / 0.25) var(--tw-gradient-from-position);
--tw-gradient-to: rgb(245 158 11 / 0) var(--tw-gradient-to-position);
--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
} }
.from-amber-500\/30{ .from-amber-500\/30{
@ -1102,9 +1119,9 @@ video {
--tw-gradient-to: rgb(245 158 11 / 0) var(--tw-gradient-to-position); --tw-gradient-to: rgb(245 158 11 / 0) var(--tw-gradient-to-position);
--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
} }
.from-orange-500{ .from-amber-700\/20{
--tw-gradient-from: #f97316 var(--tw-gradient-from-position); --tw-gradient-from: rgb(180 83 9 / 0.2) var(--tw-gradient-from-position);
--tw-gradient-to: rgb(249 115 22 / 0) var(--tw-gradient-to-position); --tw-gradient-to: rgb(180 83 9 / 0) var(--tw-gradient-to-position);
--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
} }
.from-orange-500\/20{ .from-orange-500\/20{
@ -1112,16 +1129,6 @@ video {
--tw-gradient-to: rgb(249 115 22 / 0) var(--tw-gradient-to-position); --tw-gradient-to: rgb(249 115 22 / 0) var(--tw-gradient-to-position);
--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
} }
.from-orange-500\/25{
--tw-gradient-from: rgb(249 115 22 / 0.25) var(--tw-gradient-from-position);
--tw-gradient-to: rgb(249 115 22 / 0) var(--tw-gradient-to-position);
--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
}
.from-orange-700\/20{
--tw-gradient-from: rgb(194 65 12 / 0.2) var(--tw-gradient-from-position);
--tw-gradient-to: rgb(194 65 12 / 0) var(--tw-gradient-to-position);
--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
}
.from-slate-400\/20{ .from-slate-400\/20{
--tw-gradient-from: rgb(148 163 184 / 0.2) var(--tw-gradient-from-position); --tw-gradient-from: rgb(148 163 184 / 0.2) var(--tw-gradient-from-position);
--tw-gradient-to: rgb(148 163 184 / 0) var(--tw-gradient-to-position); --tw-gradient-to: rgb(148 163 184 / 0) var(--tw-gradient-to-position);
@ -1132,33 +1139,30 @@ video {
--tw-gradient-to: rgb(0 0 0 / 0) var(--tw-gradient-to-position); --tw-gradient-to: rgb(0 0 0 / 0) var(--tw-gradient-to-position);
--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
} }
.via-slate-700\/50{ .via-white\/\[0\.06\]{
--tw-gradient-to: rgb(51 65 85 / 0) var(--tw-gradient-to-position); --tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position);
--tw-gradient-stops: var(--tw-gradient-from), rgb(51 65 85 / 0.5) var(--tw-gradient-via-position), var(--tw-gradient-to); --tw-gradient-stops: var(--tw-gradient-from), rgb(255 255 255 / 0.06) var(--tw-gradient-via-position), var(--tw-gradient-to);
} }
.to-accent-indigo\/10{ .to-accent-cyan\/10{
--tw-gradient-to: rgb(129 140 248 / 0.1) var(--tw-gradient-to-position); --tw-gradient-to: rgb(34 211 238 / 0.1) var(--tw-gradient-to-position);
} }
.to-accent-indigo\/5{ .to-accent-cyan\/5{
--tw-gradient-to: rgb(129 140 248 / 0.05) var(--tw-gradient-to-position); --tw-gradient-to: rgb(34 211 238 / 0.05) var(--tw-gradient-to-position);
} }
.to-amber-500\/15{ .to-amber-500\/15{
--tw-gradient-to: rgb(245 158 11 / 0.15) var(--tw-gradient-to-position); --tw-gradient-to: rgb(245 158 11 / 0.15) var(--tw-gradient-to-position);
} }
.to-amber-500\/20{
--tw-gradient-to: rgb(245 158 11 / 0.2) var(--tw-gradient-to-position);
}
.to-amber-500\/25{
--tw-gradient-to: rgb(245 158 11 / 0.25) var(--tw-gradient-to-position);
}
.to-amber-600{ .to-amber-600{
--tw-gradient-to: #d97706 var(--tw-gradient-to-position); --tw-gradient-to: #d97706 var(--tw-gradient-to-position);
} }
.to-amber-600\/15{
--tw-gradient-to: rgb(217 119 6 / 0.15) var(--tw-gradient-to-position);
}
.to-amber-600\/20{ .to-amber-600\/20{
--tw-gradient-to: rgb(217 119 6 / 0.2) var(--tw-gradient-to-position); --tw-gradient-to: rgb(217 119 6 / 0.2) var(--tw-gradient-to-position);
} }
.to-orange-800\/15{ .to-amber-800\/15{
--tw-gradient-to: rgb(154 52 18 / 0.15) var(--tw-gradient-to-position); --tw-gradient-to: rgb(146 64 14 / 0.15) var(--tw-gradient-to-position);
} }
.to-slate-500\/15{ .to-slate-500\/15{
--tw-gradient-to: rgb(100 116 139 / 0.15) var(--tw-gradient-to-position); --tw-gradient-to: rgb(100 116 139 / 0.15) var(--tw-gradient-to-position);
@ -1334,18 +1338,18 @@ video {
.tracking-wider{ .tracking-wider{
letter-spacing: 0.05em; letter-spacing: 0.05em;
} }
.text-accent-indigo{ .text-accent-cyan{
--tw-text-opacity: 1; --tw-text-opacity: 1;
color: rgb(129 140 248 / var(--tw-text-opacity, 1)); color: rgb(34 211 238 / var(--tw-text-opacity, 1));
} }
.text-accent-indigo\/50{ .text-accent-cyan\/50{
color: rgb(129 140 248 / 0.5); color: rgb(34 211 238 / 0.5);
} }
.text-accent-indigo\/70{ .text-accent-cyan\/70{
color: rgb(129 140 248 / 0.7); color: rgb(34 211 238 / 0.7);
} }
.text-accent-indigo\/80{ .text-accent-cyan\/80{
color: rgb(129 140 248 / 0.8); color: rgb(34 211 238 / 0.8);
} }
.text-amber-400{ .text-amber-400{
--tw-text-opacity: 1; --tw-text-opacity: 1;
@ -1382,37 +1386,37 @@ video {
} }
.text-text-muted{ .text-text-muted{
--tw-text-opacity: 1; --tw-text-opacity: 1;
color: rgb(84 99 128 / var(--tw-text-opacity, 1)); color: rgb(88 88 95 / var(--tw-text-opacity, 1));
} }
.text-text-muted\/30{ .text-text-muted\/30{
color: rgb(84 99 128 / 0.3); color: rgb(88 88 95 / 0.3);
} }
.text-text-muted\/40{ .text-text-muted\/40{
color: rgb(84 99 128 / 0.4); color: rgb(88 88 95 / 0.4);
} }
.text-text-muted\/50{ .text-text-muted\/50{
color: rgb(84 99 128 / 0.5); color: rgb(88 88 95 / 0.5);
} }
.text-text-muted\/60{ .text-text-muted\/60{
color: rgb(84 99 128 / 0.6); color: rgb(88 88 95 / 0.6);
} }
.text-text-primary{ .text-text-primary{
--tw-text-opacity: 1; --tw-text-opacity: 1;
color: rgb(241 245 249 / var(--tw-text-opacity, 1)); color: rgb(245 245 247 / var(--tw-text-opacity, 1));
} }
.text-text-secondary{ .text-text-secondary{
--tw-text-opacity: 1; --tw-text-opacity: 1;
color: rgb(136 150 179 / var(--tw-text-opacity, 1)); color: rgb(152 152 164 / var(--tw-text-opacity, 1));
} }
.text-white{ .text-white{
--tw-text-opacity: 1; --tw-text-opacity: 1;
color: rgb(255 255 255 / var(--tw-text-opacity, 1)); color: rgb(255 255 255 / var(--tw-text-opacity, 1));
} }
.placeholder-text-muted\/40::-moz-placeholder{ .placeholder-text-muted\/40::-moz-placeholder{
color: rgb(84 99 128 / 0.4); color: rgb(88 88 95 / 0.4);
} }
.placeholder-text-muted\/40::placeholder{ .placeholder-text-muted\/40::placeholder{
color: rgb(84 99 128 / 0.4); color: rgb(88 88 95 / 0.4);
} }
.opacity-0{ .opacity-0{
opacity: 0; opacity: 0;
@ -1421,7 +1425,7 @@ video {
opacity: 0.7; opacity: 0.7;
} }
.shadow-glow-sm{ .shadow-glow-sm{
--tw-shadow: 0 0 10px rgba(249, 115, 22, 0.1); --tw-shadow: 0 0 10px rgba(245, 158, 11, 0.08);
--tw-shadow-colored: 0 0 10px var(--tw-shadow-color); --tw-shadow-colored: 0 0 10px var(--tw-shadow-color);
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
} }
@ -1477,16 +1481,16 @@ video {
} }
:root { :root {
--color-up: #ef4444; --color-up: #ff6b6b;
--color-down: #22c55e; --color-down: #34d399;
--font-display: 'Outfit', -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif; --font-display: 'Outfit', -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
--font-body: 'Outfit', -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif; --font-body: 'Outfit', -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
--font-mono: 'SF Mono', 'JetBrains Mono', 'Fira Code', ui-monospace, monospace; --font-mono: 'SF Mono', 'JetBrains Mono', 'Fira Code', ui-monospace, monospace;
} }
body { body {
background-color: #0a0e1a; background-color: #0a0a0c;
color: #f1f5f9; color: #f5f5f7;
font-family: var(--font-body); font-family: var(--font-body);
-webkit-font-smoothing: antialiased; -webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale; -moz-osx-font-smoothing: grayscale;
@ -1505,13 +1509,13 @@ body::before {
content: ''; content: '';
position: fixed; position: fixed;
inset: 0; inset: 0;
opacity: 0.015; opacity: 0.018;
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)'/%3E%3C/svg%3E"); background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)'/%3E%3C/svg%3E");
pointer-events: none; pointer-events: none;
z-index: 9999; z-index: 9999;
} }
/* Ambient glow effect - top right */ /* Ambient glow effect - top right (amber) */
body::after { body::after {
content: ''; content: '';
position: fixed; position: fixed;
@ -1519,7 +1523,7 @@ body::after {
right: -200px; right: -200px;
width: 600px; width: 600px;
height: 600px; height: 600px;
background: radial-gradient(circle, rgba(249, 115, 22, 0.04) 0%, transparent 70%); background: radial-gradient(circle, rgba(245, 158, 11, 0.035) 0%, transparent 70%);
pointer-events: none; pointer-events: none;
z-index: 0; z-index: 0;
} }
@ -1532,11 +1536,11 @@ body::after {
background: transparent; background: transparent;
} }
::-webkit-scrollbar-thumb { ::-webkit-scrollbar-thumb {
background: rgba(148, 163, 184, 0.2); background: rgba(255, 255, 255, 0.10);
border-radius: 10px; border-radius: 10px;
} }
::-webkit-scrollbar-thumb:hover { ::-webkit-scrollbar-thumb:hover {
background: rgba(148, 163, 184, 0.3); background: rgba(255, 255, 255, 0.18);
} }
/* Animations */ /* Animations */
@ -1580,7 +1584,7 @@ body::after {
} }
.animate-shimmer { .animate-shimmer {
background: linear-gradient(90deg, transparent, rgba(148, 163, 184, 0.05), transparent); background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.04), transparent);
background-size: 200% 100%; background-size: 200% 100%;
animation: shimmer 2s infinite; animation: shimmer 2s infinite;
} }
@ -1594,25 +1598,25 @@ body::after {
/* Score bar gradient */ /* Score bar gradient */
.score-bar-gradient-high { .score-bar-gradient-high {
background: linear-gradient(90deg, #ef4444, #f97316); background: linear-gradient(90deg, #ff6b6b, #f59e0b);
} }
.score-bar-gradient-mid { .score-bar-gradient-mid {
background: linear-gradient(90deg, #f97316, #eab308); background: linear-gradient(90deg, #f59e0b, #fbbf24);
} }
.score-bar-gradient-low { .score-bar-gradient-low {
background: linear-gradient(90deg, #64748b, #475569); background: linear-gradient(90deg, #585860, #3a3a40);
} }
/* Selection color */ /* Selection color */
::-moz-selection { ::-moz-selection {
background: rgba(249, 115, 22, 0.3); background: rgba(245, 158, 11, 0.25);
color: #f1f5f9; color: #f5f5f7;
} }
::selection { ::selection {
background: rgba(249, 115, 22, 0.3); background: rgba(245, 158, 11, 0.25);
color: #f1f5f9; color: #f5f5f7;
} }
.hover\:bg-white\/\[0\.04\]:hover{ .hover\:bg-white\/\[0\.04\]:hover{
background-color: rgb(255 255 255 / 0.04); background-color: rgb(255 255 255 / 0.04);
@ -1620,33 +1624,33 @@ body::after {
.hover\:bg-white\/\[0\.06\]:hover{ .hover\:bg-white\/\[0\.06\]:hover{
background-color: rgb(255 255 255 / 0.06); background-color: rgb(255 255 255 / 0.06);
} }
.hover\:from-accent-indigo\/30:hover{ .hover\:from-accent-cyan\/30:hover{
--tw-gradient-from: rgb(129 140 248 / 0.3) var(--tw-gradient-from-position); --tw-gradient-from: rgb(34 211 238 / 0.3) var(--tw-gradient-from-position);
--tw-gradient-to: rgb(129 140 248 / 0) var(--tw-gradient-to-position); --tw-gradient-to: rgb(34 211 238 / 0) var(--tw-gradient-to-position);
--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
} }
.hover\:from-orange-500\/30:hover{ .hover\:from-amber-500\/30:hover{
--tw-gradient-from: rgb(249 115 22 / 0.3) var(--tw-gradient-from-position); --tw-gradient-from: rgb(245 158 11 / 0.3) var(--tw-gradient-from-position);
--tw-gradient-to: rgb(249 115 22 / 0) var(--tw-gradient-to-position); --tw-gradient-to: rgb(245 158 11 / 0) var(--tw-gradient-to-position);
--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
} }
.hover\:to-accent-indigo\/20:hover{ .hover\:to-accent-cyan\/20:hover{
--tw-gradient-to: rgb(129 140 248 / 0.2) var(--tw-gradient-to-position); --tw-gradient-to: rgb(34 211 238 / 0.2) var(--tw-gradient-to-position);
} }
.hover\:to-amber-500\/30:hover{ .hover\:to-amber-600\/25:hover{
--tw-gradient-to: rgb(245 158 11 / 0.3) var(--tw-gradient-to-position); --tw-gradient-to: rgb(217 119 6 / 0.25) var(--tw-gradient-to-position);
} }
.hover\:text-orange-400:hover{ .hover\:text-amber-400:hover{
--tw-text-opacity: 1; --tw-text-opacity: 1;
color: rgb(251 146 60 / var(--tw-text-opacity, 1)); color: rgb(251 191 36 / var(--tw-text-opacity, 1));
} }
.hover\:text-text-primary:hover{ .hover\:text-text-primary:hover{
--tw-text-opacity: 1; --tw-text-opacity: 1;
color: rgb(241 245 249 / var(--tw-text-opacity, 1)); color: rgb(245 245 247 / var(--tw-text-opacity, 1));
} }
.hover\:text-text-secondary:hover{ .hover\:text-text-secondary:hover{
--tw-text-opacity: 1; --tw-text-opacity: 1;
color: rgb(136 150 179 / var(--tw-text-opacity, 1)); color: rgb(152 152 164 / var(--tw-text-opacity, 1));
} }
.focus\:outline-none:focus{ .focus\:outline-none:focus{
outline: 2px solid transparent; outline: 2px solid transparent;
@ -1657,8 +1661,8 @@ body::after {
--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);
box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
} }
.focus\:ring-accent-indigo\/30:focus{ .focus\:ring-accent-cyan\/30:focus{
--tw-ring-color: rgb(129 140 248 / 0.3); --tw-ring-color: rgb(34 211 238 / 0.3);
} }
.active\:scale-95:active{ .active\:scale-95:active{
--tw-scale-x: .95; --tw-scale-x: .95;

File diff suppressed because one or more lines are too long

View File

@ -89,8 +89,8 @@ export default function ChatPage() {
{/* Header */} {/* Header */}
<div className="flex items-center justify-between px-5 py-3.5 border-b border-white/[0.04] bg-bg-primary/80 backdrop-blur-xl"> <div className="flex items-center justify-between px-5 py-3.5 border-b border-white/[0.04] bg-bg-primary/80 backdrop-blur-xl">
<div className="flex items-center gap-3"> <div className="flex items-center gap-3">
<div className="w-7 h-7 rounded-lg bg-gradient-to-br from-accent-indigo/30 to-accent-indigo/10 flex items-center justify-center border border-accent-indigo/20"> <div className="w-7 h-7 rounded-lg bg-gradient-to-br from-accent-cyan/30 to-accent-cyan/10 flex items-center justify-center border border-accent-cyan/20">
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.8" className="text-accent-indigo/70"> <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.8" className="text-accent-cyan/70">
<path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" /> <path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" />
</svg> </svg>
</div> </div>
@ -115,8 +115,8 @@ export default function ChatPage() {
<div ref={scrollRef} className="flex-1 overflow-y-auto px-5 py-5 space-y-4"> <div ref={scrollRef} className="flex-1 overflow-y-auto px-5 py-5 space-y-4">
{messages.length === 0 ? ( {messages.length === 0 ? (
<div className="flex flex-col items-center justify-center h-full text-center animate-fade-in-up"> <div className="flex flex-col items-center justify-center h-full text-center animate-fade-in-up">
<div className="w-14 h-14 rounded-2xl bg-gradient-to-br from-accent-indigo/15 to-accent-indigo/5 flex items-center justify-center mb-5 border border-accent-indigo/10"> <div className="w-14 h-14 rounded-2xl bg-gradient-to-br from-accent-cyan/15 to-accent-cyan/5 flex items-center justify-center mb-5 border border-accent-cyan/10">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" className="text-accent-indigo/50"> <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" className="text-accent-cyan/50">
<path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" /> <path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" />
</svg> </svg>
</div> </div>
@ -167,7 +167,7 @@ export default function ChatPage() {
<span>{msg.content}</span> <span>{msg.content}</span>
)} )}
{streaming && i === messages.length - 1 && msg.role === "assistant" && msg.content && ( {streaming && i === messages.length - 1 && msg.role === "assistant" && msg.content && (
<span className="inline-block w-1.5 h-4 bg-accent-indigo/60 ml-0.5 animate-pulse rounded-full" /> <span className="inline-block w-1.5 h-4 bg-accent-cyan/60 ml-0.5 animate-pulse rounded-full" />
)} )}
</div> </div>
</div> </div>
@ -175,8 +175,8 @@ export default function ChatPage() {
{/* Status indicator during tool calls */} {/* Status indicator during tool calls */}
{streaming && status && messages[messages.length - 1]?.content && ( {streaming && status && messages[messages.length - 1]?.content && (
<div className="flex justify-start"> <div className="flex justify-start">
<div className="text-xs text-accent-indigo/50 flex items-center gap-2 px-3"> <div className="text-xs text-accent-cyan/50 flex items-center gap-2 px-3">
<span className="inline-block w-2.5 h-2.5 border border-accent-indigo/30 border-t-accent-indigo/70 rounded-full animate-spin" /> <span className="inline-block w-2.5 h-2.5 border border-accent-cyan/30 border-t-accent-cyan/70 rounded-full animate-spin" />
{status} {status}
</div> </div>
</div> </div>
@ -195,13 +195,13 @@ export default function ChatPage() {
onKeyDown={handleKeyDown} onKeyDown={handleKeyDown}
placeholder="输入问题..." placeholder="输入问题..."
rows={1} rows={1}
className="flex-1 bg-white/[0.03] rounded-xl px-4 py-2.5 text-sm resize-none focus:outline-none focus:ring-1 focus:ring-accent-indigo/30 placeholder-text-muted/40 border border-white/[0.04] transition-all duration-200" className="flex-1 bg-white/[0.03] rounded-xl px-4 py-2.5 text-sm resize-none focus:outline-none focus:ring-1 focus:ring-accent-cyan/30 placeholder-text-muted/40 border border-white/[0.04] transition-all duration-200"
disabled={streaming} disabled={streaming}
/> />
<button <button
onClick={() => sendMessage(input)} onClick={() => sendMessage(input)}
disabled={!input.trim() || streaming} disabled={!input.trim() || streaming}
className="px-4 py-2.5 bg-gradient-to-r from-accent-indigo/20 to-accent-indigo/10 text-accent-indigo rounded-xl text-sm hover:from-accent-indigo/30 hover:to-accent-indigo/20 disabled:opacity-20 transition-all duration-200 shrink-0 border border-accent-indigo/10 font-medium" className="px-4 py-2.5 bg-gradient-to-r from-accent-cyan/20 to-accent-cyan/10 text-accent-cyan rounded-xl text-sm hover:from-accent-cyan/30 hover:to-accent-cyan/20 disabled:opacity-20 transition-all duration-200 shrink-0 border border-accent-cyan/10 font-medium"
> >
</button> </button>

View File

@ -5,16 +5,16 @@
@tailwind utilities; @tailwind utilities;
:root { :root {
--color-up: #ef4444; --color-up: #ff6b6b;
--color-down: #22c55e; --color-down: #34d399;
--font-display: 'Outfit', -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif; --font-display: 'Outfit', -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
--font-body: 'Outfit', -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif; --font-body: 'Outfit', -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
--font-mono: 'SF Mono', 'JetBrains Mono', 'Fira Code', ui-monospace, monospace; --font-mono: 'SF Mono', 'JetBrains Mono', 'Fira Code', ui-monospace, monospace;
} }
body { body {
background-color: #0a0e1a; background-color: #0a0a0c;
color: #f1f5f9; color: #f5f5f7;
font-family: var(--font-body); font-family: var(--font-body);
-webkit-font-smoothing: antialiased; -webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale; -moz-osx-font-smoothing: grayscale;
@ -29,37 +29,39 @@ body {
/* Glass morphism card */ /* Glass morphism card */
@layer components { @layer components {
.glass-card { .glass-card {
background: linear-gradient(135deg, rgba(30, 41, 59, 0.8) 0%, rgba(15, 23, 42, 0.9) 100%); background: linear-gradient(135deg, rgba(22, 22, 25, 0.85) 0%, rgba(10, 10, 12, 0.95) 100%);
backdrop-filter: blur(20px); backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px);
border: 1px solid rgba(148, 163, 184, 0.08); border: 1px solid rgba(255, 255, 255, 0.05);
border-radius: 16px; border-radius: 16px;
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.03);
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
} }
.glass-card:hover { .glass-card:hover {
border-color: rgba(148, 163, 184, 0.15); border-color: rgba(255, 255, 255, 0.10);
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3), 0 0 0 1px rgba(148, 163, 184, 0.05); box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4), inset 0 1px 0 rgba(255, 255, 255, 0.05);
transform: translateY(-1px); transform: translateY(-1px);
} }
.glass-card-static { .glass-card-static {
background: linear-gradient(135deg, rgba(30, 41, 59, 0.8) 0%, rgba(15, 23, 42, 0.9) 100%); background: linear-gradient(135deg, rgba(22, 22, 25, 0.85) 0%, rgba(10, 10, 12, 0.95) 100%);
backdrop-filter: blur(20px); backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px);
border: 1px solid rgba(148, 163, 184, 0.08); border: 1px solid rgba(255, 255, 255, 0.05);
border-radius: 16px; border-radius: 16px;
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.03);
} }
.glass-sidebar { .glass-sidebar {
background: linear-gradient(180deg, rgba(15, 23, 42, 0.97) 0%, rgba(10, 14, 26, 0.99) 100%); background: linear-gradient(180deg, rgba(16, 16, 19, 0.97) 0%, rgba(10, 10, 12, 0.99) 100%);
backdrop-filter: blur(30px); backdrop-filter: blur(30px);
-webkit-backdrop-filter: blur(30px); -webkit-backdrop-filter: blur(30px);
border-right: 1px solid rgba(148, 163, 184, 0.06); border-right: 1px solid rgba(255, 255, 255, 0.04);
} }
.glow-accent { .glow-accent {
box-shadow: 0 0 20px rgba(249, 115, 22, 0.15), 0 0 60px rgba(249, 115, 22, 0.05); box-shadow: 0 0 20px rgba(245, 158, 11, 0.12), 0 0 60px rgba(245, 158, 11, 0.04);
} }
.gradient-border { .gradient-border {
@ -72,7 +74,7 @@ body {
inset: 0; inset: 0;
border-radius: inherit; border-radius: inherit;
padding: 1px; padding: 1px;
background: linear-gradient(135deg, rgba(249, 115, 22, 0.3), rgba(99, 102, 241, 0.3), rgba(249, 115, 22, 0.1)); background: linear-gradient(135deg, rgba(245, 158, 11, 0.25), rgba(34, 211, 238, 0.25), rgba(245, 158, 11, 0.08));
-webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0); -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
-webkit-mask-composite: xor; -webkit-mask-composite: xor;
mask-composite: exclude; mask-composite: exclude;
@ -85,13 +87,13 @@ body::before {
content: ''; content: '';
position: fixed; position: fixed;
inset: 0; inset: 0;
opacity: 0.015; opacity: 0.018;
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)'/%3E%3C/svg%3E"); background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)'/%3E%3C/svg%3E");
pointer-events: none; pointer-events: none;
z-index: 9999; z-index: 9999;
} }
/* Ambient glow effect - top right */ /* Ambient glow effect - top right (amber) */
body::after { body::after {
content: ''; content: '';
position: fixed; position: fixed;
@ -99,7 +101,7 @@ body::after {
right: -200px; right: -200px;
width: 600px; width: 600px;
height: 600px; height: 600px;
background: radial-gradient(circle, rgba(249, 115, 22, 0.04) 0%, transparent 70%); background: radial-gradient(circle, rgba(245, 158, 11, 0.035) 0%, transparent 70%);
pointer-events: none; pointer-events: none;
z-index: 0; z-index: 0;
} }
@ -112,11 +114,11 @@ body::after {
background: transparent; background: transparent;
} }
::-webkit-scrollbar-thumb { ::-webkit-scrollbar-thumb {
background: rgba(148, 163, 184, 0.2); background: rgba(255, 255, 255, 0.10);
border-radius: 10px; border-radius: 10px;
} }
::-webkit-scrollbar-thumb:hover { ::-webkit-scrollbar-thumb:hover {
background: rgba(148, 163, 184, 0.3); background: rgba(255, 255, 255, 0.18);
} }
/* Animations */ /* Animations */
@ -160,7 +162,7 @@ body::after {
} }
.animate-shimmer { .animate-shimmer {
background: linear-gradient(90deg, transparent, rgba(148, 163, 184, 0.05), transparent); background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.04), transparent);
background-size: 200% 100%; background-size: 200% 100%;
animation: shimmer 2s infinite; animation: shimmer 2s infinite;
} }
@ -174,19 +176,19 @@ body::after {
/* Score bar gradient */ /* Score bar gradient */
.score-bar-gradient-high { .score-bar-gradient-high {
background: linear-gradient(90deg, #ef4444, #f97316); background: linear-gradient(90deg, #ff6b6b, #f59e0b);
} }
.score-bar-gradient-mid { .score-bar-gradient-mid {
background: linear-gradient(90deg, #f97316, #eab308); background: linear-gradient(90deg, #f59e0b, #fbbf24);
} }
.score-bar-gradient-low { .score-bar-gradient-low {
background: linear-gradient(90deg, #64748b, #475569); background: linear-gradient(90deg, #585860, #3a3a40);
} }
/* Selection color */ /* Selection color */
::selection { ::selection {
background: rgba(249, 115, 22, 0.3); background: rgba(245, 158, 11, 0.25);
color: #f1f5f9; color: #f5f5f7;
} }

View File

@ -28,7 +28,7 @@ export default function RootLayout({
{/* Brand */} {/* Brand */}
<div className="px-6 pt-7 pb-5"> <div className="px-6 pt-7 pb-5">
<div className="flex items-center gap-3"> <div className="flex items-center gap-3">
<div className="w-8 h-8 rounded-lg bg-gradient-to-br from-orange-500 to-amber-600 flex items-center justify-center text-sm font-bold text-white shadow-glow-sm"> <div className="w-8 h-8 rounded-lg bg-gradient-to-br from-amber-500 to-amber-600 flex items-center justify-center text-sm font-bold text-white shadow-glow-sm">
D D
</div> </div>
<div> <div>
@ -39,7 +39,7 @@ export default function RootLayout({
</div> </div>
{/* Divider */} {/* Divider */}
<div className="mx-5 h-px bg-gradient-to-r from-transparent via-slate-700/50 to-transparent" /> <div className="mx-5 h-px bg-gradient-to-r from-transparent via-white/[0.06] to-transparent" />
{/* Nav */} {/* Nav */}
<nav className="flex-1 py-5 px-3 space-y-1"> <nav className="flex-1 py-5 px-3 space-y-1">
@ -50,14 +50,14 @@ export default function RootLayout({
</nav> </nav>
{/* Footer */} {/* Footer */}
<div className="px-6 py-5 border-t border-slate-800/50"> <div className="px-6 py-5 border-t border-white/[0.04]">
<div className="text-xs text-text-muted leading-relaxed"> <div className="text-xs text-text-muted leading-relaxed">
<div className="flex items-center gap-1.5 mb-1"> <div className="flex items-center gap-1.5 mb-1">
<span className="w-1 h-1 rounded-full bg-emerald-500" /> <span className="w-1 h-1 rounded-full bg-emerald-500" />
<span>Tushare Pro + </span> <span>Tushare Pro + </span>
</div> </div>
<div className="flex items-center gap-1.5"> <div className="flex items-center gap-1.5">
<span className="w-1 h-1 rounded-full bg-accent-indigo" /> <span className="w-1 h-1 rounded-full bg-accent-cyan" />
<span>AI 引擎: DeepSeek</span> <span>AI 引擎: DeepSeek</span>
</div> </div>
</div> </div>
@ -79,7 +79,7 @@ export default function RootLayout({
function MobileNav() { function MobileNav() {
return ( return (
<nav className="fixed bottom-0 left-0 right-0 md:hidden z-50 bg-bg-secondary/95 backdrop-blur-xl border-t border-slate-800/50"> <nav className="fixed bottom-0 left-0 right-0 md:hidden z-50 bg-bg-secondary/95 backdrop-blur-xl border-t border-white/[0.04]">
<div className="flex justify-around py-2 pb-[max(0.5rem,env(safe-area-inset-bottom))]"> <div className="flex justify-around py-2 pb-[max(0.5rem,env(safe-area-inset-bottom))]">
<MobileNavItem href="/" label="总览"> <MobileNavItem href="/" label="总览">
<DashboardIcon /> <DashboardIcon />

View File

@ -117,11 +117,11 @@ export default function DashboardPage() {
<button <button
onClick={handleRefresh} onClick={handleRefresh}
disabled={refreshing} disabled={refreshing}
className="text-xs px-4 py-2 bg-gradient-to-r from-orange-500/20 to-amber-500/20 text-orange-400 rounded-xl hover:from-orange-500/30 hover:to-amber-500/30 disabled:opacity-40 transition-all duration-200 border border-orange-500/10 font-medium" className="text-xs px-4 py-2 bg-gradient-to-r from-amber-500/20 to-amber-600/15 text-amber-400 rounded-xl hover:from-amber-500/30 hover:to-amber-600/25 disabled:opacity-40 transition-all duration-200 border border-amber-500/10 font-medium"
> >
{refreshing ? ( {refreshing ? (
<span className="inline-flex items-center gap-1.5"> <span className="inline-flex items-center gap-1.5">
<span className="w-3 h-3 border border-orange-400/40 border-t-orange-400 rounded-full animate-spin" /> <span className="w-3 h-3 border border-amber-400/40 border-t-amber-400 rounded-full animate-spin" />
... ...
</span> </span>
) : scanStatus?.is_trading ? ( ) : scanStatus?.is_trading ? (
@ -134,8 +134,8 @@ export default function DashboardPage() {
{/* Scan result toast */} {/* Scan result toast */}
{refreshResult && ( {refreshResult && (
<div className="glass-card-static border-orange-500/15 px-4 py-2.5 text-xs text-orange-400 animate-fade-in-up flex items-center gap-2"> <div className="glass-card-static border-amber-500/15 px-4 py-2.5 text-xs text-amber-400 animate-fade-in-up flex items-center gap-2">
<span className="w-1 h-1 rounded-full bg-orange-400" /> <span className="w-1 h-1 rounded-full bg-amber-400" />
{refreshResult} {refreshResult}
</div> </div>
)} )}
@ -155,7 +155,7 @@ export default function DashboardPage() {
<span className="text-text-primary ml-1.5 font-mono tabular-nums">{data.recommendations.length}</span> <span className="text-text-primary ml-1.5 font-mono tabular-nums">{data.recommendations.length}</span>
) : ""} ) : ""}
</h2> </h2>
<a href="/recommendations" className="text-xs text-text-muted hover:text-orange-400 transition-colors flex items-center gap-1"> <a href="/recommendations" className="text-xs text-text-muted hover:text-amber-400 transition-colors flex items-center gap-1">
<svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"> <svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
<path d="M5 12h14M12 5l7 7-7 7" /> <path d="M5 12h14M12 5l7 7-7 7" />

View File

@ -68,7 +68,7 @@ export default function RecommendationsPage() {
onClick={() => setFilter(key)} onClick={() => setFilter(key)}
className={`text-xs px-4 py-1.5 rounded-xl whitespace-nowrap transition-all duration-200 font-medium ${ className={`text-xs px-4 py-1.5 rounded-xl whitespace-nowrap transition-all duration-200 font-medium ${
filter === key filter === key
? "bg-gradient-to-r from-orange-500/25 to-amber-500/25 text-orange-400 border border-orange-500/15" ? "bg-gradient-to-r from-amber-500/25 to-amber-600/20 text-amber-400 border border-amber-500/15"
: "bg-white/[0.03] text-text-muted hover:text-text-secondary hover:bg-white/[0.06] border border-transparent" : "bg-white/[0.03] text-text-muted hover:text-text-secondary hover:bg-white/[0.06] border border-transparent"
}`} }`}
> >

View File

@ -85,7 +85,7 @@ export default function MarketTemp({ data, indices }: MarketTempProps) {
<span className="text-emerald-400 font-mono tabular-nums">{data.down_count}</span> <span className="text-emerald-400 font-mono tabular-nums">{data.down_count}</span>
</StatCard> </StatCard>
<StatCard label={hasMaxStreak ? "最高连板" : "连板"}> <StatCard label={hasMaxStreak ? "最高连板" : "连板"}>
<span className="text-orange-400 font-mono tabular-nums font-semibold"> <span className="text-amber-400 font-mono tabular-nums font-semibold">
{hasMaxStreak ? `${data.max_streak}连板` : "-"} {hasMaxStreak ? `${data.max_streak}连板` : "-"}
</span> </span>
</StatCard> </StatCard>

View File

@ -53,7 +53,7 @@ export default function SectorHeatmap({ sectors }: { sectors: SectorData[] }) {
: index === 1 : index === 1
? "bg-gradient-to-br from-slate-400/20 to-slate-500/15 text-slate-300 border border-slate-400/15" ? "bg-gradient-to-br from-slate-400/20 to-slate-500/15 text-slate-300 border border-slate-400/15"
: index === 2 : index === 2
? "bg-gradient-to-br from-orange-700/20 to-orange-800/15 text-orange-400 border border-orange-600/15" ? "bg-gradient-to-br from-amber-700/20 to-amber-800/15 text-amber-400 border border-amber-600/15"
: "bg-white/[0.03] text-text-muted border border-white/[0.04]" : "bg-white/[0.03] text-text-muted border border-white/[0.04]"
}`}> }`}>
{index + 1} {index + 1}
@ -81,7 +81,7 @@ export default function SectorHeatmap({ sectors }: { sectors: SectorData[] }) {
{/* Heat score pill */} {/* Heat score pill */}
<span className={`font-mono tabular-nums text-xs font-semibold px-2 py-1 rounded-lg min-w-[36px] text-center ${ <span className={`font-mono tabular-nums text-xs font-semibold px-2 py-1 rounded-lg min-w-[36px] text-center ${
isTop3 isTop3
? "bg-orange-500/20 text-orange-400 border border-orange-500/15" ? "bg-amber-500/20 text-amber-400 border border-amber-500/15"
: "bg-white/[0.04] text-text-muted border border-white/[0.04]" : "bg-white/[0.04] text-text-muted border border-white/[0.04]"
}`}> }`}>
{s.heat_score.toFixed(0)} {s.heat_score.toFixed(0)}

View File

@ -51,7 +51,7 @@ export default function StockCard({ rec, showLLMLoading = false }: { rec: Recomm
</div> </div>
<div> <div>
<span className="text-text-muted"> </span> <span className="text-text-muted"> </span>
<span className="text-orange-400 font-mono tabular-nums">{rec.target_price}</span> <span className="text-amber-400 font-mono tabular-nums">{rec.target_price}</span>
</div> </div>
<div> <div>
<span className="text-text-muted"> </span> <span className="text-text-muted"> </span>
@ -64,7 +64,7 @@ export default function StockCard({ rec, showLLMLoading = false }: { rec: Recomm
<div className="space-y-1.5"> <div className="space-y-1.5">
{rec.reasons.map((r, i) => ( {rec.reasons.map((r, i) => (
<div key={i} className="text-xs text-text-secondary flex items-start gap-2"> <div key={i} className="text-xs text-text-secondary flex items-start gap-2">
<span className="w-1 h-1 rounded-full bg-orange-500/60 mt-[7px] shrink-0" /> <span className="w-1 h-1 rounded-full bg-amber-500/60 mt-[7px] shrink-0" />
<span className="leading-relaxed">{r}</span> <span className="leading-relaxed">{r}</span>
</div> </div>
))} ))}
@ -72,15 +72,15 @@ export default function StockCard({ rec, showLLMLoading = false }: { rec: Recomm
{/* AI Analysis */} {/* AI Analysis */}
{rec.llm_analysis ? ( {rec.llm_analysis ? (
<div className="mt-3 bg-accent-indigo/[0.06] border border-accent-indigo/[0.12] rounded-xl px-4 py-3"> <div className="mt-3 bg-accent-cyan/[0.06] border border-accent-cyan/[0.12] rounded-xl px-4 py-3">
<div className="text-xs text-accent-indigo/80 font-semibold tracking-wider mb-1.5">AI </div> <div className="text-xs text-accent-cyan/80 font-semibold tracking-wider mb-1.5">AI </div>
<div className="text-xs text-text-secondary leading-relaxed"> <div className="text-xs text-text-secondary leading-relaxed">
{rec.llm_analysis} {rec.llm_analysis}
</div> </div>
</div> </div>
) : showLLMLoading ? ( ) : showLLMLoading ? (
<div className="mt-3 text-xs text-text-muted flex items-center gap-2"> <div className="mt-3 text-xs text-text-muted flex items-center gap-2">
<span className="inline-block w-3 h-3 border border-accent-indigo/30 border-t-accent-indigo/80 rounded-full animate-spin" /> <span className="inline-block w-3 h-3 border border-accent-cyan/30 border-t-accent-cyan/80 rounded-full animate-spin" />
AI ... AI ...
</div> </div>
) : null} ) : null}

View File

@ -35,10 +35,10 @@ export function getSignalColor(signal: string): string {
} }
export function getTempColor(temp: number): string { export function getTempColor(temp: number): string {
if (temp >= 70) return "#ef4444"; if (temp >= 70) return "#ff6b6b";
if (temp >= 50) return "#f97316"; if (temp >= 50) return "#f59e0b";
if (temp >= 30) return "#eab308"; if (temp >= 30) return "#fbbf24";
return "#22c55e"; return "#34d399";
} }
export function getTempLabel(temp: number): string { export function getTempLabel(temp: number): string {

View File

@ -7,23 +7,23 @@ module.exports = {
theme: { theme: {
extend: { extend: {
colors: { colors: {
up: "#ef4444", up: "#ff6b6b",
down: "#22c55e", down: "#34d399",
hot: "#f97316", hot: "#f59e0b",
bg: { bg: {
primary: "#0a0e1a", primary: "#0a0a0c",
secondary: "#0f172a", secondary: "#101013",
card: "#131a2e", card: "#161619",
elevated: "#1a2340", elevated: "#1e1e22",
}, },
text: { text: {
primary: "#f1f5f9", primary: "#f5f5f7",
secondary: "#8896b3", secondary: "#9898a4",
muted: "#546380", muted: "#58585f",
}, },
accent: { accent: {
orange: "#f97316", amber: "#f59e0b",
indigo: "#818cf8", cyan: "#22d3ee",
}, },
}, },
fontFamily: { fontFamily: {
@ -35,9 +35,9 @@ module.exports = {
"3xl": "20px", "3xl": "20px",
}, },
boxShadow: { boxShadow: {
card: "0 4px 24px rgba(0, 0, 0, 0.2)", card: "0 4px 24px rgba(0, 0, 0, 0.3)",
glow: "0 0 20px rgba(249, 115, 22, 0.15)", glow: "0 0 20px rgba(245, 158, 11, 0.12)",
"glow-sm": "0 0 10px rgba(249, 115, 22, 0.1)", "glow-sm": "0 0 10px rgba(245, 158, 11, 0.08)",
}, },
animation: { animation: {
"fade-in-up": "fadeInUp 0.5s cubic-bezier(0.4, 0, 0.2, 1) both", "fade-in-up": "fadeInUp 0.5s cubic-bezier(0.4, 0, 0.2, 1) both",