@codraoss/ui 0.9.5 → 0.9.6

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/index.d.ts CHANGED
@@ -209,6 +209,23 @@ interface LoadErrorProps {
209
209
  /** Friendly copy up front, raw error as a small mono chip - instead of a bare toast echoing "Failed to fetch". */
210
210
  declare function LoadError({ title, detail, hint, onRetry, retrying, className, }: LoadErrorProps): React.JSX.Element;
211
211
 
212
+ interface OnboardingStep {
213
+ id: string;
214
+ label: React__default.ReactNode;
215
+ done: boolean;
216
+ onClick?: () => void;
217
+ }
218
+ interface OnboardingCardProps {
219
+ title?: React__default.ReactNode;
220
+ completedTitle?: React__default.ReactNode;
221
+ description?: React__default.ReactNode;
222
+ steps: OnboardingStep[];
223
+ onDismiss?: () => void;
224
+ className?: string;
225
+ segments?: number;
226
+ }
227
+ declare function OnboardingCard({ title, completedTitle, description, steps, onDismiss, className, segments, }: OnboardingCardProps): React__default.JSX.Element;
228
+
212
229
  declare function CardDots(): React.JSX.Element;
213
230
  declare function GraphShell({ title, icon, legend, children, className, }: {
214
231
  title: string;
@@ -248,4 +265,4 @@ declare function TickMeter({ label, value, max, color, valueLabel, }: {
248
265
  valueLabel: string;
249
266
  }): React.JSX.Element;
250
267
 
251
- export { Alert, Badge, BarSparkline, Button, type ButtonProps, CardDots, ChartDefs, ConfirmDialog, CopyButton, EmptyState, GithubMark, GraphShell, Input, type InputProps, LayerCard, LegendChip, LinkButton, LoadError, MeterList, SectionCard, Select, SeriesMarker, type SeriesMarkerProps, Skeleton, Switch, type SwitchProps, Text, TickMeter, badgeVariants, buttonVariants };
268
+ export { Alert, Badge, BarSparkline, Button, type ButtonProps, CardDots, ChartDefs, ConfirmDialog, CopyButton, EmptyState, GithubMark, GraphShell, Input, type InputProps, LayerCard, LegendChip, LinkButton, LoadError, MeterList, OnboardingCard, type OnboardingCardProps, type OnboardingStep, SectionCard, Select, SeriesMarker, type SeriesMarkerProps, Skeleton, Switch, type SwitchProps, Text, TickMeter, badgeVariants, buttonVariants };
package/dist/index.js CHANGED
@@ -1002,11 +1002,88 @@ function LoadError({
1002
1002
  );
1003
1003
  }
1004
1004
 
1005
+ // src/components/onboarding-card.tsx
1006
+ import "react";
1007
+ import { Check as Check3, X } from "lucide-react";
1008
+ import { jsx as jsx19, jsxs as jsxs11 } from "react/jsx-runtime";
1009
+ function OnboardingCard({
1010
+ title = "You're almost there!",
1011
+ completedTitle = "You're all set! \u{1F389}",
1012
+ description,
1013
+ steps,
1014
+ onDismiss,
1015
+ className,
1016
+ segments = 22
1017
+ }) {
1018
+ const doneCount = steps.filter((s) => s.done).length;
1019
+ const totalSteps = steps.length;
1020
+ const allDone = doneCount === totalSteps && totalSteps > 0;
1021
+ const filledCount = doneCount > 0 ? Math.max(1, Math.round(doneCount / totalSteps * segments)) : 0;
1022
+ return /* @__PURE__ */ jsx19("div", { className: cn("ui-well overflow-hidden rounded-lg", className), children: /* @__PURE__ */ jsxs11("div", { className: "px-3.5 pb-3.5 pt-5", children: [
1023
+ /* @__PURE__ */ jsxs11("div", { className: "relative mb-3.5 text-center", children: [
1024
+ /* @__PURE__ */ jsx19("p", { className: "text-[14px] font-semibold leading-tight text-black dark:text-white", children: allDone ? completedTitle : title }),
1025
+ !allDone && description && /* @__PURE__ */ jsx19("p", { className: "mt-1 text-[12px] leading-snug text-black/50 dark:text-white/50", children: description }),
1026
+ onDismiss && /* @__PURE__ */ jsx19(
1027
+ "button",
1028
+ {
1029
+ onClick: onDismiss,
1030
+ "aria-label": "Dismiss",
1031
+ className: "absolute -top-1 -right-1 flex h-5 w-5 items-center justify-center rounded text-ui-subtle/60 transition-colors hover:bg-ui-fill hover:text-ui-default",
1032
+ children: /* @__PURE__ */ jsx19(X, { size: 12 })
1033
+ }
1034
+ )
1035
+ ] }),
1036
+ /* @__PURE__ */ jsx19(
1037
+ "div",
1038
+ {
1039
+ className: "mb-3.5 grid h-[22px] gap-[4px]",
1040
+ style: { gridTemplateColumns: `repeat(${segments}, minmax(0, 1fr))` },
1041
+ "aria-label": `${doneCount} of ${totalSteps} steps complete`,
1042
+ "aria-hidden": true,
1043
+ children: Array.from({ length: segments }).map((_, i) => /* @__PURE__ */ jsx19(
1044
+ "span",
1045
+ {
1046
+ className: cn(
1047
+ "rounded-[1px] transition-colors duration-500",
1048
+ i < filledCount ? "bg-[oklch(68%_0.14_185)]" : "bg-[#ffffff] dark:bg-[#3B3B3E]"
1049
+ )
1050
+ },
1051
+ i
1052
+ ))
1053
+ }
1054
+ ),
1055
+ /* @__PURE__ */ jsx19("div", { className: "-mx-2 overflow-hidden rounded-md divide-y divide-ui-line/60", children: steps.map((step) => {
1056
+ const content = /* @__PURE__ */ jsxs11("div", { className: cn(
1057
+ "flex w-full items-center gap-2.5 px-2 py-[9px]",
1058
+ "text-left text-[12px] font-medium leading-tight",
1059
+ "transition-colors duration-150",
1060
+ step.done ? "text-ui-subtle cursor-default" : "text-foreground hover:bg-ui-fill/50"
1061
+ ), children: [
1062
+ /* @__PURE__ */ jsx19(
1063
+ "span",
1064
+ {
1065
+ className: cn(
1066
+ "flex h-[18px] w-[18px] shrink-0 items-center justify-center rounded-full border transition-colors duration-300",
1067
+ step.done ? "border-[#00B3A3] bg-[#00B3A3] text-white" : "border-ui-line bg-transparent text-transparent"
1068
+ ),
1069
+ children: /* @__PURE__ */ jsx19(Check3, { size: 10, strokeWidth: 3 })
1070
+ }
1071
+ ),
1072
+ /* @__PURE__ */ jsx19("span", { className: "flex-1 truncate", children: step.label })
1073
+ ] });
1074
+ if (step.onClick) {
1075
+ return /* @__PURE__ */ jsx19("button", { onClick: step.onClick, className: "w-full outline-none focus-visible:bg-ui-fill/50", children: content }, step.id);
1076
+ }
1077
+ return /* @__PURE__ */ jsx19("div", { children: content }, step.id);
1078
+ }) })
1079
+ ] }) });
1080
+ }
1081
+
1005
1082
  // src/components/chart-primitives.tsx
1006
1083
  import { Children } from "react";
1007
- import { jsx as jsx19, jsxs as jsxs11 } from "react/jsx-runtime";
1084
+ import { jsx as jsx20, jsxs as jsxs12 } from "react/jsx-runtime";
1008
1085
  function CardDots() {
1009
- return /* @__PURE__ */ jsx19(
1086
+ return /* @__PURE__ */ jsx20(
1010
1087
  "div",
1011
1088
  {
1012
1089
  "aria-hidden": true,
@@ -1028,7 +1105,7 @@ function GraphShell({
1028
1105
  return (
1029
1106
  // Same chrome as the dashboard stat cards: card face carries the title, the chart itself sits
1030
1107
  // in a recessed inner panel.
1031
- /* @__PURE__ */ jsxs11(
1108
+ /* @__PURE__ */ jsxs12(
1032
1109
  "div",
1033
1110
  {
1034
1111
  className: cn(
@@ -1036,14 +1113,14 @@ function GraphShell({
1036
1113
  className
1037
1114
  ),
1038
1115
  children: [
1039
- /* @__PURE__ */ jsxs11("div", { className: "flex items-center gap-2 px-0.5", children: [
1040
- icon && /* @__PURE__ */ jsx19("span", { className: "shrink-0 text-ui-subtle", children: icon }),
1041
- /* @__PURE__ */ jsx19("h3", { className: "truncate text-[11px] font-semibold uppercase tracking-[0.14em] text-ui-default", children: title })
1116
+ /* @__PURE__ */ jsxs12("div", { className: "flex items-center gap-2 px-0.5", children: [
1117
+ icon && /* @__PURE__ */ jsx20("span", { className: "shrink-0 text-ui-subtle", children: icon }),
1118
+ /* @__PURE__ */ jsx20("h3", { className: "truncate text-[11px] font-semibold uppercase tracking-[0.14em] text-ui-default", children: title })
1042
1119
  ] }),
1043
- /* @__PURE__ */ jsxs11("div", { className: "ui-well relative mt-3 flex flex-1 flex-col overflow-hidden rounded-md", children: [
1044
- /* @__PURE__ */ jsx19(CardDots, {}),
1045
- legend && /* @__PURE__ */ jsx19("div", { className: "relative flex flex-wrap items-center gap-x-4 gap-y-1.5 px-3.5 pt-3.5", children: legend }),
1046
- /* @__PURE__ */ jsx19("div", { className: "relative flex flex-1 flex-col", children })
1120
+ /* @__PURE__ */ jsxs12("div", { className: "ui-well relative mt-3 flex flex-1 flex-col overflow-hidden rounded-md", children: [
1121
+ /* @__PURE__ */ jsx20(CardDots, {}),
1122
+ legend && /* @__PURE__ */ jsx20("div", { className: "relative flex flex-wrap items-center gap-x-4 gap-y-1.5 px-3.5 pt-3.5", children: legend }),
1123
+ /* @__PURE__ */ jsx20("div", { className: "relative flex flex-1 flex-col", children })
1047
1124
  ] })
1048
1125
  ]
1049
1126
  }
@@ -1052,7 +1129,7 @@ function GraphShell({
1052
1129
  }
1053
1130
  function SeriesMarker({ color, hatched, dashed }) {
1054
1131
  if (dashed) {
1055
- return /* @__PURE__ */ jsx19(
1132
+ return /* @__PURE__ */ jsx20(
1056
1133
  "span",
1057
1134
  {
1058
1135
  "aria-hidden": true,
@@ -1061,7 +1138,7 @@ function SeriesMarker({ color, hatched, dashed }) {
1061
1138
  }
1062
1139
  );
1063
1140
  }
1064
- return /* @__PURE__ */ jsx19(
1141
+ return /* @__PURE__ */ jsx20(
1065
1142
  "span",
1066
1143
  {
1067
1144
  "aria-hidden": true,
@@ -1079,26 +1156,26 @@ function LegendChip({
1079
1156
  dashed,
1080
1157
  label
1081
1158
  }) {
1082
- return /* @__PURE__ */ jsxs11("span", { className: "flex items-center gap-1.5 text-xs text-ui-subtle", children: [
1083
- /* @__PURE__ */ jsx19(SeriesMarker, { color, hatched, dashed }),
1159
+ return /* @__PURE__ */ jsxs12("span", { className: "flex items-center gap-1.5 text-xs text-ui-subtle", children: [
1160
+ /* @__PURE__ */ jsx20(SeriesMarker, { color, hatched, dashed }),
1084
1161
  label
1085
1162
  ] });
1086
1163
  }
1087
1164
  function ChartDefs({ isDark }) {
1088
1165
  const hatch = isDark ? "rgba(228,228,231,0.5)" : "rgba(63,63,70,0.4)";
1089
1166
  const hatchBg = isDark ? "rgba(255,255,255,0.05)" : "rgba(0,0,0,0.04)";
1090
- return /* @__PURE__ */ jsxs11("defs", { children: [
1091
- /* @__PURE__ */ jsxs11("pattern", { id: "hatchGray", patternUnits: "userSpaceOnUse", width: "5", height: "5", patternTransform: "rotate(45)", children: [
1092
- /* @__PURE__ */ jsx19("rect", { width: "5", height: "5", fill: hatchBg }),
1093
- /* @__PURE__ */ jsx19("line", { x1: "0", y1: "0", x2: "0", y2: "5", stroke: hatch, strokeWidth: "1.4" })
1167
+ return /* @__PURE__ */ jsxs12("defs", { children: [
1168
+ /* @__PURE__ */ jsxs12("pattern", { id: "hatchGray", patternUnits: "userSpaceOnUse", width: "5", height: "5", patternTransform: "rotate(45)", children: [
1169
+ /* @__PURE__ */ jsx20("rect", { width: "5", height: "5", fill: hatchBg }),
1170
+ /* @__PURE__ */ jsx20("line", { x1: "0", y1: "0", x2: "0", y2: "5", stroke: hatch, strokeWidth: "1.4" })
1094
1171
  ] }),
1095
- /* @__PURE__ */ jsxs11("linearGradient", { id: "blueBar", x1: "0", y1: "0", x2: "0", y2: "1", children: [
1096
- /* @__PURE__ */ jsx19("stop", { offset: "0%", stopColor: "#60a5fa" }),
1097
- /* @__PURE__ */ jsx19("stop", { offset: "100%", stopColor: "#2563eb" })
1172
+ /* @__PURE__ */ jsxs12("linearGradient", { id: "blueBar", x1: "0", y1: "0", x2: "0", y2: "1", children: [
1173
+ /* @__PURE__ */ jsx20("stop", { offset: "0%", stopColor: "#60a5fa" }),
1174
+ /* @__PURE__ */ jsx20("stop", { offset: "100%", stopColor: "#2563eb" })
1098
1175
  ] }),
1099
- /* @__PURE__ */ jsxs11("linearGradient", { id: "amberFill", x1: "0", y1: "0", x2: "0", y2: "1", children: [
1100
- /* @__PURE__ */ jsx19("stop", { offset: "0%", stopColor: isDark ? "#f59e0b" : "#d97706", stopOpacity: 0.16 }),
1101
- /* @__PURE__ */ jsx19("stop", { offset: "100%", stopColor: isDark ? "#f59e0b" : "#d97706", stopOpacity: 0.02 })
1176
+ /* @__PURE__ */ jsxs12("linearGradient", { id: "amberFill", x1: "0", y1: "0", x2: "0", y2: "1", children: [
1177
+ /* @__PURE__ */ jsx20("stop", { offset: "0%", stopColor: isDark ? "#f59e0b" : "#d97706", stopOpacity: 0.16 }),
1178
+ /* @__PURE__ */ jsx20("stop", { offset: "100%", stopColor: isDark ? "#f59e0b" : "#d97706", stopOpacity: 0.02 })
1102
1179
  ] })
1103
1180
  ] });
1104
1181
  }
@@ -1106,7 +1183,7 @@ var METER_ROW_PX = 20;
1106
1183
  var METER_GAP_PX = 14;
1107
1184
  function MeterList({ visible, children }) {
1108
1185
  const scrolls = Children.count(children) > visible;
1109
- return /* @__PURE__ */ jsx19("div", { className: "px-3.5 py-4 sm:px-4 sm:py-4.5", children: /* @__PURE__ */ jsx19(
1186
+ return /* @__PURE__ */ jsx20("div", { className: "px-3.5 py-4 sm:px-4 sm:py-4.5", children: /* @__PURE__ */ jsx20(
1110
1187
  "div",
1111
1188
  {
1112
1189
  className: cn("space-y-3.5", scrolls && "overflow-y-auto pr-3"),
@@ -1124,17 +1201,25 @@ function TickMeter({
1124
1201
  }) {
1125
1202
  const SEGMENTS = 26;
1126
1203
  const filled = value > 0 ? Math.max(1, Math.round(value / Math.max(max, 1) * SEGMENTS)) : 0;
1127
- return /* @__PURE__ */ jsxs11("div", { className: "flex h-5 items-center gap-3", children: [
1128
- /* @__PURE__ */ jsx19("span", { className: "w-28 shrink-0 truncate text-[13px] font-medium text-ui-default", title: label, children: label }),
1129
- /* @__PURE__ */ jsx19("div", { className: "flex h-4 flex-1 items-stretch gap-[2.5px]", "aria-hidden": true, children: Array.from({ length: SEGMENTS }).map((_, i) => /* @__PURE__ */ jsx19(
1130
- "span",
1204
+ return /* @__PURE__ */ jsxs12("div", { className: "flex h-5 items-center gap-3", children: [
1205
+ /* @__PURE__ */ jsx20("span", { className: "w-28 shrink-0 truncate text-[13px] font-medium text-ui-default", title: label, children: label }),
1206
+ /* @__PURE__ */ jsx20(
1207
+ "div",
1131
1208
  {
1132
- className: "min-w-[2px] flex-1 rounded-[1px]",
1133
- style: { backgroundColor: i < filled ? color : "var(--ui-fill)" }
1134
- },
1135
- i
1136
- )) }),
1137
- /* @__PURE__ */ jsx19("span", { className: "ui-font-mono w-14 shrink-0 text-right text-xs tabular-nums text-ui-default", children: valueLabel })
1209
+ className: "grid h-4 flex-1 gap-[2.5px]",
1210
+ style: { gridTemplateColumns: `repeat(${SEGMENTS}, minmax(0, 1fr))` },
1211
+ "aria-hidden": true,
1212
+ children: Array.from({ length: SEGMENTS }).map((_, i) => /* @__PURE__ */ jsx20(
1213
+ "span",
1214
+ {
1215
+ className: "rounded-[1px]",
1216
+ style: { backgroundColor: i < filled ? color : "var(--ui-fill)" }
1217
+ },
1218
+ i
1219
+ ))
1220
+ }
1221
+ ),
1222
+ /* @__PURE__ */ jsx20("span", { className: "ui-font-mono w-14 shrink-0 text-right text-xs tabular-nums text-ui-default", children: valueLabel })
1138
1223
  ] });
1139
1224
  }
1140
1225
  export {
@@ -1155,6 +1240,7 @@ export {
1155
1240
  LinkButton,
1156
1241
  LoadError,
1157
1242
  MeterList,
1243
+ OnboardingCard,
1158
1244
  SectionCard,
1159
1245
  Select,
1160
1246
  SeriesMarker,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/alert.tsx","../src/components/badge.tsx","../src/components/badge-variants.ts","../src/components/button.tsx","../src/components/button-variants.ts","../src/components/confirm-dialog.tsx","../src/components/input.tsx","../src/components/layer-card.tsx","../src/components/select.tsx","../src/components/select-panel.tsx","../src/components/select-shared.ts","../src/components/select-trigger.tsx","../src/components/switch.tsx","../src/components/text.tsx","../src/components/skeleton.tsx","../src/components/empty-state.tsx","../src/components/section-card.tsx","../src/components/copy-button.tsx","../src/lib/constants.ts","../src/components/bar-sparkline.tsx","../src/components/github-mark.tsx","../src/components/load-error.tsx","../src/components/chart-primitives.tsx"],"sourcesContent":["import * as React from 'react';\nimport { cn } from '../lib/utils';\nimport { AlertCircle, CheckCircle2, AlertTriangle, Info } from 'lucide-react';\n\nconst variants = {\n default: {\n bg: 'var(--info-bg)',\n border: 'var(--info-border)',\n color: 'var(--info)',\n icon: Info\n },\n destructive: {\n bg: 'var(--danger-bg)',\n border: 'var(--danger-border)',\n color: 'var(--danger)',\n icon: AlertCircle\n },\n warning: {\n bg: 'var(--warning-bg)',\n border: 'var(--warning-border)',\n color: 'var(--warning)',\n icon: AlertTriangle\n },\n success: {\n bg: 'var(--success-bg)',\n border: 'var(--success-border)',\n color: 'var(--success)',\n icon: CheckCircle2\n }\n};\n\ninterface AlertProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: keyof typeof variants;\n icon?: React.ElementType;\n}\n\nexport const Alert = React.forwardRef<HTMLDivElement, AlertProps>(\n ({ className, variant = 'default', icon: IconOverride, children, ...props }, ref) => {\n const config = variants[variant];\n const Icon = IconOverride || config.icon;\n\n return (\n <div\n ref={ref}\n role=\"alert\"\n className={cn(\n 'flex gap-3 rounded-lg border px-4 py-3 text-sm',\n className\n )}\n style={{ \n backgroundColor: config.bg, \n borderColor: config.border, \n color: config.color \n }}\n {...props}\n >\n <Icon className=\"h-4 w-4 shrink-0 mt-0.5\" />\n <div className=\"flex-1\">{children}</div>\n </div>\n );\n }\n);\nAlert.displayName = 'Alert';\n","import * as React from 'react';\nimport { type VariantProps } from 'class-variance-authority';\nimport { cn } from '../lib/utils';\nimport { badgeVariants } from '../components/badge-variants';\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, ...props }: BadgeProps) {\n return <div className={cn(badgeVariants({ variant }), className)} {...props} />;\n}\n\nexport { Badge };\n","import { cva } from 'class-variance-authority';\n\n// Borderless tinted pills (Cloudflare-dashboard style): translucent fill + saturated text of the same hue.\nexport const badgeVariants = cva(\n 'inline-flex items-center gap-1 rounded-md px-2 py-0.5 text-[11px] font-medium transition-colors',\n {\n variants: {\n variant: {\n default: 'bg-primary/15 text-primary',\n secondary: 'bg-ui-fill/45 text-ui-default',\n neutral: 'bg-ui-fill/45 text-ui-default',\n info: 'bg-info/15 text-info',\n success: 'bg-success/15 text-success',\n warning: 'bg-warning/15 text-warning',\n danger: 'bg-danger/15 text-danger',\n outline: 'text-ui-default ring-1 ring-inset ring-ui-line bg-transparent',\n },\n },\n defaultVariants: { variant: 'default' },\n },\n);\n","import * as React from 'react';\nimport { useRender } from '@base-ui/react/use-render';\nimport { type VariantProps } from 'class-variance-authority';\nimport { Loader2 } from 'lucide-react';\nimport { cn } from '../lib/utils';\nimport { buttonVariants } from '../components/button-variants';\n\ntype Shape = 'base' | 'square' | 'circle';\n\n// Icon-only shapes: collapse padding and match width to the height of each size.\nconst SQUARE_WIDTH: Record<string, string> = {\n xs: 'w-6 p-0',\n sm: 'w-8 p-0',\n base: 'w-9 p-0',\n default: 'w-9 p-0',\n lg: 'w-11 p-0',\n icon: 'p-0',\n};\n\nfunction shapeClass(shape: Shape, size: VariantProps<typeof buttonVariants>['size']) {\n if (shape === 'base') return '';\n return cn(SQUARE_WIDTH[size ?? 'default'], shape === 'circle' && 'rounded-full');\n}\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n shape?: Shape;\n /** Element rendered before children (skipped while `loading`). */\n icon?: React.ReactNode;\n /** Shows a spinner and disables the button. */\n loading?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, shape = 'base', asChild = false, icon, loading, children, ...props }, ref) => {\n const classes = cn(buttonVariants({ variant, size }), shapeClass(shape, size), className);\n\n // `asChild` renders the child itself with props merged onto it (Base UI's equivalent of the former Radix Slot).\n return useRender({\n render: asChild && React.isValidElement(children) ? children : undefined,\n defaultTagName: 'button',\n ref,\n props: {\n className: classes,\n ...props,\n ...(asChild\n ? {}\n : {\n disabled: props.disabled || loading,\n children: (\n <>\n {loading ? <Loader2 className=\"size-4 animate-spin\" /> : icon}\n {children}\n </>\n ),\n }),\n },\n });\n },\n);\nButton.displayName = 'Button';\n\nexport interface LinkButtonProps\n extends React.AnchorHTMLAttributes<HTMLAnchorElement>,\n VariantProps<typeof buttonVariants> {\n shape?: Shape;\n icon?: React.ReactNode;\n /** Open in a new tab with safe rel attributes. */\n external?: boolean;\n}\n\nconst LinkButton = React.forwardRef<HTMLAnchorElement, LinkButtonProps>(\n ({ className, variant, size, shape = 'base', icon, external, children, ...props }, ref) => (\n <a\n ref={ref}\n className={cn(buttonVariants({ variant, size }), shapeClass(shape, size), className)}\n {...(external ? { target: '_blank', rel: 'noopener noreferrer' } : {})}\n {...props}\n >\n {icon}\n {children}\n </a>\n ),\n);\nLinkButton.displayName = 'LinkButton';\n\nexport { Button, LinkButton };\n","import { cva } from 'class-variance-authority';\n\n// `primary`/`secondary` use the bordered-panel look; remaining variants are legacy, kept for screens still on the older palette. Also drives <LinkButton>.\nexport const buttonVariants = cva(\n 'relative inline-flex select-none items-center justify-center gap-2 whitespace-nowrap font-semibold transition-all duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0',\n {\n variants: {\n variant: {\n primary:\n 'border border-[var(--btn-primary-border)] bg-[var(--btn-primary-surface)] text-[var(--btn-primary-fg)] hover:bg-[var(--btn-primary-hover)]',\n secondary: 'border border-ui-line bg-ui-base text-ui-default hover:bg-ui-fill/60',\n default: 'bg-primary text-primary-foreground shadow-sm hover:bg-primary/90 active:scale-[.98]',\n destructive: 'bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90',\n 'destructive-outline':\n 'border border-danger-border bg-danger-bg/40 text-danger shadow-sm hover:bg-destructive hover:text-destructive-foreground hover:border-destructive',\n 'warning-outline':\n 'border border-warning-border bg-warning-bg/40 text-warning shadow-sm hover:bg-warning-bg hover:border-warning',\n outline:\n 'border border-zinc-200 bg-white shadow-sm hover:bg-zinc-50 hover:text-zinc-900 dark:border-white/10 dark:bg-white/[0.06] dark:hover:bg-white/[0.1] dark:hover:text-foreground',\n ghost: 'hover:bg-secondary hover:text-secondary-foreground',\n link: 'text-primary underline-offset-4 hover:underline',\n accent: 'bg-accent text-accent-foreground shadow-sm hover:bg-accent/90 active:scale-[.98]',\n },\n size: {\n default: 'h-9 rounded-md px-4 py-2 text-sm',\n sm: 'h-8 rounded-md px-3 text-xs',\n base: 'h-9 rounded-md px-3 text-sm',\n lg: 'h-11 rounded-md px-6 text-sm',\n xs: 'h-6 rounded-md px-1.5 text-xs',\n icon: 'h-9 w-9 rounded-md',\n },\n },\n defaultVariants: { variant: 'default', size: 'default' },\n },\n);\n","import { Dialog } from '@base-ui/react/dialog';\nimport { AlertTriangle } from 'lucide-react';\nimport { Button, type ButtonProps } from '../components/button';\n\ninterface ConfirmDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title: string;\n description: string;\n confirmLabel?: string;\n cancelLabel?: string;\n confirmVariant?: ButtonProps['variant'];\n onConfirm: () => void;\n}\n\nexport function ConfirmDialog({\n open,\n onOpenChange,\n title,\n description,\n confirmLabel = 'Continue',\n cancelLabel = 'Cancel',\n confirmVariant = 'default',\n onConfirm,\n}: ConfirmDialogProps) {\n return (\n <Dialog.Root open={open} onOpenChange={onOpenChange}>\n <Dialog.Portal>\n <Dialog.Backdrop className=\"fixed inset-0 z-40 bg-background/75 backdrop-blur-sm transition-opacity duration-150 data-ending-style:opacity-0 data-starting-style:opacity-0\" />\n <Dialog.Popup className=\"fixed left-1/2 top-1/2 z-50 w-[calc(100vw-1.5rem)] max-w-md -translate-x-1/2 -translate-y-1/2 rounded-lg border border-ui-line bg-card p-5 shadow-2xl transition-[opacity,transform] duration-150 data-ending-style:scale-95 data-ending-style:opacity-0 data-starting-style:scale-95 data-starting-style:opacity-0\">\n <div className=\"flex items-start gap-3\">\n <span className=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-[var(--warning-bg)] text-[var(--warning)]\">\n <AlertTriangle size={18} />\n </span>\n <div className=\"min-w-0\">\n <Dialog.Title className=\"text-sm font-semibold text-foreground\">{title}</Dialog.Title>\n <Dialog.Description className=\"mt-1 text-sm text-muted-foreground\">\n {description}\n </Dialog.Description>\n </div>\n </div>\n\n <div className=\"mt-5 flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\">\n <Dialog.Close render={<Button variant=\"outline\" />}>{cancelLabel}</Dialog.Close>\n <Button\n variant={confirmVariant}\n onClick={() => {\n onConfirm();\n onOpenChange(false);\n }}\n >\n {confirmLabel}\n </Button>\n </div>\n </Dialog.Popup>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n","import * as React from 'react';\nimport { cn } from '../lib/utils';\n\ntype InputSize = 'xs' | 'sm' | 'base' | 'lg';\n\nconst SIZE_CLASS: Record<InputSize, string> = {\n xs: 'h-6 rounded-md px-1.5 text-xs',\n sm: 'h-8 rounded-md px-2 text-xs',\n base: 'h-9 rounded-md px-3 text-sm',\n lg: 'h-10 rounded-md px-4 text-base',\n};\n\n// Omit the native numeric `size` attribute so our string-union size wins.\nexport interface InputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {\n size?: InputSize;\n}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, size = 'base', ...props }, ref) => (\n <input\n ref={ref}\n className={cn(\n 'w-full border border-ui-line bg-ui-base text-ui-default transition-colors placeholder:text-ui-subtle focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ui-brand/40 disabled:cursor-not-allowed disabled:opacity-50',\n SIZE_CLASS[size],\n className,\n )}\n {...props}\n />\n ),\n);\nInput.displayName = 'Input';\n\nexport { Input };\n","import * as React from 'react';\nimport { cn } from '../lib/utils';\n\n/** Uses the `ui-*` surface tokens defined in app.css. */\nconst LayerCard = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('rounded-lg border border-ui-line bg-ui-base', className)}\n {...props}\n />\n ),\n);\nLayerCard.displayName = 'LayerCard';\n\nexport { LayerCard };\n","import { domAnimation, LazyMotion, useReducedMotion } from 'motion/react';\nimport {\n type CSSProperties,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode,\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { cn } from '../lib/utils';\nimport { SelectPanel } from './select-panel';\nimport type { Placement, SelectOption, TriggerRect } from './select-shared';\nimport { SelectTrigger } from './select-trigger';\n\ninterface SelectProps {\n value: string;\n onValueChange: (value: string) => void;\n options: SelectOption[];\n placeholder?: string;\n label?: string;\n className?: string;\n triggerClassName?: string;\n triggerStyle?: CSSProperties;\n leadingIcon?: ReactNode;\n /** Decides the dropdown's background so it stays distinguishable from where the trigger sits. */\n variant?: 'page' | 'card';\n}\n\nexport function Select({\n value,\n onValueChange,\n options,\n placeholder = 'Select...',\n label,\n className,\n triggerClassName,\n triggerStyle,\n leadingIcon,\n variant = 'page',\n}: SelectProps) {\n const reduce = useReducedMotion() ?? false;\n const baseId = useId();\n const triggerId = `${baseId}-trigger`;\n const listId = `${baseId}-list`;\n const labelId = `${baseId}-label`;\n const triggerRef = useRef<HTMLButtonElement>(null);\n const labelRef = useRef<HTMLLabelElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const innerRef = useRef<HTMLUListElement>(null);\n const [open, setOpen] = useState(false);\n const [placement, setPlacement] = useState<Placement>('bottom');\n const [height, setHeight] = useState(0);\n const [rect, setRect] = useState<TriggerRect | null>(null);\n const [highlightedIndex, setHighlightedIndex] = useState(0);\n const optionRefs = useRef<Array<HTMLButtonElement | null>>([]);\n /** What last moved the highlight - only keyboard moves should auto-scroll. */\n const highlightSource = useRef<'keyboard' | 'pointer'>('keyboard');\n\n const selectedOption = options.find((opt) => opt.value === value);\n\n // Depends on `open` only: keying off `options`/`value` yanked the highlight back when a caller passed a freshly-built array mid-interaction.\n useEffect(() => {\n if (!open) return;\n highlightSource.current = 'keyboard';\n const idx = options.findIndex((opt) => opt.value === value);\n setHighlightedIndex(idx >= 0 ? idx : 0);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open]);\n\n // Keyboard only: on hover this looped (hover → scrollIntoView → reposition → mouseenter again), causing jitter.\n useEffect(() => {\n if (!open || highlightSource.current !== 'keyboard') return;\n optionRefs.current[highlightedIndex]?.scrollIntoView({ block: 'nearest' });\n }, [open, highlightedIndex]);\n\n useEffect(() => {\n if (!open) return;\n const onKey = (e: KeyboardEvent) => e.key === 'Escape' && setOpen(false);\n const onPointer = (e: PointerEvent) => {\n const target = e.target as Node;\n if (triggerRef.current?.contains(target)) return;\n if (panelRef.current?.contains(target)) return;\n // The label forwards its click to the trigger, so treating it as \"outside\" would close the\n // panel here and let that forwarded click reopen it -- one click, no visible change.\n if (labelRef.current?.contains(target)) return;\n setOpen(false);\n };\n window.addEventListener('keydown', onKey);\n window.addEventListener('pointerdown', onPointer);\n return () => {\n window.removeEventListener('keydown', onKey);\n window.removeEventListener('pointerdown', onPointer);\n };\n }, [open]);\n\n useLayoutEffect(() => {\n const node = innerRef.current;\n if (!node) return;\n const measure = () => setHeight(node.offsetHeight);\n measure();\n const observer = new ResizeObserver(measure);\n observer.observe(node);\n return () => observer.disconnect();\n }, []);\n\n // Flips upward when there's no room below; batched to one animation frame since scroll/resize fire faster than repaints.\n useLayoutEffect(() => {\n if (!open) return;\n const trigger = triggerRef.current;\n if (!trigger) return;\n let frame: number | null = null;\n const update = () => {\n frame = null;\n const r = trigger.getBoundingClientRect();\n setRect({ left: r.left, width: r.width, top: r.top, bottom: r.bottom });\n const h = innerRef.current?.offsetHeight ?? 0;\n const below = window.innerHeight - r.bottom;\n const above = r.top;\n setPlacement(below < h + 16 && above > below ? 'top' : 'bottom');\n };\n const scheduleUpdate = (e?: Event) => {\n // Scrolling the list doesn't move the trigger; recomputing only causes flicker.\n if (e && e.target instanceof Node && panelRef.current?.contains(e.target)) return;\n if (frame !== null) return;\n frame = requestAnimationFrame(update);\n };\n update();\n window.addEventListener('scroll', scheduleUpdate, true);\n window.addEventListener('resize', scheduleUpdate);\n return () => {\n if (frame !== null) cancelAnimationFrame(frame);\n window.removeEventListener('scroll', scheduleUpdate, true);\n window.removeEventListener('resize', scheduleUpdate);\n };\n }, [open]);\n\n const moveHighlight = (next: number) => {\n highlightSource.current = 'keyboard';\n setHighlightedIndex(Math.min(Math.max(next, 0), options.length - 1));\n };\n\n const onTriggerKeyDown = (e: ReactKeyboardEvent<HTMLButtonElement>) => {\n if (!open) {\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp' || e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n setOpen(true);\n }\n return;\n }\n if (options.length === 0) return;\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n moveHighlight(highlightedIndex + 1);\n break;\n case 'ArrowUp':\n e.preventDefault();\n moveHighlight(highlightedIndex - 1);\n break;\n case 'Home':\n e.preventDefault();\n moveHighlight(0);\n break;\n case 'End':\n e.preventDefault();\n moveHighlight(options.length - 1);\n break;\n case 'Enter':\n case ' ':\n e.preventDefault();\n onValueChange(options[highlightedIndex].value);\n setOpen(false);\n break;\n case 'Tab':\n setOpen(false);\n break;\n default:\n break;\n }\n };\n\n const selectOption = (next: string) => {\n onValueChange(next);\n setOpen(false);\n };\n\n const highlightOption = (index: number) => {\n highlightSource.current = 'pointer';\n setHighlightedIndex(index);\n };\n\n const isTop = placement === 'top';\n\n return (\n <LazyMotion features={domAnimation}>\n <div className={cn('flex flex-col gap-1.5', className)}>\n {label && (\n <label\n ref={labelRef}\n id={labelId}\n htmlFor={triggerId}\n className=\"text-[10px] font-bold uppercase tracking-wider text-ui-subtle\"\n >\n {label}\n </label>\n )}\n <div className=\"relative\">\n <SelectTrigger\n triggerRef={triggerRef}\n triggerId={triggerId}\n listId={listId}\n labelId={label ? labelId : undefined}\n activeDescendantId={\n open && options[highlightedIndex] ? `${listId}-option-${highlightedIndex}` : undefined\n }\n open={open}\n isTop={isTop}\n reduce={reduce}\n selectedOption={selectedOption}\n placeholder={placeholder}\n leadingIcon={leadingIcon}\n variant={variant}\n className={triggerClassName}\n style={triggerStyle}\n onToggle={() => setOpen((v) => !v)}\n onKeyDown={onTriggerKeyDown}\n />\n </div>\n\n {/* Portaled to <body> so it can't be clipped by an ancestor's stacking context. */}\n {createPortal(\n <SelectPanel\n panelRef={panelRef}\n innerRef={innerRef}\n optionRefs={optionRefs}\n listId={listId}\n triggerId={triggerId}\n options={options}\n value={value}\n highlightedIndex={highlightedIndex}\n open={open}\n isTop={isTop}\n reduce={reduce}\n height={height}\n rect={rect}\n onSelect={selectOption}\n onHighlight={highlightOption}\n />,\n document.body,\n )}\n </div>\n </LazyMotion>\n );\n}\n","import { Check } from 'lucide-react';\nimport { m, type Transition } from 'motion/react';\nimport type { RefObject } from 'react';\nimport { cn } from '../lib/utils';\nimport { EASE_OUT } from '../lib/ease';\nimport {\n INSTANT_TRANSITION,\n ITEM_VARIANTS,\n LIST_VARIANTS,\n type SelectOption,\n type TriggerRect,\n} from './select-shared';\n\nconst REDUCED_TRANSITION: Transition = { duration: 0.12 };\nconst GAP_TRANSITION_OPEN: Transition = { type: 'spring', duration: 0.44, bounce: 0.45, delay: 0.09 };\nconst GAP_TRANSITION_CLOSED: Transition = { type: 'spring', duration: 0.26, bounce: 0.1 };\nconst RADIUS_TRANSITION_OPEN: Transition = { duration: 0.26, ease: EASE_OUT, delay: 0.1 };\nconst RADIUS_TRANSITION_CLOSED: Transition = { duration: 0.15, ease: EASE_OUT };\nconst OPACITY_TRANSITION_OPEN: Transition = { duration: 0.18 };\nconst OPACITY_TRANSITION_CLOSED: Transition = { duration: 0.16, delay: 0.1 };\nconst HEIGHT_TRANSITION_OPEN: Transition = { type: 'spring', duration: 0.4, bounce: 0.14 };\nconst HEIGHT_TRANSITION_CLOSED: Transition = { duration: 0.24, ease: EASE_OUT, delay: 0.1 };\n\ninterface SelectPanelProps {\n panelRef: RefObject<HTMLDivElement | null>;\n innerRef: RefObject<HTMLUListElement | null>;\n optionRefs: RefObject<Array<HTMLButtonElement | null>>;\n listId: string;\n triggerId: string;\n options: SelectOption[];\n value: string;\n highlightedIndex: number;\n open: boolean;\n isTop: boolean;\n reduce: boolean;\n height: number;\n rect: TriggerRect | null;\n onSelect: (value: string) => void;\n onHighlight: (index: number) => void;\n}\n\nexport function SelectPanel({\n panelRef,\n innerRef,\n optionRefs,\n listId,\n triggerId,\n options,\n value,\n highlightedIndex,\n open,\n isTop,\n reduce,\n height,\n rect,\n onSelect,\n onHighlight,\n}: SelectPanelProps) {\n const nearGap = open ? 8 : 0;\n const nearRadius = open ? 7 : 0;\n const gapT = open ? GAP_TRANSITION_OPEN : GAP_TRANSITION_CLOSED;\n const radiusT = open ? RADIUS_TRANSITION_OPEN : RADIUS_TRANSITION_CLOSED;\n\n return (\n <m.div\n ref={panelRef}\n id={listId}\n role=\"listbox\"\n aria-labelledby={triggerId}\n aria-hidden={!open}\n initial={false}\n animate={\n reduce\n ? { opacity: open ? 1 : 0, height: open ? height : 0 }\n : {\n opacity: open ? 1 : 0,\n height: open ? height : 0,\n // gap opens on the side facing the trigger\n marginTop: isTop ? 0 : nearGap,\n marginBottom: isTop ? nearGap : 0,\n // near corners go flat->round; far corners stay rounded\n borderTopLeftRadius: isTop ? 7 : nearRadius,\n borderTopRightRadius: isTop ? 7 : nearRadius,\n borderBottomLeftRadius: isTop ? nearRadius : 7,\n borderBottomRightRadius: isTop ? nearRadius : 7,\n }\n }\n transition={\n reduce\n ? REDUCED_TRANSITION\n : {\n opacity: open ? OPACITY_TRANSITION_OPEN : OPACITY_TRANSITION_CLOSED,\n height: open ? HEIGHT_TRANSITION_OPEN : HEIGHT_TRANSITION_CLOSED,\n marginTop: isTop ? INSTANT_TRANSITION : gapT,\n marginBottom: isTop ? gapT : INSTANT_TRANSITION,\n borderTopLeftRadius: isTop ? INSTANT_TRANSITION : radiusT,\n borderTopRightRadius: isTop ? INSTANT_TRANSITION : radiusT,\n borderBottomLeftRadius: isTop ? radiusT : INSTANT_TRANSITION,\n borderBottomRightRadius: isTop ? radiusT : INSTANT_TRANSITION,\n }\n }\n style={{\n position: 'fixed',\n left: rect?.left ?? 0,\n width: rect?.width ?? 0,\n top: isTop ? undefined : (rect?.bottom ?? 0),\n bottom: isTop ? window.innerHeight - (rect?.top ?? 0) : undefined,\n transformOrigin: isTop ? 'bottom' : 'top',\n overflow: 'hidden',\n pointerEvents: open ? 'auto' : 'none',\n }}\n // Flush against the trigger, then separates into its own rounded pill.\n className=\"z-50 border border-ui-line bg-ui-base shadow-lg shadow-black/[0.04] dark:shadow-black/40\"\n >\n <m.ul\n ref={innerRef}\n variants={reduce ? undefined : LIST_VARIANTS}\n initial={false}\n animate={open ? 'show' : 'hidden'}\n className=\"max-h-[min(28rem,60vh)] overflow-y-auto p-1\"\n >\n {options.map((option, index) => {\n const selected = option.value === value;\n const highlighted = index === highlightedIndex;\n return (\n <m.li key={option.value} variants={reduce ? undefined : ITEM_VARIANTS}>\n <button\n ref={(node) => {\n optionRefs.current[index] = node;\n }}\n id={`${listId}-option-${index}`}\n type=\"button\"\n role=\"option\"\n aria-selected={selected}\n tabIndex={-1}\n onMouseEnter={() => onHighlight(index)}\n onClick={() => onSelect(option.value)}\n className={cn(\n // `whitespace-nowrap`: on the 72px \"rows per page\" select, the check icon ate the width and \"10\" wrapped to stacked digits.\n 'flex w-full items-center justify-between gap-2 whitespace-nowrap rounded-md px-2.5 py-1.5 text-left text-sm outline-none transition-colors',\n selected\n ? 'bg-ui-brand/10 font-medium text-ui-brand'\n : 'text-ui-default hover:bg-ui-fill hover:text-ui-strong focus-visible:bg-ui-fill',\n highlighted && !selected && 'bg-ui-fill text-ui-strong',\n )}\n >\n <span className=\"min-w-0 truncate\">{option.label}</span>\n {selected ? <Check className=\"h-3.5 w-3.5 shrink-0\" /> : null}\n </button>\n </m.li>\n );\n })}\n </m.ul>\n </m.div>\n );\n}\n","import type { Transition, Variants } from 'motion/react';\n\nexport type Placement = 'bottom' | 'top';\n\nexport interface SelectOption {\n value: string;\n label: string;\n}\n\n/** Trigger box in viewport coordinates; the portaled panel is positioned from it. */\nexport interface TriggerRect {\n left: number;\n width: number;\n top: number;\n bottom: number;\n}\n\n// Spring with bounce powers the unfold; per-property timings on the panel choreograph it.\nexport const CHEVRON_TRANSITION: Transition = { type: 'spring', duration: 0.4, bounce: 0.3 };\n\n// Compounds per option; 0.035 delayed the last item ~0.9s on long lists, so 0.02 is the compromise.\nexport const LIST_VARIANTS: Variants = {\n hidden: {},\n show: { transition: { staggerChildren: 0.02, delayChildren: 0.03 } },\n};\nexport const ITEM_VARIANTS: Variants = {\n hidden: { opacity: 0, y: -5, filter: 'blur(2px)' },\n show: { opacity: 1, y: 0, filter: 'blur(0px)' },\n};\n\n/** Snaps a property to its target: the side not being choreographed, and every reduced-motion path. */\nexport const INSTANT_TRANSITION: Transition = { duration: 0 };\n","import { ChevronDown } from 'lucide-react';\nimport { m, type Transition } from 'motion/react';\nimport type { CSSProperties, KeyboardEvent as ReactKeyboardEvent, ReactNode, RefObject } from 'react';\nimport { cn } from '../lib/utils';\nimport { EASE_OUT } from '../lib/ease';\nimport { CHEVRON_TRANSITION, INSTANT_TRANSITION, type SelectOption } from './select-shared';\n\n// Gooey: the edge facing the panel snaps flat while attached, then rounds as the two pinch apart.\nconst RADIUS_OPEN = [0, 0, 7];\nconst RADIUS_CLOSED = [7, 0, 7];\nconst RADIUS_TRANSITION_OPEN: Transition = { duration: 0.46, times: [0, 0.4, 1], ease: EASE_OUT };\nconst RADIUS_TRANSITION_CLOSED: Transition = { duration: 0.34, times: [0, 0.5, 1], ease: EASE_OUT };\n\ninterface SelectTriggerProps {\n triggerRef: RefObject<HTMLButtonElement | null>;\n triggerId: string;\n listId: string;\n labelId: string | undefined;\n activeDescendantId: string | undefined;\n open: boolean;\n isTop: boolean;\n reduce: boolean;\n selectedOption: SelectOption | undefined;\n placeholder: string;\n leadingIcon: ReactNode;\n variant: 'page' | 'card';\n className: string | undefined;\n style: CSSProperties | undefined;\n onToggle: () => void;\n onKeyDown: (e: ReactKeyboardEvent<HTMLButtonElement>) => void;\n}\n\nexport function SelectTrigger({\n triggerRef,\n triggerId,\n listId,\n labelId,\n activeDescendantId,\n open,\n isTop,\n reduce,\n selectedOption,\n placeholder,\n leadingIcon,\n variant,\n className,\n style,\n onToggle,\n onKeyDown,\n}: SelectTriggerProps) {\n const kf = open ? RADIUS_OPEN : RADIUS_CLOSED;\n const kfT = reduce\n ? INSTANT_TRANSITION\n : open\n ? RADIUS_TRANSITION_OPEN\n : RADIUS_TRANSITION_CLOSED;\n\n return (\n <m.button\n ref={triggerRef}\n type=\"button\"\n id={triggerId}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={listId}\n // Self-reference keeps the selected label in the accessible name now that <label> also points here.\n aria-labelledby={labelId ? `${labelId} ${triggerId}` : undefined}\n aria-activedescendant={activeDescendantId}\n onClick={onToggle}\n onKeyDown={onKeyDown}\n initial={false}\n animate={{\n borderTopLeftRadius: isTop ? kf : 7,\n borderTopRightRadius: isTop ? kf : 7,\n borderBottomLeftRadius: isTop ? 7 : kf,\n borderBottomRightRadius: isTop ? 7 : kf,\n }}\n transition={{\n borderTopLeftRadius: isTop ? kfT : INSTANT_TRANSITION,\n borderTopRightRadius: isTop ? kfT : INSTANT_TRANSITION,\n borderBottomLeftRadius: isTop ? INSTANT_TRANSITION : kfT,\n borderBottomRightRadius: isTop ? INSTANT_TRANSITION : kfT,\n }}\n style={style}\n className={cn(\n 'relative z-10 flex h-9 w-full items-center justify-between gap-2 border border-ui-line px-3 py-2 text-sm font-normal text-ui-default outline-none transition-colors',\n variant === 'page' ? 'bg-ui-base' : 'bg-ui-fill/50',\n 'hover:bg-ui-fill/70 focus-visible:ring-2 focus-visible:ring-ui-brand/40 focus-visible:ring-offset-1 focus-visible:ring-offset-background',\n !selectedOption && 'text-ui-subtle',\n className,\n )}\n >\n <span className=\"flex min-w-0 flex-1 items-center gap-2\">\n {leadingIcon && <span className=\"shrink-0 text-primary/70\">{leadingIcon}</span>}\n <span className=\"min-w-0 truncate\">\n {selectedOption ? selectedOption.label : placeholder}\n </span>\n </span>\n <m.span\n aria-hidden\n animate={{ rotate: open ? 180 : 0 }}\n transition={reduce ? INSTANT_TRANSITION : CHEVRON_TRANSITION}\n className=\"shrink-0 text-ui-subtle\"\n >\n <ChevronDown className=\"h-4 w-4\" />\n </m.span>\n </m.button>\n );\n}\n","import * as React from 'react';\nimport { Switch as BaseSwitch } from '@base-ui/react/switch';\nimport { cn } from '../lib/utils';\n\nexport interface SwitchProps {\n checked?: boolean;\n defaultChecked?: boolean;\n disabled?: boolean;\n onCheckedChange?: (checked: boolean) => void;\n className?: string;\n 'aria-label'?: string;\n id?: string;\n}\n\n/** Toggle switch on Base UI, styled with the ui-* tokens (brand track when on). */\nconst Switch = React.forwardRef<HTMLButtonElement, SwitchProps>(\n ({ className, onCheckedChange, ...props }, ref) => (\n <BaseSwitch.Root\n ref={ref}\n onCheckedChange={(checked) => onCheckedChange?.(checked)}\n className={cn(\n // Squarish track + knob (Cloudflare-dashboard switch shape).\n 'relative inline-flex h-4 w-7 shrink-0 cursor-pointer items-center rounded-[5px] p-[2px] transition-colors duration-200',\n // Dark mode: lighter zinc when off (reads against the page), deeper lime when on (knob doesn't blend).\n 'bg-ui-fill dark:bg-[oklch(40%_0_0)]',\n 'data-checked:bg-ui-brand dark:data-checked:bg-[oklch(64%_0.21_118)]',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ui-brand/40 focus-visible:ring-offset-1 focus-visible:ring-offset-ui-base',\n 'data-disabled:cursor-not-allowed data-disabled:opacity-50',\n className,\n )}\n {...props}\n >\n <BaseSwitch.Thumb className=\"h-3 w-3 rounded-[3px] bg-white shadow-sm transition-transform duration-200 data-checked:translate-x-3\" />\n </BaseSwitch.Root>\n ),\n);\nSwitch.displayName = 'Switch';\n\nexport { Switch };\n","import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../lib/utils';\n\nconst textVariants = cva('', {\n variants: {\n variant: {\n body: 'text-ui-default',\n secondary: 'text-ui-subtle',\n strong: 'text-ui-strong',\n },\n size: {\n sm: 'text-sm',\n base: 'text-base',\n },\n bold: {\n true: 'font-semibold',\n false: '',\n },\n },\n defaultVariants: { variant: 'body', size: 'base', bold: false },\n});\n\ninterface TextProps\n extends React.HTMLAttributes<HTMLElement>,\n VariantProps<typeof textVariants> {\n /** Element to render (e.g. \"span\", \"h3\"). Defaults to <p>. */\n as?: React.ElementType;\n}\n\n/** Typographic primitive keyed off the ui-* surface text tokens. */\nexport function Text({ as: Comp = 'p', variant, size, bold, className, ...props }: TextProps) {\n return <Comp className={cn(textVariants({ variant, size, bold }), className)} {...props} />;\n}\n","import React from 'react';\nimport { cn } from '../lib/utils';\n\ninterface SkeletonProps {\n width?: string | number;\n height?: string | number;\n borderRadius?: string | number;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport const Skeleton: React.FC<SkeletonProps> = ({\n width,\n height,\n borderRadius,\n className = '',\n style,\n}) => {\n return (\n <div\n className={cn('skeleton', className)}\n style={{\n width: width ?? '100%',\n height: height ?? '1rem',\n borderRadius: borderRadius ?? undefined,\n ...style,\n }}\n />\n );\n};\n","import React from 'react';\nimport { cn } from '../lib/utils';\nimport { Button } from '../components/button';\n\ninterface EmptyStateProps {\n icon?: React.ReactNode;\n title: string;\n description?: string;\n /** Bullet hints with a green dot prefix. */\n hints?: string[];\n linkAction?: {\n label: string;\n href?: string;\n onClick?: () => void;\n };\n /** Legacy single action button */\n action?: {\n label: string;\n onClick: () => void;\n };\n className?: string;\n}\n\nexport function EmptyState({ icon, title, description, hints, linkAction, action, className }: EmptyStateProps) {\n return (\n <div\n className={cn(\n 'flex flex-col items-center justify-center gap-4 px-8 py-16 text-center',\n className,\n )}\n >\n {icon && (\n <div className=\"flex h-14 w-14 items-center justify-center text-muted-foreground/40 [&_svg]:h-9 [&_svg]:w-9 [&_svg]:stroke-[1.35]\">\n {icon}\n </div>\n )}\n <div className=\"space-y-1.5\">\n <h3 className=\"text-base font-semibold text-foreground\">{title}</h3>\n {description && (\n <p className=\"max-w-sm text-sm text-muted-foreground leading-relaxed\">{description}</p>\n )}\n </div>\n\n {hints && hints.length > 0 && (\n <ul className=\"mt-1 flex flex-col gap-1.5 text-left\">\n {hints.map((hint) => (\n <li key={hint} className=\"flex items-start gap-2.5 text-sm text-muted-foreground\">\n <span className=\"mt-[7px] h-1.5 w-1.5 shrink-0 rounded-full bg-primary opacity-80\" />\n <span>{hint}</span>\n </li>\n ))}\n </ul>\n )}\n\n {linkAction && (\n <div className=\"mt-3\">\n {linkAction.href ? (\n <Button asChild variant=\"outline\" size=\"sm\">\n <a\n href={linkAction.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {linkAction.label}\n </a>\n </Button>\n ) : (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={linkAction.onClick}\n >\n {linkAction.label}\n </Button>\n )}\n </div>\n )}\n\n {action && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={action.onClick}\n className=\"mt-2 text-muted-foreground hover:text-foreground\"\n >\n {action.label}\n </Button>\n )}\n </div>\n );\n}\n","import type { ReactNode } from 'react';\n\nexport function SectionCard({\n icon,\n title,\n description,\n action,\n children,\n}: {\n icon?: ReactNode;\n title: string;\n description?: string;\n action?: ReactNode;\n children: ReactNode;\n}) {\n return (\n <section className=\"ui-panel min-w-0 overflow-hidden\">\n <div className=\"flex items-center justify-between gap-4 border-b border-ui-line px-5 py-4\">\n <div className=\"flex min-w-0 items-center gap-2.5\">\n {icon && <span className=\"shrink-0 text-ui-subtle\">{icon}</span>}\n <div className=\"min-w-0\">\n <h2 className=\"text-[11px] font-semibold uppercase tracking-[0.14em] text-ui-default\">{title}</h2>\n {description && <p className=\"mt-0.5 truncate text-xs text-ui-subtle\">{description}</p>}\n </div>\n </div>\n {action && <div className=\"shrink-0\">{action}</div>}\n </div>\n {children}\n </section>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { Check, Copy } from 'lucide-react';\nimport { cn } from '../lib/utils';\nimport { UI_DURATION_TOOLTIP } from '../lib/constants';\n\n/**\n * Drag-selecting a long, scrollable `<pre>` is miserable - the container\n * scrolls while you drag, so one click is the reliable path instead.\n */\nexport function CopyButton({\n value,\n label = 'Copy',\n className,\n}: {\n value: string;\n label?: string;\n className?: string;\n}) {\n const [copied, setCopied] = useState(false);\n const timer = useRef<number | null>(null);\n // The timeout outlives the component if the panel is collapsed right after a copy.\n useEffect(() => () => {\n if (timer.current !== null) window.clearTimeout(timer.current);\n }, []);\n\n const copy = async () => {\n try {\n await navigator.clipboard.writeText(value);\n setCopied(true);\n if (timer.current !== null) window.clearTimeout(timer.current);\n timer.current = window.setTimeout(() => setCopied(false), UI_DURATION_TOOLTIP);\n } catch {\n // Clipboard access can be refused (insecure origin, permissions policy); fail quietly since manual selection still works.\n }\n };\n\n return (\n <button\n type=\"button\"\n onClick={copy}\n aria-label={copied ? 'Copied' : label}\n className={cn(\n 'inline-flex shrink-0 items-center gap-1 rounded border border-ui-line px-1.5 py-0.5',\n 'text-[10px] font-medium transition-colors',\n copied ? 'text-emerald-500' : 'text-ui-subtle hover:text-foreground',\n className,\n )}\n >\n {copied ? <Check size={10} /> : <Copy size={10} />}\n {copied ? 'Copied' : label}\n </button>\n );\n}\n","/**\n * Core UI magic numbers and standard constants.\n */\n\n// Animation timings (ms)\nexport const UI_DURATION_FAST = 150;\nexport const UI_DURATION_NORMAL = 200;\nexport const UI_DURATION_SLOW = 300;\nexport const UI_DURATION_TOOLTIP = 1500;\n\n// Standard opacities\nexport const OPACITY_DISABLED = 0.5;\nexport const OPACITY_HOVER = 0.8;\n\n// Common chart/graph colors\nexport const CHART_COLORS = {\n hatchGray: 'url(#hatchGray)',\n defaultGrid: '#333',\n transparent: 'transparent',\n tooltipBg: 'rgba(0,0,0,0.5)',\n} as const;\n\n// Layout thresholds\nexport const LAYOUT_CONSTANTS = {\n mobileBreakpoint: 768,\n} as const;\n","import { useMemo } from 'react';\nimport { cn } from '../lib/utils';\n\ninterface BarSparklineProps {\n /** Raw daily series; aggregated into `bars` buckets for the mini chart. */\n data: number[];\n /** Bar color (hex). A vertical gradient is derived from it. */\n color: string;\n bars?: number;\n className?: string;\n}\n\n/**\n * Resamples `data` to exactly `bars` values (summed down or nearest-neighbour\n * stretched up) so the chart renders a stable bar count even though the trend\n * query omits inactive days and a quiet range can yield far fewer points.\n */\nfunction bucketize(data: number[], bars: number): number[] {\n const out = Array<number>(bars).fill(0);\n if (data.length === 0) return out;\n\n if (data.length >= bars) {\n const size = data.length / bars;\n for (let i = 0; i < bars; i++) {\n const start = Math.floor(i * size);\n const end = Math.floor((i + 1) * size);\n out[i] = data.slice(start, end).reduce((sum, v) => sum + v, 0);\n }\n } else {\n for (let i = 0; i < bars; i++) {\n out[i] = data[Math.floor((i * data.length) / bars)];\n }\n }\n return out;\n}\n\n// Lightweight divs rather than a charting lib.\n// Minimum height share so zero/quiet periods still render as a visible bar, not an invisible nub.\nconst BASELINE_PCT = 32;\n\nexport function BarSparkline({ data, color, bars = 8, className }: BarSparklineProps) {\n const buckets = useMemo(() => bucketize(data, bars), [data, bars]);\n const max = Math.max(...buckets, 1);\n\n return (\n <div className={cn('flex h-12 items-end justify-end gap-[3px]', className)} aria-hidden=\"true\">\n {buckets.map((value, i) => (\n <div\n key={i}\n className=\"w-[5px] rounded-[2px] transition-[height] duration-500\"\n style={{\n height: `${BASELINE_PCT + (value / max) * (100 - BASELINE_PCT)}%`,\n background: `linear-gradient(to top, ${color}99, ${color})`,\n }}\n />\n ))}\n </div>\n );\n}\n","/** GitHub brand mark - lucide-react no longer ships brand icons. */\nexport function GithubMark({ size = 16, className }: { size?: number; className?: string }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n aria-hidden=\"true\"\n >\n <path d=\"M12 .5C5.65.5.5 5.65.5 12c0 5.08 3.29 9.39 7.86 10.91.58.11.79-.25.79-.55 0-.27-.01-1.17-.02-2.12-3.2.7-3.87-1.36-3.87-1.36-.52-1.33-1.28-1.68-1.28-1.68-1.04-.71.08-.7.08-.7 1.15.08 1.76 1.19 1.76 1.19 1.03 1.76 2.69 1.25 3.34.96.1-.75.4-1.25.72-1.54-2.55-.29-5.24-1.28-5.24-5.68 0-1.26.45-2.28 1.19-3.09-.12-.29-.52-1.46.11-3.05 0 0 .97-.31 3.17 1.18a11 11 0 0 1 2.89-.39c.98 0 1.97.13 2.89.39 2.2-1.49 3.16-1.18 3.16-1.18.63 1.59.24 2.76.12 3.05.74.81 1.19 1.83 1.19 3.09 0 4.41-2.69 5.38-5.25 5.67.41.35.77 1.05.77 2.12 0 1.53-.01 2.76-.01 3.14 0 .3.2.66.8.55A11.51 11.51 0 0 0 23.5 12C23.5 5.65 18.35.5 12 .5Z\" />\n </svg>\n );\n}\n","import { AlertTriangle, RefreshCw } from 'lucide-react';\nimport { Button } from '../components/button';\nimport { cn } from '../lib/utils';\n\ninterface LoadErrorProps {\n /** Friendly headline, e.g. \"Couldn't load dashboard data\". */\n title?: string;\n /** Raw error detail (e.g. \"Failed to fetch\"), shown as a mono chip. */\n detail?: string | null;\n /** Guidance line under the title; defaults to connection-check copy. */\n hint?: string;\n onRetry?: () => void;\n retrying?: boolean;\n className?: string;\n}\n\n/** Friendly copy up front, raw error as a small mono chip - instead of a bare toast echoing \"Failed to fetch\". */\nexport function LoadError({\n title = \"Couldn't load data\",\n detail,\n hint = 'Check your connection, then try again. If this keeps happening, the server may be unreachable.',\n onRetry,\n retrying,\n className,\n}: LoadErrorProps) {\n return (\n <section\n role=\"alert\"\n className={cn(\n 'ui-font-sans rounded-lg border border-ui-line bg-white p-3.5 dark:border-[oklch(0.27_0_0)] dark:bg-black sm:p-4',\n className,\n )}\n >\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between sm:gap-6\">\n <div className=\"flex min-w-0 items-start gap-3\">\n <span className=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-md bg-red-500/10 text-red-600 dark:text-red-400\">\n <AlertTriangle size={15} strokeWidth={2} />\n </span>\n <div className=\"min-w-0\">\n <h2 className=\"text-[13px] font-medium text-ui-default\">{title}</h2>\n <p className=\"mt-0.5 text-xs leading-relaxed text-ui-subtle\">\n {hint}\n </p>\n {detail && (\n <code className=\"ui-well ui-font-mono mt-2 inline-block max-w-full truncate rounded-[5px] px-2 py-1 text-[11px] text-ui-subtle\">\n {detail}\n </code>\n )}\n </div>\n </div>\n\n {onRetry && (\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={onRetry}\n disabled={retrying}\n icon={<RefreshCw size={13} className={retrying ? 'animate-spin' : ''} />}\n className=\"w-full shrink-0 sm:w-auto\"\n >\n Retry\n </Button>\n )}\n </div>\n </section>\n );\n}\n","import { Children, type ReactNode } from 'react';\nimport { cn } from '../lib/utils';\n\nexport function CardDots() {\n return (\n <div\n aria-hidden\n className=\"pointer-events-none absolute inset-0 opacity-[0.35]\"\n style={{\n backgroundImage: 'radial-gradient(circle, var(--ui-line) 1px, transparent 1px)',\n backgroundSize: '18px 18px',\n }}\n />\n );\n}\n\nexport function GraphShell({\n title,\n icon,\n legend,\n children,\n className = '',\n}: {\n title: string;\n icon?: ReactNode;\n legend?: ReactNode;\n children: ReactNode;\n className?: string;\n}) {\n return (\n // Same chrome as the dashboard stat cards: card face carries the title, the chart itself sits\n // in a recessed inner panel.\n <div\n className={cn(\n 'flex flex-col rounded-lg border border-ui-line bg-white p-3.5 dark:border-[oklch(0.27_0_0)] dark:bg-black',\n className,\n )}\n >\n <div className=\"flex items-center gap-2 px-0.5\">\n {icon && <span className=\"shrink-0 text-ui-subtle\">{icon}</span>}\n <h3 className=\"truncate text-[11px] font-semibold uppercase tracking-[0.14em] text-ui-default\">\n {title}\n </h3>\n </div>\n\n <div className=\"ui-well relative mt-3 flex flex-1 flex-col overflow-hidden rounded-md\">\n {/* Dot texture lives on the recessed face, where the chart reads against it. */}\n <CardDots />\n {legend && (\n <div className=\"relative flex flex-wrap items-center gap-x-4 gap-y-1.5 px-3.5 pt-3.5\">\n {legend}\n </div>\n )}\n <div className=\"relative flex flex-1 flex-col\">{children}</div>\n </div>\n </div>\n );\n}\n\nexport interface SeriesMarkerProps {\n /** Flat CSS colour. Ignored when `hatched` is set, which paints its own fill. */\n color?: string;\n /** The cross-hatched fill used for the input-token series. */\n hatched?: boolean;\n /** A dashed rule instead of a swatch, for series drawn as a dashed line. */\n dashed?: boolean;\n}\n\n/**\n * The swatch that identifies a series. Shared by the legend and the tooltip so a series looks the\n * same in both - a tooltip dot that doesn't match its legend chip reads as a different series.\n */\nexport function SeriesMarker({ color, hatched, dashed }: SeriesMarkerProps) {\n if (dashed) {\n return (\n <span\n aria-hidden\n className=\"h-0 w-3.5 shrink-0 border-t-2 border-dashed\"\n style={{ borderColor: color }}\n />\n );\n }\n\n return (\n <span\n aria-hidden\n className=\"h-2.5 w-2.5 shrink-0 rounded-[3px]\"\n style={\n hatched\n ? {\n backgroundImage:\n 'repeating-linear-gradient(45deg, var(--ui-subtle) 0 1.5px, transparent 1.5px 3.5px)',\n backgroundColor: 'color-mix(in oklch, var(--ui-fill) 60%, transparent)',\n }\n : { backgroundColor: color }\n }\n />\n );\n}\n\nexport function LegendChip({\n color,\n hatched,\n dashed,\n label,\n}: SeriesMarkerProps & { label: string }) {\n return (\n <span className=\"flex items-center gap-1.5 text-xs text-ui-subtle\">\n <SeriesMarker color={color} hatched={hatched} dashed={dashed} />\n {label}\n </span>\n );\n}\n\n\n\nexport function ChartDefs({ isDark }: { isDark: boolean }) {\n const hatch = isDark ? 'rgba(228,228,231,0.5)' : 'rgba(63,63,70,0.4)';\n const hatchBg = isDark ? 'rgba(255,255,255,0.05)' : 'rgba(0,0,0,0.04)';\n return (\n <defs>\n <pattern id=\"hatchGray\" patternUnits=\"userSpaceOnUse\" width=\"5\" height=\"5\" patternTransform=\"rotate(45)\">\n <rect width=\"5\" height=\"5\" fill={hatchBg} />\n <line x1=\"0\" y1=\"0\" x2=\"0\" y2=\"5\" stroke={hatch} strokeWidth=\"1.4\" />\n </pattern>\n <linearGradient id=\"blueBar\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor=\"#60a5fa\" />\n <stop offset=\"100%\" stopColor=\"#2563eb\" />\n </linearGradient>\n <linearGradient id=\"amberFill\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={isDark ? '#f59e0b' : '#d97706'} stopOpacity={0.16} />\n <stop offset=\"100%\" stopColor={isDark ? '#f59e0b' : '#d97706'} stopOpacity={0.02} />\n </linearGradient>\n </defs>\n );\n}\n\nconst METER_ROW_PX = 20;\nconst METER_GAP_PX = 14;\n\nexport function MeterList({ visible, children }: { visible: number; children: ReactNode }) {\n const scrolls = Children.count(children) > visible;\n\n return (\n <div className=\"px-3.5 py-4 sm:px-4 sm:py-4.5\">\n <div\n className={cn('space-y-3.5', scrolls && 'overflow-y-auto pr-3')}\n style={scrolls ? { maxHeight: visible * METER_ROW_PX + (visible - 1) * METER_GAP_PX } : undefined}\n >\n {children}\n </div>\n </div>\n );\n}\n\nexport function TickMeter({\n label,\n value,\n max,\n color,\n valueLabel,\n}: {\n label: string;\n value: number;\n max: number;\n color: string;\n valueLabel: string;\n}) {\n const SEGMENTS = 26;\n const filled = value > 0 ? Math.max(1, Math.round((value / Math.max(max, 1)) * SEGMENTS)) : 0;\n\n return (\n <div className=\"flex h-5 items-center gap-3\">\n <span className=\"w-28 shrink-0 truncate text-[13px] font-medium text-ui-default\" title={label}>\n {label}\n </span>\n <div className=\"flex h-4 flex-1 items-stretch gap-[2.5px]\" aria-hidden>\n {Array.from({ length: SEGMENTS }).map((_, i) => (\n <span\n key={i}\n className=\"min-w-[2px] flex-1 rounded-[1px]\"\n style={{ backgroundColor: i < filled ? color : 'var(--ui-fill)' }}\n />\n ))}\n </div>\n <span className=\"ui-font-mono w-14 shrink-0 text-right text-xs tabular-nums text-ui-default\">\n {valueLabel}\n </span>\n </div>\n );\n}\n"],"mappings":"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","names":["jsx","React","cva","jsx","jsxs","AlertTriangle","jsx","jsxs","AlertTriangle","React","jsx","React","jsx","jsx","jsxs","m","jsx","jsxs","RADIUS_TRANSITION_OPEN","RADIUS_TRANSITION_CLOSED","m","jsx","jsxs","React","jsx","cva","jsx","cva","jsx","jsx","jsxs","jsx","jsxs","useEffect","useRef","useState","Check","jsx","jsxs","useState","useRef","useEffect","Check","jsx","jsx","AlertTriangle","jsx","jsxs","AlertTriangle","jsx","jsxs"]}
1
+ {"version":3,"sources":["../src/components/alert.tsx","../src/components/badge.tsx","../src/components/badge-variants.ts","../src/components/button.tsx","../src/components/button-variants.ts","../src/components/confirm-dialog.tsx","../src/components/input.tsx","../src/components/layer-card.tsx","../src/components/select.tsx","../src/components/select-panel.tsx","../src/components/select-shared.ts","../src/components/select-trigger.tsx","../src/components/switch.tsx","../src/components/text.tsx","../src/components/skeleton.tsx","../src/components/empty-state.tsx","../src/components/section-card.tsx","../src/components/copy-button.tsx","../src/lib/constants.ts","../src/components/bar-sparkline.tsx","../src/components/github-mark.tsx","../src/components/load-error.tsx","../src/components/onboarding-card.tsx","../src/components/chart-primitives.tsx"],"sourcesContent":["import * as React from 'react';\nimport { cn } from '../lib/utils';\nimport { AlertCircle, CheckCircle2, AlertTriangle, Info } from 'lucide-react';\n\nconst variants = {\n default: {\n bg: 'var(--info-bg)',\n border: 'var(--info-border)',\n color: 'var(--info)',\n icon: Info\n },\n destructive: {\n bg: 'var(--danger-bg)',\n border: 'var(--danger-border)',\n color: 'var(--danger)',\n icon: AlertCircle\n },\n warning: {\n bg: 'var(--warning-bg)',\n border: 'var(--warning-border)',\n color: 'var(--warning)',\n icon: AlertTriangle\n },\n success: {\n bg: 'var(--success-bg)',\n border: 'var(--success-border)',\n color: 'var(--success)',\n icon: CheckCircle2\n }\n};\n\ninterface AlertProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: keyof typeof variants;\n icon?: React.ElementType;\n}\n\nexport const Alert = React.forwardRef<HTMLDivElement, AlertProps>(\n ({ className, variant = 'default', icon: IconOverride, children, ...props }, ref) => {\n const config = variants[variant];\n const Icon = IconOverride || config.icon;\n\n return (\n <div\n ref={ref}\n role=\"alert\"\n className={cn(\n 'flex gap-3 rounded-lg border px-4 py-3 text-sm',\n className\n )}\n style={{ \n backgroundColor: config.bg, \n borderColor: config.border, \n color: config.color \n }}\n {...props}\n >\n <Icon className=\"h-4 w-4 shrink-0 mt-0.5\" />\n <div className=\"flex-1\">{children}</div>\n </div>\n );\n }\n);\nAlert.displayName = 'Alert';\n","import * as React from 'react';\nimport { type VariantProps } from 'class-variance-authority';\nimport { cn } from '../lib/utils';\nimport { badgeVariants } from '../components/badge-variants';\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, ...props }: BadgeProps) {\n return <div className={cn(badgeVariants({ variant }), className)} {...props} />;\n}\n\nexport { Badge };\n","import { cva } from 'class-variance-authority';\n\n// Borderless tinted pills (Cloudflare-dashboard style): translucent fill + saturated text of the same hue.\nexport const badgeVariants = cva(\n 'inline-flex items-center gap-1 rounded-md px-2 py-0.5 text-[11px] font-medium transition-colors',\n {\n variants: {\n variant: {\n default: 'bg-primary/15 text-primary',\n secondary: 'bg-ui-fill/45 text-ui-default',\n neutral: 'bg-ui-fill/45 text-ui-default',\n info: 'bg-info/15 text-info',\n success: 'bg-success/15 text-success',\n warning: 'bg-warning/15 text-warning',\n danger: 'bg-danger/15 text-danger',\n outline: 'text-ui-default ring-1 ring-inset ring-ui-line bg-transparent',\n },\n },\n defaultVariants: { variant: 'default' },\n },\n);\n","import * as React from 'react';\nimport { useRender } from '@base-ui/react/use-render';\nimport { type VariantProps } from 'class-variance-authority';\nimport { Loader2 } from 'lucide-react';\nimport { cn } from '../lib/utils';\nimport { buttonVariants } from '../components/button-variants';\n\ntype Shape = 'base' | 'square' | 'circle';\n\n// Icon-only shapes: collapse padding and match width to the height of each size.\nconst SQUARE_WIDTH: Record<string, string> = {\n xs: 'w-6 p-0',\n sm: 'w-8 p-0',\n base: 'w-9 p-0',\n default: 'w-9 p-0',\n lg: 'w-11 p-0',\n icon: 'p-0',\n};\n\nfunction shapeClass(shape: Shape, size: VariantProps<typeof buttonVariants>['size']) {\n if (shape === 'base') return '';\n return cn(SQUARE_WIDTH[size ?? 'default'], shape === 'circle' && 'rounded-full');\n}\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n shape?: Shape;\n /** Element rendered before children (skipped while `loading`). */\n icon?: React.ReactNode;\n /** Shows a spinner and disables the button. */\n loading?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, shape = 'base', asChild = false, icon, loading, children, ...props }, ref) => {\n const classes = cn(buttonVariants({ variant, size }), shapeClass(shape, size), className);\n\n // `asChild` renders the child itself with props merged onto it (Base UI's equivalent of the former Radix Slot).\n return useRender({\n render: asChild && React.isValidElement(children) ? children : undefined,\n defaultTagName: 'button',\n ref,\n props: {\n className: classes,\n ...props,\n ...(asChild\n ? {}\n : {\n disabled: props.disabled || loading,\n children: (\n <>\n {loading ? <Loader2 className=\"size-4 animate-spin\" /> : icon}\n {children}\n </>\n ),\n }),\n },\n });\n },\n);\nButton.displayName = 'Button';\n\nexport interface LinkButtonProps\n extends React.AnchorHTMLAttributes<HTMLAnchorElement>,\n VariantProps<typeof buttonVariants> {\n shape?: Shape;\n icon?: React.ReactNode;\n /** Open in a new tab with safe rel attributes. */\n external?: boolean;\n}\n\nconst LinkButton = React.forwardRef<HTMLAnchorElement, LinkButtonProps>(\n ({ className, variant, size, shape = 'base', icon, external, children, ...props }, ref) => (\n <a\n ref={ref}\n className={cn(buttonVariants({ variant, size }), shapeClass(shape, size), className)}\n {...(external ? { target: '_blank', rel: 'noopener noreferrer' } : {})}\n {...props}\n >\n {icon}\n {children}\n </a>\n ),\n);\nLinkButton.displayName = 'LinkButton';\n\nexport { Button, LinkButton };\n","import { cva } from 'class-variance-authority';\n\n// `primary`/`secondary` use the bordered-panel look; remaining variants are legacy, kept for screens still on the older palette. Also drives <LinkButton>.\nexport const buttonVariants = cva(\n 'relative inline-flex select-none items-center justify-center gap-2 whitespace-nowrap font-semibold transition-all duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0',\n {\n variants: {\n variant: {\n primary:\n 'border border-[var(--btn-primary-border)] bg-[var(--btn-primary-surface)] text-[var(--btn-primary-fg)] hover:bg-[var(--btn-primary-hover)]',\n secondary: 'border border-ui-line bg-ui-base text-ui-default hover:bg-ui-fill/60',\n default: 'bg-primary text-primary-foreground shadow-sm hover:bg-primary/90 active:scale-[.98]',\n destructive: 'bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90',\n 'destructive-outline':\n 'border border-danger-border bg-danger-bg/40 text-danger shadow-sm hover:bg-destructive hover:text-destructive-foreground hover:border-destructive',\n 'warning-outline':\n 'border border-warning-border bg-warning-bg/40 text-warning shadow-sm hover:bg-warning-bg hover:border-warning',\n outline:\n 'border border-zinc-200 bg-white shadow-sm hover:bg-zinc-50 hover:text-zinc-900 dark:border-white/10 dark:bg-white/[0.06] dark:hover:bg-white/[0.1] dark:hover:text-foreground',\n ghost: 'hover:bg-secondary hover:text-secondary-foreground',\n link: 'text-primary underline-offset-4 hover:underline',\n accent: 'bg-accent text-accent-foreground shadow-sm hover:bg-accent/90 active:scale-[.98]',\n },\n size: {\n default: 'h-9 rounded-md px-4 py-2 text-sm',\n sm: 'h-8 rounded-md px-3 text-xs',\n base: 'h-9 rounded-md px-3 text-sm',\n lg: 'h-11 rounded-md px-6 text-sm',\n xs: 'h-6 rounded-md px-1.5 text-xs',\n icon: 'h-9 w-9 rounded-md',\n },\n },\n defaultVariants: { variant: 'default', size: 'default' },\n },\n);\n","import { Dialog } from '@base-ui/react/dialog';\nimport { AlertTriangle } from 'lucide-react';\nimport { Button, type ButtonProps } from '../components/button';\n\ninterface ConfirmDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title: string;\n description: string;\n confirmLabel?: string;\n cancelLabel?: string;\n confirmVariant?: ButtonProps['variant'];\n onConfirm: () => void;\n}\n\nexport function ConfirmDialog({\n open,\n onOpenChange,\n title,\n description,\n confirmLabel = 'Continue',\n cancelLabel = 'Cancel',\n confirmVariant = 'default',\n onConfirm,\n}: ConfirmDialogProps) {\n return (\n <Dialog.Root open={open} onOpenChange={onOpenChange}>\n <Dialog.Portal>\n <Dialog.Backdrop className=\"fixed inset-0 z-40 bg-background/75 backdrop-blur-sm transition-opacity duration-150 data-ending-style:opacity-0 data-starting-style:opacity-0\" />\n <Dialog.Popup className=\"fixed left-1/2 top-1/2 z-50 w-[calc(100vw-1.5rem)] max-w-md -translate-x-1/2 -translate-y-1/2 rounded-lg border border-ui-line bg-card p-5 shadow-2xl transition-[opacity,transform] duration-150 data-ending-style:scale-95 data-ending-style:opacity-0 data-starting-style:scale-95 data-starting-style:opacity-0\">\n <div className=\"flex items-start gap-3\">\n <span className=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-[var(--warning-bg)] text-[var(--warning)]\">\n <AlertTriangle size={18} />\n </span>\n <div className=\"min-w-0\">\n <Dialog.Title className=\"text-sm font-semibold text-foreground\">{title}</Dialog.Title>\n <Dialog.Description className=\"mt-1 text-sm text-muted-foreground\">\n {description}\n </Dialog.Description>\n </div>\n </div>\n\n <div className=\"mt-5 flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\">\n <Dialog.Close render={<Button variant=\"outline\" />}>{cancelLabel}</Dialog.Close>\n <Button\n variant={confirmVariant}\n onClick={() => {\n onConfirm();\n onOpenChange(false);\n }}\n >\n {confirmLabel}\n </Button>\n </div>\n </Dialog.Popup>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n","import * as React from 'react';\nimport { cn } from '../lib/utils';\n\ntype InputSize = 'xs' | 'sm' | 'base' | 'lg';\n\nconst SIZE_CLASS: Record<InputSize, string> = {\n xs: 'h-6 rounded-md px-1.5 text-xs',\n sm: 'h-8 rounded-md px-2 text-xs',\n base: 'h-9 rounded-md px-3 text-sm',\n lg: 'h-10 rounded-md px-4 text-base',\n};\n\n// Omit the native numeric `size` attribute so our string-union size wins.\nexport interface InputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {\n size?: InputSize;\n}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, size = 'base', ...props }, ref) => (\n <input\n ref={ref}\n className={cn(\n 'w-full border border-ui-line bg-ui-base text-ui-default transition-colors placeholder:text-ui-subtle focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ui-brand/40 disabled:cursor-not-allowed disabled:opacity-50',\n SIZE_CLASS[size],\n className,\n )}\n {...props}\n />\n ),\n);\nInput.displayName = 'Input';\n\nexport { Input };\n","import * as React from 'react';\nimport { cn } from '../lib/utils';\n\n/** Uses the `ui-*` surface tokens defined in app.css. */\nconst LayerCard = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('rounded-lg border border-ui-line bg-ui-base', className)}\n {...props}\n />\n ),\n);\nLayerCard.displayName = 'LayerCard';\n\nexport { LayerCard };\n","import { domAnimation, LazyMotion, useReducedMotion } from 'motion/react';\nimport {\n type CSSProperties,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode,\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { cn } from '../lib/utils';\nimport { SelectPanel } from './select-panel';\nimport type { Placement, SelectOption, TriggerRect } from './select-shared';\nimport { SelectTrigger } from './select-trigger';\n\ninterface SelectProps {\n value: string;\n onValueChange: (value: string) => void;\n options: SelectOption[];\n placeholder?: string;\n label?: string;\n className?: string;\n triggerClassName?: string;\n triggerStyle?: CSSProperties;\n leadingIcon?: ReactNode;\n /** Decides the dropdown's background so it stays distinguishable from where the trigger sits. */\n variant?: 'page' | 'card';\n}\n\nexport function Select({\n value,\n onValueChange,\n options,\n placeholder = 'Select...',\n label,\n className,\n triggerClassName,\n triggerStyle,\n leadingIcon,\n variant = 'page',\n}: SelectProps) {\n const reduce = useReducedMotion() ?? false;\n const baseId = useId();\n const triggerId = `${baseId}-trigger`;\n const listId = `${baseId}-list`;\n const labelId = `${baseId}-label`;\n const triggerRef = useRef<HTMLButtonElement>(null);\n const labelRef = useRef<HTMLLabelElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const innerRef = useRef<HTMLUListElement>(null);\n const [open, setOpen] = useState(false);\n const [placement, setPlacement] = useState<Placement>('bottom');\n const [height, setHeight] = useState(0);\n const [rect, setRect] = useState<TriggerRect | null>(null);\n const [highlightedIndex, setHighlightedIndex] = useState(0);\n const optionRefs = useRef<Array<HTMLButtonElement | null>>([]);\n /** What last moved the highlight - only keyboard moves should auto-scroll. */\n const highlightSource = useRef<'keyboard' | 'pointer'>('keyboard');\n\n const selectedOption = options.find((opt) => opt.value === value);\n\n // Depends on `open` only: keying off `options`/`value` yanked the highlight back when a caller passed a freshly-built array mid-interaction.\n useEffect(() => {\n if (!open) return;\n highlightSource.current = 'keyboard';\n const idx = options.findIndex((opt) => opt.value === value);\n setHighlightedIndex(idx >= 0 ? idx : 0);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open]);\n\n // Keyboard only: on hover this looped (hover → scrollIntoView → reposition → mouseenter again), causing jitter.\n useEffect(() => {\n if (!open || highlightSource.current !== 'keyboard') return;\n optionRefs.current[highlightedIndex]?.scrollIntoView({ block: 'nearest' });\n }, [open, highlightedIndex]);\n\n useEffect(() => {\n if (!open) return;\n const onKey = (e: KeyboardEvent) => e.key === 'Escape' && setOpen(false);\n const onPointer = (e: PointerEvent) => {\n const target = e.target as Node;\n if (triggerRef.current?.contains(target)) return;\n if (panelRef.current?.contains(target)) return;\n // The label forwards its click to the trigger, so treating it as \"outside\" would close the\n // panel here and let that forwarded click reopen it -- one click, no visible change.\n if (labelRef.current?.contains(target)) return;\n setOpen(false);\n };\n window.addEventListener('keydown', onKey);\n window.addEventListener('pointerdown', onPointer);\n return () => {\n window.removeEventListener('keydown', onKey);\n window.removeEventListener('pointerdown', onPointer);\n };\n }, [open]);\n\n useLayoutEffect(() => {\n const node = innerRef.current;\n if (!node) return;\n const measure = () => setHeight(node.offsetHeight);\n measure();\n const observer = new ResizeObserver(measure);\n observer.observe(node);\n return () => observer.disconnect();\n }, []);\n\n // Flips upward when there's no room below; batched to one animation frame since scroll/resize fire faster than repaints.\n useLayoutEffect(() => {\n if (!open) return;\n const trigger = triggerRef.current;\n if (!trigger) return;\n let frame: number | null = null;\n const update = () => {\n frame = null;\n const r = trigger.getBoundingClientRect();\n setRect({ left: r.left, width: r.width, top: r.top, bottom: r.bottom });\n const h = innerRef.current?.offsetHeight ?? 0;\n const below = window.innerHeight - r.bottom;\n const above = r.top;\n setPlacement(below < h + 16 && above > below ? 'top' : 'bottom');\n };\n const scheduleUpdate = (e?: Event) => {\n // Scrolling the list doesn't move the trigger; recomputing only causes flicker.\n if (e && e.target instanceof Node && panelRef.current?.contains(e.target)) return;\n if (frame !== null) return;\n frame = requestAnimationFrame(update);\n };\n update();\n window.addEventListener('scroll', scheduleUpdate, true);\n window.addEventListener('resize', scheduleUpdate);\n return () => {\n if (frame !== null) cancelAnimationFrame(frame);\n window.removeEventListener('scroll', scheduleUpdate, true);\n window.removeEventListener('resize', scheduleUpdate);\n };\n }, [open]);\n\n const moveHighlight = (next: number) => {\n highlightSource.current = 'keyboard';\n setHighlightedIndex(Math.min(Math.max(next, 0), options.length - 1));\n };\n\n const onTriggerKeyDown = (e: ReactKeyboardEvent<HTMLButtonElement>) => {\n if (!open) {\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp' || e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n setOpen(true);\n }\n return;\n }\n if (options.length === 0) return;\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n moveHighlight(highlightedIndex + 1);\n break;\n case 'ArrowUp':\n e.preventDefault();\n moveHighlight(highlightedIndex - 1);\n break;\n case 'Home':\n e.preventDefault();\n moveHighlight(0);\n break;\n case 'End':\n e.preventDefault();\n moveHighlight(options.length - 1);\n break;\n case 'Enter':\n case ' ':\n e.preventDefault();\n onValueChange(options[highlightedIndex].value);\n setOpen(false);\n break;\n case 'Tab':\n setOpen(false);\n break;\n default:\n break;\n }\n };\n\n const selectOption = (next: string) => {\n onValueChange(next);\n setOpen(false);\n };\n\n const highlightOption = (index: number) => {\n highlightSource.current = 'pointer';\n setHighlightedIndex(index);\n };\n\n const isTop = placement === 'top';\n\n return (\n <LazyMotion features={domAnimation}>\n <div className={cn('flex flex-col gap-1.5', className)}>\n {label && (\n <label\n ref={labelRef}\n id={labelId}\n htmlFor={triggerId}\n className=\"text-[10px] font-bold uppercase tracking-wider text-ui-subtle\"\n >\n {label}\n </label>\n )}\n <div className=\"relative\">\n <SelectTrigger\n triggerRef={triggerRef}\n triggerId={triggerId}\n listId={listId}\n labelId={label ? labelId : undefined}\n activeDescendantId={\n open && options[highlightedIndex] ? `${listId}-option-${highlightedIndex}` : undefined\n }\n open={open}\n isTop={isTop}\n reduce={reduce}\n selectedOption={selectedOption}\n placeholder={placeholder}\n leadingIcon={leadingIcon}\n variant={variant}\n className={triggerClassName}\n style={triggerStyle}\n onToggle={() => setOpen((v) => !v)}\n onKeyDown={onTriggerKeyDown}\n />\n </div>\n\n {/* Portaled to <body> so it can't be clipped by an ancestor's stacking context. */}\n {createPortal(\n <SelectPanel\n panelRef={panelRef}\n innerRef={innerRef}\n optionRefs={optionRefs}\n listId={listId}\n triggerId={triggerId}\n options={options}\n value={value}\n highlightedIndex={highlightedIndex}\n open={open}\n isTop={isTop}\n reduce={reduce}\n height={height}\n rect={rect}\n onSelect={selectOption}\n onHighlight={highlightOption}\n />,\n document.body,\n )}\n </div>\n </LazyMotion>\n );\n}\n","import { Check } from 'lucide-react';\nimport { m, type Transition } from 'motion/react';\nimport type { RefObject } from 'react';\nimport { cn } from '../lib/utils';\nimport { EASE_OUT } from '../lib/ease';\nimport {\n INSTANT_TRANSITION,\n ITEM_VARIANTS,\n LIST_VARIANTS,\n type SelectOption,\n type TriggerRect,\n} from './select-shared';\n\nconst REDUCED_TRANSITION: Transition = { duration: 0.12 };\nconst GAP_TRANSITION_OPEN: Transition = { type: 'spring', duration: 0.44, bounce: 0.45, delay: 0.09 };\nconst GAP_TRANSITION_CLOSED: Transition = { type: 'spring', duration: 0.26, bounce: 0.1 };\nconst RADIUS_TRANSITION_OPEN: Transition = { duration: 0.26, ease: EASE_OUT, delay: 0.1 };\nconst RADIUS_TRANSITION_CLOSED: Transition = { duration: 0.15, ease: EASE_OUT };\nconst OPACITY_TRANSITION_OPEN: Transition = { duration: 0.18 };\nconst OPACITY_TRANSITION_CLOSED: Transition = { duration: 0.16, delay: 0.1 };\nconst HEIGHT_TRANSITION_OPEN: Transition = { type: 'spring', duration: 0.4, bounce: 0.14 };\nconst HEIGHT_TRANSITION_CLOSED: Transition = { duration: 0.24, ease: EASE_OUT, delay: 0.1 };\n\ninterface SelectPanelProps {\n panelRef: RefObject<HTMLDivElement | null>;\n innerRef: RefObject<HTMLUListElement | null>;\n optionRefs: RefObject<Array<HTMLButtonElement | null>>;\n listId: string;\n triggerId: string;\n options: SelectOption[];\n value: string;\n highlightedIndex: number;\n open: boolean;\n isTop: boolean;\n reduce: boolean;\n height: number;\n rect: TriggerRect | null;\n onSelect: (value: string) => void;\n onHighlight: (index: number) => void;\n}\n\nexport function SelectPanel({\n panelRef,\n innerRef,\n optionRefs,\n listId,\n triggerId,\n options,\n value,\n highlightedIndex,\n open,\n isTop,\n reduce,\n height,\n rect,\n onSelect,\n onHighlight,\n}: SelectPanelProps) {\n const nearGap = open ? 8 : 0;\n const nearRadius = open ? 7 : 0;\n const gapT = open ? GAP_TRANSITION_OPEN : GAP_TRANSITION_CLOSED;\n const radiusT = open ? RADIUS_TRANSITION_OPEN : RADIUS_TRANSITION_CLOSED;\n\n return (\n <m.div\n ref={panelRef}\n id={listId}\n role=\"listbox\"\n aria-labelledby={triggerId}\n aria-hidden={!open}\n initial={false}\n animate={\n reduce\n ? { opacity: open ? 1 : 0, height: open ? height : 0 }\n : {\n opacity: open ? 1 : 0,\n height: open ? height : 0,\n // gap opens on the side facing the trigger\n marginTop: isTop ? 0 : nearGap,\n marginBottom: isTop ? nearGap : 0,\n // near corners go flat->round; far corners stay rounded\n borderTopLeftRadius: isTop ? 7 : nearRadius,\n borderTopRightRadius: isTop ? 7 : nearRadius,\n borderBottomLeftRadius: isTop ? nearRadius : 7,\n borderBottomRightRadius: isTop ? nearRadius : 7,\n }\n }\n transition={\n reduce\n ? REDUCED_TRANSITION\n : {\n opacity: open ? OPACITY_TRANSITION_OPEN : OPACITY_TRANSITION_CLOSED,\n height: open ? HEIGHT_TRANSITION_OPEN : HEIGHT_TRANSITION_CLOSED,\n marginTop: isTop ? INSTANT_TRANSITION : gapT,\n marginBottom: isTop ? gapT : INSTANT_TRANSITION,\n borderTopLeftRadius: isTop ? INSTANT_TRANSITION : radiusT,\n borderTopRightRadius: isTop ? INSTANT_TRANSITION : radiusT,\n borderBottomLeftRadius: isTop ? radiusT : INSTANT_TRANSITION,\n borderBottomRightRadius: isTop ? radiusT : INSTANT_TRANSITION,\n }\n }\n style={{\n position: 'fixed',\n left: rect?.left ?? 0,\n width: rect?.width ?? 0,\n top: isTop ? undefined : (rect?.bottom ?? 0),\n bottom: isTop ? window.innerHeight - (rect?.top ?? 0) : undefined,\n transformOrigin: isTop ? 'bottom' : 'top',\n overflow: 'hidden',\n pointerEvents: open ? 'auto' : 'none',\n }}\n // Flush against the trigger, then separates into its own rounded pill.\n className=\"z-50 border border-ui-line bg-ui-base shadow-lg shadow-black/[0.04] dark:shadow-black/40\"\n >\n <m.ul\n ref={innerRef}\n variants={reduce ? undefined : LIST_VARIANTS}\n initial={false}\n animate={open ? 'show' : 'hidden'}\n className=\"max-h-[min(28rem,60vh)] overflow-y-auto p-1\"\n >\n {options.map((option, index) => {\n const selected = option.value === value;\n const highlighted = index === highlightedIndex;\n return (\n <m.li key={option.value} variants={reduce ? undefined : ITEM_VARIANTS}>\n <button\n ref={(node) => {\n optionRefs.current[index] = node;\n }}\n id={`${listId}-option-${index}`}\n type=\"button\"\n role=\"option\"\n aria-selected={selected}\n tabIndex={-1}\n onMouseEnter={() => onHighlight(index)}\n onClick={() => onSelect(option.value)}\n className={cn(\n // `whitespace-nowrap`: on the 72px \"rows per page\" select, the check icon ate the width and \"10\" wrapped to stacked digits.\n 'flex w-full items-center justify-between gap-2 whitespace-nowrap rounded-md px-2.5 py-1.5 text-left text-sm outline-none transition-colors',\n selected\n ? 'bg-ui-brand/10 font-medium text-ui-brand'\n : 'text-ui-default hover:bg-ui-fill hover:text-ui-strong focus-visible:bg-ui-fill',\n highlighted && !selected && 'bg-ui-fill text-ui-strong',\n )}\n >\n <span className=\"min-w-0 truncate\">{option.label}</span>\n {selected ? <Check className=\"h-3.5 w-3.5 shrink-0\" /> : null}\n </button>\n </m.li>\n );\n })}\n </m.ul>\n </m.div>\n );\n}\n","import type { Transition, Variants } from 'motion/react';\n\nexport type Placement = 'bottom' | 'top';\n\nexport interface SelectOption {\n value: string;\n label: string;\n}\n\n/** Trigger box in viewport coordinates; the portaled panel is positioned from it. */\nexport interface TriggerRect {\n left: number;\n width: number;\n top: number;\n bottom: number;\n}\n\n// Spring with bounce powers the unfold; per-property timings on the panel choreograph it.\nexport const CHEVRON_TRANSITION: Transition = { type: 'spring', duration: 0.4, bounce: 0.3 };\n\n// Compounds per option; 0.035 delayed the last item ~0.9s on long lists, so 0.02 is the compromise.\nexport const LIST_VARIANTS: Variants = {\n hidden: {},\n show: { transition: { staggerChildren: 0.02, delayChildren: 0.03 } },\n};\nexport const ITEM_VARIANTS: Variants = {\n hidden: { opacity: 0, y: -5, filter: 'blur(2px)' },\n show: { opacity: 1, y: 0, filter: 'blur(0px)' },\n};\n\n/** Snaps a property to its target: the side not being choreographed, and every reduced-motion path. */\nexport const INSTANT_TRANSITION: Transition = { duration: 0 };\n","import { ChevronDown } from 'lucide-react';\nimport { m, type Transition } from 'motion/react';\nimport type { CSSProperties, KeyboardEvent as ReactKeyboardEvent, ReactNode, RefObject } from 'react';\nimport { cn } from '../lib/utils';\nimport { EASE_OUT } from '../lib/ease';\nimport { CHEVRON_TRANSITION, INSTANT_TRANSITION, type SelectOption } from './select-shared';\n\n// Gooey: the edge facing the panel snaps flat while attached, then rounds as the two pinch apart.\nconst RADIUS_OPEN = [0, 0, 7];\nconst RADIUS_CLOSED = [7, 0, 7];\nconst RADIUS_TRANSITION_OPEN: Transition = { duration: 0.46, times: [0, 0.4, 1], ease: EASE_OUT };\nconst RADIUS_TRANSITION_CLOSED: Transition = { duration: 0.34, times: [0, 0.5, 1], ease: EASE_OUT };\n\ninterface SelectTriggerProps {\n triggerRef: RefObject<HTMLButtonElement | null>;\n triggerId: string;\n listId: string;\n labelId: string | undefined;\n activeDescendantId: string | undefined;\n open: boolean;\n isTop: boolean;\n reduce: boolean;\n selectedOption: SelectOption | undefined;\n placeholder: string;\n leadingIcon: ReactNode;\n variant: 'page' | 'card';\n className: string | undefined;\n style: CSSProperties | undefined;\n onToggle: () => void;\n onKeyDown: (e: ReactKeyboardEvent<HTMLButtonElement>) => void;\n}\n\nexport function SelectTrigger({\n triggerRef,\n triggerId,\n listId,\n labelId,\n activeDescendantId,\n open,\n isTop,\n reduce,\n selectedOption,\n placeholder,\n leadingIcon,\n variant,\n className,\n style,\n onToggle,\n onKeyDown,\n}: SelectTriggerProps) {\n const kf = open ? RADIUS_OPEN : RADIUS_CLOSED;\n const kfT = reduce\n ? INSTANT_TRANSITION\n : open\n ? RADIUS_TRANSITION_OPEN\n : RADIUS_TRANSITION_CLOSED;\n\n return (\n <m.button\n ref={triggerRef}\n type=\"button\"\n id={triggerId}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={listId}\n // Self-reference keeps the selected label in the accessible name now that <label> also points here.\n aria-labelledby={labelId ? `${labelId} ${triggerId}` : undefined}\n aria-activedescendant={activeDescendantId}\n onClick={onToggle}\n onKeyDown={onKeyDown}\n initial={false}\n animate={{\n borderTopLeftRadius: isTop ? kf : 7,\n borderTopRightRadius: isTop ? kf : 7,\n borderBottomLeftRadius: isTop ? 7 : kf,\n borderBottomRightRadius: isTop ? 7 : kf,\n }}\n transition={{\n borderTopLeftRadius: isTop ? kfT : INSTANT_TRANSITION,\n borderTopRightRadius: isTop ? kfT : INSTANT_TRANSITION,\n borderBottomLeftRadius: isTop ? INSTANT_TRANSITION : kfT,\n borderBottomRightRadius: isTop ? INSTANT_TRANSITION : kfT,\n }}\n style={style}\n className={cn(\n 'relative z-10 flex h-9 w-full items-center justify-between gap-2 border border-ui-line px-3 py-2 text-sm font-normal text-ui-default outline-none transition-colors',\n variant === 'page' ? 'bg-ui-base' : 'bg-ui-fill/50',\n 'hover:bg-ui-fill/70 focus-visible:ring-2 focus-visible:ring-ui-brand/40 focus-visible:ring-offset-1 focus-visible:ring-offset-background',\n !selectedOption && 'text-ui-subtle',\n className,\n )}\n >\n <span className=\"flex min-w-0 flex-1 items-center gap-2\">\n {leadingIcon && <span className=\"shrink-0 text-primary/70\">{leadingIcon}</span>}\n <span className=\"min-w-0 truncate\">\n {selectedOption ? selectedOption.label : placeholder}\n </span>\n </span>\n <m.span\n aria-hidden\n animate={{ rotate: open ? 180 : 0 }}\n transition={reduce ? INSTANT_TRANSITION : CHEVRON_TRANSITION}\n className=\"shrink-0 text-ui-subtle\"\n >\n <ChevronDown className=\"h-4 w-4\" />\n </m.span>\n </m.button>\n );\n}\n","import * as React from 'react';\nimport { Switch as BaseSwitch } from '@base-ui/react/switch';\nimport { cn } from '../lib/utils';\n\nexport interface SwitchProps {\n checked?: boolean;\n defaultChecked?: boolean;\n disabled?: boolean;\n onCheckedChange?: (checked: boolean) => void;\n className?: string;\n 'aria-label'?: string;\n id?: string;\n}\n\n/** Toggle switch on Base UI, styled with the ui-* tokens (brand track when on). */\nconst Switch = React.forwardRef<HTMLButtonElement, SwitchProps>(\n ({ className, onCheckedChange, ...props }, ref) => (\n <BaseSwitch.Root\n ref={ref}\n onCheckedChange={(checked) => onCheckedChange?.(checked)}\n className={cn(\n // Squarish track + knob (Cloudflare-dashboard switch shape).\n 'relative inline-flex h-4 w-7 shrink-0 cursor-pointer items-center rounded-[5px] p-[2px] transition-colors duration-200',\n // Dark mode: lighter zinc when off (reads against the page), deeper lime when on (knob doesn't blend).\n 'bg-ui-fill dark:bg-[oklch(40%_0_0)]',\n 'data-checked:bg-ui-brand dark:data-checked:bg-[oklch(64%_0.21_118)]',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ui-brand/40 focus-visible:ring-offset-1 focus-visible:ring-offset-ui-base',\n 'data-disabled:cursor-not-allowed data-disabled:opacity-50',\n className,\n )}\n {...props}\n >\n <BaseSwitch.Thumb className=\"h-3 w-3 rounded-[3px] bg-white shadow-sm transition-transform duration-200 data-checked:translate-x-3\" />\n </BaseSwitch.Root>\n ),\n);\nSwitch.displayName = 'Switch';\n\nexport { Switch };\n","import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../lib/utils';\n\nconst textVariants = cva('', {\n variants: {\n variant: {\n body: 'text-ui-default',\n secondary: 'text-ui-subtle',\n strong: 'text-ui-strong',\n },\n size: {\n sm: 'text-sm',\n base: 'text-base',\n },\n bold: {\n true: 'font-semibold',\n false: '',\n },\n },\n defaultVariants: { variant: 'body', size: 'base', bold: false },\n});\n\ninterface TextProps\n extends React.HTMLAttributes<HTMLElement>,\n VariantProps<typeof textVariants> {\n /** Element to render (e.g. \"span\", \"h3\"). Defaults to <p>. */\n as?: React.ElementType;\n}\n\n/** Typographic primitive keyed off the ui-* surface text tokens. */\nexport function Text({ as: Comp = 'p', variant, size, bold, className, ...props }: TextProps) {\n return <Comp className={cn(textVariants({ variant, size, bold }), className)} {...props} />;\n}\n","import React from 'react';\nimport { cn } from '../lib/utils';\n\ninterface SkeletonProps {\n width?: string | number;\n height?: string | number;\n borderRadius?: string | number;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport const Skeleton: React.FC<SkeletonProps> = ({\n width,\n height,\n borderRadius,\n className = '',\n style,\n}) => {\n return (\n <div\n className={cn('skeleton', className)}\n style={{\n width: width ?? '100%',\n height: height ?? '1rem',\n borderRadius: borderRadius ?? undefined,\n ...style,\n }}\n />\n );\n};\n","import React from 'react';\nimport { cn } from '../lib/utils';\nimport { Button } from '../components/button';\n\ninterface EmptyStateProps {\n icon?: React.ReactNode;\n title: string;\n description?: string;\n /** Bullet hints with a green dot prefix. */\n hints?: string[];\n linkAction?: {\n label: string;\n href?: string;\n onClick?: () => void;\n };\n /** Legacy single action button */\n action?: {\n label: string;\n onClick: () => void;\n };\n className?: string;\n}\n\nexport function EmptyState({ icon, title, description, hints, linkAction, action, className }: EmptyStateProps) {\n return (\n <div\n className={cn(\n 'flex flex-col items-center justify-center gap-4 px-8 py-16 text-center',\n className,\n )}\n >\n {icon && (\n <div className=\"flex h-14 w-14 items-center justify-center text-muted-foreground/40 [&_svg]:h-9 [&_svg]:w-9 [&_svg]:stroke-[1.35]\">\n {icon}\n </div>\n )}\n <div className=\"space-y-1.5\">\n <h3 className=\"text-base font-semibold text-foreground\">{title}</h3>\n {description && (\n <p className=\"max-w-sm text-sm text-muted-foreground leading-relaxed\">{description}</p>\n )}\n </div>\n\n {hints && hints.length > 0 && (\n <ul className=\"mt-1 flex flex-col gap-1.5 text-left\">\n {hints.map((hint) => (\n <li key={hint} className=\"flex items-start gap-2.5 text-sm text-muted-foreground\">\n <span className=\"mt-[7px] h-1.5 w-1.5 shrink-0 rounded-full bg-primary opacity-80\" />\n <span>{hint}</span>\n </li>\n ))}\n </ul>\n )}\n\n {linkAction && (\n <div className=\"mt-3\">\n {linkAction.href ? (\n <Button asChild variant=\"outline\" size=\"sm\">\n <a\n href={linkAction.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {linkAction.label}\n </a>\n </Button>\n ) : (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={linkAction.onClick}\n >\n {linkAction.label}\n </Button>\n )}\n </div>\n )}\n\n {action && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={action.onClick}\n className=\"mt-2 text-muted-foreground hover:text-foreground\"\n >\n {action.label}\n </Button>\n )}\n </div>\n );\n}\n","import type { ReactNode } from 'react';\n\nexport function SectionCard({\n icon,\n title,\n description,\n action,\n children,\n}: {\n icon?: ReactNode;\n title: string;\n description?: string;\n action?: ReactNode;\n children: ReactNode;\n}) {\n return (\n <section className=\"ui-panel min-w-0 overflow-hidden\">\n <div className=\"flex items-center justify-between gap-4 border-b border-ui-line px-5 py-4\">\n <div className=\"flex min-w-0 items-center gap-2.5\">\n {icon && <span className=\"shrink-0 text-ui-subtle\">{icon}</span>}\n <div className=\"min-w-0\">\n <h2 className=\"text-[11px] font-semibold uppercase tracking-[0.14em] text-ui-default\">{title}</h2>\n {description && <p className=\"mt-0.5 truncate text-xs text-ui-subtle\">{description}</p>}\n </div>\n </div>\n {action && <div className=\"shrink-0\">{action}</div>}\n </div>\n {children}\n </section>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { Check, Copy } from 'lucide-react';\nimport { cn } from '../lib/utils';\nimport { UI_DURATION_TOOLTIP } from '../lib/constants';\n\n/**\n * Drag-selecting a long, scrollable `<pre>` is miserable - the container\n * scrolls while you drag, so one click is the reliable path instead.\n */\nexport function CopyButton({\n value,\n label = 'Copy',\n className,\n}: {\n value: string;\n label?: string;\n className?: string;\n}) {\n const [copied, setCopied] = useState(false);\n const timer = useRef<number | null>(null);\n // The timeout outlives the component if the panel is collapsed right after a copy.\n useEffect(() => () => {\n if (timer.current !== null) window.clearTimeout(timer.current);\n }, []);\n\n const copy = async () => {\n try {\n await navigator.clipboard.writeText(value);\n setCopied(true);\n if (timer.current !== null) window.clearTimeout(timer.current);\n timer.current = window.setTimeout(() => setCopied(false), UI_DURATION_TOOLTIP);\n } catch {\n // Clipboard access can be refused (insecure origin, permissions policy); fail quietly since manual selection still works.\n }\n };\n\n return (\n <button\n type=\"button\"\n onClick={copy}\n aria-label={copied ? 'Copied' : label}\n className={cn(\n 'inline-flex shrink-0 items-center gap-1 rounded border border-ui-line px-1.5 py-0.5',\n 'text-[10px] font-medium transition-colors',\n copied ? 'text-emerald-500' : 'text-ui-subtle hover:text-foreground',\n className,\n )}\n >\n {copied ? <Check size={10} /> : <Copy size={10} />}\n {copied ? 'Copied' : label}\n </button>\n );\n}\n","/**\n * Core UI magic numbers and standard constants.\n */\n\n// Animation timings (ms)\nexport const UI_DURATION_FAST = 150;\nexport const UI_DURATION_NORMAL = 200;\nexport const UI_DURATION_SLOW = 300;\nexport const UI_DURATION_TOOLTIP = 1500;\n\n// Standard opacities\nexport const OPACITY_DISABLED = 0.5;\nexport const OPACITY_HOVER = 0.8;\n\n// Common chart/graph colors\nexport const CHART_COLORS = {\n hatchGray: 'url(#hatchGray)',\n defaultGrid: '#333',\n transparent: 'transparent',\n tooltipBg: 'rgba(0,0,0,0.5)',\n} as const;\n\n// Layout thresholds\nexport const LAYOUT_CONSTANTS = {\n mobileBreakpoint: 768,\n} as const;\n","import { useMemo } from 'react';\nimport { cn } from '../lib/utils';\n\ninterface BarSparklineProps {\n /** Raw daily series; aggregated into `bars` buckets for the mini chart. */\n data: number[];\n /** Bar color (hex). A vertical gradient is derived from it. */\n color: string;\n bars?: number;\n className?: string;\n}\n\n/**\n * Resamples `data` to exactly `bars` values (summed down or nearest-neighbour\n * stretched up) so the chart renders a stable bar count even though the trend\n * query omits inactive days and a quiet range can yield far fewer points.\n */\nfunction bucketize(data: number[], bars: number): number[] {\n const out = Array<number>(bars).fill(0);\n if (data.length === 0) return out;\n\n if (data.length >= bars) {\n const size = data.length / bars;\n for (let i = 0; i < bars; i++) {\n const start = Math.floor(i * size);\n const end = Math.floor((i + 1) * size);\n out[i] = data.slice(start, end).reduce((sum, v) => sum + v, 0);\n }\n } else {\n for (let i = 0; i < bars; i++) {\n out[i] = data[Math.floor((i * data.length) / bars)];\n }\n }\n return out;\n}\n\n// Lightweight divs rather than a charting lib.\n// Minimum height share so zero/quiet periods still render as a visible bar, not an invisible nub.\nconst BASELINE_PCT = 32;\n\nexport function BarSparkline({ data, color, bars = 8, className }: BarSparklineProps) {\n const buckets = useMemo(() => bucketize(data, bars), [data, bars]);\n const max = Math.max(...buckets, 1);\n\n return (\n <div className={cn('flex h-12 items-end justify-end gap-[3px]', className)} aria-hidden=\"true\">\n {buckets.map((value, i) => (\n <div\n key={i}\n className=\"w-[5px] rounded-[2px] transition-[height] duration-500\"\n style={{\n height: `${BASELINE_PCT + (value / max) * (100 - BASELINE_PCT)}%`,\n background: `linear-gradient(to top, ${color}99, ${color})`,\n }}\n />\n ))}\n </div>\n );\n}\n","/** GitHub brand mark - lucide-react no longer ships brand icons. */\nexport function GithubMark({ size = 16, className }: { size?: number; className?: string }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n aria-hidden=\"true\"\n >\n <path d=\"M12 .5C5.65.5.5 5.65.5 12c0 5.08 3.29 9.39 7.86 10.91.58.11.79-.25.79-.55 0-.27-.01-1.17-.02-2.12-3.2.7-3.87-1.36-3.87-1.36-.52-1.33-1.28-1.68-1.28-1.68-1.04-.71.08-.7.08-.7 1.15.08 1.76 1.19 1.76 1.19 1.03 1.76 2.69 1.25 3.34.96.1-.75.4-1.25.72-1.54-2.55-.29-5.24-1.28-5.24-5.68 0-1.26.45-2.28 1.19-3.09-.12-.29-.52-1.46.11-3.05 0 0 .97-.31 3.17 1.18a11 11 0 0 1 2.89-.39c.98 0 1.97.13 2.89.39 2.2-1.49 3.16-1.18 3.16-1.18.63 1.59.24 2.76.12 3.05.74.81 1.19 1.83 1.19 3.09 0 4.41-2.69 5.38-5.25 5.67.41.35.77 1.05.77 2.12 0 1.53-.01 2.76-.01 3.14 0 .3.2.66.8.55A11.51 11.51 0 0 0 23.5 12C23.5 5.65 18.35.5 12 .5Z\" />\n </svg>\n );\n}\n","import { AlertTriangle, RefreshCw } from 'lucide-react';\nimport { Button } from '../components/button';\nimport { cn } from '../lib/utils';\n\ninterface LoadErrorProps {\n /** Friendly headline, e.g. \"Couldn't load dashboard data\". */\n title?: string;\n /** Raw error detail (e.g. \"Failed to fetch\"), shown as a mono chip. */\n detail?: string | null;\n /** Guidance line under the title; defaults to connection-check copy. */\n hint?: string;\n onRetry?: () => void;\n retrying?: boolean;\n className?: string;\n}\n\n/** Friendly copy up front, raw error as a small mono chip - instead of a bare toast echoing \"Failed to fetch\". */\nexport function LoadError({\n title = \"Couldn't load data\",\n detail,\n hint = 'Check your connection, then try again. If this keeps happening, the server may be unreachable.',\n onRetry,\n retrying,\n className,\n}: LoadErrorProps) {\n return (\n <section\n role=\"alert\"\n className={cn(\n 'ui-font-sans rounded-lg border border-ui-line bg-white p-3.5 dark:border-[oklch(0.27_0_0)] dark:bg-black sm:p-4',\n className,\n )}\n >\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between sm:gap-6\">\n <div className=\"flex min-w-0 items-start gap-3\">\n <span className=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-md bg-red-500/10 text-red-600 dark:text-red-400\">\n <AlertTriangle size={15} strokeWidth={2} />\n </span>\n <div className=\"min-w-0\">\n <h2 className=\"text-[13px] font-medium text-ui-default\">{title}</h2>\n <p className=\"mt-0.5 text-xs leading-relaxed text-ui-subtle\">\n {hint}\n </p>\n {detail && (\n <code className=\"ui-well ui-font-mono mt-2 inline-block max-w-full truncate rounded-[5px] px-2 py-1 text-[11px] text-ui-subtle\">\n {detail}\n </code>\n )}\n </div>\n </div>\n\n {onRetry && (\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={onRetry}\n disabled={retrying}\n icon={<RefreshCw size={13} className={retrying ? 'animate-spin' : ''} />}\n className=\"w-full shrink-0 sm:w-auto\"\n >\n Retry\n </Button>\n )}\n </div>\n </section>\n );\n}\n","import React from 'react';\nimport { Check, X } from 'lucide-react';\nimport { cn } from '../lib/utils';\n\nexport interface OnboardingStep {\n id: string;\n label: React.ReactNode;\n done: boolean;\n onClick?: () => void;\n}\n\nexport interface OnboardingCardProps {\n title?: React.ReactNode;\n completedTitle?: React.ReactNode;\n description?: React.ReactNode;\n steps: OnboardingStep[];\n onDismiss?: () => void;\n className?: string;\n segments?: number;\n}\n\nexport function OnboardingCard({\n title = \"You're almost there!\",\n completedTitle = \"You're all set! 🎉\",\n description,\n steps,\n onDismiss,\n className,\n segments = 22,\n}: OnboardingCardProps) {\n const doneCount = steps.filter((s) => s.done).length;\n const totalSteps = steps.length;\n const allDone = doneCount === totalSteps && totalSteps > 0;\n \n const filledCount =\n doneCount > 0\n ? Math.max(1, Math.round((doneCount / totalSteps) * segments))\n : 0;\n\n return (\n <div className={cn(\"ui-well overflow-hidden rounded-lg\", className)}>\n <div className=\"px-3.5 pb-3.5 pt-5\">\n \n {/* Header */}\n <div className=\"relative mb-3.5 text-center\">\n <p className=\"text-[14px] font-semibold leading-tight text-black dark:text-white\">\n {allDone ? completedTitle : title}\n </p>\n {!allDone && description && (\n <p className=\"mt-1 text-[12px] leading-snug text-black/50 dark:text-white/50\">\n {description}\n </p>\n )}\n {onDismiss && (\n <button\n onClick={onDismiss}\n aria-label=\"Dismiss\"\n className=\"absolute -top-1 -right-1 flex h-5 w-5 items-center justify-center rounded text-ui-subtle/60 transition-colors hover:bg-ui-fill hover:text-ui-default\"\n >\n <X size={12} />\n </button>\n )}\n </div>\n\n {/* Segmented bar */}\n <div\n className=\"mb-3.5 grid h-[22px] gap-[4px]\"\n style={{ gridTemplateColumns: `repeat(${segments}, minmax(0, 1fr))` }}\n aria-label={`${doneCount} of ${totalSteps} steps complete`}\n aria-hidden\n >\n {Array.from({ length: segments }).map((_, i) => (\n <span\n key={i}\n className={cn(\n \"rounded-[1px] transition-colors duration-500\",\n i < filledCount \n ? \"bg-[oklch(68%_0.14_185)]\" \n : \"bg-[#ffffff] dark:bg-[#3B3B3E]\"\n )}\n />\n ))}\n </div>\n\n {/* Step list */}\n <div className=\"-mx-2 overflow-hidden rounded-md divide-y divide-ui-line/60\">\n {steps.map((step) => {\n const content = (\n <div className={cn(\n 'flex w-full items-center gap-2.5 px-2 py-[9px]',\n 'text-left text-[12px] font-medium leading-tight',\n 'transition-colors duration-150',\n step.done\n ? 'text-ui-subtle cursor-default'\n : 'text-foreground hover:bg-ui-fill/50',\n )}>\n {/* Check circle */}\n <span\n className={cn(\n 'flex h-[18px] w-[18px] shrink-0 items-center justify-center rounded-full border transition-colors duration-300',\n step.done\n ? 'border-[#00B3A3] bg-[#00B3A3] text-white'\n : 'border-ui-line bg-transparent text-transparent'\n )}\n >\n <Check size={10} strokeWidth={3} />\n </span>\n \n {/* Text */}\n <span className=\"flex-1 truncate\">{step.label}</span>\n </div>\n );\n\n if (step.onClick) {\n return (\n <button key={step.id} onClick={step.onClick} className=\"w-full outline-none focus-visible:bg-ui-fill/50\">\n {content}\n </button>\n );\n }\n\n return <div key={step.id}>{content}</div>;\n })}\n </div>\n </div>\n </div>\n );\n}\n","import { Children, type ReactNode } from 'react';\nimport { cn } from '../lib/utils';\n\nexport function CardDots() {\n return (\n <div\n aria-hidden\n className=\"pointer-events-none absolute inset-0 opacity-[0.35]\"\n style={{\n backgroundImage: 'radial-gradient(circle, var(--ui-line) 1px, transparent 1px)',\n backgroundSize: '18px 18px',\n }}\n />\n );\n}\n\nexport function GraphShell({\n title,\n icon,\n legend,\n children,\n className = '',\n}: {\n title: string;\n icon?: ReactNode;\n legend?: ReactNode;\n children: ReactNode;\n className?: string;\n}) {\n return (\n // Same chrome as the dashboard stat cards: card face carries the title, the chart itself sits\n // in a recessed inner panel.\n <div\n className={cn(\n 'flex flex-col rounded-lg border border-ui-line bg-white p-3.5 dark:border-[oklch(0.27_0_0)] dark:bg-black',\n className,\n )}\n >\n <div className=\"flex items-center gap-2 px-0.5\">\n {icon && <span className=\"shrink-0 text-ui-subtle\">{icon}</span>}\n <h3 className=\"truncate text-[11px] font-semibold uppercase tracking-[0.14em] text-ui-default\">\n {title}\n </h3>\n </div>\n\n <div className=\"ui-well relative mt-3 flex flex-1 flex-col overflow-hidden rounded-md\">\n {/* Dot texture lives on the recessed face, where the chart reads against it. */}\n <CardDots />\n {legend && (\n <div className=\"relative flex flex-wrap items-center gap-x-4 gap-y-1.5 px-3.5 pt-3.5\">\n {legend}\n </div>\n )}\n <div className=\"relative flex flex-1 flex-col\">{children}</div>\n </div>\n </div>\n );\n}\n\nexport interface SeriesMarkerProps {\n /** Flat CSS colour. Ignored when `hatched` is set, which paints its own fill. */\n color?: string;\n /** The cross-hatched fill used for the input-token series. */\n hatched?: boolean;\n /** A dashed rule instead of a swatch, for series drawn as a dashed line. */\n dashed?: boolean;\n}\n\n/**\n * The swatch that identifies a series. Shared by the legend and the tooltip so a series looks the\n * same in both - a tooltip dot that doesn't match its legend chip reads as a different series.\n */\nexport function SeriesMarker({ color, hatched, dashed }: SeriesMarkerProps) {\n if (dashed) {\n return (\n <span\n aria-hidden\n className=\"h-0 w-3.5 shrink-0 border-t-2 border-dashed\"\n style={{ borderColor: color }}\n />\n );\n }\n\n return (\n <span\n aria-hidden\n className=\"h-2.5 w-2.5 shrink-0 rounded-[3px]\"\n style={\n hatched\n ? {\n backgroundImage:\n 'repeating-linear-gradient(45deg, var(--ui-subtle) 0 1.5px, transparent 1.5px 3.5px)',\n backgroundColor: 'color-mix(in oklch, var(--ui-fill) 60%, transparent)',\n }\n : { backgroundColor: color }\n }\n />\n );\n}\n\nexport function LegendChip({\n color,\n hatched,\n dashed,\n label,\n}: SeriesMarkerProps & { label: string }) {\n return (\n <span className=\"flex items-center gap-1.5 text-xs text-ui-subtle\">\n <SeriesMarker color={color} hatched={hatched} dashed={dashed} />\n {label}\n </span>\n );\n}\n\n\n\nexport function ChartDefs({ isDark }: { isDark: boolean }) {\n const hatch = isDark ? 'rgba(228,228,231,0.5)' : 'rgba(63,63,70,0.4)';\n const hatchBg = isDark ? 'rgba(255,255,255,0.05)' : 'rgba(0,0,0,0.04)';\n return (\n <defs>\n <pattern id=\"hatchGray\" patternUnits=\"userSpaceOnUse\" width=\"5\" height=\"5\" patternTransform=\"rotate(45)\">\n <rect width=\"5\" height=\"5\" fill={hatchBg} />\n <line x1=\"0\" y1=\"0\" x2=\"0\" y2=\"5\" stroke={hatch} strokeWidth=\"1.4\" />\n </pattern>\n <linearGradient id=\"blueBar\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor=\"#60a5fa\" />\n <stop offset=\"100%\" stopColor=\"#2563eb\" />\n </linearGradient>\n <linearGradient id=\"amberFill\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={isDark ? '#f59e0b' : '#d97706'} stopOpacity={0.16} />\n <stop offset=\"100%\" stopColor={isDark ? '#f59e0b' : '#d97706'} stopOpacity={0.02} />\n </linearGradient>\n </defs>\n );\n}\n\nconst METER_ROW_PX = 20;\nconst METER_GAP_PX = 14;\n\nexport function MeterList({ visible, children }: { visible: number; children: ReactNode }) {\n const scrolls = Children.count(children) > visible;\n\n return (\n <div className=\"px-3.5 py-4 sm:px-4 sm:py-4.5\">\n <div\n className={cn('space-y-3.5', scrolls && 'overflow-y-auto pr-3')}\n style={scrolls ? { maxHeight: visible * METER_ROW_PX + (visible - 1) * METER_GAP_PX } : undefined}\n >\n {children}\n </div>\n </div>\n );\n}\n\nexport function TickMeter({\n label,\n value,\n max,\n color,\n valueLabel,\n}: {\n label: string;\n value: number;\n max: number;\n color: string;\n valueLabel: string;\n}) {\n const SEGMENTS = 26;\n const filled = value > 0 ? Math.max(1, Math.round((value / Math.max(max, 1)) * SEGMENTS)) : 0;\n\n return (\n <div className=\"flex h-5 items-center gap-3\">\n <span className=\"w-28 shrink-0 truncate text-[13px] font-medium text-ui-default\" title={label}>\n {label}\n </span>\n <div\n className=\"grid h-4 flex-1 gap-[2.5px]\"\n style={{ gridTemplateColumns: `repeat(${SEGMENTS}, minmax(0, 1fr))` }}\n aria-hidden\n >\n {Array.from({ length: SEGMENTS }).map((_, i) => (\n <span\n key={i}\n className=\"rounded-[1px]\"\n style={{ backgroundColor: i < filled ? color : 'var(--ui-fill)' }}\n />\n ))}\n </div>\n <span className=\"ui-font-mono w-14 shrink-0 text-right text-xs tabular-nums text-ui-default\">\n {valueLabel}\n </span>\n </div>\n );\n}\n"],"mappings":"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","names":["jsx","React","cva","jsx","jsxs","AlertTriangle","jsx","jsxs","AlertTriangle","React","jsx","React","jsx","jsx","jsxs","m","jsx","jsxs","RADIUS_TRANSITION_OPEN","RADIUS_TRANSITION_CLOSED","m","jsx","jsxs","React","jsx","cva","jsx","cva","jsx","jsx","jsxs","jsx","jsxs","useEffect","useRef","useState","Check","jsx","jsxs","useState","useRef","useEffect","Check","jsx","jsx","AlertTriangle","jsx","jsxs","AlertTriangle","Check","jsx","jsxs","Check","jsx","jsxs"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codraoss/ui",
3
- "version": "0.9.5",
3
+ "version": "0.9.6",
4
4
  "description": "Codra's reusable React design-system primitives and hooks.",
5
5
  "author": "Devarshi Shimpi",
6
6
  "license": "AGPL-3.0-only",