@photon-ai/pho-ui 4.8.0 → 4.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/dist/chunks/bar-chart-Metal1Vu.js +19 -0
  2. package/dist/chunks/bar-chart-Metal1Vu.js.map +1 -0
  3. package/dist/chunks/{basic-page-BqfpJgAj.js → basic-page-DzT8yecB.js} +176 -175
  4. package/dist/chunks/basic-page-DzT8yecB.js.map +1 -0
  5. package/dist/chunks/chart-D4jJKeh2.js +1338 -0
  6. package/dist/chunks/chart-D4jJKeh2.js.map +1 -0
  7. package/dist/chunks/code-block-CbcE994O.js +516 -0
  8. package/dist/chunks/code-block-CbcE994O.js.map +1 -0
  9. package/dist/chunks/line-chart-3zH_lhTW.js +22 -0
  10. package/dist/chunks/line-chart-3zH_lhTW.js.map +1 -0
  11. package/dist/components/bar-chart.js +1 -1
  12. package/dist/components/chart.js +8 -5
  13. package/dist/components/code-block.js +12 -3
  14. package/dist/components/line-chart.js +1 -1
  15. package/dist/index.js +175 -162
  16. package/dist/motion.js +14 -13
  17. package/dist/motion.js.map +1 -1
  18. package/dist/primitives.js +1 -1
  19. package/dist/sections/basic-page.js +1 -1
  20. package/dist/src/components/bar-chart/bar-chart.d.ts +9 -1
  21. package/dist/src/components/chart/chart.d.ts +25 -0
  22. package/dist/src/components/chart/format.d.ts +9 -5
  23. package/dist/src/components/chart/index.d.ts +7 -4
  24. package/dist/src/components/chart/scale.d.ts +2 -2
  25. package/dist/src/components/chart/shell.d.ts +20 -13
  26. package/dist/src/components/chart/skeleton.d.ts +11 -0
  27. package/dist/src/components/chart/theme.d.ts +8 -0
  28. package/dist/src/components/chart/types.d.ts +39 -2
  29. package/dist/src/components/chart/use-measure.d.ts +2 -1
  30. package/dist/src/components/code-block/code-block.d.ts +23 -11
  31. package/dist/src/components/code-block/highlight.d.ts +24 -0
  32. package/dist/src/components/code-block/index.d.ts +4 -1
  33. package/dist/src/components/code-block/languages.d.ts +64 -0
  34. package/dist/src/components/code-block/pho-theme.d.ts +18 -0
  35. package/dist/src/components/code-block/tokens.d.ts +14 -0
  36. package/dist/src/components/line-chart/line-chart.d.ts +12 -3
  37. package/dist/src/motion/index.d.ts +6 -0
  38. package/dist/src/sections/basic-page/basic-page.d.ts +2 -0
  39. package/package.json +4 -1
  40. package/src/styles/theme.css +17 -4
  41. package/dist/chunks/IconArrowsMinimize-BfPUGuCB.js +0 -75
  42. package/dist/chunks/IconArrowsMinimize-BfPUGuCB.js.map +0 -1
  43. package/dist/chunks/bar-chart-DIALC2_z.js +0 -190
  44. package/dist/chunks/bar-chart-DIALC2_z.js.map +0 -1
  45. package/dist/chunks/basic-page-BqfpJgAj.js.map +0 -1
  46. package/dist/chunks/code-block-BuFfh0zH.js +0 -197
  47. package/dist/chunks/code-block-BuFfh0zH.js.map +0 -1
  48. package/dist/chunks/legend-C0mU7dqd.js +0 -60
  49. package/dist/chunks/legend-C0mU7dqd.js.map +0 -1
  50. package/dist/chunks/line-chart-VuMYKzW3.js +0 -453
  51. package/dist/chunks/line-chart-VuMYKzW3.js.map +0 -1
  52. package/dist/chunks/use-measure-C-i54AC6.js +0 -629
  53. package/dist/chunks/use-measure-C-i54AC6.js.map +0 -1
  54. package/dist/src/components/chart/axes.d.ts +0 -22
