+ {description ? (
+
+ {description}
+
+ ) : null}
+ {loading ? (
+
+ ) : hasData ? (
+
+ ) : (
+
{emptyLabel}
+ )}
+
+ )
+ }
+)
+
+export interface LineChartOptions {
+ /**
+ * Chart series. At most `maxSeries` of them render: past that, the tail is
+ * summed per category into a single aggregate series named after the
+ * `others` message.
+ */
+ series: LineChartSeries[]
+ /**
+ * Labels of the category axis, in render order. Every series provides one
+ * value per category.
+ */
+ categories: string[]
+ /**
+ * Accessible name announced for the chart.
+ */
+ label: string
+ /**
+ * Accessible long description of what the chart shows.
+ * @default undefined
+ */
+ description?: string
+ /**
+ * Shows a loading placeholder instead of the chart.
+ * @default false
+ */
+ loading?: boolean
+ /**
+ * Overrides the chart's internal messages, which are otherwise localized from
+ * the surrounding `LocaleProvider`.
+ * @default undefined
+ */
+ messages?: LineChartMessages
+ /**
+ * How many series render at most. Raise it to give more series their own
+ * name and color instead of aggregating them; the default keeps the chart
+ * to the primary and secondary series plus the aggregate.
+ *
+ * Capped at 6 — the palette has that many colors and never cycles them.
+ * Series past the cap still aggregate, so no data is dropped.
+ * @default 3
+ */
+ maxSeries?: number
+ /**
+ * Draw the lines as smooth curves instead of straight segments. Off by
+ * default: straight segments read exact values more precisely, smooth
+ * curves suit trend-forward narratives.
+ * @default false
+ */
+ smooth?: boolean
+}
+
+export type LineChartProps = LineChartOptions & ComponentPropsWithoutRef<'div'>
+
+/**
+ * Line chart internal messages
+ */
+export type LineChartMessages = ChartMessages
diff --git a/packages/charts/src/components/line-chart/line-option.ts b/packages/charts/src/components/line-chart/line-option.ts
new file mode 100644
index 000000000..b05c2d68b
--- /dev/null
+++ b/packages/charts/src/components/line-chart/line-option.ts
@@ -0,0 +1,100 @@
+import type { EChartsCoreOption } from '../../internal/echarts'
+import type { ChartAxisPointer } from '../../internal/option'
+import {
+ buildAxisTooltip,
+ buildCategoryAxis,
+ buildGrid,
+ buildLegend,
+ buildValueAxis,
+} from '../../internal/option'
+import { collapseSeries, createDeltaLookup } from '../../internal/series'
+import type { ChartTokens } from '../../internal/theme'
+import type { ChartTooltipDelta } from '../../internal/tooltip'
+
+// Re-exported so the component's `maxSeries` default flows from the shared
+// constant without the package re-exporting it a second time (it already ships
+// via the bar chart).
+export { defaultMaxSeries } from '../../internal/series'
+
+/**
+ * A single line series.
+ */
+export interface LineChartSeries {
+ /**
+ * Series name, shown in the legend and tooltip.
+ */
+ name: string
+ /**
+ * One value per category, in category order. `null` renders a gap at that
+ * category — the line is not interpolated across missing points unless a
+ * future opt-in says otherwise.
+ */
+ data: Array