@audere/ui 0.3.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/ai/index.d.ts +32 -0
- package/dist/ai/index.js +98 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/charts/index.d.ts +78 -0
- package/dist/charts/index.js +388 -0
- package/dist/charts/index.js.map +1 -0
- package/dist/composition/index.d.ts +27 -0
- package/dist/composition/index.js +61 -0
- package/dist/composition/index.js.map +1 -0
- package/dist/data/index.d.ts +73 -0
- package/dist/data/index.js +320 -0
- package/dist/data/index.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.js +1350 -0
- package/dist/index.js.map +1 -0
- package/dist/layout/index.d.ts +107 -0
- package/dist/layout/index.js +232 -0
- package/dist/layout/index.js.map +1 -0
- package/dist/lib/utils.d.ts +5 -0
- package/dist/lib/utils.js +11 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/primitives/index.d.ts +29 -0
- package/dist/primitives/index.js +163 -0
- package/dist/primitives/index.js.map +1 -0
- package/dist/surface/index.d.ts +16 -0
- package/dist/surface/index.js +38 -0
- package/dist/surface/index.js.map +1 -0
- package/dist/theme/index.d.ts +72 -0
- package/dist/theme/index.js +60 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/workflow/index.d.ts +38 -0
- package/dist/workflow/index.js +101 -0
- package/dist/workflow/index.js.map +1 -0
- package/package.json +108 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/utils.ts","../../src/surface/Surface.tsx","../../src/charts/ChartContainer.tsx","../../src/charts/SharedPieChart.tsx","../../src/charts/SharedBarChart.tsx","../../src/charts/SharedAreaChart.tsx","../../src/charts/CashflowChart.tsx"],"names":["jsx","jsxs","RechartsPieChart","ResponsiveContainer","RechartsBarChart","Tooltip","DEFAULT_FILL","RechartsAreaChart","CartesianGrid","XAxis","YAxis","ReferenceLine","Area"],"mappings":"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","file":"index.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../lib/utils\";\n\nconst surfaceVariants = cva(\n \"rounded-xl border border-border bg-card text-card-foreground shadow-sm\",\n {\n variants: {\n padding: {\n none: \"p-0\",\n sm: \"p-4\",\n md: \"p-6\",\n },\n },\n defaultVariants: {\n padding: \"none\",\n },\n },\n);\n\nexport type SurfaceProps = React.ComponentProps<\"div\"> &\n VariantProps<typeof surfaceVariants>;\n\n/**\n * Default elevated panel for tables, metrics, charts, and grouped content.\n * Uses theme CSS variables (`--card`, `--border`); host apps must define :root tokens.\n */\nexport function Surface({ className, padding, ...props }: SurfaceProps) {\n return (\n <div\n data-slot=\"surface\"\n className={cn(surfaceVariants({ padding }), className)}\n {...props}\n />\n );\n}\n\nexport { surfaceVariants };\n","import type { ReactNode } from \"react\";\n\nimport { Surface } from \"../surface/Surface\";\nimport { cn } from \"../lib/utils\";\n\nexport type ChartContainerProps = {\n title?: string;\n className?: string;\n height?: number;\n children: ReactNode;\n};\n\n/** Wrapper for shared chart cards: consistent surface, height, optional title. */\nexport function ChartContainer({\n title,\n className = \"\",\n height = 280,\n children,\n}: ChartContainerProps) {\n return (\n <Surface className={cn(\"flex flex-col overflow-hidden\", className)}>\n {title ? (\n <div className=\"px-6 pb-2 pt-4\">\n <h3 className=\"text-sm font-semibold text-foreground\">{title}</h3>\n </div>\n ) : null}\n <div className=\"flex-1 px-4 pb-4\" style={{ minHeight: height }}>\n {children}\n </div>\n </Surface>\n );\n}\n","import {\n PieChart as RechartsPieChart,\n Pie,\n Cell,\n Tooltip,\n Legend,\n ResponsiveContainer,\n} from \"recharts\";\nimport { ChartContainer } from \"./ChartContainer\";\n\nconst AUDERE_CHART_COLORS = [\n \"#0f172a\", // navy900\n \"#14b8a6\", // teal500\n \"#64748b\", // slate-500\n \"#0d9488\", // teal-600\n \"#94a3b8\", // slate-400\n \"#2dd4bf\", // teal-400\n];\n\nexport type PieChartDataItem = {\n name: string;\n value: number;\n};\n\nexport type SharedPieChartProps = {\n data: PieChartDataItem[];\n title?: string;\n height?: number;\n showLegend?: boolean;\n /** Name of the value field for tooltip (e.g. \"Clients\", \"Revenue\") */\n valueLabel?: string;\n};\n\nexport function SharedPieChart({\n data,\n title,\n height = 280,\n showLegend = true,\n valueLabel = \"Value\",\n}: SharedPieChartProps) {\n return (\n <ChartContainer title={title} height={height}>\n <ResponsiveContainer width=\"100%\" height={height}>\n <RechartsPieChart margin={{ top: 8, right: 8, bottom: 8, left: 8 }}>\n <Pie\n data={data}\n cx=\"50%\"\n cy=\"50%\"\n innerRadius={60}\n outerRadius={90}\n paddingAngle={2}\n dataKey=\"value\"\n nameKey=\"name\"\n label={({ name, percent }) => `${name} ${(percent * 100).toFixed(0)}%`}\n labelLine={false}\n >\n {data.map((_, index) => (\n <Cell\n key={`cell-${index}`}\n fill={AUDERE_CHART_COLORS[index % AUDERE_CHART_COLORS.length]}\n stroke=\"white\"\n strokeWidth={2}\n />\n ))}\n </Pie>\n <Tooltip\n formatter={(value: number) => [value, valueLabel]}\n contentStyle={{\n borderRadius: \"8px\",\n border: \"1px solid var(--border)\",\n backgroundColor: \"var(--card)\",\n color: \"var(--card-foreground)\",\n boxShadow: \"0 1px 3px 0 rgb(15 23 42 / 0.08)\",\n fontSize: \"12px\",\n }}\n labelStyle={{ color: \"var(--foreground)\", fontWeight: 600 }}\n />\n {showLegend && (\n <Legend\n verticalAlign=\"bottom\"\n height={36}\n formatter={(value: string, entry: any) => (\n <span className=\"text-xs text-muted-foreground\">\n {value}\n {entry?.payload?.payload?.value != null && ` (${entry.payload.payload.value})`}\n </span>\n )}\n />\n )}\n </RechartsPieChart>\n </ResponsiveContainer>\n </ChartContainer>\n );\n}\n","import {\n BarChart as RechartsBarChart,\n Bar,\n XAxis,\n YAxis,\n CartesianGrid,\n Tooltip,\n ResponsiveContainer,\n ReferenceLine,\n} from \"recharts\";\nimport { ChartContainer } from \"./ChartContainer\";\n\nexport type BarChartDataItem = Record<string, string | number>;\n\nexport type SharedBarChartProps = {\n data: BarChartDataItem[];\n /** Key in each item for the category axis (e.g. \"name\", \"month\") */\n dataKey: string;\n /** Key(s) for the bar value(s). Single = one bar series, multiple = grouped/stacked */\n valueKeys?: string[];\n title?: string;\n height?: number;\n /** Optional reference line value (e.g. monthly target) */\n referenceLine?: { value: number; label?: string };\n /** Bar fill colour (default Audere teal) */\n fill?: string;\n};\n\nconst DEFAULT_FILL = \"#14b8a6\";\n\nexport function SharedBarChart({\n data,\n dataKey,\n valueKeys = [\"value\"],\n title,\n height = 260,\n referenceLine,\n fill = DEFAULT_FILL,\n}: SharedBarChartProps) {\n const colors = [\"#14b8a6\", \"#0f172a\", \"#64748b\", \"#0d9488\"];\n\n return (\n <ChartContainer title={title} height={height}>\n <ResponsiveContainer width=\"100%\" height={height}>\n <RechartsBarChart\n data={data}\n margin={{ top: 8, right: 8, bottom: 8, left: 8 }}\n >\n <CartesianGrid strokeDasharray=\"3 3\" vertical={false} stroke=\"#e2e8f0\" />\n <XAxis\n dataKey={dataKey}\n axisLine={false}\n tickLine={false}\n tick={{ fontSize: 12, fill: \"#64748b\" }}\n dy={8}\n />\n <YAxis\n axisLine={false}\n tickLine={false}\n tick={{ fontSize: 12, fill: \"#64748b\" }}\n dx={-8}\n />\n <Tooltip\n contentStyle={{\n borderRadius: \"8px\",\n border: \"1px solid var(--border)\",\n backgroundColor: \"var(--card)\",\n color: \"var(--card-foreground)\",\n boxShadow: \"0 1px 3px 0 rgb(15 23 42 / 0.08)\",\n fontSize: \"12px\",\n }}\n cursor={{ fill: \"var(--muted)\" }}\n />\n {referenceLine != null && (\n <ReferenceLine\n y={referenceLine.value}\n stroke=\"#dc2626\"\n strokeDasharray=\"4 4\"\n label={{\n value: referenceLine.label ?? \"Target\",\n position: \"right\",\n fontSize: 11,\n fill: \"#64748b\",\n }}\n />\n )}\n {valueKeys.map((key, idx) => (\n <Bar\n key={key}\n dataKey={key}\n fill={colors[idx % colors.length]}\n radius={[4, 4, 0, 0]}\n name={key.replace(/([A-Z])/g, \" $1\").trim()}\n />\n ))}\n </RechartsBarChart>\n </ResponsiveContainer>\n </ChartContainer>\n );\n}\n","import {\n AreaChart as RechartsAreaChart,\n Area,\n XAxis,\n YAxis,\n CartesianGrid,\n Tooltip,\n ResponsiveContainer,\n} from \"recharts\";\nimport { ChartContainer } from \"./ChartContainer\";\n\nexport type AreaChartDataItem = Record<string, string | number>;\n\nexport type SharedAreaChartProps = {\n data: AreaChartDataItem[];\n dataKey: string;\n valueKey: string;\n title?: string;\n height?: number;\n /** Optional second series key for stacked/dual area (e.g. inflow vs outflow) */\n secondaryValueKey?: string;\n fill?: string;\n};\n\nconst DEFAULT_FILL = \"#0f172a\";\nconst SECONDARY_FILL = \"#14b8a6\";\n\nexport function SharedAreaChart({\n data,\n dataKey,\n valueKey,\n title,\n height = 260,\n secondaryValueKey,\n fill = DEFAULT_FILL,\n}: SharedAreaChartProps) {\n return (\n <ChartContainer title={title} height={height}>\n <ResponsiveContainer width=\"100%\" height={height}>\n <RechartsAreaChart\n data={data}\n margin={{ top: 8, right: 8, bottom: 8, left: 8 }}\n >\n <defs>\n <linearGradient id=\"areaFill\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"5%\" stopColor={fill} stopOpacity={0.35} />\n <stop offset=\"95%\" stopColor={fill} stopOpacity={0} />\n </linearGradient>\n {secondaryValueKey && (\n <linearGradient id=\"areaFillSecondary\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"5%\" stopColor={SECONDARY_FILL} stopOpacity={0.35} />\n <stop offset=\"95%\" stopColor={SECONDARY_FILL} stopOpacity={0} />\n </linearGradient>\n )}\n </defs>\n <CartesianGrid strokeDasharray=\"3 3\" vertical={false} stroke=\"#e2e8f0\" />\n <XAxis\n dataKey={dataKey}\n axisLine={false}\n tickLine={false}\n tick={{ fontSize: 12, fill: \"#64748b\" }}\n dy={8}\n />\n <YAxis\n axisLine={false}\n tickLine={false}\n tick={{ fontSize: 12, fill: \"#64748b\" }}\n dx={-8}\n />\n <Tooltip\n contentStyle={{\n borderRadius: \"8px\",\n border: \"1px solid var(--border)\",\n backgroundColor: \"var(--card)\",\n color: \"var(--card-foreground)\",\n boxShadow: \"0 1px 3px 0 rgb(15 23 42 / 0.08)\",\n fontSize: \"12px\",\n }}\n />\n {secondaryValueKey && (\n <Area\n type=\"monotone\"\n dataKey={secondaryValueKey}\n stroke={SECONDARY_FILL}\n strokeWidth={2}\n fill=\"url(#areaFillSecondary)\"\n />\n )}\n <Area\n type=\"monotone\"\n dataKey={valueKey}\n stroke={fill}\n strokeWidth={2}\n fill=\"url(#areaFill)\"\n />\n </RechartsAreaChart>\n </ResponsiveContainer>\n </ChartContainer>\n );\n}\n","import {\n AreaChart as RechartsAreaChart,\n Area,\n XAxis,\n YAxis,\n CartesianGrid,\n Tooltip,\n ResponsiveContainer,\n ReferenceLine,\n} from \"recharts\";\nimport { ChartContainer } from \"./ChartContainer\";\n\nexport type CashflowChartDataItem = {\n /** Period label (e.g. \"Jan\", \"Q1\") */\n period: string;\n /** Inflow amount */\n inflow: number;\n /** Outflow amount */\n outflow: number;\n /** Optional net (inflow - outflow); computed if not provided */\n net?: number;\n};\n\nexport type CashflowChartProps = {\n data: CashflowChartDataItem[];\n title?: string;\n height?: number;\n /** Currency or unit for tooltip (e.g. \"£\", \"$\") */\n currency?: string;\n};\n\nfunction formatValue(value: number, currency = \"\"): string {\n const abs = Math.abs(value);\n const sign = value < 0 ? \"−\" : \"\";\n if (abs >= 1_000_000) return `${sign}${currency}${(abs / 1_000_000).toFixed(1)}M`;\n if (abs >= 1_000) return `${sign}${currency}${(abs / 1_000).toFixed(1)}k`;\n return `${sign}${currency}${abs.toLocaleString()}`;\n}\n\nexport function CashflowChart({\n data,\n title,\n height = 260,\n currency = \"£\",\n}: CashflowChartProps) {\n const series = data.map((d) => ({\n ...d,\n net: d.net ?? d.inflow - d.outflow,\n }));\n\n return (\n <ChartContainer title={title} height={height}>\n <ResponsiveContainer width=\"100%\" height={height}>\n <RechartsAreaChart\n data={series}\n margin={{ top: 8, right: 8, bottom: 8, left: 8 }}\n >\n <defs>\n <linearGradient id=\"cashflowNet\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"5%\" stopColor=\"#14b8a6\" stopOpacity={0.4} />\n <stop offset=\"95%\" stopColor=\"#14b8a6\" stopOpacity={0} />\n </linearGradient>\n </defs>\n <CartesianGrid strokeDasharray=\"3 3\" vertical={false} stroke=\"#e2e8f0\" />\n <XAxis\n dataKey=\"period\"\n axisLine={false}\n tickLine={false}\n tick={{ fontSize: 12, fill: \"#64748b\" }}\n dy={8}\n />\n <YAxis\n axisLine={false}\n tickLine={false}\n tick={{ fontSize: 12, fill: \"#64748b\" }}\n dx={-8}\n tickFormatter={(v) => formatValue(v, currency)}\n />\n <ReferenceLine y={0} stroke=\"#94a3b8\" strokeDasharray=\"2 2\" />\n <Tooltip\n contentStyle={{\n borderRadius: \"8px\",\n border: \"1px solid #e2e8f0\",\n boxShadow: \"0 1px 3px 0 rgb(15 23 42 / 0.08)\",\n fontSize: \"12px\",\n }}\n formatter={(value: any, name: any) => [\n formatValue(Number(value), currency),\n name === \"inflow\" ? \"Inflow\" : name === \"outflow\" ? \"Outflow\" : \"Net\",\n ]}\n labelFormatter={(label) => `Period: ${label}`}\n content={({ active, payload, label }: any) => {\n if (!active || !payload?.length || !label) return null;\n const row = series.find((d) => d.period === label);\n return (\n <div className=\"rounded-lg border border-border bg-card px-3 py-2 text-card-foreground shadow-sm\">\n <div className=\"mb-1.5 text-xs font-semibold\">{label}</div>\n {row && (\n <div className=\"grid grid-cols-1 gap-0.5 text-xs text-muted-foreground\">\n <span>Inflow: {formatValue(row.inflow, currency)}</span>\n <span>Outflow: {formatValue(row.outflow, currency)}</span>\n <span className=\"font-medium text-foreground\">\n Net: {formatValue(row.net ?? row.inflow - row.outflow, currency)}\n </span>\n </div>\n )}\n </div>\n );\n }}\n />\n <Area\n type=\"monotone\"\n dataKey=\"net\"\n stroke=\"#14b8a6\"\n strokeWidth={2}\n fill=\"url(#cashflowNet)\"\n name=\"net\"\n />\n </RechartsAreaChart>\n </ResponsiveContainer>\n </ChartContainer>\n );\n}\n"]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
|
|
4
|
+
type PageHeaderProps = {
|
|
5
|
+
title: string;
|
|
6
|
+
description?: string;
|
|
7
|
+
actions?: ReactNode;
|
|
8
|
+
className?: string;
|
|
9
|
+
};
|
|
10
|
+
declare function PageHeader({ title, description, actions, className, }: PageHeaderProps): react_jsx_runtime.JSX.Element;
|
|
11
|
+
|
|
12
|
+
type SectionProps = {
|
|
13
|
+
children: ReactNode;
|
|
14
|
+
title?: string;
|
|
15
|
+
description?: string;
|
|
16
|
+
className?: string;
|
|
17
|
+
};
|
|
18
|
+
declare function Section({ title, description, children, className, }: SectionProps): react_jsx_runtime.JSX.Element;
|
|
19
|
+
|
|
20
|
+
type ToolbarProps = {
|
|
21
|
+
children: ReactNode;
|
|
22
|
+
className?: string;
|
|
23
|
+
};
|
|
24
|
+
/** Primary row for filters, bulk actions, or view controls above a table or list. */
|
|
25
|
+
declare function Toolbar({ children, className }: ToolbarProps): react_jsx_runtime.JSX.Element;
|
|
26
|
+
|
|
27
|
+
export { PageHeader, type PageHeaderProps, Section, type SectionProps, Toolbar, type ToolbarProps };
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { clsx } from 'clsx';
|
|
2
|
+
import { twMerge } from 'tailwind-merge';
|
|
3
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
4
|
+
|
|
5
|
+
// src/lib/utils.ts
|
|
6
|
+
function cn(...inputs) {
|
|
7
|
+
return twMerge(clsx(inputs));
|
|
8
|
+
}
|
|
9
|
+
function PageHeader({
|
|
10
|
+
title,
|
|
11
|
+
description,
|
|
12
|
+
actions,
|
|
13
|
+
className
|
|
14
|
+
}) {
|
|
15
|
+
return /* @__PURE__ */ jsxs(
|
|
16
|
+
"header",
|
|
17
|
+
{
|
|
18
|
+
className: cn(
|
|
19
|
+
"flex flex-col gap-4 border-b border-border pb-8 sm:flex-row sm:items-start sm:justify-between",
|
|
20
|
+
className
|
|
21
|
+
),
|
|
22
|
+
children: [
|
|
23
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0 space-y-1", children: [
|
|
24
|
+
/* @__PURE__ */ jsx("h1", { className: "text-3xl font-semibold tracking-tight text-foreground", children: title }),
|
|
25
|
+
description ? /* @__PURE__ */ jsx("p", { className: "text-lg text-muted-foreground", children: description }) : null
|
|
26
|
+
] }),
|
|
27
|
+
actions ? /* @__PURE__ */ jsx("div", { className: "flex shrink-0 flex-wrap items-center gap-2", children: actions }) : null
|
|
28
|
+
]
|
|
29
|
+
}
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
function Section({
|
|
33
|
+
title,
|
|
34
|
+
description,
|
|
35
|
+
children,
|
|
36
|
+
className
|
|
37
|
+
}) {
|
|
38
|
+
return /* @__PURE__ */ jsxs("section", { className: cn("space-y-4", className), children: [
|
|
39
|
+
title || description ? /* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
|
|
40
|
+
title ? /* @__PURE__ */ jsx("h2", { className: "text-xl font-semibold tracking-tight text-foreground", children: title }) : null,
|
|
41
|
+
description ? /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: description }) : null
|
|
42
|
+
] }) : null,
|
|
43
|
+
children
|
|
44
|
+
] });
|
|
45
|
+
}
|
|
46
|
+
function Toolbar({ children, className }) {
|
|
47
|
+
return /* @__PURE__ */ jsx(
|
|
48
|
+
"div",
|
|
49
|
+
{
|
|
50
|
+
className: cn(
|
|
51
|
+
"flex flex-col gap-3 sm:flex-row sm:flex-wrap sm:items-center sm:justify-between",
|
|
52
|
+
className
|
|
53
|
+
),
|
|
54
|
+
children
|
|
55
|
+
}
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export { PageHeader, Section, Toolbar };
|
|
60
|
+
//# sourceMappingURL=index.js.map
|
|
61
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/utils.ts","../../src/composition/PageHeader.tsx","../../src/composition/Section.tsx","../../src/composition/Toolbar.tsx"],"names":["jsxs","jsx"],"mappings":";;;;;AAGO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;ACMO,SAAS,UAAA,CAAW;AAAA,EACzB,KAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAAoB;AAClB,EAAA,uBACE,IAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,+FAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mBAAA,EACb,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uDAAA,EACX,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,UACC,8BACC,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAiC,uBAAY,CAAA,GACxD;AAAA,SAAA,EACN,CAAA;AAAA,QACC,0BACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CAAA,EAA8C,mBAAQ,CAAA,GACnE;AAAA;AAAA;AAAA,GACN;AAEJ;AC1BO,SAAS,OAAA,CAAQ;AAAA,EACtB,KAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAAiB;AACf,EAAA,uBACEA,IAAAA,CAAC,SAAA,EAAA,EAAQ,WAAW,EAAA,CAAG,WAAA,EAAa,SAAS,CAAA,EAC1C,QAAA,EAAA;AAAA,IAAA,KAAA,IAAS,WAAA,mBACRA,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,WAAA,EACZ,QAAA,EAAA;AAAA,MAAA,KAAA,mBACCC,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,sDAAA,EACX,iBACH,CAAA,GACE,IAAA;AAAA,MACH,8BACCA,GAAAA,CAAC,OAAE,SAAA,EAAU,+BAAA,EAAiC,uBAAY,CAAA,GACxD;AAAA,KAAA,EACN,CAAA,GACE,IAAA;AAAA,IACH;AAAA,GAAA,EACH,CAAA;AAEJ;ACxBO,SAAS,OAAA,CAAQ,EAAE,QAAA,EAAU,SAAA,EAAU,EAAiB;AAC7D,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,iFAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ","file":"index.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import type { ReactNode } from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\nexport type PageHeaderProps = {\n title: string;\n description?: string;\n actions?: ReactNode;\n className?: string;\n};\n\nexport function PageHeader({\n title,\n description,\n actions,\n className,\n}: PageHeaderProps) {\n return (\n <header\n className={cn(\n \"flex flex-col gap-4 border-b border-border pb-8 sm:flex-row sm:items-start sm:justify-between\",\n className,\n )}\n >\n <div className=\"min-w-0 space-y-1\">\n <h1 className=\"text-3xl font-semibold tracking-tight text-foreground\">\n {title}\n </h1>\n {description ? (\n <p className=\"text-lg text-muted-foreground\">{description}</p>\n ) : null}\n </div>\n {actions ? (\n <div className=\"flex shrink-0 flex-wrap items-center gap-2\">{actions}</div>\n ) : null}\n </header>\n );\n}\n","import type { ReactNode } from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\nexport type SectionProps = {\n children: ReactNode;\n title?: string;\n description?: string;\n className?: string;\n};\n\nexport function Section({\n title,\n description,\n children,\n className,\n}: SectionProps) {\n return (\n <section className={cn(\"space-y-4\", className)}>\n {title || description ? (\n <div className=\"space-y-1\">\n {title ? (\n <h2 className=\"text-xl font-semibold tracking-tight text-foreground\">\n {title}\n </h2>\n ) : null}\n {description ? (\n <p className=\"text-sm text-muted-foreground\">{description}</p>\n ) : null}\n </div>\n ) : null}\n {children}\n </section>\n );\n}\n","import type { ReactNode } from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\nexport type ToolbarProps = {\n children: ReactNode;\n className?: string;\n};\n\n/** Primary row for filters, bulk actions, or view controls above a table or list. */\nexport function Toolbar({ children, className }: ToolbarProps) {\n return (\n <div\n className={cn(\n \"flex flex-col gap-3 sm:flex-row sm:flex-wrap sm:items-center sm:justify-between\",\n className,\n )}\n >\n {children}\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
|
|
4
|
+
type Column<T> = {
|
|
5
|
+
key: keyof T;
|
|
6
|
+
header: string;
|
|
7
|
+
render?: (row: T) => ReactNode;
|
|
8
|
+
};
|
|
9
|
+
type DataTableProps<T extends {
|
|
10
|
+
id: string | number;
|
|
11
|
+
}> = {
|
|
12
|
+
columns: Column<T>[];
|
|
13
|
+
rows: T[];
|
|
14
|
+
};
|
|
15
|
+
declare function DataTable<T extends {
|
|
16
|
+
id: string | number;
|
|
17
|
+
}>({ columns, rows, }: DataTableProps<T>): react_jsx_runtime.JSX.Element;
|
|
18
|
+
|
|
19
|
+
type MetricTileProps = {
|
|
20
|
+
label: string;
|
|
21
|
+
value: string;
|
|
22
|
+
helperText?: string;
|
|
23
|
+
trend?: ReactNode;
|
|
24
|
+
};
|
|
25
|
+
declare function MetricTile({ label, value, helperText, trend }: MetricTileProps): react_jsx_runtime.JSX.Element;
|
|
26
|
+
|
|
27
|
+
type InsightCardProps = {
|
|
28
|
+
title: string;
|
|
29
|
+
tone?: "neutral" | "warning" | "success";
|
|
30
|
+
icon?: ReactNode;
|
|
31
|
+
children: ReactNode;
|
|
32
|
+
};
|
|
33
|
+
declare function InsightCard({ title, tone, icon, children, }: InsightCardProps): react_jsx_runtime.JSX.Element;
|
|
34
|
+
|
|
35
|
+
/** One cross-app notification row (caller supplies app icon as ReactNode). */
|
|
36
|
+
type CrossAppNotificationItem = {
|
|
37
|
+
id: string;
|
|
38
|
+
icon: ReactNode;
|
|
39
|
+
appLabel: string;
|
|
40
|
+
message: string;
|
|
41
|
+
timeAgo: string;
|
|
42
|
+
read?: boolean;
|
|
43
|
+
};
|
|
44
|
+
type CrossAppNotificationsFeedV1Props = {
|
|
45
|
+
/** Outer panel title (e.g. “Cross-app Notifications”). */
|
|
46
|
+
panelTitle?: string;
|
|
47
|
+
/** Inner list header (e.g. “Notifications”). */
|
|
48
|
+
listHeader?: string;
|
|
49
|
+
items: CrossAppNotificationItem[];
|
|
50
|
+
onMarkAllRead?: () => void;
|
|
51
|
+
onItemClick?: (id: string) => void;
|
|
52
|
+
className?: string;
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* **V1 — Single panel, divided list** (matches the cross-app mockup).
|
|
56
|
+
* `Surface` container + inner header row + `divide-y` list; unread rows use bold body text.
|
|
57
|
+
*/
|
|
58
|
+
declare function CrossAppNotificationsFeedV1({ panelTitle, listHeader, items, onMarkAllRead, onItemClick, className, }: CrossAppNotificationsFeedV1Props): react_jsx_runtime.JSX.Element;
|
|
59
|
+
type CrossAppNotificationsFeedV2Props = CrossAppNotificationsFeedV1Props;
|
|
60
|
+
/**
|
|
61
|
+
* **V2 — Inset rows** on a muted canvas: same structure as V1 but each row sits in a soft inner
|
|
62
|
+
* `Surface` strip (more separation, less ruler line).
|
|
63
|
+
*/
|
|
64
|
+
declare function CrossAppNotificationsFeedV2({ panelTitle, listHeader, items, onMarkAllRead, onItemClick, className, }: CrossAppNotificationsFeedV2Props): react_jsx_runtime.JSX.Element;
|
|
65
|
+
type CrossAppNotificationsFeedV3Props = Omit<CrossAppNotificationsFeedV1Props, "listHeader"> & {
|
|
66
|
+
listHeader?: string;
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* **V3 — Dense single-line row**: `Badge` for app, truncated message, time on the right; best for many items.
|
|
70
|
+
*/
|
|
71
|
+
declare function CrossAppNotificationsFeedV3({ panelTitle, listHeader, items, onMarkAllRead, onItemClick, className, }: CrossAppNotificationsFeedV3Props): react_jsx_runtime.JSX.Element;
|
|
72
|
+
|
|
73
|
+
export { type Column, type CrossAppNotificationItem, CrossAppNotificationsFeedV1, type CrossAppNotificationsFeedV1Props, CrossAppNotificationsFeedV2, type CrossAppNotificationsFeedV2Props, CrossAppNotificationsFeedV3, type CrossAppNotificationsFeedV3Props, DataTable, type DataTableProps, InsightCard, type InsightCardProps, MetricTile, type MetricTileProps };
|
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
import { cva } from 'class-variance-authority';
|
|
2
|
+
import { clsx } from 'clsx';
|
|
3
|
+
import { twMerge } from 'tailwind-merge';
|
|
4
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
5
|
+
import { Slot } from '@radix-ui/react-slot';
|
|
6
|
+
|
|
7
|
+
// src/surface/Surface.tsx
|
|
8
|
+
function cn(...inputs) {
|
|
9
|
+
return twMerge(clsx(inputs));
|
|
10
|
+
}
|
|
11
|
+
var surfaceVariants = cva(
|
|
12
|
+
"rounded-xl border border-border bg-card text-card-foreground shadow-sm",
|
|
13
|
+
{
|
|
14
|
+
variants: {
|
|
15
|
+
padding: {
|
|
16
|
+
none: "p-0",
|
|
17
|
+
sm: "p-4",
|
|
18
|
+
md: "p-6"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
defaultVariants: {
|
|
22
|
+
padding: "none"
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
);
|
|
26
|
+
function Surface({ className, padding, ...props }) {
|
|
27
|
+
return /* @__PURE__ */ jsx(
|
|
28
|
+
"div",
|
|
29
|
+
{
|
|
30
|
+
"data-slot": "surface",
|
|
31
|
+
className: cn(surfaceVariants({ padding }), className),
|
|
32
|
+
...props
|
|
33
|
+
}
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
function DataTable({
|
|
37
|
+
columns,
|
|
38
|
+
rows
|
|
39
|
+
}) {
|
|
40
|
+
return /* @__PURE__ */ jsx(Surface, { className: "overflow-x-auto", children: /* @__PURE__ */ jsxs("table", { className: "w-full text-left text-sm text-foreground", children: [
|
|
41
|
+
/* @__PURE__ */ jsx("thead", { className: "border-b border-border bg-muted/50 text-xs font-semibold uppercase tracking-wider text-muted-foreground", children: /* @__PURE__ */ jsx("tr", { children: columns.map((column) => /* @__PURE__ */ jsx(
|
|
42
|
+
"th",
|
|
43
|
+
{
|
|
44
|
+
scope: "col",
|
|
45
|
+
className: "px-6 py-3",
|
|
46
|
+
children: column.header
|
|
47
|
+
},
|
|
48
|
+
String(column.key)
|
|
49
|
+
)) }) }),
|
|
50
|
+
/* @__PURE__ */ jsx("tbody", { children: rows.map((row) => /* @__PURE__ */ jsx(
|
|
51
|
+
"tr",
|
|
52
|
+
{
|
|
53
|
+
className: "border-b border-border/60 bg-card transition-colors hover:bg-muted/40",
|
|
54
|
+
children: columns.map((column) => /* @__PURE__ */ jsx("td", { className: "px-6 py-4", children: column.render ? column.render(row) : String(row[column.key]) }, String(column.key)))
|
|
55
|
+
},
|
|
56
|
+
row.id
|
|
57
|
+
)) })
|
|
58
|
+
] }) });
|
|
59
|
+
}
|
|
60
|
+
function MetricTile({ label, value, helperText, trend }) {
|
|
61
|
+
return /* @__PURE__ */ jsxs(Surface, { padding: "sm", children: [
|
|
62
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
|
|
63
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs font-medium uppercase tracking-wider text-muted-foreground", children: label }),
|
|
64
|
+
/* @__PURE__ */ jsx("p", { className: "text-2xl font-semibold text-foreground", children: value })
|
|
65
|
+
] }),
|
|
66
|
+
helperText ? /* @__PURE__ */ jsx("p", { className: "mt-2 text-xs text-muted-foreground", children: helperText }) : null,
|
|
67
|
+
trend ? /* @__PURE__ */ jsx("div", { className: "mt-3 text-xs", children: trend }) : null
|
|
68
|
+
] });
|
|
69
|
+
}
|
|
70
|
+
var toneClasses = {
|
|
71
|
+
neutral: "",
|
|
72
|
+
warning: "border-l-4 border-l-amber-500",
|
|
73
|
+
success: "border-l-4 border-l-emerald-500"
|
|
74
|
+
};
|
|
75
|
+
function InsightCard({
|
|
76
|
+
title,
|
|
77
|
+
tone = "neutral",
|
|
78
|
+
icon,
|
|
79
|
+
children
|
|
80
|
+
}) {
|
|
81
|
+
return /* @__PURE__ */ jsx(
|
|
82
|
+
Surface,
|
|
83
|
+
{
|
|
84
|
+
className: cn(tone !== "neutral" && toneClasses[tone]),
|
|
85
|
+
padding: "md",
|
|
86
|
+
children: /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-4", children: [
|
|
87
|
+
icon ? /* @__PURE__ */ jsx("div", { className: "mt-1 flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-muted", children: icon }) : null,
|
|
88
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
|
|
89
|
+
/* @__PURE__ */ jsx("h4", { className: "mb-1 text-sm font-semibold text-foreground", children: title }),
|
|
90
|
+
/* @__PURE__ */ jsx("div", { className: "text-sm text-muted-foreground", children })
|
|
91
|
+
] })
|
|
92
|
+
] })
|
|
93
|
+
}
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
var buttonVariants = cva(
|
|
97
|
+
"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
|
|
98
|
+
{
|
|
99
|
+
variants: {
|
|
100
|
+
variant: {
|
|
101
|
+
default: "bg-primary text-primary-foreground hover:bg-primary/90",
|
|
102
|
+
destructive: "bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
|
|
103
|
+
outline: "border bg-background text-foreground hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
|
|
104
|
+
secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
|
|
105
|
+
ghost: "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
|
|
106
|
+
link: "text-primary underline-offset-4 hover:underline"
|
|
107
|
+
},
|
|
108
|
+
size: {
|
|
109
|
+
default: "h-9 px-4 py-2 has-[>svg]:px-3",
|
|
110
|
+
sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",
|
|
111
|
+
lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
|
|
112
|
+
icon: "size-9 rounded-md"
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
defaultVariants: {
|
|
116
|
+
variant: "default",
|
|
117
|
+
size: "default"
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
);
|
|
121
|
+
function Button({
|
|
122
|
+
className,
|
|
123
|
+
variant,
|
|
124
|
+
size,
|
|
125
|
+
asChild = false,
|
|
126
|
+
...props
|
|
127
|
+
}) {
|
|
128
|
+
const Comp = asChild ? Slot : "button";
|
|
129
|
+
return /* @__PURE__ */ jsx(
|
|
130
|
+
Comp,
|
|
131
|
+
{
|
|
132
|
+
"data-slot": "button",
|
|
133
|
+
className: cn(buttonVariants({ variant, size, className })),
|
|
134
|
+
...props
|
|
135
|
+
}
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
var badgeVariants = cva(
|
|
139
|
+
"inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden",
|
|
140
|
+
{
|
|
141
|
+
variants: {
|
|
142
|
+
variant: {
|
|
143
|
+
default: "border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90",
|
|
144
|
+
secondary: "border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90",
|
|
145
|
+
destructive: "border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
|
|
146
|
+
outline: "text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground"
|
|
147
|
+
}
|
|
148
|
+
},
|
|
149
|
+
defaultVariants: {
|
|
150
|
+
variant: "default"
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
);
|
|
154
|
+
function Badge({
|
|
155
|
+
className,
|
|
156
|
+
variant,
|
|
157
|
+
asChild = false,
|
|
158
|
+
...props
|
|
159
|
+
}) {
|
|
160
|
+
const Comp = asChild ? Slot : "span";
|
|
161
|
+
return /* @__PURE__ */ jsx(
|
|
162
|
+
Comp,
|
|
163
|
+
{
|
|
164
|
+
"data-slot": "badge",
|
|
165
|
+
className: cn(badgeVariants({ variant }), className),
|
|
166
|
+
...props
|
|
167
|
+
}
|
|
168
|
+
);
|
|
169
|
+
}
|
|
170
|
+
function CrossAppNotificationsFeedV1({
|
|
171
|
+
panelTitle = "Cross-app Notifications",
|
|
172
|
+
listHeader = "Notifications",
|
|
173
|
+
items,
|
|
174
|
+
onMarkAllRead,
|
|
175
|
+
onItemClick,
|
|
176
|
+
className
|
|
177
|
+
}) {
|
|
178
|
+
return /* @__PURE__ */ jsxs(Surface, { padding: "none", className: cn("overflow-hidden", className), children: [
|
|
179
|
+
panelTitle ? /* @__PURE__ */ jsx("div", { className: "border-b border-border px-5 py-4", children: /* @__PURE__ */ jsx("h2", { className: "text-base font-semibold tracking-tight text-foreground", children: panelTitle }) }) : null,
|
|
180
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-3 border-b border-border px-5 py-3", children: [
|
|
181
|
+
/* @__PURE__ */ jsx("span", { className: "text-sm font-semibold text-foreground", children: listHeader }),
|
|
182
|
+
onMarkAllRead ? /* @__PURE__ */ jsx(Button, { type: "button", variant: "link", size: "sm", className: "h-auto p-0 text-sm", onClick: onMarkAllRead, children: "Mark all as read" }) : /* @__PURE__ */ jsx("span", { className: "text-sm text-muted-foreground", children: " " })
|
|
183
|
+
] }),
|
|
184
|
+
/* @__PURE__ */ jsx("ul", { className: "divide-y divide-border", role: "list", children: items.map((item) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsxs(
|
|
185
|
+
"button",
|
|
186
|
+
{
|
|
187
|
+
type: "button",
|
|
188
|
+
className: cn(
|
|
189
|
+
"flex w-full gap-3 px-5 py-4 text-left transition-colors hover:bg-muted/40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
|
|
190
|
+
item.read && "opacity-90"
|
|
191
|
+
),
|
|
192
|
+
onClick: () => onItemClick?.(item.id),
|
|
193
|
+
children: [
|
|
194
|
+
/* @__PURE__ */ jsx("span", { className: "flex h-10 w-10 shrink-0 items-center justify-center overflow-hidden rounded-full bg-muted text-muted-foreground", children: item.icon }),
|
|
195
|
+
/* @__PURE__ */ jsxs("span", { className: "min-w-0 flex-1", children: [
|
|
196
|
+
/* @__PURE__ */ jsxs(
|
|
197
|
+
"span",
|
|
198
|
+
{
|
|
199
|
+
className: cn(
|
|
200
|
+
"block text-sm leading-snug text-foreground",
|
|
201
|
+
!item.read ? "font-bold" : "font-normal text-muted-foreground"
|
|
202
|
+
),
|
|
203
|
+
children: [
|
|
204
|
+
/* @__PURE__ */ jsxs("span", { className: !item.read ? "font-bold" : "font-semibold", children: [
|
|
205
|
+
item.appLabel,
|
|
206
|
+
":"
|
|
207
|
+
] }),
|
|
208
|
+
" ",
|
|
209
|
+
item.message
|
|
210
|
+
]
|
|
211
|
+
}
|
|
212
|
+
),
|
|
213
|
+
/* @__PURE__ */ jsxs("span", { className: "mt-1 flex items-center gap-1 text-xs text-muted-foreground", children: [
|
|
214
|
+
/* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "text-[11px]", children: "\u25F7" }),
|
|
215
|
+
item.timeAgo
|
|
216
|
+
] })
|
|
217
|
+
] })
|
|
218
|
+
]
|
|
219
|
+
}
|
|
220
|
+
) }, item.id)) })
|
|
221
|
+
] });
|
|
222
|
+
}
|
|
223
|
+
function CrossAppNotificationsFeedV2({
|
|
224
|
+
panelTitle = "Cross-app Notifications",
|
|
225
|
+
listHeader = "Notifications",
|
|
226
|
+
items,
|
|
227
|
+
onMarkAllRead,
|
|
228
|
+
onItemClick,
|
|
229
|
+
className
|
|
230
|
+
}) {
|
|
231
|
+
return /* @__PURE__ */ jsxs(Surface, { padding: "none", className: cn("overflow-hidden bg-muted/30", className), children: [
|
|
232
|
+
panelTitle ? /* @__PURE__ */ jsx("div", { className: "border-b border-border bg-card px-5 py-4", children: /* @__PURE__ */ jsx("h2", { className: "text-base font-semibold tracking-tight text-foreground", children: panelTitle }) }) : null,
|
|
233
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-3 border-b border-border bg-card px-5 py-3", children: [
|
|
234
|
+
/* @__PURE__ */ jsx("span", { className: "text-sm font-semibold text-foreground", children: listHeader }),
|
|
235
|
+
onMarkAllRead ? /* @__PURE__ */ jsx(Button, { type: "button", variant: "link", size: "sm", className: "h-auto p-0 text-sm", onClick: onMarkAllRead, children: "Mark all as read" }) : null
|
|
236
|
+
] }),
|
|
237
|
+
/* @__PURE__ */ jsx("div", { className: "space-y-2 p-3", children: items.map((item) => /* @__PURE__ */ jsx(
|
|
238
|
+
Surface,
|
|
239
|
+
{
|
|
240
|
+
padding: "none",
|
|
241
|
+
className: "border-border/80 bg-card shadow-none transition-colors hover:border-primary/25",
|
|
242
|
+
children: /* @__PURE__ */ jsxs(
|
|
243
|
+
"button",
|
|
244
|
+
{
|
|
245
|
+
type: "button",
|
|
246
|
+
className: "flex w-full gap-3 px-4 py-3 text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
|
|
247
|
+
onClick: () => onItemClick?.(item.id),
|
|
248
|
+
children: [
|
|
249
|
+
/* @__PURE__ */ jsx("span", { className: "flex h-10 w-10 shrink-0 items-center justify-center overflow-hidden rounded-full bg-muted", children: item.icon }),
|
|
250
|
+
/* @__PURE__ */ jsxs("span", { className: "min-w-0 flex-1", children: [
|
|
251
|
+
/* @__PURE__ */ jsxs(
|
|
252
|
+
"span",
|
|
253
|
+
{
|
|
254
|
+
className: cn(
|
|
255
|
+
"block text-sm leading-snug",
|
|
256
|
+
!item.read ? "font-bold text-foreground" : "font-normal text-muted-foreground"
|
|
257
|
+
),
|
|
258
|
+
children: [
|
|
259
|
+
/* @__PURE__ */ jsxs("span", { className: !item.read ? "font-bold" : "font-semibold text-foreground", children: [
|
|
260
|
+
item.appLabel,
|
|
261
|
+
":"
|
|
262
|
+
] }),
|
|
263
|
+
" ",
|
|
264
|
+
item.message
|
|
265
|
+
]
|
|
266
|
+
}
|
|
267
|
+
),
|
|
268
|
+
/* @__PURE__ */ jsx("span", { className: "mt-1 text-xs text-muted-foreground", children: item.timeAgo })
|
|
269
|
+
] })
|
|
270
|
+
]
|
|
271
|
+
}
|
|
272
|
+
)
|
|
273
|
+
},
|
|
274
|
+
item.id
|
|
275
|
+
)) })
|
|
276
|
+
] });
|
|
277
|
+
}
|
|
278
|
+
function CrossAppNotificationsFeedV3({
|
|
279
|
+
panelTitle = "Cross-app Notifications",
|
|
280
|
+
listHeader = "Notifications",
|
|
281
|
+
items,
|
|
282
|
+
onMarkAllRead,
|
|
283
|
+
onItemClick,
|
|
284
|
+
className
|
|
285
|
+
}) {
|
|
286
|
+
return /* @__PURE__ */ jsxs(Surface, { padding: "none", className: cn("overflow-hidden", className), children: [
|
|
287
|
+
panelTitle ? /* @__PURE__ */ jsx("div", { className: "border-b border-border px-4 py-3", children: /* @__PURE__ */ jsx("h2", { className: "text-sm font-semibold tracking-tight text-foreground", children: panelTitle }) }) : null,
|
|
288
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-2 border-b border-border px-4 py-2", children: [
|
|
289
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: listHeader }),
|
|
290
|
+
onMarkAllRead ? /* @__PURE__ */ jsx(Button, { type: "button", variant: "link", size: "sm", className: "h-auto p-0 text-xs", onClick: onMarkAllRead, children: "Mark all read" }) : null
|
|
291
|
+
] }),
|
|
292
|
+
/* @__PURE__ */ jsx("ul", { className: "divide-y divide-border", role: "list", children: items.map((item) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsxs(
|
|
293
|
+
"button",
|
|
294
|
+
{
|
|
295
|
+
type: "button",
|
|
296
|
+
className: "flex w-full items-center gap-2 px-4 py-2.5 text-left text-sm hover:bg-muted/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
297
|
+
onClick: () => onItemClick?.(item.id),
|
|
298
|
+
children: [
|
|
299
|
+
/* @__PURE__ */ jsx("span", { className: "flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-muted text-[10px]", children: item.icon }),
|
|
300
|
+
/* @__PURE__ */ jsx(Badge, { variant: "secondary", className: "shrink-0 text-[10px]", children: item.appLabel }),
|
|
301
|
+
/* @__PURE__ */ jsx(
|
|
302
|
+
"span",
|
|
303
|
+
{
|
|
304
|
+
className: cn(
|
|
305
|
+
"min-w-0 flex-1 truncate",
|
|
306
|
+
!item.read ? "font-semibold text-foreground" : "font-normal text-muted-foreground"
|
|
307
|
+
),
|
|
308
|
+
children: item.message
|
|
309
|
+
}
|
|
310
|
+
),
|
|
311
|
+
/* @__PURE__ */ jsx("span", { className: "shrink-0 text-xs tabular-nums text-muted-foreground", children: item.timeAgo })
|
|
312
|
+
]
|
|
313
|
+
}
|
|
314
|
+
) }, item.id)) })
|
|
315
|
+
] });
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
export { CrossAppNotificationsFeedV1, CrossAppNotificationsFeedV2, CrossAppNotificationsFeedV3, DataTable, InsightCard, MetricTile };
|
|
319
|
+
//# sourceMappingURL=index.js.map
|
|
320
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/utils.ts","../../src/surface/Surface.tsx","../../src/data/DataTable.tsx","../../src/data/MetricTile.tsx","../../src/data/InsightCard.tsx","../../src/primitives/button.tsx","../../src/primitives/badge.tsx","../../src/data/CrossAppNotifications.tsx"],"names":["jsx","jsxs","cva","Slot"],"mappings":"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","file":"index.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../lib/utils\";\n\nconst surfaceVariants = cva(\n \"rounded-xl border border-border bg-card text-card-foreground shadow-sm\",\n {\n variants: {\n padding: {\n none: \"p-0\",\n sm: \"p-4\",\n md: \"p-6\",\n },\n },\n defaultVariants: {\n padding: \"none\",\n },\n },\n);\n\nexport type SurfaceProps = React.ComponentProps<\"div\"> &\n VariantProps<typeof surfaceVariants>;\n\n/**\n * Default elevated panel for tables, metrics, charts, and grouped content.\n * Uses theme CSS variables (`--card`, `--border`); host apps must define :root tokens.\n */\nexport function Surface({ className, padding, ...props }: SurfaceProps) {\n return (\n <div\n data-slot=\"surface\"\n className={cn(surfaceVariants({ padding }), className)}\n {...props}\n />\n );\n}\n\nexport { surfaceVariants };\n","import type { ReactNode } from \"react\";\n\nimport { Surface } from \"../surface/Surface\";\n\nexport type Column<T> = {\n key: keyof T;\n header: string;\n render?: (row: T) => ReactNode;\n};\n\nexport type DataTableProps<T extends { id: string | number }> = {\n columns: Column<T>[];\n rows: T[];\n};\n\nexport function DataTable<T extends { id: string | number }>({\n columns,\n rows,\n}: DataTableProps<T>) {\n return (\n <Surface className=\"overflow-x-auto\">\n <table className=\"w-full text-left text-sm text-foreground\">\n <thead className=\"border-b border-border bg-muted/50 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n <tr>\n {columns.map((column) => (\n <th\n key={String(column.key)}\n scope=\"col\"\n className=\"px-6 py-3\"\n >\n {column.header}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row) => (\n <tr\n key={row.id}\n className=\"border-b border-border/60 bg-card transition-colors hover:bg-muted/40\"\n >\n {columns.map((column) => (\n <td key={String(column.key)} className=\"px-6 py-4\">\n {column.render ? column.render(row) : String(row[column.key])}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </Surface>\n );\n}\n","import type { ReactNode } from \"react\";\n\nimport { Surface } from \"../surface/Surface\";\n\nexport type MetricTileProps = {\n label: string;\n value: string;\n helperText?: string;\n trend?: ReactNode;\n};\n\nexport function MetricTile({ label, value, helperText, trend }: MetricTileProps) {\n return (\n <Surface padding=\"sm\">\n <div className=\"space-y-1\">\n <p className=\"text-xs font-medium uppercase tracking-wider text-muted-foreground\">\n {label}\n </p>\n <p className=\"text-2xl font-semibold text-foreground\">{value}</p>\n </div>\n {helperText ? (\n <p className=\"mt-2 text-xs text-muted-foreground\">{helperText}</p>\n ) : null}\n {trend ? <div className=\"mt-3 text-xs\">{trend}</div> : null}\n </Surface>\n );\n}\n","import type { ReactNode } from \"react\";\n\nimport { Surface } from \"../surface/Surface\";\nimport { cn } from \"../lib/utils\";\n\nexport type InsightCardProps = {\n title: string;\n tone?: \"neutral\" | \"warning\" | \"success\";\n icon?: ReactNode;\n children: ReactNode;\n};\n\n/** Semantic accents — not mapped to theme tokens; use for clear status differentiation. */\nconst toneClasses: Record<NonNullable<InsightCardProps[\"tone\"]>, string> = {\n neutral: \"\",\n warning: \"border-l-4 border-l-amber-500\",\n success: \"border-l-4 border-l-emerald-500\",\n};\n\nexport function InsightCard({\n title,\n tone = \"neutral\",\n icon,\n children,\n}: InsightCardProps) {\n return (\n <Surface\n className={cn(tone !== \"neutral\" && toneClasses[tone])}\n padding=\"md\"\n >\n <div className=\"flex items-start gap-4\">\n {icon ? (\n <div className=\"mt-1 flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-muted\">\n {icon}\n </div>\n ) : null}\n <div className=\"min-w-0\">\n <h4 className=\"mb-1 text-sm font-semibold text-foreground\">{title}</h4>\n <div className=\"text-sm text-muted-foreground\">{children}</div>\n </div>\n </div>\n </Surface>\n );\n}\n","import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../lib/utils\";\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n outline:\n \"border bg-background text-foreground hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost:\n \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2 has-[>svg]:px-3\",\n sm: \"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5\",\n lg: \"h-10 rounded-md px-6 has-[>svg]:px-4\",\n icon: \"size-9 rounded-md\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nfunction Button({\n className,\n variant,\n size,\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean;\n }) {\n const Comp = asChild ? Slot : \"button\";\n\n return (\n <Comp\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n );\n}\n\nexport { Button, buttonVariants };\n","import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../lib/utils\";\n\nconst badgeVariants = cva(\n \"inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden\",\n {\n variants: {\n variant: {\n default:\n \"border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90\",\n secondary:\n \"border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90\",\n destructive:\n \"border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n outline:\n \"text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nfunction Badge({\n className,\n variant,\n asChild = false,\n ...props\n}: React.ComponentProps<\"span\"> &\n VariantProps<typeof badgeVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : \"span\";\n\n return (\n <Comp\n data-slot=\"badge\"\n className={cn(badgeVariants({ variant }), className)}\n {...props}\n />\n );\n}\n\nexport { Badge, badgeVariants };\n","import type { ReactNode } from \"react\";\n\nimport { Button } from \"../primitives/button\";\nimport { Badge } from \"../primitives/badge\";\nimport { Surface } from \"../surface/Surface\";\nimport { cn } from \"../lib/utils\";\n\n/** One cross-app notification row (caller supplies app icon as ReactNode). */\nexport type CrossAppNotificationItem = {\n id: string;\n icon: ReactNode;\n appLabel: string;\n message: string;\n timeAgo: string;\n read?: boolean;\n};\n\nexport type CrossAppNotificationsFeedV1Props = {\n /** Outer panel title (e.g. “Cross-app Notifications”). */\n panelTitle?: string;\n /** Inner list header (e.g. “Notifications”). */\n listHeader?: string;\n items: CrossAppNotificationItem[];\n onMarkAllRead?: () => void;\n onItemClick?: (id: string) => void;\n className?: string;\n};\n\n/**\n * **V1 — Single panel, divided list** (matches the cross-app mockup).\n * `Surface` container + inner header row + `divide-y` list; unread rows use bold body text.\n */\nexport function CrossAppNotificationsFeedV1({\n panelTitle = \"Cross-app Notifications\",\n listHeader = \"Notifications\",\n items,\n onMarkAllRead,\n onItemClick,\n className,\n}: CrossAppNotificationsFeedV1Props) {\n return (\n <Surface padding=\"none\" className={cn(\"overflow-hidden\", className)}>\n {panelTitle ? (\n <div className=\"border-b border-border px-5 py-4\">\n <h2 className=\"text-base font-semibold tracking-tight text-foreground\">{panelTitle}</h2>\n </div>\n ) : null}\n\n <div className=\"flex items-center justify-between gap-3 border-b border-border px-5 py-3\">\n <span className=\"text-sm font-semibold text-foreground\">{listHeader}</span>\n {onMarkAllRead ? (\n <Button type=\"button\" variant=\"link\" size=\"sm\" className=\"h-auto p-0 text-sm\" onClick={onMarkAllRead}>\n Mark all as read\n </Button>\n ) : (\n <span className=\"text-sm text-muted-foreground\"> </span>\n )}\n </div>\n\n <ul className=\"divide-y divide-border\" role=\"list\">\n {items.map((item) => (\n <li key={item.id}>\n <button\n type=\"button\"\n className={cn(\n \"flex w-full gap-3 px-5 py-4 text-left transition-colors hover:bg-muted/40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n item.read && \"opacity-90\",\n )}\n onClick={() => onItemClick?.(item.id)}\n >\n <span className=\"flex h-10 w-10 shrink-0 items-center justify-center overflow-hidden rounded-full bg-muted text-muted-foreground\">\n {item.icon}\n </span>\n <span className=\"min-w-0 flex-1\">\n <span\n className={cn(\n \"block text-sm leading-snug text-foreground\",\n !item.read ? \"font-bold\" : \"font-normal text-muted-foreground\",\n )}\n >\n <span className={!item.read ? \"font-bold\" : \"font-semibold\"}>{item.appLabel}:</span>{\" \"}\n {item.message}\n </span>\n <span className=\"mt-1 flex items-center gap-1 text-xs text-muted-foreground\">\n <span aria-hidden className=\"text-[11px]\">\n ◷\n </span>\n {item.timeAgo}\n </span>\n </span>\n </button>\n </li>\n ))}\n </ul>\n </Surface>\n );\n}\n\nexport type CrossAppNotificationsFeedV2Props = CrossAppNotificationsFeedV1Props;\n\n/**\n * **V2 — Inset rows** on a muted canvas: same structure as V1 but each row sits in a soft inner\n * `Surface` strip (more separation, less ruler line).\n */\nexport function CrossAppNotificationsFeedV2({\n panelTitle = \"Cross-app Notifications\",\n listHeader = \"Notifications\",\n items,\n onMarkAllRead,\n onItemClick,\n className,\n}: CrossAppNotificationsFeedV2Props) {\n return (\n <Surface padding=\"none\" className={cn(\"overflow-hidden bg-muted/30\", className)}>\n {panelTitle ? (\n <div className=\"border-b border-border bg-card px-5 py-4\">\n <h2 className=\"text-base font-semibold tracking-tight text-foreground\">{panelTitle}</h2>\n </div>\n ) : null}\n\n <div className=\"flex items-center justify-between gap-3 border-b border-border bg-card px-5 py-3\">\n <span className=\"text-sm font-semibold text-foreground\">{listHeader}</span>\n {onMarkAllRead ? (\n <Button type=\"button\" variant=\"link\" size=\"sm\" className=\"h-auto p-0 text-sm\" onClick={onMarkAllRead}>\n Mark all as read\n </Button>\n ) : null}\n </div>\n\n <div className=\"space-y-2 p-3\">\n {items.map((item) => (\n <Surface\n key={item.id}\n padding=\"none\"\n className=\"border-border/80 bg-card shadow-none transition-colors hover:border-primary/25\"\n >\n <button\n type=\"button\"\n className=\"flex w-full gap-3 px-4 py-3 text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\"\n onClick={() => onItemClick?.(item.id)}\n >\n <span className=\"flex h-10 w-10 shrink-0 items-center justify-center overflow-hidden rounded-full bg-muted\">\n {item.icon}\n </span>\n <span className=\"min-w-0 flex-1\">\n <span\n className={cn(\n \"block text-sm leading-snug\",\n !item.read ? \"font-bold text-foreground\" : \"font-normal text-muted-foreground\",\n )}\n >\n <span className={!item.read ? \"font-bold\" : \"font-semibold text-foreground\"}>{item.appLabel}:</span>{\" \"}\n {item.message}\n </span>\n <span className=\"mt-1 text-xs text-muted-foreground\">{item.timeAgo}</span>\n </span>\n </button>\n </Surface>\n ))}\n </div>\n </Surface>\n );\n}\n\nexport type CrossAppNotificationsFeedV3Props = Omit<CrossAppNotificationsFeedV1Props, \"listHeader\"> & {\n listHeader?: string;\n};\n\n/**\n * **V3 — Dense single-line row**: `Badge` for app, truncated message, time on the right; best for many items.\n */\nexport function CrossAppNotificationsFeedV3({\n panelTitle = \"Cross-app Notifications\",\n listHeader = \"Notifications\",\n items,\n onMarkAllRead,\n onItemClick,\n className,\n}: CrossAppNotificationsFeedV3Props) {\n return (\n <Surface padding=\"none\" className={cn(\"overflow-hidden\", className)}>\n {panelTitle ? (\n <div className=\"border-b border-border px-4 py-3\">\n <h2 className=\"text-sm font-semibold tracking-tight text-foreground\">{panelTitle}</h2>\n </div>\n ) : null}\n\n <div className=\"flex items-center justify-between gap-2 border-b border-border px-4 py-2\">\n <span className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">{listHeader}</span>\n {onMarkAllRead ? (\n <Button type=\"button\" variant=\"link\" size=\"sm\" className=\"h-auto p-0 text-xs\" onClick={onMarkAllRead}>\n Mark all read\n </Button>\n ) : null}\n </div>\n\n <ul className=\"divide-y divide-border\" role=\"list\">\n {items.map((item) => (\n <li key={item.id}>\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-2 px-4 py-2.5 text-left text-sm hover:bg-muted/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n onClick={() => onItemClick?.(item.id)}\n >\n <span className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-muted text-[10px]\">\n {item.icon}\n </span>\n <Badge variant=\"secondary\" className=\"shrink-0 text-[10px]\">\n {item.appLabel}\n </Badge>\n <span\n className={cn(\n \"min-w-0 flex-1 truncate\",\n !item.read ? \"font-semibold text-foreground\" : \"font-normal text-muted-foreground\",\n )}\n >\n {item.message}\n </span>\n <span className=\"shrink-0 text-xs tabular-nums text-muted-foreground\">{item.timeAgo}</span>\n </button>\n </li>\n ))}\n </ul>\n </Surface>\n );\n}\n"]}
|