This commit is contained in:
aaron 2026-04-13 16:56:06 +08:00
parent 0dc27af2d1
commit e3f3e42f69
16 changed files with 312 additions and 183 deletions

Binary file not shown.

View File

@ -1,71 +1,15 @@
{
"pages": {
"/_not-found/page": [
"static/chunks/webpack-76aa9cbbdedb6a49.js",
"static/chunks/fd9d1056-adfa616cc092a9a4.js",
"static/chunks/117-ecf6156e4230cff0.js",
"static/chunks/main-app-7d7e5d1021afd90c.js",
"static/chunks/app/_not-found/page-63dff3110725cc01.js"
"/page": [
"static/chunks/webpack.js",
"static/chunks/main-app.js",
"static/chunks/app/page.js"
],
"/layout": [
"static/chunks/webpack-76aa9cbbdedb6a49.js",
"static/chunks/fd9d1056-adfa616cc092a9a4.js",
"static/chunks/117-ecf6156e4230cff0.js",
"static/chunks/main-app-7d7e5d1021afd90c.js",
"static/css/d058b374bc2164de.css",
"static/chunks/733-a1f3d91858269b2e.js",
"static/chunks/app/layout-97d28992dc357af9.js"
],
"/page": [
"static/chunks/webpack-76aa9cbbdedb6a49.js",
"static/chunks/fd9d1056-adfa616cc092a9a4.js",
"static/chunks/117-ecf6156e4230cff0.js",
"static/chunks/main-app-7d7e5d1021afd90c.js",
"static/chunks/891-f6021cc9fb1f4075.js",
"static/chunks/app/page-17e83ee269671b5a.js"
],
"/chat/page": [
"static/chunks/webpack-76aa9cbbdedb6a49.js",
"static/chunks/fd9d1056-adfa616cc092a9a4.js",
"static/chunks/117-ecf6156e4230cff0.js",
"static/chunks/main-app-7d7e5d1021afd90c.js",
"static/chunks/app/chat/page-259ebe7c6b763203.js"
],
"/login/page": [
"static/chunks/webpack-76aa9cbbdedb6a49.js",
"static/chunks/fd9d1056-adfa616cc092a9a4.js",
"static/chunks/117-ecf6156e4230cff0.js",
"static/chunks/main-app-7d7e5d1021afd90c.js",
"static/chunks/app/login/page-85bca09c6487284f.js"
],
"/recommendations/page": [
"static/chunks/webpack-76aa9cbbdedb6a49.js",
"static/chunks/fd9d1056-adfa616cc092a9a4.js",
"static/chunks/117-ecf6156e4230cff0.js",
"static/chunks/main-app-7d7e5d1021afd90c.js",
"static/chunks/891-f6021cc9fb1f4075.js",
"static/chunks/app/recommendations/page-80a26fb41740ab9e.js"
],
"/sectors/page": [
"static/chunks/webpack-76aa9cbbdedb6a49.js",
"static/chunks/fd9d1056-adfa616cc092a9a4.js",
"static/chunks/117-ecf6156e4230cff0.js",
"static/chunks/main-app-7d7e5d1021afd90c.js",
"static/chunks/app/sectors/page-48689923560f4c85.js"
],
"/stock/[code]/page": [
"static/chunks/webpack-76aa9cbbdedb6a49.js",
"static/chunks/fd9d1056-adfa616cc092a9a4.js",
"static/chunks/117-ecf6156e4230cff0.js",
"static/chunks/main-app-7d7e5d1021afd90c.js",
"static/chunks/app/stock/[code]/page-3a59c8e3fe1fa303.js"
],
"/users/page": [
"static/chunks/webpack-76aa9cbbdedb6a49.js",
"static/chunks/fd9d1056-adfa616cc092a9a4.js",
"static/chunks/117-ecf6156e4230cff0.js",
"static/chunks/main-app-7d7e5d1021afd90c.js",
"static/chunks/app/users/page-42113a921614c709.js"
"static/chunks/webpack.js",
"static/chunks/main-app.js",
"static/css/app/layout.css",
"static/chunks/app/layout.js"
]
}
}

View File

@ -1,32 +1,19 @@
{
"polyfillFiles": [
"static/chunks/polyfills-42372ed130431b0a.js"
"static/chunks/polyfills.js"
],
"devFiles": [],
"ampDevFiles": [],
"lowPriorityFiles": [
"static/dWWzvd20BkDpBrtD733RH/_buildManifest.js",
"static/dWWzvd20BkDpBrtD733RH/_ssgManifest.js"
"static/development/_buildManifest.js",
"static/development/_ssgManifest.js"
],
"rootMainFiles": [
"static/chunks/webpack-76aa9cbbdedb6a49.js",
"static/chunks/fd9d1056-adfa616cc092a9a4.js",
"static/chunks/117-ecf6156e4230cff0.js",
"static/chunks/main-app-7d7e5d1021afd90c.js"
"static/chunks/webpack.js",
"static/chunks/main-app.js"
],
"pages": {
"/_app": [
"static/chunks/webpack-76aa9cbbdedb6a49.js",
"static/chunks/framework-f66176bb897dc684.js",
"static/chunks/main-9c5f6b283127d940.js",
"static/chunks/pages/_app-72b849fbd24ac258.js"
],
"/_error": [
"static/chunks/webpack-76aa9cbbdedb6a49.js",
"static/chunks/framework-f66176bb897dc684.js",
"static/chunks/main-9c5f6b283127d940.js",
"static/chunks/pages/_error-7ba65e1336b92748.js"
]
"/_app": []
},
"ampFirstPages": []
}

File diff suppressed because one or more lines are too long

View File

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

View File

@ -1,11 +1,3 @@
{
"/_not-found/page": "app/_not-found/page.js",
"/page": "app/page.js",
"/chat/page": "app/chat/page.js",
"/api/chat/stream/route": "app/api/chat/stream/route.js",
"/login/page": "app/login/page.js",
"/recommendations/page": "app/recommendations/page.js",
"/sectors/page": "app/sectors/page.js",
"/stock/[code]/page": "app/stock/[code]/page.js",
"/users/page": "app/users/page.js"
"/page": "app/page.js"
}

View File

@ -1 +1 @@
self.__INTERCEPTION_ROUTE_REWRITE_MANIFEST="[]";
self.__INTERCEPTION_ROUTE_REWRITE_MANIFEST="[]"

View File

@ -1 +1,21 @@
self.__BUILD_MANIFEST={polyfillFiles:["static/chunks/polyfills-42372ed130431b0a.js"],devFiles:[],ampDevFiles:[],lowPriorityFiles:[],rootMainFiles:["static/chunks/webpack-76aa9cbbdedb6a49.js","static/chunks/fd9d1056-adfa616cc092a9a4.js","static/chunks/117-ecf6156e4230cff0.js","static/chunks/main-app-7d7e5d1021afd90c.js"],pages:{"/_app":["static/chunks/webpack-76aa9cbbdedb6a49.js","static/chunks/framework-f66176bb897dc684.js","static/chunks/main-9c5f6b283127d940.js","static/chunks/pages/_app-72b849fbd24ac258.js"],"/_error":["static/chunks/webpack-76aa9cbbdedb6a49.js","static/chunks/framework-f66176bb897dc684.js","static/chunks/main-9c5f6b283127d940.js","static/chunks/pages/_error-7ba65e1336b92748.js"]},ampFirstPages:[]},self.__BUILD_MANIFEST.lowPriorityFiles=["/static/"+process.env.__NEXT_BUILD_ID+"/_buildManifest.js",,"/static/"+process.env.__NEXT_BUILD_ID+"/_ssgManifest.js"];
self.__BUILD_MANIFEST = {
"polyfillFiles": [
"static/chunks/polyfills.js"
],
"devFiles": [],
"ampDevFiles": [],
"lowPriorityFiles": [],
"rootMainFiles": [
"static/chunks/webpack.js",
"static/chunks/main-app.js"
],
"pages": {
"/_app": []
},
"ampFirstPages": []
};
self.__BUILD_MANIFEST.lowPriorityFiles = [
"/static/" + process.env.__NEXT_BUILD_ID + "/_buildManifest.js",
,"/static/" + process.env.__NEXT_BUILD_ID + "/_ssgManifest.js",
];

View File

@ -1 +1 @@
self.__REACT_LOADABLE_MANIFEST='{"components/capital-flow.tsx -> echarts":{"id":9614,"files":["static/chunks/614.2cf8795c6fba79f8.js"]},"components/kline-chart.tsx -> echarts":{"id":9614,"files":["static/chunks/614.2cf8795c6fba79f8.js"]},"components/score-radar.tsx -> echarts":{"id":9614,"files":["static/chunks/614.2cf8795c6fba79f8.js"]}}';
self.__REACT_LOADABLE_MANIFEST="{}"

View File

@ -1 +1 @@
self.__NEXT_FONT_MANIFEST='{"pages":{},"app":{},"appUsingSizeAdjust":false,"pagesUsingSizeAdjust":false}';
self.__NEXT_FONT_MANIFEST="{\"pages\":{},\"app\":{},\"appUsingSizeAdjust\":false,\"pagesUsingSizeAdjust\":false}"

View File

@ -1 +1 @@
{"/_app":"pages/_app.js","/_error":"pages/_error.js","/_document":"pages/_document.js","/404":"pages/404.html"}
{}

View File

@ -1 +1 @@
self.__RSC_SERVER_MANIFEST="{\"node\":{},\"edge\":{},\"encryptionKey\":\"process.env.NEXT_SERVER_ACTIONS_ENCRYPTION_KEY\"}"
self.__RSC_SERVER_MANIFEST="{\n \"node\": {},\n \"edge\": {},\n \"encryptionKey\": \"process.env.NEXT_SERVER_ACTIONS_ENCRYPTION_KEY\"\n}"

View File

@ -1 +1,5 @@
{"node":{},"edge":{},"encryptionKey":"zQZTP4OVau3TMa/3EnbIENz7Y9ODeKQcCxekJfzqw4o="}
{
"node": {},
"edge": {},
"encryptionKey": "t8NqvDMYNuIMnc0JzSsolcrzKZh3QqUqStILpaN7mCE="
}

View File

@ -1 +1,215 @@
(()=>{"use strict";var e={},r={};function t(o){var n=r[o];if(void 0!==n)return n.exports;var a=r[o]={exports:{}},u=!0;try{e[o](a,a.exports,t),u=!1}finally{u&&delete r[o]}return a.exports}t.m=e,t.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return t.d(r,{a:r}),r},(()=>{var e,r=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__;t.t=function(o,n){if(1&n&&(o=this(o)),8&n||"object"==typeof o&&o&&(4&n&&o.__esModule||16&n&&"function"==typeof o.then))return o;var a=Object.create(null);t.r(a);var u={};e=e||[null,r({}),r([]),r(r)];for(var f=2&n&&o;"object"==typeof f&&!~e.indexOf(f);f=r(f))Object.getOwnPropertyNames(f).forEach(e=>u[e]=()=>o[e]);return u.default=()=>o,t.d(a,u),a}})(),t.d=(e,r)=>{for(var o in r)t.o(r,o)&&!t.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:r[o]})},t.f={},t.e=e=>Promise.all(Object.keys(t.f).reduce((r,o)=>(t.f[o](e,r),r),[])),t.u=e=>""+e+".js",t.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),t.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.X=(e,r,o)=>{var n=r;o||(r=e,o=()=>t(t.s=n)),r.map(t.e,t);var a=o();return void 0===a?e:a},(()=>{var e={658:1},r=r=>{var o=r.modules,n=r.ids,a=r.runtime;for(var u in o)t.o(o,u)&&(t.m[u]=o[u]);a&&a(t);for(var f=0;f<n.length;f++)e[n[f]]=1};t.f.require=(o,n)=>{e[o]||(658!=o?r(require("./chunks/"+t.u(o))):e[o]=1)},module.exports=t,t.C=r})()})();
/*
* ATTENTION: An "eval-source-map" devtool has been used.
* This devtool is neither made for production nor for readable output files.
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
* or disable the default devtool with "devtool: false".
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
*/
/******/ (() => { // webpackBootstrap
/******/ "use strict";
/******/ var __webpack_modules__ = ({});
/************************************************************************/
/******/ // The module cache
/******/ var __webpack_module_cache__ = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/ var cachedModule = __webpack_module_cache__[moduleId];
/******/ if (cachedModule !== undefined) {
/******/ return cachedModule.exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = __webpack_module_cache__[moduleId] = {
/******/ id: moduleId,
/******/ loaded: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ var threw = true;
/******/ try {
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
/******/ threw = false;
/******/ } finally {
/******/ if(threw) delete __webpack_module_cache__[moduleId];
/******/ }
/******/
/******/ // Flag the module as loaded
/******/ module.loaded = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = __webpack_modules__;
/******/
/************************************************************************/
/******/ /* webpack/runtime/compat get default export */
/******/ (() => {
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = (module) => {
/******/ var getter = module && module.__esModule ?
/******/ () => (module['default']) :
/******/ () => (module);
/******/ __webpack_require__.d(getter, { a: getter });
/******/ return getter;
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/create fake namespace object */
/******/ (() => {
/******/ var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__);
/******/ var leafPrototypes;
/******/ // create a fake namespace object
/******/ // mode & 1: value is a module id, require it
/******/ // mode & 2: merge all properties of value into the ns
/******/ // mode & 4: return value when already ns object
/******/ // mode & 16: return value when it's Promise-like
/******/ // mode & 8|1: behave like require
/******/ __webpack_require__.t = function(value, mode) {
/******/ if(mode & 1) value = this(value);
/******/ if(mode & 8) return value;
/******/ if(typeof value === 'object' && value) {
/******/ if((mode & 4) && value.__esModule) return value;
/******/ if((mode & 16) && typeof value.then === 'function') return value;
/******/ }
/******/ var ns = Object.create(null);
/******/ __webpack_require__.r(ns);
/******/ var def = {};
/******/ leafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];
/******/ for(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {
/******/ Object.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key])));
/******/ }
/******/ def['default'] = () => (value);
/******/ __webpack_require__.d(ns, def);
/******/ return ns;
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/define property getters */
/******/ (() => {
/******/ // define getter functions for harmony exports
/******/ __webpack_require__.d = (exports, definition) => {
/******/ for(var key in definition) {
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ }
/******/ }
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/ensure chunk */
/******/ (() => {
/******/ __webpack_require__.f = {};
/******/ // This file contains only the entry chunk.
/******/ // The chunk loading function for additional chunks
/******/ __webpack_require__.e = (chunkId) => {
/******/ return Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {
/******/ __webpack_require__.f[key](chunkId, promises);
/******/ return promises;
/******/ }, []));
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/get javascript chunk filename */
/******/ (() => {
/******/ // This function allow to reference async chunks and sibling chunks for the entrypoint
/******/ __webpack_require__.u = (chunkId) => {
/******/ // return url for filenames based on template
/******/ return "" + chunkId + ".js";
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/getFullHash */
/******/ (() => {
/******/ __webpack_require__.h = () => ("d5fab7bdabc14f64")
/******/ })();
/******/
/******/ /* webpack/runtime/hasOwnProperty shorthand */
/******/ (() => {
/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
/******/ })();
/******/
/******/ /* webpack/runtime/make namespace object */
/******/ (() => {
/******/ // define __esModule on exports
/******/ __webpack_require__.r = (exports) => {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/node module decorator */
/******/ (() => {
/******/ __webpack_require__.nmd = (module) => {
/******/ module.paths = [];
/******/ if (!module.children) module.children = [];
/******/ return module;
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/startup entrypoint */
/******/ (() => {
/******/ __webpack_require__.X = (result, chunkIds, fn) => {
/******/ // arguments: chunkIds, moduleId are deprecated
/******/ var moduleId = chunkIds;
/******/ if(!fn) chunkIds = result, fn = () => (__webpack_require__(__webpack_require__.s = moduleId));
/******/ chunkIds.map(__webpack_require__.e, __webpack_require__)
/******/ var r = fn();
/******/ return r === undefined ? result : r;
/******/ }
/******/ })();
/******/
/******/ /* webpack/runtime/require chunk loading */
/******/ (() => {
/******/ // no baseURI
/******/
/******/ // object to store loaded chunks
/******/ // "1" means "loaded", otherwise not loaded yet
/******/ var installedChunks = {
/******/ "webpack-runtime": 1
/******/ };
/******/
/******/ // no on chunks loaded
/******/
/******/ var installChunk = (chunk) => {
/******/ var moreModules = chunk.modules, chunkIds = chunk.ids, runtime = chunk.runtime;
/******/ for(var moduleId in moreModules) {
/******/ if(__webpack_require__.o(moreModules, moduleId)) {
/******/ __webpack_require__.m[moduleId] = moreModules[moduleId];
/******/ }
/******/ }
/******/ if(runtime) runtime(__webpack_require__);
/******/ for(var i = 0; i < chunkIds.length; i++)
/******/ installedChunks[chunkIds[i]] = 1;
/******/
/******/ };
/******/
/******/ // require() chunk loading for javascript
/******/ __webpack_require__.f.require = (chunkId, promises) => {
/******/ // "1" is the signal for "already loaded"
/******/ if(!installedChunks[chunkId]) {
/******/ if("webpack-runtime" != chunkId) {
/******/ installChunk(require("./" + __webpack_require__.u(chunkId)));
/******/ } else installedChunks[chunkId] = 1;
/******/ }
/******/ };
/******/
/******/ module.exports = __webpack_require__;
/******/ __webpack_require__.C = installChunk;
/******/
/******/ // no HMR
/******/
/******/ // no HMR manifest
/******/ })();
/******/
/************************************************************************/
/******/
/******/
/******/ })()
;

File diff suppressed because one or more lines are too long

View File

@ -24,17 +24,17 @@ export default function MarketTemp({ data, indices }: MarketTempProps) {
const hasMaxStreak = data.max_streak != null && data.max_streak > 0;
return (
<div className="glass-card-static p-5 animate-fade-in-up">
<div className="glass-card-static p-4 sm:p-5 animate-fade-in-up">
{/* Header */}
<div className="flex items-center justify-between mb-4">
<div className="flex items-center justify-between mb-3 sm:mb-4">
<h2 className="text-xs font-semibold text-text-muted uppercase tracking-wider"></h2>
<span className="text-xs text-text-muted font-mono tabular-nums">{data.trade_date}</span>
<span className="text-[10px] sm:text-xs text-text-muted font-mono tabular-nums">{data.trade_date}</span>
</div>
{/* Top row: Gauge + Stats grid */}
<div className="flex items-center gap-5 mb-4">
<div className="flex items-center gap-3 sm:gap-5 mb-3 sm:mb-4">
{/* Circular gauge */}
<div className="relative w-24 h-24 flex-shrink-0">
<div className="relative w-16 sm:w-20 md:w-24 h-16 sm:h-20 md:h-24 flex-shrink-0">
<svg viewBox="0 0 100 100" className="w-full h-full -rotate-90">
<defs>
<linearGradient id="tempGrad" x1="0%" y1="0%" x2="100%" y2="0%">
@ -60,13 +60,13 @@ export default function MarketTemp({ data, indices }: MarketTempProps) {
/>
</svg>
<div className="absolute inset-0 flex flex-col items-center justify-center">
<span className="text-xl font-bold font-mono tabular-nums" style={{ color }}>{data.temperature}</span>
<span className="text-xs text-text-muted font-medium mt-0.5">{label}</span>
<span className="text-base sm:text-lg md:text-xl font-bold font-mono tabular-nums" style={{ color }}>{data.temperature}</span>
<span className="text-[10px] sm:text-xs text-text-muted font-medium mt-0.5">{label}</span>
</div>
</div>
{/* Key stats grid 3x2 */}
<div className="flex-1 grid grid-cols-3 gap-2">
<div className="flex-1 grid grid-cols-3 gap-1.5 sm:gap-2">
<StatCard label="涨停">
<span className="text-red-400 font-mono tabular-nums font-semibold">{data.limit_up_count}</span>
</StatCard>
@ -94,26 +94,26 @@ export default function MarketTemp({ data, indices }: MarketTempProps) {
{/* Middle row: Broken rate + MA20 */}
<div className="grid grid-cols-2 gap-2 mb-2">
<div className="bg-surface-1 rounded-lg px-3 py-2 border border-border-subtle">
<div className="text-xs text-text-muted mb-0.5"></div>
<div className="bg-surface-1 rounded-lg px-2 sm:px-3 py-2 border border-border-subtle">
<div className="text-[10px] sm:text-xs text-text-muted mb-0.5"></div>
{hasBrokenRate ? (
<div className="flex items-baseline gap-1">
<span className="text-sm font-mono tabular-nums font-semibold text-amber-400">
<span className="text-xs sm:text-sm font-mono tabular-nums font-semibold text-amber-400">
{data.broken_rate!.toFixed(1)}%
</span>
{data.broken_rate! > 50 && (
<span className="text-xs text-amber-500/60"></span>
<span className="text-[10px] sm:text-xs text-amber-500/60"></span>
)}
</div>
) : (
<span className="text-sm text-text-muted/40">-</span>
<span className="text-xs sm:text-sm text-text-muted/40">-</span>
)}
</div>
<div className="bg-surface-1 rounded-lg px-3 py-2 border border-border-subtle">
<div className="text-xs text-text-muted mb-0.5">线</div>
<div className="bg-surface-1 rounded-lg px-2 sm:px-3 py-2 border border-border-subtle">
<div className="text-[10px] sm:text-xs text-text-muted mb-0.5">线</div>
<div className="flex items-center gap-1.5">
<span className={`w-1.5 h-1.5 rounded-full ${data.index_above_ma20 ? "bg-red-400" : "bg-emerald-400"}`} />
<span className={`text-sm font-semibold ${data.index_above_ma20 ? "text-red-400" : "text-emerald-400"}`}>
<span className={`text-xs sm:text-sm font-semibold ${data.index_above_ma20 ? "text-red-400" : "text-emerald-400"}`}>
{data.index_above_ma20 ? "均线之上" : "均线之下"}
</span>
</div>
@ -124,18 +124,20 @@ export default function MarketTemp({ data, indices }: MarketTempProps) {
{indices && indices.length > 0 && (
<div className="grid grid-cols-3 gap-2">
{indices.map((idx) => (
<div key={idx.code} className="bg-surface-1 rounded-lg px-3 py-2 border border-border-subtle">
<div className="text-xs text-text-muted mb-0.5">
<div key={idx.code} className="bg-surface-1 rounded-lg px-2 sm:px-3 py-2 border border-border-subtle">
<div className="text-[10px] sm:text-xs text-text-muted mb-0.5 truncate">
{idx.name}
{idx.realtime && <span className="text-emerald-400/60 ml-1">· </span>}
{idx.realtime && <span className="text-emerald-400/60 ml-0.5">·</span>}
</div>
<span className={`text-sm font-mono tabular-nums font-semibold ${idx.pct_chg > 0 ? "text-red-400" : idx.pct_chg < 0 ? "text-emerald-400" : "text-text-primary"}`}>
<div className="flex flex-col sm:flex-row sm:items-baseline gap-0.5 sm:gap-1.5">
<span className={`text-xs sm:text-sm font-mono tabular-nums font-semibold ${idx.pct_chg > 0 ? "text-red-400" : idx.pct_chg < 0 ? "text-emerald-400" : "text-text-primary"}`}>
{idx.close.toFixed(2)}
</span>
<span className={`text-xs font-mono tabular-nums ml-1.5 ${idx.pct_chg > 0 ? "text-red-400" : idx.pct_chg < 0 ? "text-emerald-400" : "text-text-muted"}`}>
<span className={`text-[10px] sm:text-xs font-mono tabular-nums ${idx.pct_chg > 0 ? "text-red-400" : idx.pct_chg < 0 ? "text-emerald-400" : "text-text-muted"}`}>
{idx.pct_chg > 0 ? "+" : ""}{idx.pct_chg.toFixed(2)}%
</span>
</div>
</div>
))}
</div>
)}
@ -145,9 +147,9 @@ export default function MarketTemp({ data, indices }: MarketTempProps) {
function StatCard({ label, children }: { label: string; children: React.ReactNode }) {
return (
<div className="bg-surface-1 rounded-lg px-3 py-2 border border-border-subtle">
<div className="text-xs text-text-muted mb-0.5 font-medium">{label}</div>
<div className="text-sm">{children}</div>
<div className="bg-surface-1 rounded-lg px-2 sm:px-3 py-1.5 sm:py-2 border border-border-subtle">
<div className="text-[10px] sm:text-xs text-text-muted mb-0.5 font-medium">{label}</div>
<div className="text-xs sm:text-sm">{children}</div>
</div>
);
}