@@ -1,190 +0,0 @@
1
- "use client";
2
- import { i as ct, t as mt } from "./legend-C0mU7dqd.js";
3
- import { _ as ut, a as ft, c as ht, d as pt, f as $t, g as vt, h as K, i as bt, l as yt, m as dt, n as Mt, o as xt, p as gt, r as kt, s as O, t as Ft, u as Tt, v as Ct } from "./use-measure-C-i54AC6.js";
4
- import { useMemo as z, useState as Lt } from "react";
5
- import { jsx as M, jsxs as St } from "react/jsx-runtime";
6
- var wt = 24, Pt = 4;
7
- function At(f, e, b, $, w) {
8
- const t = Math.min(Pt, b / 2, $), C = e + $;
9
- return t <= 0 ? `M${f},${e}h${b}v${$}h${-b}Z` : w === "top" ? `M${f},${C}v${-($ - t)}a${t},${t} 0 0 1 ${t},${-t}h${b - 2 * t}a${t},${t} 0 0 1 ${t},${t}v${$ - t}Z` : `M${f},${e}h${b}v${$ - t}a${t},${t} 0 0 1 ${-t},${t}h${-(b - 2 * t)}a${t},${t} 0 0 1 ${-t},${-t}Z`;
10
- }
11
- function It({ data: f, series: e, label: b, description: $, height: w = 200, width: t, valueFormat: C, timeFormat: j, locale: F, legend: Q, baseline: E = "zero", stacked: x = !1, breakdownTitle: tt, loading: H, empty: ot = "Nothing here yet.", className: nt, ...rt }) {
12
- const [at, P] = Ft(t), [g, Y] = Lt(null), o = z(() => {
13
- const n = e.map((p, s) => ct(p.color, s)), a = f.map((p) => gt(p.x)), l = ft(a), h = C ?? K(F, !0), S = C ?? K(F), m = j ?? xt(F, l), i = f.map((p) => {
14
- let s = 0, d = 0;
15
- return e.map((k) => {
16
- const r = vt(p, k.key);
17
- if (!x) return {
18
- value: r,
19
- from: 0,
20
- to: r ?? 0
21
- };
22
- if (r == null || r === 0) return {
23
- value: r,
24
- from: r ?? 0,
25
- to: r ?? 0
26
- };
27
- if (r > 0) {
28
- const it = s;
29
- return s += r, {
30
- value: r,
31
- from: it,
32
- to: s
33
- };
34
- }
35
- const Z = d;
36
- return d += r, {
37
- value: r,
38
- from: Z,
39
- to: d
40
- };
41
- });
42
- });
43
- let u = 1 / 0, v = -1 / 0;
44
- for (const p of i) for (const s of p)
45
- s.value != null && (u = Math.min(u, s.from, s.to), v = Math.max(v, s.from, s.to));
46
- u === 1 / 0 && (u = 0, v = 0), E === "zero" && (u = Math.min(0, u), v = Math.max(0, v));
47
- const T = yt(u, v);
48
- return {
49
- colors: n,
50
- times: a,
51
- span: l,
52
- axisFormat: h,
53
- fullFormat: S,
54
- headingFormat: m,
55
- columns: i,
56
- y: T,
57
- yLabels: T.ticks.map(h),
58
- described: $ ?? dt({
59
- data: f,
60
- series: e,
61
- kind: "bar",
62
- valueFormat: S,
63
- timeFormat: m
64
- })
65
- };
66
- }, [
67
- f,
68
- e,
69
- x,
70
- E,
71
- C,
72
- j,
73
- F,
74
- $
75
- ]), c = bt(P, w, o.yLabels), y = f.length, _ = o.span > 0 ? o.span / 2 : 1, U = (o.times[0] ?? 0) - _, V = (o.times[y - 1] ?? 0) + _, { left: A, right: I } = c, B = z(() => O([U, V], [A, I]), [
76
- U,
77
- V,
78
- A,
79
- I
80
- ]), D = O(o.y.domain, [c.bottom, c.top]), L = y > 0 ? c.innerWidth / y : 0, X = L >= 6 ? 2 : L >= 3 ? 1 : 0, N = Math.max(1, Math.min(wt, L - X)), q = x ? 1 : e.length, G = Math.max(1, (N - (q - 1) * Math.min(2, X)) / q), R = z(() => o.times.map((n) => B(n)), [o.times, B]), et = z(() => {
81
- const n = I - A;
82
- if (y === 0 || n <= 0) return [];
83
- const a = $t(F), l = pt(o.times[0], o.times[y - 1], n);
84
- return Tt(l, a, n).map((h) => ({
85
- x: B(h.getTime()),
86
- label: a(h)
87
- }));
88
- }, [
89
- y,
90
- o.times,
91
- A,
92
- I,
93
- B,
94
- F
95
- ]), st = (n) => {
96
- if (y === 0) return;
97
- const a = n.currentTarget.getBoundingClientRect(), l = a.width > 0 ? P / a.width : 1, h = (n.clientX - a.left) * l;
98
- Y(ht(R, h));
99
- }, W = g != null ? f[g] : void 0, lt = Q ?? e.length > 1, J = D(0);
100
- return /* @__PURE__ */ St(kt, {
101
- label: b,
102
- description: o.described,
103
- height: w,
104
- width: P,
105
- containerRef: at,
106
- loading: H,
107
- empty: ot,
108
- showEmpty: y === 0 && !H,
109
- onPlotPointerMove: st,
110
- onPlotPointerLeave: () => Y(null),
111
- className: nt,
112
- legend: lt ? /* @__PURE__ */ M(mt, { items: e.map((n, a) => ({
113
- label: n.label,
114
- color: o.colors[a],
115
- kind: "rect"
116
- })) }) : null,
117
- tooltip: g != null && W != null ? /* @__PURE__ */ M(Mt, {
118
- x: R[g],
119
- width: P,
120
- top: c.top,
121
- heading: o.headingFormat(new Date(W.x)),
122
- rows: e.map((n, a) => {
123
- const l = o.columns[g][a].value;
124
- return {
125
- label: n.label,
126
- value: l == null ? "No data" : o.fullFormat(l),
127
- color: o.colors[a],
128
- kind: "rect"
129
- };
130
- }),
131
- breakdown: W.breakdown,
132
- breakdownTitle: tt,
133
- valueFormat: o.fullFormat
134
- }) : null,
135
- ...rt,
136
- children: [
137
- /* @__PURE__ */ M(Ct, {
138
- layout: c,
139
- ticks: o.y.ticks,
140
- labels: o.yLabels,
141
- scale: D
142
- }),
143
- /* @__PURE__ */ M(ut, {
144
- layout: c,
145
- ticks: et
146
- }),
147
- g != null && W != null && /* @__PURE__ */ M("rect", {
148
- x: R[g] - L / 2,
149
- y: c.top,
150
- width: L,
151
- height: c.innerHeight,
152
- fill: "var(--background-color-pho-ghost-hover)"
153
- }),
154
- /* @__PURE__ */ M("g", {
155
- "data-bars": "",
156
- children: o.columns.map((n, a) => {
157
- const l = R[a];
158
- let h = -1, S = -1;
159
- return n.forEach((m, i) => {
160
- m.value == null || m.value === 0 || (m.value > 0 ? h = i : S = i);
161
- }), n.map((m, i) => {
162
- const { value: u } = m;
163
- if (u == null || u === 0) return null;
164
- const v = x ? l - N / 2 : l - N / 2 + i * (G + Math.min(2, X)), T = x ? N : G, p = D(m.from), s = D(m.to);
165
- let d = Math.min(p, s), k = Math.abs(p - s);
166
- const r = u > 0, Z = !x || (r ? i === h : i === S);
167
- return x && k > 3 && (Z || (r && (d += 1), k -= 1), m.from !== 0 && (r || (d += 1), k -= 1)), /* @__PURE__ */ M("path", {
168
- d: Z ? At(v, d, T, k, r ? "top" : "bottom") : `M${v},${d}h${T}v${k}h${-T}Z`,
169
- fill: o.colors[i],
170
- "data-series": e[i].key
171
- }, e[i].key);
172
- });
173
- })
174
- }),
175
- o.y.domain[0] < 0 && o.y.domain[1] > 0 ? null : /* @__PURE__ */ M("line", {
176
- x1: c.left,
177
- x2: c.right,
178
- y1: J,
179
- y2: J,
180
- stroke: "var(--color-pho-chart-crosshair)"
181
- })
182
- ]
183
- });
184
- }
185
- It.displayName = "BarChart";
186
- export {
187
- It as t
188
- };
189
-
190
- //# sourceMappingURL=bar-chart-DIALC2_z.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bar-chart-DIALC2_z.js","names":[],"sources":["../../src/components/bar-chart/bar-chart.tsx"],"sourcesContent":["import { useMemo, useState, type PointerEvent } from \"react\";\nimport { XAxis, YAxis } from \"../chart/axes\";\nimport { chartColor } from \"../chart/color\";\nimport { describeChart, numberFormatter, readValue } from \"../chart/format\";\nimport { ChartLegend } from \"../chart/legend\";\nimport {\n bucketSpan,\n bucketTimeFormatter,\n linearScale,\n nearestIndex,\n niceLinearDomain,\n thinTicks,\n timeAxisTicks,\n timeTickFormatter,\n toTime,\n} from \"../chart/scale\";\nimport { ChartShell, chartLayout } from \"../chart/shell\";\nimport { ChartTooltip } from \"../chart/tooltip\";\nimport type { ChartBaseProps, ChartDatum } from \"../chart/types\";\nimport { useMeasuredWidth } from \"../chart/use-measure\";\n\n/**\n * BarChart — buckets over time as columns: messages a day, requests an\n * hour, deliveries. One series, several side by side, or `stacked` for\n * parts of a whole (inbound / outbound, successful / failed).\n *\n * Design notes:\n * - Marks are thin: a column never fills its slot and never runs past\n * 24px; the leftover is air. The data end is rounded (4px), the\n * baseline end square — in a stack only the top segment gets the\n * corners, and a 2px gap in the surface colour separates segments\n * instead of a stroke.\n * - Gridlines are hairlines one step off the surface; the zero line a\n * touch stronger. Axis text is description ink at 11px; the y-axis\n * labels thin themselves to three to five round numbers (whole numbers\n * on a count axis), the x-axis to the round times that fit.\n * - Hover lifts the bucket with the ghost wash and opens the tooltip on\n * it: the bucket's time, every series' value, and the bucket's\n * `breakdown` when it has one (errors by route).\n * - The figure is `role=\"img\"` with the `label` and a spoken summary; the\n * legend is real text below the plot, present for two or more series.\n */\n\nconst BAR_MAX = 24;\nconst RADIUS = 4;\n\nexport interface BarChartProps<T extends ChartDatum> extends ChartBaseProps<T> {\n /** Stack the series in one column per bucket, first series at the bottom. */\n stacked?: boolean;\n}\n\n/** A column with its data end rounded and its baseline end square. */\nfunction barPath(\n x: number,\n top: number,\n width: number,\n height: number,\n end: \"top\" | \"bottom\",\n): string {\n const r = Math.min(RADIUS, width / 2, height);\n const bottom = top + height;\n if (r <= 0) return `M${x},${top}h${width}v${height}h${-width}Z`;\n if (end === \"top\") {\n return `M${x},${bottom}v${-(height - r)}a${r},${r} 0 0 1 ${r},${-r}h${width - 2 * r}a${r},${r} 0 0 1 ${r},${r}v${height - r}Z`;\n }\n return `M${x},${top}h${width}v${height - r}a${r},${r} 0 0 1 ${-r},${r}h${-(width - 2 * r)}a${r},${r} 0 0 1 ${-r},${-r}Z`;\n}\n\nexport function BarChart<T extends ChartDatum>({\n data,\n series,\n label,\n description,\n height = 200,\n width: fixedWidth,\n valueFormat,\n timeFormat,\n locale,\n legend,\n baseline = \"zero\",\n stacked = false,\n breakdownTitle,\n loading,\n empty = \"Nothing here yet.\",\n className,\n ...props\n}: BarChartProps<T>) {\n const [containerRef, width] = useMeasuredWidth<HTMLDivElement>(fixedWidth);\n const [hovered, setHovered] = useState<number | null>(null);\n\n const model = useMemo(() => {\n const colors = series.map((s, index) => chartColor(s.color, index));\n const times = data.map((d) => toTime(d.x));\n const span = bucketSpan(times);\n const axisFormat = valueFormat ?? numberFormatter(locale, true);\n const fullFormat = valueFormat ?? numberFormatter(locale);\n const headingFormat = timeFormat ?? bucketTimeFormatter(locale, span);\n // Per bucket, per series: the value and, when stacked, where it sits.\n const columns = data.map((d) => {\n let positive = 0;\n let negative = 0;\n return series.map((s) => {\n const value = readValue(d, s.key);\n if (!stacked) return { value, from: 0, to: value ?? 0 };\n if (value == null || value === 0) {\n return { value, from: value ?? 0, to: value ?? 0 };\n }\n if (value > 0) {\n const from = positive;\n positive += value;\n return { value, from, to: positive };\n }\n const from = negative;\n negative += value;\n return { value, from, to: negative };\n });\n });\n let min = Infinity;\n let max = -Infinity;\n for (const column of columns) {\n for (const segment of column) {\n if (segment.value == null) continue;\n min = Math.min(min, segment.from, segment.to);\n max = Math.max(max, segment.from, segment.to);\n }\n }\n if (min === Infinity) {\n min = 0;\n max = 0;\n }\n if (baseline === \"zero\") {\n min = Math.min(0, min);\n max = Math.max(0, max);\n }\n const y = niceLinearDomain(min, max);\n const yLabels = y.ticks.map(axisFormat);\n return {\n colors,\n times,\n span,\n axisFormat,\n fullFormat,\n headingFormat,\n columns,\n y,\n yLabels,\n described:\n description ??\n describeChart({\n data,\n series,\n kind: \"bar\",\n valueFormat: fullFormat,\n timeFormat: headingFormat,\n }),\n };\n }, [\n data,\n series,\n stacked,\n baseline,\n valueFormat,\n timeFormat,\n locale,\n description,\n ]);\n\n const layout = chartLayout(width, height, model.yLabels);\n const n = data.length;\n // Buckets are centred in equal bands; positions come from the time\n // scale so a missing bucket leaves its hole rather than closing up.\n const halfSpan = model.span > 0 ? model.span / 2 : 1;\n const t0 = (model.times[0] ?? 0) - halfSpan;\n const t1 = (model.times[n - 1] ?? 0) + halfSpan;\n const { left, right } = layout;\n const xScale = useMemo(\n () => linearScale([t0, t1], [left, right]),\n [t0, t1, left, right],\n );\n const yScale = linearScale(model.y.domain, [layout.bottom, layout.top]);\n const band = n > 0 ? layout.innerWidth / n : 0;\n const gap = band >= 6 ? 2 : band >= 3 ? 1 : 0;\n const slot = Math.max(1, Math.min(BAR_MAX, band - gap));\n const groups = stacked ? 1 : series.length;\n const barWidth = Math.max(\n 1,\n (slot - (groups - 1) * Math.min(2, gap)) / groups,\n );\n const centers = useMemo(\n () => model.times.map((t) => xScale(t)),\n [model.times, xScale],\n );\n\n const xTicks = useMemo(() => {\n const innerWidth = right - left;\n if (n === 0 || innerWidth <= 0) return [];\n const format = timeTickFormatter(locale);\n const ticks = timeAxisTicks(\n model.times[0]!,\n model.times[n - 1]!,\n innerWidth,\n );\n return thinTicks(ticks, format, innerWidth).map((tick) => ({\n x: xScale(tick.getTime()),\n label: format(tick),\n }));\n }, [n, model.times, left, right, xScale, locale]);\n\n const onPointerMove = (event: PointerEvent<SVGSVGElement>) => {\n if (n === 0) return;\n const rect = event.currentTarget.getBoundingClientRect();\n const scale = rect.width > 0 ? width / rect.width : 1;\n const px = (event.clientX - rect.left) * scale;\n setHovered(nearestIndex(centers, px));\n };\n\n const hoveredDatum = hovered != null ? data[hovered] : undefined;\n const showLegend = legend ?? series.length > 1;\n const zeroY = yScale(0);\n\n return (\n <ChartShell\n label={label}\n description={model.described}\n height={height}\n width={width}\n containerRef={containerRef}\n loading={loading}\n empty={empty}\n showEmpty={n === 0 && !loading}\n onPlotPointerMove={onPointerMove}\n onPlotPointerLeave={() => setHovered(null)}\n className={className}\n legend={\n showLegend ? (\n <ChartLegend\n items={series.map((s, index) => ({\n label: s.label,\n color: model.colors[index]!,\n kind: \"rect\",\n }))}\n />\n ) : null\n }\n tooltip={\n hovered != null && hoveredDatum != null ? (\n <ChartTooltip\n x={centers[hovered]!}\n width={width}\n top={layout.top}\n heading={model.headingFormat(new Date(hoveredDatum.x))}\n rows={series.map((s, index) => {\n const value = model.columns[hovered]![index]!.value;\n return {\n label: s.label,\n value: value == null ? \"No data\" : model.fullFormat(value),\n color: model.colors[index]!,\n kind: \"rect\",\n };\n })}\n breakdown={hoveredDatum.breakdown}\n breakdownTitle={breakdownTitle}\n valueFormat={model.fullFormat}\n />\n ) : null\n }\n {...props}\n >\n <YAxis\n layout={layout}\n ticks={model.y.ticks}\n labels={model.yLabels}\n scale={yScale}\n />\n <XAxis layout={layout} ticks={xTicks} />\n {hovered != null && hoveredDatum != null && (\n <rect\n x={centers[hovered]! - band / 2}\n y={layout.top}\n width={band}\n height={layout.innerHeight}\n fill=\"var(--background-color-pho-ghost-hover)\"\n />\n )}\n <g data-bars=\"\">\n {model.columns.map((column, i) => {\n const cx = centers[i]!;\n // The topmost drawn segment in each direction gets the corners.\n let lastPositive = -1;\n let lastNegative = -1;\n column.forEach((segment, index) => {\n if (segment.value == null || segment.value === 0) return;\n if (segment.value > 0) lastPositive = index;\n else lastNegative = index;\n });\n return column.map((segment, index) => {\n const { value } = segment;\n if (value == null || value === 0) return null;\n const x = stacked\n ? cx - slot / 2\n : cx - slot / 2 + index * (barWidth + Math.min(2, gap));\n const w = stacked ? slot : barWidth;\n const yFrom = yScale(segment.from);\n const yTo = yScale(segment.to);\n let top = Math.min(yFrom, yTo);\n let h = Math.abs(yFrom - yTo);\n const positive = value > 0;\n // Side by side, every column is its own and gets the corners.\n const outer =\n !stacked ||\n (positive ? index === lastPositive : index === lastNegative);\n // The 2px surface gap: shave 1px off each side of a boundary\n // between two segments, when the segment can spare it.\n if (stacked && h > 3) {\n if (!outer) {\n if (positive) top += 1;\n h -= 1;\n }\n if (segment.from !== 0) {\n if (!positive) top += 1;\n h -= 1;\n }\n }\n return (\n <path\n key={series[index]!.key}\n d={\n outer\n ? barPath(x, top, w, h, positive ? \"top\" : \"bottom\")\n : `M${x},${top}h${w}v${h}h${-w}Z`\n }\n fill={model.colors[index]}\n data-series={series[index]!.key}\n />\n );\n });\n })}\n </g>\n {model.y.domain[0] < 0 && model.y.domain[1] > 0 ? null : (\n <line\n x1={layout.left}\n x2={layout.right}\n y1={zeroY}\n y2={zeroY}\n stroke=\"var(--color-pho-chart-crosshair)\"\n />\n )}\n </ChartShell>\n );\n}\n\nBarChart.displayName = \"BarChart\";\n"],"mappings":"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"}