+
+
+
+
+
+
+
+
+
+
+
+ 数据口径:当前筛选范围内销售额与利润求和,订单数去重;环比前一等长周期。
+ Powered By VisActor
+
+
+```
+
+下方接入示例使用 24px 圆角,窄屏降为 16px。先引入[数值字号规范](./metric-card.md#数值字号规范)的容器与 token,将其容器查询中的 `.dashboard` 映射为本例 `.dashboard-grid`;以下代码仅按主辅角色消费字号。紧凑卡片可统一调整圆角,字号只按角色与断点整组切换,不逐卡覆盖。
+
+```css
+* {
+ box-sizing: border-box;
+}
+body {
+ margin: 0;
+ background: var(--background-base);
+ color: var(--ink);
+ font-family: Inter, 'PingFang SC', 'Microsoft YaHei', sans-serif;
+}
+.dashboard-view {
+ width: min(var(--content-width, 1140px), calc(100% - 32px));
+ margin: 32px auto;
+}
+.dashboard-header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 16px;
+ margin-bottom: 20px;
+}
+h1 {
+ margin: 0;
+ font-size: 24px;
+}
+h2 {
+ margin: 0 0 12px;
+ color: var(--muted);
+ font-size: 13px;
+ font-weight: 500;
+}
+.filters {
+ display: flex;
+ gap: 4px;
+ min-width: 0;
+ margin: 0;
+ padding: 0;
+ border: 0;
+}
+.filters button {
+ padding: 8px 12px;
+ border: 1px solid var(--border);
+ border-radius: 6px;
+ background: var(--surface);
+ color: var(--ink);
+ font: inherit;
+ cursor: pointer;
+}
+.filters button[aria-pressed='true'] {
+ border-color: var(--accent);
+ background: var(--accent-soft);
+}
+.filters button:focus-visible {
+ outline: 2px solid var(--accent);
+ outline-offset: 2px;
+}
+.dashboard-grid {
+ display: grid;
+ grid-template-columns: repeat(12, minmax(0, 1fr));
+ grid-auto-rows: minmax(44px, auto);
+ gap: 16px;
+}
+.dashboard-attribution {
+ display: flex;
+ justify-content: flex-end;
+ flex-wrap: wrap;
+ gap: 4px 12px;
+ margin: 16px 0 0;
+ color: var(--muted);
+ font-size: 11px;
+ line-height: 1.5;
+ text-align: right;
+ overflow-wrap: anywhere;
+}
+.card-slot {
+ min-width: 0;
+ min-height: min-content;
+ display: flex;
+ flex-direction: column;
+}
+.card {
+ flex: 1;
+ min-height: min-content;
+ height: auto;
+ padding: 20px;
+ border: 1px solid var(--border);
+ border-radius: var(--card-radius, 24px);
+ background: var(--surface);
+}
+.insight-card {
+ padding: 12px 20px;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ gap: 10px;
+}
+.insight-card h2 {
+ margin: 0;
+ color: var(--accent-ink);
+}
+.insight-body {
+ display: grid;
+ gap: 8px;
+}
+.insight-conclusion {
+ color: var(--ink);
+ font-size: 16px;
+ font-weight: 600;
+ line-height: 1.65;
+ overflow-wrap: anywhere;
+}
+.insight-scope {
+ margin: 0;
+ color: var(--muted);
+ font-size: 12px;
+ line-height: 1.6;
+}
+.insight-list {
+ display: grid;
+ gap: 6px;
+ margin: 0;
+ padding-left: 20px;
+ font-size: 14px;
+ line-height: 1.65;
+ overflow-wrap: anywhere;
+}
+.insight-change {
+ font-weight: 600;
+ white-space: nowrap;
+}
+.insight-change[data-direction='up'] {
+ color: var(--insight-up, #12815e);
+}
+.insight-change[data-direction='down'] {
+ color: var(--insight-down, #c64a3f);
+}
+.main-card {
+ display: flex;
+ flex-direction: column;
+ transform: none;
+}
+.main-plot {
+ flex: 1;
+ min-height: 150px;
+ contain: size;
+ margin-top: 16px;
+}
+.sub-card {
+ transform: perspective(800px) rotate3d(var(--tilt-x, 0), var(--tilt-y, 1), 0, var(--tilt-angle, 0deg));
+}
+.metric-value {
+ font-size: var(--metric-secondary-size);
+ font-variant-numeric: tabular-nums;
+ font-weight: 600;
+ letter-spacing: -0.025em;
+ line-height: 1.12;
+}
+.main-card > .metric-value {
+ font-size: var(--metric-primary-size);
+}
+.metric-body {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 12px;
+}
+.mini-plot {
+ width: clamp(72px, 28vw, 132px);
+ height: 72px;
+ flex-shrink: 0;
+ contain: size;
+}
+@media (max-width: 991px) {
+ .dashboard-header {
+ align-items: flex-start;
+ flex-wrap: wrap;
+ }
+}
+@media (max-width: 540px) {
+ .dashboard-view {
+ margin: 20px auto;
+ }
+ .card {
+ --card-radius: 16px;
+ padding: 16px;
+ }
+}
+@media (prefers-reduced-motion: reduce), (hover: none) {
+ .sub-card {
+ transform: none;
+ }
+}
+```
+
+从 DSL 读取位置,布局应用后再调整 VChart 尺寸。`renderedCharts` 是沿用示例的 `Map