@photon-ai/pho-ui 2.11.0 → 2.13.0
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.
- package/dist/chunks/badge-DlLJPLeZ.js +78 -0
- package/dist/chunks/badge-DlLJPLeZ.js.map +1 -0
- package/dist/chunks/bar-chart-BJfr3eyd.js +190 -0
- package/dist/chunks/bar-chart-BJfr3eyd.js.map +1 -0
- package/dist/chunks/legend-C0mU7dqd.js +60 -0
- package/dist/chunks/legend-C0mU7dqd.js.map +1 -0
- package/dist/chunks/line-chart-CUR3AxrR.js +453 -0
- package/dist/chunks/line-chart-CUR3AxrR.js.map +1 -0
- package/dist/chunks/stat-hnNqjWVG.js +85 -0
- package/dist/chunks/stat-hnNqjWVG.js.map +1 -0
- package/dist/chunks/use-measure-CMVgLouO.js +616 -0
- package/dist/chunks/use-measure-CMVgLouO.js.map +1 -0
- package/dist/components/badge.js +5 -71
- package/dist/components/bar-chart.js +5 -0
- package/dist/components/chart.js +8 -0
- package/dist/components/line-chart.js +5 -0
- package/dist/components/stat.js +6 -0
- package/dist/components/toggle.js +14 -14
- package/dist/components/toggle.js.map +1 -1
- package/dist/index.js +89 -76
- package/dist/src/components/badge/badge.d.ts +7 -3
- package/dist/src/components/bar-chart/bar-chart.d.ts +9 -0
- package/dist/src/components/bar-chart/index.d.ts +2 -0
- package/dist/src/components/chart/axes.d.ts +22 -0
- package/dist/src/components/chart/color.d.ts +10 -0
- package/dist/src/components/chart/format.d.ts +25 -0
- package/dist/src/components/chart/index.d.ts +8 -0
- package/dist/src/components/chart/legend.d.ts +26 -0
- package/dist/src/components/chart/scale.d.ts +34 -0
- package/dist/src/components/chart/shell.d.ts +42 -0
- package/dist/src/components/chart/tooltip.d.ts +30 -0
- package/dist/src/components/chart/types.d.ts +76 -0
- package/dist/src/components/chart/use-measure.d.ts +8 -0
- package/dist/src/components/line-chart/index.d.ts +2 -0
- package/dist/src/components/line-chart/line-chart.d.ts +11 -0
- package/dist/src/components/stat/index.d.ts +1 -0
- package/dist/src/components/stat/stat.d.ts +61 -0
- package/dist/src/components/toggle/toggle.d.ts +5 -1
- package/dist/src/index.d.ts +4 -0
- package/package.json +23 -1
- package/src/styles/theme.css +51 -0
- package/dist/components/badge.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-measure-CMVgLouO.js","names":[],"sources":["../../src/components/chart/axes.tsx","../../src/components/chart/format.ts","../../../../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/ascending.js","../../../../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/descending.js","../../../../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/bisector.js","../../../../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/ticks.js","../../../../node_modules/.pnpm/d3-time@3.1.0/node_modules/d3-time/src/interval.js","../../../../node_modules/.pnpm/d3-time@3.1.0/node_modules/d3-time/src/millisecond.js","../../../../node_modules/.pnpm/d3-time@3.1.0/node_modules/d3-time/src/duration.js","../../../../node_modules/.pnpm/d3-time@3.1.0/node_modules/d3-time/src/second.js","../../../../node_modules/.pnpm/d3-time@3.1.0/node_modules/d3-time/src/minute.js","../../../../node_modules/.pnpm/d3-time@3.1.0/node_modules/d3-time/src/hour.js","../../../../node_modules/.pnpm/d3-time@3.1.0/node_modules/d3-time/src/day.js","../../../../node_modules/.pnpm/d3-time@3.1.0/node_modules/d3-time/src/week.js","../../../../node_modules/.pnpm/d3-time@3.1.0/node_modules/d3-time/src/month.js","../../../../node_modules/.pnpm/d3-time@3.1.0/node_modules/d3-time/src/year.js","../../../../node_modules/.pnpm/d3-time@3.1.0/node_modules/d3-time/src/ticks.js","../../src/components/chart/scale.ts","../../src/components/chart/shell.tsx","../../src/components/chart/tooltip.tsx","../../src/components/chart/use-measure.ts"],"sourcesContent":["import type { ChartLayout } from \"./shell\";\n\nconst TICK_TEXT = {\n fontSize: 11,\n fill: \"var(--text-color-pho-description)\",\n fontVariantNumeric: \"tabular-nums\",\n} as const;\n\nexport interface YAxisProps {\n layout: ChartLayout;\n ticks: ReadonlyArray<number>;\n labels: ReadonlyArray<string>;\n scale: (value: number) => number;\n}\n\n/**\n * Gridlines across the plot with their labels on the left: hairlines one\n * step off the surface, the zero line a touch stronger so bars read as\n * standing on something.\n */\nexport function YAxis({ layout, ticks, labels, scale }: YAxisProps) {\n return (\n <g aria-hidden>\n {ticks.map((tick, index) => {\n const y = scale(tick);\n return (\n <g key={tick}>\n <line\n x1={layout.left}\n x2={layout.right}\n y1={y}\n y2={y}\n stroke={\n tick === 0\n ? \"var(--color-pho-chart-crosshair)\"\n : \"var(--color-pho-chart-grid)\"\n }\n />\n <text\n x={layout.left - 8}\n y={y}\n dy=\"0.35em\"\n textAnchor=\"end\"\n style={TICK_TEXT}\n >\n {labels[index]}\n </text>\n </g>\n );\n })}\n </g>\n );\n}\n\nexport interface XAxisProps {\n layout: ChartLayout;\n ticks: ReadonlyArray<{ x: number; label: string }>;\n}\n\n/** Time labels along the bottom band; the end labels tuck inside the plot. */\nexport function XAxis({ layout, ticks }: XAxisProps) {\n const y = layout.height - 6;\n return (\n <g aria-hidden>\n {ticks.map(({ x, label }) => {\n const half = (label.length * 6.5) / 2;\n const anchor =\n x - half < layout.left\n ? \"start\"\n : x + half > layout.right\n ? \"end\"\n : \"middle\";\n const tx =\n anchor === \"start\"\n ? Math.max(x, layout.left)\n : anchor === \"end\"\n ? Math.min(x, layout.right)\n : x;\n return (\n <text key={x} x={tx} y={y} textAnchor={anchor} style={TICK_TEXT}>\n {label}\n </text>\n );\n })}\n </g>\n );\n}\n","import type { ChartDatum, ChartSeries } from \"./types\";\n\n/**\n * The default number format: grouped digits for a value someone reads\n * (\"12,001\"), compact for an axis tick (\"12K\") where room is short.\n */\nexport function numberFormatter(\n locale: string | undefined,\n compact = false,\n): (value: number) => string {\n const format = new Intl.NumberFormat(\n locale,\n compact\n ? { notation: \"compact\", maximumFractionDigits: 1 }\n : { maximumFractionDigits: 2 },\n );\n return (value) => format.format(value);\n}\n\n/** A number under a series key, or nothing: missing, null, or not a number. */\nexport function readValue(datum: object, key: string): number | null {\n const value = (datum as Record<string, unknown>)[key];\n return typeof value === \"number\" && Number.isFinite(value) ? value : null;\n}\n\n/** \"Inbound and outbound\", \"p50, p90 and p99\". */\nexport function joinNames(names: ReadonlyArray<string>): string {\n if (names.length <= 1) return names[0] ?? \"\";\n return `${names.slice(0, -1).join(\", \")} and ${names[names.length - 1]}`;\n}\n\ninterface DescribeOptions<T extends ChartDatum> {\n data: ReadonlyArray<T>;\n series: ReadonlyArray<ChartSeries<T>>;\n /** Bars sum to a total; lines run between a low and a high. */\n kind: \"bar\" | \"line\";\n valueFormat: (value: number) => string;\n timeFormat: (date: Date) => string;\n}\n\n/**\n * What the figure says about itself to assistive tech: which series, over\n * what range, and for each one the total (bars) or the low and high\n * (lines), plus where it peaked.\n */\nexport function describeChart<T extends ChartDatum>({\n data,\n series,\n kind,\n valueFormat,\n timeFormat,\n}: DescribeOptions<T>): string {\n if (data.length === 0) return \"No data to show.\";\n const first = data[0]!;\n const last = data[data.length - 1]!;\n const range =\n data.length > 1\n ? `${timeFormat(new Date(first.x))} to ${timeFormat(new Date(last.x))}`\n : timeFormat(new Date(first.x));\n const parts = [`${joinNames(series.map((s) => s.label))}, ${range}.`];\n for (const s of series) {\n let total = 0;\n let min = Infinity;\n let max = -Infinity;\n let peakAt: Date | null = null;\n let seen = 0;\n for (const datum of data) {\n const value = readValue(datum, s.key);\n if (value == null) continue;\n seen++;\n total += value;\n if (value < min) min = value;\n if (value > max) {\n max = value;\n peakAt = new Date(datum.x);\n }\n }\n if (seen === 0) {\n parts.push(`${s.label}: no values.`);\n continue;\n }\n const peak = peakAt\n ? `, peak ${valueFormat(max)} at ${timeFormat(peakAt)}`\n : \"\";\n parts.push(\n kind === \"bar\"\n ? `${s.label}: ${valueFormat(total)} in total${peak}.`\n : `${s.label}: from ${valueFormat(min)} to ${valueFormat(max)}${peak}.`,\n );\n }\n return parts.join(\" \");\n}\n","export default function ascending(a, b) {\n return a == null || b == null ? NaN : a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n","export default function descending(a, b) {\n return a == null || b == null ? NaN\n : b < a ? -1\n : b > a ? 1\n : b >= a ? 0\n : NaN;\n}\n","import ascending from \"./ascending.js\";\nimport descending from \"./descending.js\";\n\nexport default function bisector(f) {\n let compare1, compare2, delta;\n\n // If an accessor is specified, promote it to a comparator. In this case we\n // can test whether the search value is (self-) comparable. We can’t do this\n // for a comparator (except for specific, known comparators) because we can’t\n // tell if the comparator is symmetric, and an asymmetric comparator can’t be\n // used to test whether a single value is comparable.\n if (f.length !== 2) {\n compare1 = ascending;\n compare2 = (d, x) => ascending(f(d), x);\n delta = (d, x) => f(d) - x;\n } else {\n compare1 = f === ascending || f === descending ? f : zero;\n compare2 = f;\n delta = f;\n }\n\n function left(a, x, lo = 0, hi = a.length) {\n if (lo < hi) {\n if (compare1(x, x) !== 0) return hi;\n do {\n const mid = (lo + hi) >>> 1;\n if (compare2(a[mid], x) < 0) lo = mid + 1;\n else hi = mid;\n } while (lo < hi);\n }\n return lo;\n }\n\n function right(a, x, lo = 0, hi = a.length) {\n if (lo < hi) {\n if (compare1(x, x) !== 0) return hi;\n do {\n const mid = (lo + hi) >>> 1;\n if (compare2(a[mid], x) <= 0) lo = mid + 1;\n else hi = mid;\n } while (lo < hi);\n }\n return lo;\n }\n\n function center(a, x, lo = 0, hi = a.length) {\n const i = left(a, x, lo, hi - 1);\n return i > lo && delta(a[i - 1], x) > -delta(a[i], x) ? i - 1 : i;\n }\n\n return {left, center, right};\n}\n\nfunction zero() {\n return 0;\n}\n","const e10 = Math.sqrt(50),\n e5 = Math.sqrt(10),\n e2 = Math.sqrt(2);\n\nfunction tickSpec(start, stop, count) {\n const step = (stop - start) / Math.max(0, count),\n power = Math.floor(Math.log10(step)),\n error = step / Math.pow(10, power),\n factor = error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1;\n let i1, i2, inc;\n if (power < 0) {\n inc = Math.pow(10, -power) / factor;\n i1 = Math.round(start * inc);\n i2 = Math.round(stop * inc);\n if (i1 / inc < start) ++i1;\n if (i2 / inc > stop) --i2;\n inc = -inc;\n } else {\n inc = Math.pow(10, power) * factor;\n i1 = Math.round(start / inc);\n i2 = Math.round(stop / inc);\n if (i1 * inc < start) ++i1;\n if (i2 * inc > stop) --i2;\n }\n if (i2 < i1 && 0.5 <= count && count < 2) return tickSpec(start, stop, count * 2);\n return [i1, i2, inc];\n}\n\nexport default function ticks(start, stop, count) {\n stop = +stop, start = +start, count = +count;\n if (!(count > 0)) return [];\n if (start === stop) return [start];\n const reverse = stop < start, [i1, i2, inc] = reverse ? tickSpec(stop, start, count) : tickSpec(start, stop, count);\n if (!(i2 >= i1)) return [];\n const n = i2 - i1 + 1, ticks = new Array(n);\n if (reverse) {\n if (inc < 0) for (let i = 0; i < n; ++i) ticks[i] = (i2 - i) / -inc;\n else for (let i = 0; i < n; ++i) ticks[i] = (i2 - i) * inc;\n } else {\n if (inc < 0) for (let i = 0; i < n; ++i) ticks[i] = (i1 + i) / -inc;\n else for (let i = 0; i < n; ++i) ticks[i] = (i1 + i) * inc;\n }\n return ticks;\n}\n\nexport function tickIncrement(start, stop, count) {\n stop = +stop, start = +start, count = +count;\n return tickSpec(start, stop, count)[2];\n}\n\nexport function tickStep(start, stop, count) {\n stop = +stop, start = +start, count = +count;\n const reverse = stop < start, inc = reverse ? tickIncrement(stop, start, count) : tickIncrement(start, stop, count);\n return (reverse ? -1 : 1) * (inc < 0 ? 1 / -inc : inc);\n}\n","const t0 = new Date, t1 = new Date;\n\nexport function timeInterval(floori, offseti, count, field) {\n\n function interval(date) {\n return floori(date = arguments.length === 0 ? new Date : new Date(+date)), date;\n }\n\n interval.floor = (date) => {\n return floori(date = new Date(+date)), date;\n };\n\n interval.ceil = (date) => {\n return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;\n };\n\n interval.round = (date) => {\n const d0 = interval(date), d1 = interval.ceil(date);\n return date - d0 < d1 - date ? d0 : d1;\n };\n\n interval.offset = (date, step) => {\n return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;\n };\n\n interval.range = (start, stop, step) => {\n const range = [];\n start = interval.ceil(start);\n step = step == null ? 1 : Math.floor(step);\n if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date\n let previous;\n do range.push(previous = new Date(+start)), offseti(start, step), floori(start);\n while (previous < start && start < stop);\n return range;\n };\n\n interval.filter = (test) => {\n return timeInterval((date) => {\n if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1);\n }, (date, step) => {\n if (date >= date) {\n if (step < 0) while (++step <= 0) {\n while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty\n } else while (--step >= 0) {\n while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty\n }\n }\n });\n };\n\n if (count) {\n interval.count = (start, end) => {\n t0.setTime(+start), t1.setTime(+end);\n floori(t0), floori(t1);\n return Math.floor(count(t0, t1));\n };\n\n interval.every = (step) => {\n step = Math.floor(step);\n return !isFinite(step) || !(step > 0) ? null\n : !(step > 1) ? interval\n : interval.filter(field\n ? (d) => field(d) % step === 0\n : (d) => interval.count(0, d) % step === 0);\n };\n }\n\n return interval;\n}\n","import {timeInterval} from \"./interval.js\";\n\nexport const millisecond = timeInterval(() => {\n // noop\n}, (date, step) => {\n date.setTime(+date + step);\n}, (start, end) => {\n return end - start;\n});\n\n// An optimized implementation for this simple case.\nmillisecond.every = (k) => {\n k = Math.floor(k);\n if (!isFinite(k) || !(k > 0)) return null;\n if (!(k > 1)) return millisecond;\n return timeInterval((date) => {\n date.setTime(Math.floor(date / k) * k);\n }, (date, step) => {\n date.setTime(+date + step * k);\n }, (start, end) => {\n return (end - start) / k;\n });\n};\n\nexport const milliseconds = millisecond.range;\n","export const durationSecond = 1000;\nexport const durationMinute = durationSecond * 60;\nexport const durationHour = durationMinute * 60;\nexport const durationDay = durationHour * 24;\nexport const durationWeek = durationDay * 7;\nexport const durationMonth = durationDay * 30;\nexport const durationYear = durationDay * 365;\n","import {timeInterval} from \"./interval.js\";\nimport {durationSecond} from \"./duration.js\";\n\nexport const second = timeInterval((date) => {\n date.setTime(date - date.getMilliseconds());\n}, (date, step) => {\n date.setTime(+date + step * durationSecond);\n}, (start, end) => {\n return (end - start) / durationSecond;\n}, (date) => {\n return date.getUTCSeconds();\n});\n\nexport const seconds = second.range;\n","import {timeInterval} from \"./interval.js\";\nimport {durationMinute, durationSecond} from \"./duration.js\";\n\nexport const timeMinute = timeInterval((date) => {\n date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond);\n}, (date, step) => {\n date.setTime(+date + step * durationMinute);\n}, (start, end) => {\n return (end - start) / durationMinute;\n}, (date) => {\n return date.getMinutes();\n});\n\nexport const timeMinutes = timeMinute.range;\n\nexport const utcMinute = timeInterval((date) => {\n date.setUTCSeconds(0, 0);\n}, (date, step) => {\n date.setTime(+date + step * durationMinute);\n}, (start, end) => {\n return (end - start) / durationMinute;\n}, (date) => {\n return date.getUTCMinutes();\n});\n\nexport const utcMinutes = utcMinute.range;\n","import {timeInterval} from \"./interval.js\";\nimport {durationHour, durationMinute, durationSecond} from \"./duration.js\";\n\nexport const timeHour = timeInterval((date) => {\n date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond - date.getMinutes() * durationMinute);\n}, (date, step) => {\n date.setTime(+date + step * durationHour);\n}, (start, end) => {\n return (end - start) / durationHour;\n}, (date) => {\n return date.getHours();\n});\n\nexport const timeHours = timeHour.range;\n\nexport const utcHour = timeInterval((date) => {\n date.setUTCMinutes(0, 0, 0);\n}, (date, step) => {\n date.setTime(+date + step * durationHour);\n}, (start, end) => {\n return (end - start) / durationHour;\n}, (date) => {\n return date.getUTCHours();\n});\n\nexport const utcHours = utcHour.range;\n","import {timeInterval} from \"./interval.js\";\nimport {durationDay, durationMinute} from \"./duration.js\";\n\nexport const timeDay = timeInterval(\n date => date.setHours(0, 0, 0, 0),\n (date, step) => date.setDate(date.getDate() + step),\n (start, end) => (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay,\n date => date.getDate() - 1\n);\n\nexport const timeDays = timeDay.range;\n\nexport const utcDay = timeInterval((date) => {\n date.setUTCHours(0, 0, 0, 0);\n}, (date, step) => {\n date.setUTCDate(date.getUTCDate() + step);\n}, (start, end) => {\n return (end - start) / durationDay;\n}, (date) => {\n return date.getUTCDate() - 1;\n});\n\nexport const utcDays = utcDay.range;\n\nexport const unixDay = timeInterval((date) => {\n date.setUTCHours(0, 0, 0, 0);\n}, (date, step) => {\n date.setUTCDate(date.getUTCDate() + step);\n}, (start, end) => {\n return (end - start) / durationDay;\n}, (date) => {\n return Math.floor(date / durationDay);\n});\n\nexport const unixDays = unixDay.range;\n","import {timeInterval} from \"./interval.js\";\nimport {durationMinute, durationWeek} from \"./duration.js\";\n\nfunction timeWeekday(i) {\n return timeInterval((date) => {\n date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7);\n date.setHours(0, 0, 0, 0);\n }, (date, step) => {\n date.setDate(date.getDate() + step * 7);\n }, (start, end) => {\n return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek;\n });\n}\n\nexport const timeSunday = timeWeekday(0);\nexport const timeMonday = timeWeekday(1);\nexport const timeTuesday = timeWeekday(2);\nexport const timeWednesday = timeWeekday(3);\nexport const timeThursday = timeWeekday(4);\nexport const timeFriday = timeWeekday(5);\nexport const timeSaturday = timeWeekday(6);\n\nexport const timeSundays = timeSunday.range;\nexport const timeMondays = timeMonday.range;\nexport const timeTuesdays = timeTuesday.range;\nexport const timeWednesdays = timeWednesday.range;\nexport const timeThursdays = timeThursday.range;\nexport const timeFridays = timeFriday.range;\nexport const timeSaturdays = timeSaturday.range;\n\nfunction utcWeekday(i) {\n return timeInterval((date) => {\n date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7);\n date.setUTCHours(0, 0, 0, 0);\n }, (date, step) => {\n date.setUTCDate(date.getUTCDate() + step * 7);\n }, (start, end) => {\n return (end - start) / durationWeek;\n });\n}\n\nexport const utcSunday = utcWeekday(0);\nexport const utcMonday = utcWeekday(1);\nexport const utcTuesday = utcWeekday(2);\nexport const utcWednesday = utcWeekday(3);\nexport const utcThursday = utcWeekday(4);\nexport const utcFriday = utcWeekday(5);\nexport const utcSaturday = utcWeekday(6);\n\nexport const utcSundays = utcSunday.range;\nexport const utcMondays = utcMonday.range;\nexport const utcTuesdays = utcTuesday.range;\nexport const utcWednesdays = utcWednesday.range;\nexport const utcThursdays = utcThursday.range;\nexport const utcFridays = utcFriday.range;\nexport const utcSaturdays = utcSaturday.range;\n","import {timeInterval} from \"./interval.js\";\n\nexport const timeMonth = timeInterval((date) => {\n date.setDate(1);\n date.setHours(0, 0, 0, 0);\n}, (date, step) => {\n date.setMonth(date.getMonth() + step);\n}, (start, end) => {\n return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;\n}, (date) => {\n return date.getMonth();\n});\n\nexport const timeMonths = timeMonth.range;\n\nexport const utcMonth = timeInterval((date) => {\n date.setUTCDate(1);\n date.setUTCHours(0, 0, 0, 0);\n}, (date, step) => {\n date.setUTCMonth(date.getUTCMonth() + step);\n}, (start, end) => {\n return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;\n}, (date) => {\n return date.getUTCMonth();\n});\n\nexport const utcMonths = utcMonth.range;\n","import {timeInterval} from \"./interval.js\";\n\nexport const timeYear = timeInterval((date) => {\n date.setMonth(0, 1);\n date.setHours(0, 0, 0, 0);\n}, (date, step) => {\n date.setFullYear(date.getFullYear() + step);\n}, (start, end) => {\n return end.getFullYear() - start.getFullYear();\n}, (date) => {\n return date.getFullYear();\n});\n\n// An optimized implementation for this simple case.\ntimeYear.every = (k) => {\n return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : timeInterval((date) => {\n date.setFullYear(Math.floor(date.getFullYear() / k) * k);\n date.setMonth(0, 1);\n date.setHours(0, 0, 0, 0);\n }, (date, step) => {\n date.setFullYear(date.getFullYear() + step * k);\n });\n};\n\nexport const timeYears = timeYear.range;\n\nexport const utcYear = timeInterval((date) => {\n date.setUTCMonth(0, 1);\n date.setUTCHours(0, 0, 0, 0);\n}, (date, step) => {\n date.setUTCFullYear(date.getUTCFullYear() + step);\n}, (start, end) => {\n return end.getUTCFullYear() - start.getUTCFullYear();\n}, (date) => {\n return date.getUTCFullYear();\n});\n\n// An optimized implementation for this simple case.\nutcYear.every = (k) => {\n return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : timeInterval((date) => {\n date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k);\n date.setUTCMonth(0, 1);\n date.setUTCHours(0, 0, 0, 0);\n }, (date, step) => {\n date.setUTCFullYear(date.getUTCFullYear() + step * k);\n });\n};\n\nexport const utcYears = utcYear.range;\n","import {bisector, tickStep} from \"d3-array\";\nimport {durationDay, durationHour, durationMinute, durationMonth, durationSecond, durationWeek, durationYear} from \"./duration.js\";\nimport {millisecond} from \"./millisecond.js\";\nimport {second} from \"./second.js\";\nimport {timeMinute, utcMinute} from \"./minute.js\";\nimport {timeHour, utcHour} from \"./hour.js\";\nimport {timeDay, unixDay} from \"./day.js\";\nimport {timeSunday, utcSunday} from \"./week.js\";\nimport {timeMonth, utcMonth} from \"./month.js\";\nimport {timeYear, utcYear} from \"./year.js\";\n\nfunction ticker(year, month, week, day, hour, minute) {\n\n const tickIntervals = [\n [second, 1, durationSecond],\n [second, 5, 5 * durationSecond],\n [second, 15, 15 * durationSecond],\n [second, 30, 30 * durationSecond],\n [minute, 1, durationMinute],\n [minute, 5, 5 * durationMinute],\n [minute, 15, 15 * durationMinute],\n [minute, 30, 30 * durationMinute],\n [ hour, 1, durationHour ],\n [ hour, 3, 3 * durationHour ],\n [ hour, 6, 6 * durationHour ],\n [ hour, 12, 12 * durationHour ],\n [ day, 1, durationDay ],\n [ day, 2, 2 * durationDay ],\n [ week, 1, durationWeek ],\n [ month, 1, durationMonth ],\n [ month, 3, 3 * durationMonth ],\n [ year, 1, durationYear ]\n ];\n\n function ticks(start, stop, count) {\n const reverse = stop < start;\n if (reverse) [start, stop] = [stop, start];\n const interval = count && typeof count.range === \"function\" ? count : tickInterval(start, stop, count);\n const ticks = interval ? interval.range(start, +stop + 1) : []; // inclusive stop\n return reverse ? ticks.reverse() : ticks;\n }\n\n function tickInterval(start, stop, count) {\n const target = Math.abs(stop - start) / count;\n const i = bisector(([,, step]) => step).right(tickIntervals, target);\n if (i === tickIntervals.length) return year.every(tickStep(start / durationYear, stop / durationYear, count));\n if (i === 0) return millisecond.every(Math.max(tickStep(start, stop, count), 1));\n const [t, step] = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i];\n return t.every(step);\n }\n\n return [ticks, tickInterval];\n}\n\nconst [utcTicks, utcTickInterval] = ticker(utcYear, utcMonth, utcSunday, unixDay, utcHour, utcMinute);\nconst [timeTicks, timeTickInterval] = ticker(timeYear, timeMonth, timeSunday, timeDay, timeHour, timeMinute);\n\nexport {utcTicks, utcTickInterval, timeTicks, timeTickInterval};\n","import { tickStep, ticks } from \"d3-array\";\nimport { timeDay, timeTicks, timeYear } from \"d3-time\";\n\n/** Epoch milliseconds for a datum's `x`. */\nexport function toTime(x: Date | number): number {\n return typeof x === \"number\" ? x : x.getTime();\n}\n\n/** A linear map from `domain` to `range`; a flat domain maps to its start. */\nexport function linearScale(\n domain: readonly [number, number],\n range: readonly [number, number],\n): (value: number) => number {\n const [d0, d1] = domain;\n const [r0, r1] = range;\n const span = d1 - d0;\n if (span === 0) return () => r0;\n return (value) => r0 + ((value - d0) / span) * (r1 - r0);\n}\n\n/**\n * A y domain on round numbers with three to five ticks, the last tick on\n * or above the data's high end so the top of the plot is labelled.\n */\nexport function niceLinearDomain(\n min: number,\n max: number,\n): { domain: [number, number]; ticks: number[] } {\n if (!Number.isFinite(min) || !Number.isFinite(max)) {\n return { domain: [0, 1], ticks: [0, 0.5, 1] };\n }\n if (min > max) [min, max] = [max, min];\n if (min === max) {\n // A flat series still needs room to sit in.\n if (max === 0) return { domain: [0, 1], ticks: [0, 0.5, 1] };\n if (max > 0) min = 0;\n else max = 0;\n }\n for (let count = 4; count >= 2; count--) {\n const step = tickStep(min, max, count);\n const lo = Math.floor(min / step) * step;\n const hi = Math.ceil(max / step) * step;\n const values = ticks(lo, hi, count);\n if (values.length <= 5 || count === 2) {\n return { domain: [lo, hi], ticks: values };\n }\n }\n return { domain: [min, max], ticks: [min, max] };\n}\n\n/** The gap between buckets, in ms — the median step, so one hole doesn't skew it. */\nexport function bucketSpan(times: ReadonlyArray<number>): number {\n if (times.length < 2) return 0;\n const steps = [];\n for (let i = 1; i < times.length; i++) steps.push(times[i]! - times[i - 1]!);\n steps.sort((a, b) => a - b);\n return steps[Math.floor(steps.length / 2)]!;\n}\n\nconst DAY = 86_400_000;\n\n/**\n * Time ticks for a plot `width` px wide: one every ~96px, on the round\n * boundaries d3-time picks (5 minutes, an hour, a day, a month…).\n */\nexport function timeAxisTicks(\n start: number,\n stop: number,\n width: number,\n): Date[] {\n if (stop <= start || width <= 0) return [new Date(start)];\n const count = Math.max(2, Math.floor(width / 96));\n const chosen = timeTicks(new Date(start), new Date(stop), count);\n // d3's every-nth-day interval counts from the first of the month, so a\n // two-day step reads Aug 29, Aug 31, Sep 1, Sep 3. Re-step multi-day\n // ticks evenly from the first one instead.\n if (chosen.length > 2 && chosen.every((t) => isMidnight(t))) {\n const gaps = chosen.slice(1).map((t, i) => timeDay.count(chosen[i]!, t));\n const step = Math.max(...gaps);\n if (step > 1 && gaps.some((gap) => gap !== step)) {\n return timeDay.range(chosen[0]!, new Date(stop + 1), step);\n }\n }\n return chosen;\n}\n\nfunction isMidnight(date: Date): boolean {\n return timeDay(date).getTime() === date.getTime();\n}\n\n/**\n * Labels a tick by the boundary it sits on: a time within a day, a date at\n * midnight, month and year at a new year. `Intl` does the wording, so the\n * labels follow the locale.\n */\nexport function timeTickFormatter(locale?: string): (date: Date) => string {\n const time = new Intl.DateTimeFormat(locale, {\n hour: \"numeric\",\n minute: \"2-digit\",\n });\n const day = new Intl.DateTimeFormat(locale, {\n month: \"short\",\n day: \"numeric\",\n });\n const year = new Intl.DateTimeFormat(locale, {\n month: \"short\",\n year: \"numeric\",\n });\n return (date) => {\n if (timeDay(date).getTime() < date.getTime()) return time.format(date);\n if (timeYear(date).getTime() < date.getTime()) return day.format(date);\n return year.format(date);\n };\n}\n\n/**\n * The tooltip's heading for a bucket: the date alone when buckets are a\n * day or longer, date and time below that.\n */\nexport function bucketTimeFormatter(\n locale: string | undefined,\n span: number,\n): (date: Date) => string {\n const format = new Intl.DateTimeFormat(\n locale,\n span >= DAY\n ? { month: \"short\", day: \"numeric\" }\n : { month: \"short\", day: \"numeric\", hour: \"numeric\", minute: \"2-digit\" },\n );\n return (date) => format.format(date);\n}\n\n/** Estimated width of a tick label at the axis's 11px, with breathing room. */\nfunction labelWidth(label: string): number {\n return label.length * 6.5 + 16;\n}\n\n/** Keep every nth tick so the labels fit the width without touching. */\nexport function thinTicks<T>(\n values: ReadonlyArray<T>,\n labelOf: (value: T) => string,\n width: number,\n): T[] {\n if (values.length < 2) return [...values];\n const widest = Math.max(...values.map((value) => labelWidth(labelOf(value))));\n const fit = Math.max(1, Math.floor(width / widest));\n const every = Math.ceil(values.length / fit);\n if (every <= 1) return [...values];\n return values.filter((_, index) => index % every === 0);\n}\n\n/** The index of the position nearest `px` in an ascending list. */\nexport function nearestIndex(positions: ReadonlyArray<number>, px: number) {\n if (positions.length === 0) return -1;\n let lo = 0;\n let hi = positions.length - 1;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (positions[mid]! < px) lo = mid + 1;\n else hi = mid;\n }\n if (lo > 0 && px - positions[lo - 1]! < positions[lo]! - px) return lo - 1;\n return lo;\n}\n","import {\n useId,\n type ComponentProps,\n type PointerEvent,\n type ReactNode,\n type RefObject,\n} from \"react\";\nimport { cn } from \"../../utils/cn\";\n\n/** The inner box the marks draw in, once the axes have taken their bands. */\nexport interface ChartLayout {\n width: number;\n height: number;\n left: number;\n top: number;\n right: number;\n bottom: number;\n innerWidth: number;\n innerHeight: number;\n}\n\nconst TOP = 8;\nconst RIGHT = 8;\nconst X_AXIS = 22;\n\n/** The plot's box for a measured width and the y-axis labels it must fit. */\nexport function chartLayout(\n width: number,\n height: number,\n yLabels: ReadonlyArray<string>,\n): ChartLayout {\n const widest = yLabels.reduce((max, label) => Math.max(max, label.length), 0);\n const left = Math.ceil(widest * 6.5) + 10;\n const bottom = height - X_AXIS;\n return {\n width,\n height,\n left,\n top: TOP,\n right: width - RIGHT,\n bottom,\n innerWidth: Math.max(0, width - left - RIGHT),\n innerHeight: Math.max(0, bottom - TOP),\n };\n}\n\nexport interface ChartShellProps extends Omit<\n ComponentProps<\"div\">,\n \"children\"\n> {\n /** The figure's `aria-label`. */\n label: string;\n /** The figure's spoken summary. */\n description: string;\n height: number;\n /** The measured width; 0 before the browser has measured. */\n width: number;\n containerRef: RefObject<HTMLDivElement | null>;\n legend?: ReactNode;\n tooltip?: ReactNode;\n loading?: boolean;\n empty?: ReactNode;\n /** The frame says `empty` instead of drawing. */\n showEmpty?: boolean;\n /** The pointer over the plot — the chart snaps to the nearest bucket. */\n onPlotPointerMove?: (event: PointerEvent<SVGSVGElement>) => void;\n onPlotPointerLeave?: () => void;\n children?: ReactNode;\n}\n\n/**\n * The frame every chart draws in: a fixed-height plot box holding the\n * SVG (`role=\"img\"`, labelled and described for assistive tech), the\n * tooltip layer over it, the legend on its own line below. Width comes\n * from the parent; `height` covers the plot and the x-axis band, so a\n * card never grows a nested scroll.\n */\nexport function ChartShell({\n label,\n description,\n height,\n width,\n containerRef,\n legend,\n tooltip,\n loading,\n empty,\n showEmpty,\n onPlotPointerMove,\n onPlotPointerLeave,\n className,\n children,\n ...props\n}: ChartShellProps) {\n const descriptionId = useId();\n return (\n <div\n data-chart=\"\"\n className={cn(\"flex w-full min-w-0 flex-col gap-3\", className)}\n {...props}\n >\n <div\n ref={containerRef}\n aria-busy={loading || undefined}\n className={cn(\n \"relative w-full transition-opacity duration-150 ease-out\",\n loading && \"opacity-50\",\n )}\n style={{ height }}\n >\n <svg\n // An inline SVG figure is `role=\"img\"` by the SVG-AAM; there is\n // no <img> to reach for.\n // oxlint-disable-next-line jsx-a11y/prefer-tag-over-role\n role=\"img\"\n aria-label={label}\n aria-describedby={descriptionId}\n width=\"100%\"\n height={height}\n viewBox={width > 0 ? `0 0 ${width} ${height}` : undefined}\n className=\"animate-pho-chart-in block overflow-visible select-none\"\n onPointerMove={onPlotPointerMove}\n onPointerLeave={onPlotPointerLeave}\n >\n {width > 0 && !showEmpty ? children : null}\n </svg>\n <p id={descriptionId} className=\"sr-only\">\n {description}\n </p>\n {showEmpty && (\n <div className=\"text-pho-description absolute inset-0 flex items-center justify-center text-xs\">\n {empty}\n </div>\n )}\n {tooltip}\n </div>\n {legend}\n </div>\n );\n}\n","import { type ReactNode } from \"react\";\nimport { ChartSwatch, type ChartSwatchKind } from \"./legend\";\nimport type { ChartBreakdownItem } from \"./types\";\n\nexport interface ChartTooltipRow {\n label: string;\n value: string;\n color: string;\n kind?: ChartSwatchKind;\n dashed?: boolean;\n}\n\nexport interface ChartTooltipProps {\n /** The snapped x of the hovered bucket, in container px. */\n x: number;\n /** The container's width — the tooltip flips to the left past the middle. */\n width: number;\n /** Where the tooltip's top sits — the plot's top. */\n top: number;\n heading: string;\n rows: ReadonlyArray<ChartTooltipRow>;\n breakdown?: ReadonlyArray<ChartBreakdownItem>;\n breakdownTitle?: ReactNode;\n valueFormat: (value: number) => string;\n}\n\n/**\n * The readout for one bucket: its time, then every series' value (values\n * lead, in primary ink; labels follow), then the bucket's breakdown when\n * it carries one. Presentational — the figure's description already\n * speaks the data — and it never takes the pointer.\n */\nexport function ChartTooltip({\n x,\n width,\n top,\n heading,\n rows,\n breakdown,\n breakdownTitle,\n valueFormat,\n}: ChartTooltipProps) {\n const flip = x > width / 2;\n return (\n <div\n aria-hidden\n data-chart-tooltip=\"\"\n className=\"bg-pho-primary shadow-pho-lg ring-pho-secondary rounded-base pointer-events-none absolute z-10 max-w-72 min-w-40 px-3 py-2 text-xs ring-1 ring-inset\"\n style={flip ? { right: width - x + 12, top } : { left: x + 12, top }}\n >\n <div className=\"text-pho-primary font-medium\">{heading}</div>\n <ul className=\"mt-1 flex flex-col gap-0.5\">\n {rows.map((row) => (\n <li\n key={row.label}\n className=\"flex items-center justify-between gap-4\"\n >\n <span className=\"text-pho-secondary flex min-w-0 items-center gap-1.5\">\n <ChartSwatch\n color={row.color}\n kind={row.kind}\n dashed={row.dashed}\n />\n <span className=\"truncate\">{row.label}</span>\n </span>\n <span className=\"text-pho-primary font-medium tabular-nums\">\n {row.value}\n </span>\n </li>\n ))}\n </ul>\n {breakdown != null && breakdown.length > 0 && (\n <div className=\"border-pho-secondary mt-2 border-t pt-2\">\n {breakdownTitle != null && (\n <div className=\"text-pho-description mb-1\">{breakdownTitle}</div>\n )}\n <ul className=\"flex flex-col gap-0.5\">\n {breakdown.map((item) => (\n <li\n key={item.label}\n className=\"flex items-center justify-between gap-4\"\n >\n <span className=\"text-pho-secondary truncate\">\n {item.label}\n </span>\n <span className=\"text-pho-primary tabular-nums\">\n {valueFormat(item.value)}\n </span>\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n );\n}\n","import {\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type RefObject,\n} from \"react\";\n\n// React 18 warns that useLayoutEffect does nothing on the server (19 dropped\n// the warning); a plain effect there keeps a server render quiet.\nconst useIsomorphicLayoutEffect =\n typeof window === \"undefined\" ? useEffect : useLayoutEffect;\n\n/**\n * The width of the element the ref lands on, kept current through a\n * ResizeObserver. Nothing runs on the server: the first render is 0 wide\n * and the plot fills in once the browser has measured. A `fixed` width\n * skips measuring altogether.\n */\nexport function useMeasuredWidth<T extends HTMLElement>(\n fixed?: number,\n): [RefObject<T | null>, number] {\n const ref = useRef<T>(null);\n const [width, setWidth] = useState(0);\n useIsomorphicLayoutEffect(() => {\n if (fixed != null) return;\n const element = ref.current;\n if (element == null) return;\n setWidth(element.getBoundingClientRect().width);\n if (typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver((entries) => {\n const next = entries[0]?.contentRect.width;\n if (next != null) setWidth(next);\n });\n observer.observe(element);\n return () => observer.disconnect();\n }, [fixed]);\n return [ref, fixed ?? width];\n}\n"],"x_google_ignoreList":[2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],"mappings":"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"}
|
package/dist/components/badge.js
CHANGED
|
@@ -1,74 +1,8 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import {
|
|
3
|
-
import { t as a } from "../chunks/resolve-variant-CcD8iG5l.js";
|
|
4
|
-
import "react";
|
|
5
|
-
import { jsx as l } from "react/jsx-runtime";
|
|
6
|
-
var p = "inline-flex shrink-0 items-center whitespace-nowrap rounded-full font-medium", d = "bg-current/10 ring-1 ring-current/20 ring-inset", h = {
|
|
7
|
-
xs: {
|
|
8
|
-
classes: "h-4 gap-0.5 px-1.5 text-[10px] leading-none",
|
|
9
|
-
description: "Extra small — 16px; inline next to 14px labels (plan chips)"
|
|
10
|
-
},
|
|
11
|
-
sm: {
|
|
12
|
-
classes: "h-5 gap-0.5 px-2 text-xs leading-none",
|
|
13
|
-
description: "Small — 20px; dense rows, table cells"
|
|
14
|
-
},
|
|
15
|
-
md: {
|
|
16
|
-
classes: "h-6 gap-1 px-2.5 text-xs leading-none",
|
|
17
|
-
description: "Medium — 24px; the default"
|
|
18
|
-
}
|
|
19
|
-
}, c = {
|
|
20
|
-
gray: {
|
|
21
|
-
high: "bg-pho-inverse text-pho-inverse",
|
|
22
|
-
low: "text-pho-secondary",
|
|
23
|
-
description: "Neutral — the low-signal default (solid inverse)"
|
|
24
|
-
},
|
|
25
|
-
muted: {
|
|
26
|
-
high: "bg-pho-secondary text-pho-primary",
|
|
27
|
-
low: "text-pho-description",
|
|
28
|
-
description: "Muted — soft solid surface for quieter labels (Free, Shared)"
|
|
29
|
-
},
|
|
30
|
-
brand: {
|
|
31
|
-
high: "bg-pho-brand-solid text-pho-on-brand",
|
|
32
|
-
low: "text-pho-brand",
|
|
33
|
-
description: "Brand — plan tiers, feature flags, highlights"
|
|
34
|
-
},
|
|
35
|
-
success: {
|
|
36
|
-
high: "bg-pho-success-ink text-pho-on-brand",
|
|
37
|
-
low: "text-pho-success",
|
|
38
|
-
description: "Success — healthy, live, complete"
|
|
39
|
-
},
|
|
40
|
-
warning: {
|
|
41
|
-
high: "bg-pho-warning-ink text-pho-on-brand",
|
|
42
|
-
low: "text-pho-warning",
|
|
43
|
-
description: "Warning — needs attention, degraded"
|
|
44
|
-
},
|
|
45
|
-
error: {
|
|
46
|
-
high: "bg-pho-error-ink text-pho-on-brand",
|
|
47
|
-
low: "text-pho-error",
|
|
48
|
-
description: "Error — failed, blocked, over limit"
|
|
49
|
-
}
|
|
50
|
-
};
|
|
51
|
-
function g(r) {
|
|
52
|
-
const { color: t = "gray", contrast: n = "high", size: i = "md", className: o } = r ?? {}, e = c[t];
|
|
53
|
-
return s(p, a(h, i), n === "low" ? s(d, e?.low) : e?.high, o);
|
|
54
|
-
}
|
|
55
|
-
function x({ color: r, contrast: t, size: n, className: i, children: o, ...e }) {
|
|
56
|
-
return /* @__PURE__ */ l("span", {
|
|
57
|
-
className: s(g({
|
|
58
|
-
color: r,
|
|
59
|
-
contrast: t,
|
|
60
|
-
size: n
|
|
61
|
-
}), i),
|
|
62
|
-
...e,
|
|
63
|
-
children: o
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
x.displayName = "Badge";
|
|
2
|
+
import { i as s, n as e, r, t } from "../chunks/badge-DlLJPLeZ.js";
|
|
67
3
|
export {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
4
|
+
t as BADGE_COLORS,
|
|
5
|
+
e as BADGE_SIZES,
|
|
6
|
+
r as Badge,
|
|
7
|
+
s as badgeVariants
|
|
72
8
|
};
|
|
73
|
-
|
|
74
|
-
//# sourceMappingURL=badge.js.map
|
|
@@ -1,33 +1,33 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { t
|
|
3
|
-
import { t as
|
|
2
|
+
import { t } from "../chunks/cn-ChIgwEl3.js";
|
|
3
|
+
import { t as i } from "../chunks/resolve-variant-CcD8iG5l.js";
|
|
4
4
|
import "react";
|
|
5
|
-
import { jsx as
|
|
5
|
+
import { jsx as r } from "react/jsx-runtime";
|
|
6
6
|
import { Toggle as a } from "@base-ui/react/toggle";
|
|
7
|
-
var
|
|
7
|
+
var n = {
|
|
8
8
|
sm: {
|
|
9
|
-
classes: "
|
|
10
|
-
description: "Small — dense toolbars"
|
|
9
|
+
classes: "h-8 min-w-8 px-2 text-xs [&>svg]:size-4",
|
|
10
|
+
description: "Small — dense toolbars, a range picker"
|
|
11
11
|
},
|
|
12
12
|
md: {
|
|
13
|
-
classes: "
|
|
13
|
+
classes: "h-9 min-w-9 px-2 text-base [&>svg]:size-5",
|
|
14
14
|
description: "Medium — the default"
|
|
15
15
|
},
|
|
16
16
|
lg: {
|
|
17
|
-
classes: "
|
|
17
|
+
classes: "h-10 min-w-10 px-2.5 text-base [&>svg]:size-5",
|
|
18
18
|
description: "Large"
|
|
19
19
|
}
|
|
20
20
|
};
|
|
21
|
-
function
|
|
22
|
-
return /* @__PURE__ */
|
|
23
|
-
className:
|
|
21
|
+
function l({ className: e, size: s = "md", ...o }) {
|
|
22
|
+
return /* @__PURE__ */ r(a, {
|
|
23
|
+
className: t("squircle outline-pho-brand text-pho-secondary rounded-base inline-flex cursor-pointer items-center justify-center gap-1.5 font-medium whitespace-nowrap transition duration-100 ease-linear focus-visible:outline-2 focus-visible:outline-offset-2", "hover:bg-pho-ghost-hover hover:text-pho-secondary-hover", "data-[pressed]:bg-pho-inverse data-[pressed]:text-pho-inverse", "data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50", i(n, s), e),
|
|
24
24
|
...o
|
|
25
25
|
});
|
|
26
26
|
}
|
|
27
|
-
|
|
27
|
+
l.displayName = "Toggle";
|
|
28
28
|
export {
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
n as TOGGLE_SIZES,
|
|
30
|
+
l as Toggle
|
|
31
31
|
};
|
|
32
32
|
|
|
33
33
|
//# sourceMappingURL=toggle.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toggle.js","names":[],"sources":["../../src/components/toggle/toggle.tsx"],"sourcesContent":["import { type ComponentProps } from \"react\";\nimport { Toggle as BaseToggle } from \"@base-ui/react/toggle\";\nimport { cn } from \"../../utils/cn\";\nimport { resolveVariant, type VariantMap } from \"../../utils/resolve-variant\";\n\n
|
|
1
|
+
{"version":3,"file":"toggle.js","names":[],"sources":["../../src/components/toggle/toggle.tsx"],"sourcesContent":["import { type ComponentProps } from \"react\";\nimport { Toggle as BaseToggle } from \"@base-ui/react/toggle\";\nimport { cn } from \"../../utils/cn\";\nimport { resolveVariant, type VariantMap } from \"../../utils/resolve-variant\";\n\n/**\n * Size axis — three heights. An icon-only toggle is square (the padding\n * plus the icon add up to the height); one carrying a short label — a\n * range picker's `7d` — grows to fit it. `md` is default.\n */\nexport const TOGGLE_SIZES = {\n sm: {\n classes: \"h-8 min-w-8 px-2 text-xs [&>svg]:size-4\",\n description: \"Small — dense toolbars, a range picker\",\n },\n md: {\n classes: \"h-9 min-w-9 px-2 text-base [&>svg]:size-5\",\n description: \"Medium — the default\",\n },\n lg: {\n classes: \"h-10 min-w-10 px-2.5 text-base [&>svg]:size-5\",\n description: \"Large\",\n },\n} satisfies VariantMap;\n\nexport type ToggleSize = keyof typeof TOGGLE_SIZES;\n\nexport interface ToggleProps extends Omit<\n ComponentProps<typeof BaseToggle>,\n \"className\"\n> {\n className?: string;\n /** Size variant. @default \"md\" */\n size?: ToggleSize;\n}\n\n/**\n * A two-state button (pressed / not pressed) built on Base UI `Toggle` — the\n * canonical Bold/Italic toolbar control. Controlled via `pressed` /\n * `onPressedChange` or uncontrolled via `defaultPressed`. For a set of related\n * toggles, use `ToggleGroup`.\n */\nexport function Toggle({ className, size = \"md\", ...props }: ToggleProps) {\n return (\n <BaseToggle\n className={cn(\n \"squircle outline-pho-brand text-pho-secondary rounded-base inline-flex cursor-pointer items-center justify-center gap-1.5 font-medium whitespace-nowrap transition duration-100 ease-linear focus-visible:outline-2 focus-visible:outline-offset-2\",\n // Ghost control at rest — hover is the alpha wash (Button `tertiary`\n // idiom), not the card-surface hover token.\n \"hover:bg-pho-ghost-hover hover:text-pho-secondary-hover\",\n // Pressed = the site's inverted chip (Tab active): dark chip in light\n // mode, light chip in dark mode — visible on any surface.\n \"data-[pressed]:bg-pho-inverse data-[pressed]:text-pho-inverse\",\n \"data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50\",\n resolveVariant(TOGGLE_SIZES, size),\n className,\n )}\n {...props}\n />\n );\n}\n\nToggle.displayName = \"Toggle\";\n"],"mappings":";;;;;;AAUA,IAAa,IAAe;AAAA,EAC1B,IAAI;AAAA,IACF,SAAS;AAAA,IACT,aAAa;AAAA,EACf;AAAA,EACA,IAAI;AAAA,IACF,SAAS;AAAA,IACT,aAAa;AAAA,EACf;AAAA,EACA,IAAI;AAAA,IACF,SAAS;AAAA,IACT,aAAa;AAAA,EACf;AACF;AAmBA,SAAgB,EAAO,EAAE,WAAA,GAAW,MAAA,IAAO,MAAM,GAAG,EAAA,GAAsB;AACxE,SACE,gBAAA,EAAC,GAAD;AAAA,IACE,WAAW,EACT,sPAGA,2DAGA,iEACA,iEACA,EAAe,GAAc,CAAI,GACjC,CACF;AAAA,IACA,GAAI;AAAA,EACL,CAAA;AAEL;AAEA,EAAO,cAAc"}
|
package/dist/index.js
CHANGED
|
@@ -1,101 +1,114 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { t as
|
|
3
|
-
import { t } from "./chunks/is-react-component-DSnjtBmo.js";
|
|
4
|
-
import { t as
|
|
5
|
-
import { n as
|
|
6
|
-
import { BAR_RISE_PX as
|
|
7
|
-
import { n as
|
|
2
|
+
import { t as s } from "./chunks/cn-ChIgwEl3.js";
|
|
3
|
+
import { t as r } from "./chunks/is-react-component-DSnjtBmo.js";
|
|
4
|
+
import { t as o } from "./chunks/resolve-variant-CcD8iG5l.js";
|
|
5
|
+
import { n as _, t as A } from "./chunks/link-provider-DXzDQ08N.js";
|
|
6
|
+
import { BAR_RISE_PX as R, BLUR_PX as m, EASE_POP as I, EASE_STACK as T, FADE_ENTRANCE as e, FADE_SWAP as n, PRESS_SCALE as C, PRESS_SCALE_ROW as P, RISE_PX as p, SPRING_ENTRANCE as N, SPRING_PRESS as B, SPRING_PRESS_INLINE as f, SPRING_PRESS_QUICK as O, SPRING_SETTLE as u, TRAVEL_LINEAR as L, fadeThroughBlur as D, riseIn as c } from "./motion.js";
|
|
7
|
+
import { n as G, r as V, t as U } from "./chunks/use-press-pulse-IbNstUT0.js";
|
|
8
8
|
import "./utils.js";
|
|
9
|
-
import { a as
|
|
9
|
+
import { a as M, c as g, d as F, i as W, l as b, n as k, o as X, r as v, s as w, t as H, u as Z } from "./chunks/button-CdqS_t5a.js";
|
|
10
10
|
import { a as K, c as Y, i as z, l as Q, n as j, o as q, r as y, s as J, t as $ } from "./chunks/error-D0yoFxCv.js";
|
|
11
|
-
import { a as
|
|
12
|
-
import { o as
|
|
13
|
-
import { a as
|
|
14
|
-
import { t as
|
|
15
|
-
import { t as
|
|
16
|
-
import { t as
|
|
17
|
-
import {
|
|
18
|
-
import { n as
|
|
19
|
-
import {
|
|
11
|
+
import { a as sa, c as ta, d as ra, f as Ea, i as oa, l as Sa, m as _a, n as Aa, o as ia, p as Ra, r as ma, s as Ia, t as Ta, u as ea } from "./chunks/basic-page-CJwG4I83.js";
|
|
12
|
+
import { o as Ca } from "./chunks/data-table-CHLJfGkS.js";
|
|
13
|
+
import { a as pa, c as Na, i as Ba, n as fa, o as Oa, r as ua, s as La, t as Da } from "./chunks/sidebar-DVzZsCts.js";
|
|
14
|
+
import { t as la } from "./chunks/input-DjvZoF8v.js";
|
|
15
|
+
import { n as Va, t as Ua } from "./chunks/stat-hnNqjWVG.js";
|
|
16
|
+
import { t as da } from "./chunks/close-button-GvqWbLl0.js";
|
|
17
|
+
import { t as ga } from "./chunks/input-group-fc9_jD4d.js";
|
|
18
|
+
import { n as Wa, t as ba } from "./chunks/card-DSW3Uhag.js";
|
|
19
|
+
import { n as Xa, t as va } from "./chunks/dialog-BxKACOj5.js";
|
|
20
|
+
import { i as Ha, n as Za, r as xa, t as Ka } from "./chunks/status-view-C8tabjDu.js";
|
|
20
21
|
import "./components/status-view.js";
|
|
22
|
+
import { i as Qa, n as ja, r as qa, t as ya } from "./chunks/legend-C0mU7dqd.js";
|
|
23
|
+
import "./components/chart.js";
|
|
24
|
+
import { t as as } from "./chunks/bar-chart-BJfr3eyd.js";
|
|
25
|
+
import { t as ts } from "./chunks/line-chart-CUR3AxrR.js";
|
|
21
26
|
export {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
27
|
+
Ta as AUTO_SAVE_DELAY_MS,
|
|
28
|
+
R as BAR_RISE_PX,
|
|
29
|
+
Aa as BASIC_PAGE_CALLOUT,
|
|
30
|
+
ma as BASIC_PAGE_CARD,
|
|
31
|
+
oa as BASIC_PAGE_ITEM,
|
|
32
|
+
sa as BASIC_PAGE_ITEM_PANEL,
|
|
33
|
+
ia as BASIC_PAGE_ITEM_PANEL_DIVIDED,
|
|
34
|
+
Ia as BASIC_PAGE_ROW,
|
|
35
|
+
m as BLUR_PX,
|
|
36
|
+
H as BUTTON_COLORS,
|
|
32
37
|
k as BUTTON_SHAPES,
|
|
33
38
|
v as BUTTON_SIZES,
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
39
|
+
W as BUTTON_VARIANTS,
|
|
40
|
+
as as BarChart,
|
|
41
|
+
ta as BasicPage,
|
|
42
|
+
M as Button,
|
|
37
43
|
X as ButtonLink,
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
44
|
+
ba as CARD_SURFACE,
|
|
45
|
+
qa as CHART_SLOTS,
|
|
46
|
+
Sa as CONDENSE_BAR_ENTER,
|
|
47
|
+
ea as CONDENSE_BAR_RISE_PX,
|
|
48
|
+
ra as CONDENSE_BAR_TRAVEL,
|
|
42
49
|
U as CONTROL_PRESS_SCALE,
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
50
|
+
G as CONTROL_PRESS_SPRING,
|
|
51
|
+
Wa as Card,
|
|
52
|
+
ya as ChartLegend,
|
|
53
|
+
ja as ChartSwatch,
|
|
54
|
+
da as CloseButton,
|
|
55
|
+
va as Dialog,
|
|
56
|
+
I as EASE_POP,
|
|
57
|
+
T as EASE_STACK,
|
|
58
|
+
w as EFFECT_BUTTON_SIZES,
|
|
59
|
+
g as EffectButton,
|
|
60
|
+
b as EffectButtonLink,
|
|
52
61
|
$ as Error,
|
|
53
62
|
j as ErrorView,
|
|
54
63
|
e as FADE_ENTRANCE,
|
|
55
64
|
n as FADE_SWAP,
|
|
56
65
|
y as GENERIC_ERROR_TITLE,
|
|
57
|
-
|
|
58
|
-
|
|
66
|
+
la as Input,
|
|
67
|
+
ga as InputGroup,
|
|
68
|
+
ts as LineChart,
|
|
59
69
|
A as LinkProvider,
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
70
|
+
C as PRESS_SCALE,
|
|
71
|
+
P as PRESS_SCALE_ROW,
|
|
72
|
+
p as RISE_PX,
|
|
73
|
+
Da as SIDEBAR_HEADER_INSET,
|
|
74
|
+
fa as SIDEBAR_ITEM,
|
|
75
|
+
ua as SIDEBAR_ITEM_ACTIVE,
|
|
76
|
+
Ba as SIDEBAR_ITEM_INACTIVE,
|
|
77
|
+
pa as SIDEBAR_ROOT,
|
|
78
|
+
Oa as SIDEBAR_ROOT_BASE,
|
|
79
|
+
La as SIDEBAR_ROOT_INSET,
|
|
80
|
+
N as SPRING_ENTRANCE,
|
|
81
|
+
B as SPRING_PRESS,
|
|
82
|
+
f as SPRING_PRESS_INLINE,
|
|
83
|
+
O as SPRING_PRESS_QUICK,
|
|
74
84
|
u as SPRING_SETTLE,
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
85
|
+
Ka as STATUS_VIEW,
|
|
86
|
+
Za as STATUS_VIEW_COPY,
|
|
87
|
+
xa as STATUS_VIEW_SIZES,
|
|
88
|
+
Na as Sidebar,
|
|
89
|
+
Ua as Stat,
|
|
90
|
+
Va as StatGroup,
|
|
91
|
+
Ha as StatusView,
|
|
80
92
|
L as TRAVEL_LINEAR,
|
|
81
|
-
|
|
93
|
+
Z as buttonVariants,
|
|
82
94
|
z as capitalizeFirst,
|
|
83
|
-
|
|
84
|
-
|
|
95
|
+
Qa as chartColor,
|
|
96
|
+
s as cn,
|
|
97
|
+
Ca as createColumns,
|
|
85
98
|
K as describeError,
|
|
86
|
-
|
|
99
|
+
F as effectButtonVariants,
|
|
87
100
|
D as fadeThroughBlur,
|
|
88
|
-
|
|
101
|
+
Ea as formToasts,
|
|
89
102
|
q as httpReasonPhrase,
|
|
90
103
|
J as httpStatusExplanation,
|
|
91
104
|
Y as isProblem,
|
|
92
|
-
|
|
105
|
+
r as isReactComponent,
|
|
93
106
|
Q as parseProblem,
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
107
|
+
o as resolveVariant,
|
|
108
|
+
c as riseIn,
|
|
109
|
+
Ra as useAutoSave,
|
|
110
|
+
_a as useCondense,
|
|
111
|
+
Xa as useDialogPending,
|
|
112
|
+
_ as useLinkComponent,
|
|
113
|
+
V as usePressPulse
|
|
101
114
|
};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { ComponentProps } from 'react';
|
|
2
2
|
/**
|
|
3
|
-
* Size axis — fixed heights on a 4px step (16 / 20 / 24) so the ladder
|
|
4
|
-
* proportional. Horizontal padding and type scale with each step;
|
|
5
|
-
* centering comes from `items-center` on the base (no `py`).
|
|
3
|
+
* Size axis — fixed heights on a 4px step (16 / 20 / 24 / 28) so the ladder
|
|
4
|
+
* stays proportional. Horizontal padding and type scale with each step;
|
|
5
|
+
* vertical centering comes from `items-center` on the base (no `py`).
|
|
6
6
|
*/
|
|
7
7
|
export declare const BADGE_SIZES: {
|
|
8
8
|
xs: {
|
|
@@ -17,6 +17,10 @@ export declare const BADGE_SIZES: {
|
|
|
17
17
|
classes: string;
|
|
18
18
|
description: string;
|
|
19
19
|
};
|
|
20
|
+
lg: {
|
|
21
|
+
classes: string;
|
|
22
|
+
description: string;
|
|
23
|
+
};
|
|
20
24
|
};
|
|
21
25
|
/**
|
|
22
26
|
* Color axis — a closed semantic set with one recipe per contrast. `high`
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ChartBaseProps, ChartDatum } from '../chart/types';
|
|
2
|
+
export interface BarChartProps<T extends ChartDatum> extends ChartBaseProps<T> {
|
|
3
|
+
/** Stack the series in one column per bucket, first series at the bottom. */
|
|
4
|
+
stacked?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export declare function BarChart<T extends ChartDatum>({ data, series, label, description, height, width: fixedWidth, valueFormat, timeFormat, locale, legend, baseline, stacked, breakdownTitle, loading, empty, className, ...props }: BarChartProps<T>): import("react").JSX.Element;
|
|
7
|
+
export declare namespace BarChart {
|
|
8
|
+
var displayName: string;
|
|
9
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { ChartLayout } from './shell';
|
|
2
|
+
export interface YAxisProps {
|
|
3
|
+
layout: ChartLayout;
|
|
4
|
+
ticks: ReadonlyArray<number>;
|
|
5
|
+
labels: ReadonlyArray<string>;
|
|
6
|
+
scale: (value: number) => number;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Gridlines across the plot with their labels on the left: hairlines one
|
|
10
|
+
* step off the surface, the zero line a touch stronger so bars read as
|
|
11
|
+
* standing on something.
|
|
12
|
+
*/
|
|
13
|
+
export declare function YAxis({ layout, ticks, labels, scale }: YAxisProps): import("react").JSX.Element;
|
|
14
|
+
export interface XAxisProps {
|
|
15
|
+
layout: ChartLayout;
|
|
16
|
+
ticks: ReadonlyArray<{
|
|
17
|
+
x: number;
|
|
18
|
+
label: string;
|
|
19
|
+
}>;
|
|
20
|
+
}
|
|
21
|
+
/** Time labels along the bottom band; the end labels tuck inside the plot. */
|
|
22
|
+
export declare function XAxis({ layout, ticks }: XAxisProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ChartColor } from './types';
|
|
2
|
+
/** The categorical slots, in the order series take them. */
|
|
3
|
+
export declare const CHART_SLOTS: readonly ["chart-1", "chart-2", "chart-3", "chart-4", "chart-5", "chart-6"];
|
|
4
|
+
/**
|
|
5
|
+
* The CSS value for a series colour: the named colour, or the categorical
|
|
6
|
+
* slot at `index` when the series names none. Slots are an ordered,
|
|
7
|
+
* validated set — a seventh series wraps, so fold a long tail into
|
|
8
|
+
* "Other" before it gets there.
|
|
9
|
+
*/
|
|
10
|
+
export declare function chartColor(color: ChartColor | undefined, index: number): string;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { ChartDatum, ChartSeries } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* The default number format: grouped digits for a value someone reads
|
|
4
|
+
* ("12,001"), compact for an axis tick ("12K") where room is short.
|
|
5
|
+
*/
|
|
6
|
+
export declare function numberFormatter(locale: string | undefined, compact?: boolean): (value: number) => string;
|
|
7
|
+
/** A number under a series key, or nothing: missing, null, or not a number. */
|
|
8
|
+
export declare function readValue(datum: object, key: string): number | null;
|
|
9
|
+
/** "Inbound and outbound", "p50, p90 and p99". */
|
|
10
|
+
export declare function joinNames(names: ReadonlyArray<string>): string;
|
|
11
|
+
interface DescribeOptions<T extends ChartDatum> {
|
|
12
|
+
data: ReadonlyArray<T>;
|
|
13
|
+
series: ReadonlyArray<ChartSeries<T>>;
|
|
14
|
+
/** Bars sum to a total; lines run between a low and a high. */
|
|
15
|
+
kind: "bar" | "line";
|
|
16
|
+
valueFormat: (value: number) => string;
|
|
17
|
+
timeFormat: (date: Date) => string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* What the figure says about itself to assistive tech: which series, over
|
|
21
|
+
* what range, and for each one the total (bars) or the low and high
|
|
22
|
+
* (lines), plus where it peaked.
|
|
23
|
+
*/
|
|
24
|
+
export declare function describeChart<T extends ChartDatum>({ data, series, kind, valueFormat, timeFormat, }: DescribeOptions<T>): string;
|
|
25
|
+
export {};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chart foundation — what `BarChart` and `LineChart` share and a page may
|
|
3
|
+
* want on its own: the data contract, the series colour resolver, and the
|
|
4
|
+
* legend. Axes, scales, the shell and the tooltip stay internal.
|
|
5
|
+
*/
|
|
6
|
+
export type { ChartBaseProps, ChartBreakdownItem, ChartColor, ChartDatum, ChartSeries, ChartValueKey, } from './types';
|
|
7
|
+
export { chartColor, CHART_SLOTS } from './color';
|
|
8
|
+
export { ChartLegend, ChartSwatch, type ChartLegendItem, type ChartLegendProps, type ChartSwatchKind, type ChartSwatchProps, } from './legend';
|