diff options
| author | Somhairle H. Marisol <[email protected]> | 2026-09-18 08:26:30 +0800 |
|---|---|---|
| committer | Somhairle H. Marisol <[email protected]> | 2026-09-18 08:26:30 +0800 |
| commit | 06a7b1668b44f111eca5d08bc8c2c9d41d8e617e (patch) | |
| tree | 0c7220a22b866d3e298f756b42f565f4f674152c /frontend/src/lib/components/ui/chart/chart-container.svelte | |
| parent | 95215e84e045602db2370586f6089a7f9f91b33b (diff) | |
| download | strategy-lab-06a7b1668b44f111eca5d08bc8c2c9d41d8e617e.tar.gz | |
chore(frontend): shadcn-svelte / Tailwind / layerchart 工具链初始化
[变更性质]
本轮为维护性依赖与配置初始化,不改变业务页面(页面迁移见后续提交)。
[维护内容]
按 Leader 返工指令,前端 UI 组件库全量迁移 shadcn-svelte,图表渲染
从 echarts 换为 layerchart,需要一次性引入配套依赖与构建配置。
[实现方案]
package.json/pnpm-lock.yaml:tailwindcss@4、@tailwindcss/vite、
tw-animate-css、shadcn-svelte、bits-ui、tailwind-variants、clsx、
tailwind-merge、@lucide/svelte、layerchart、@fontsource-variable/inter
与 @types/node;echarts 保留至页面迁移完成后移除。pnpm-workspace.yaml
声明 allowBuilds(esbuild、@tailwindcss/oxide)。components.json 采用
mira preset,别名 $lib。tsconfig 新增 $lib paths;vite.config.ts 加入
tailwindcss 插件、$lib alias(vitest 需要)与 test 环境配置。
src/lib/components/ 为 shadcn 生成的 UI 组件源码(button/input/label/
card/badge/alert/select/table/tabs/separator/chart),src/lib/utils.ts
为 cn 工具。app.css 引入 tailwind 与 shadcn CSS 变量并调整为 teal
主题(primary #0f766e、radius 0.375rem、双主题 chart-1..5),保留
legacy 选择器(banner/beat/table.data/metric 等),mobileCss.test.ts
依赖其语义断言。
[影响范围]
构建链与主题变量;后续页面提交逐步消费这些组件,npm run check/test/
build 已全绿验证。
Diffstat (limited to 'frontend/src/lib/components/ui/chart/chart-container.svelte')
| -rw-r--r-- | frontend/src/lib/components/ui/chart/chart-container.svelte | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/frontend/src/lib/components/ui/chart/chart-container.svelte b/frontend/src/lib/components/ui/chart/chart-container.svelte new file mode 100644 index 0000000..3687ea0 --- /dev/null +++ b/frontend/src/lib/components/ui/chart/chart-container.svelte @@ -0,0 +1,80 @@ +<script lang="ts"> + import { cn, type WithElementRef } from "$lib/utils.js"; + import ChartStyle from "./chart-style.svelte"; + import { setChartContext, type ChartConfig } from "./chart-utils.js"; + import type { HTMLAttributes } from "svelte/elements"; + + const uid = $props.id(); + + let { + ref = $bindable(null), + id = uid, + class: className, + children, + config, + ...restProps + }: WithElementRef<HTMLAttributes<HTMLElement>> & { + config: ChartConfig; + } = $props(); + + const chartId = $derived(`chart-${id || uid.replace(/:/g, "")}`); + + setChartContext({ + get config() { + return config; + }, + }); +</script> + +<div + bind:this={ref} + data-chart={chartId} + data-slot="chart" + class={cn( + "flex aspect-video justify-center overflow-visible text-xs", + // Overrides + // + // Stroke around dots/marks when hovering + "[&_.lc-highlight-point]:stroke-transparent", + // override the default stroke color of lines + "[&_.lc-line]:stroke-border/50", + + // by default, layerchart shows a line intersecting the point when hovering, this hides that + "[&_.lc-highlight-line]:stroke-0", + + // by default, when you hover a point on a stacked series chart, it will drop the opacity + // of the other series, this overrides that + "[&_.lc-area-path]:opacity-100 [&_.lc-highlight-line]:opacity-100 [&_.lc-highlight-point]:opacity-100 [&_.lc-spline-path]:opacity-100 [&_.lc-text]:text-xs [&_.lc-text-svg]:overflow-visible", + + // We don't want the little tick lines between the axis labels and the chart, so we remove + // the stroke. The alternative is to manually disable `tickMarks` on the x/y axis of every + // chart. + "[&_.lc-axis-tick]:stroke-0", + + // We don't want to display the rule on the x/y axis, as there is already going to be + // a grid line there and rule ends up overlapping the marks because it is rendered after + // the marks + "[&_.lc-rule-x-line:not(.lc-grid-x-rule)]:stroke-0 [&_.lc-rule-y-line:not(.lc-grid-y-rule)]:stroke-0", + "[&_.lc-grid-x-radial-circle]:stroke-border [&_.lc-grid-x-radial-line]:stroke-border", + "[&_.lc-grid-y-radial-circle]:stroke-border [&_.lc-grid-y-radial-line]:stroke-border", + + // Legend adjustments + "[&_.lc-legend-swatch-button]:items-center [&_.lc-legend-swatch-button]:gap-1.5", + "[&_.lc-legend-swatch-group]:items-center [&_.lc-legend-swatch-group]:gap-4", + "[&_.lc-legend-swatch]:size-2.5 [&_.lc-legend-swatch]:rounded-[2px]", + + // Labels + "[&_.lc-labels-text:not([fill])]:fill-foreground [&_text]:stroke-transparent", + + // Tick labels on th x/y axes + "[&_.lc-axis-tick-label]:fill-muted-foreground [&_.lc-axis-tick-label]:font-normal", + "[&_.lc-tooltip-rects-g]:fill-transparent", + "[&_.lc-layout-svg-g]:fill-transparent", + "[&_.lc-root-container]:w-full", + className + )} + {...restProps} +> + <ChartStyle id={chartId} {config} /> + {@render children?.()} +</div> |
