@codraoss/ui 0.9.9 → 0.9.13
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/components/motion/index.d.ts +0 -8
- package/dist/components/motion/index.js +4 -6
- package/dist/components/motion/index.js.map +1 -1
- package/dist/index.d.ts +4 -21
- package/dist/index.js +23 -29
- package/dist/index.js.map +1 -1
- package/dist/lib/prompt-diff.js.map +1 -1
- package/package.json +5 -55
|
@@ -19,25 +19,19 @@ type ScrollToOptions = {
|
|
|
19
19
|
duration?: number;
|
|
20
20
|
};
|
|
21
21
|
type SmoothScrollApi = {
|
|
22
|
-
/** Null on the reduced-motion / native path. */
|
|
23
22
|
lenis: Lenis | null;
|
|
24
23
|
scrollY: MotionValue<number>;
|
|
25
24
|
progress: MotionValue<number>;
|
|
26
|
-
/** px/frame. */
|
|
27
25
|
velocity: MotionValue<number>;
|
|
28
|
-
/** Jumps instantly under reduced motion. */
|
|
29
26
|
scrollTo: (target: ScrollTarget, options?: ScrollToOptions) => void;
|
|
30
27
|
};
|
|
31
28
|
interface SmoothScrollProps {
|
|
32
29
|
children: ReactNode;
|
|
33
|
-
/** True drives window scroll; false scrolls a contained area. */
|
|
34
30
|
root?: boolean;
|
|
35
|
-
/** Lower = smoother, heavier. */
|
|
36
31
|
lerp?: number;
|
|
37
32
|
duration?: number;
|
|
38
33
|
orientation?: 'vertical' | 'horizontal';
|
|
39
34
|
wheelMultiplier?: number;
|
|
40
|
-
/** Off by default: native touch momentum is already good on mobile. */
|
|
41
35
|
touch?: boolean;
|
|
42
36
|
className?: string;
|
|
43
37
|
}
|
|
@@ -55,9 +49,7 @@ interface SteppedSliderProps {
|
|
|
55
49
|
min?: number;
|
|
56
50
|
max?: number;
|
|
57
51
|
step?: number;
|
|
58
|
-
/** Tick dots + labels rendered at each defined step. */
|
|
59
52
|
steps?: SteppedSliderStep[];
|
|
60
|
-
/** Live value readout shown above the track, and used as the accessible aria-valuetext. Defaults to the raw value. */
|
|
61
53
|
formatValue?: (value: number) => string;
|
|
62
54
|
disabled?: boolean;
|
|
63
55
|
className?: string;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
cn
|
|
3
|
-
} from "../../chunk-GNGWMNUA.js";
|
|
4
1
|
import {
|
|
5
2
|
useIsDarkMode
|
|
6
3
|
} from "../../chunk-TXNSYK4G.js";
|
|
4
|
+
import {
|
|
5
|
+
cn
|
|
6
|
+
} from "../../chunk-GNGWMNUA.js";
|
|
7
7
|
import "../../chunk-PZ5AY32C.js";
|
|
8
8
|
|
|
9
9
|
// src/components/motion/shared-layout-bg.tsx
|
|
@@ -240,7 +240,6 @@ function SmoothScroll({
|
|
|
240
240
|
smoothWheel: true,
|
|
241
241
|
syncTouch: touch,
|
|
242
242
|
easing: EASE_SCROLL,
|
|
243
|
-
// Else Lenis preventDefault()s every wheel event, blocking nested scroll areas.
|
|
244
243
|
allowNestedScroll: true
|
|
245
244
|
},
|
|
246
245
|
children: [
|
|
@@ -411,7 +410,7 @@ function SteppedSlider({
|
|
|
411
410
|
onPointerUp: endDrag,
|
|
412
411
|
onPointerCancel: endDrag,
|
|
413
412
|
className: cn(
|
|
414
|
-
"relative flex h-10 w-full
|
|
413
|
+
"relative flex h-10 w-full select-none items-center overflow-hidden rounded-lg bg-muted",
|
|
415
414
|
disabled ? "pointer-events-none opacity-50" : "cursor-grab active:cursor-grabbing"
|
|
416
415
|
),
|
|
417
416
|
children: [
|
|
@@ -476,7 +475,6 @@ function SteppedSlider({
|
|
|
476
475
|
transition: SPRING_BOUNCY,
|
|
477
476
|
className: cn(
|
|
478
477
|
"absolute top-1/2 h-5 w-1.5 rounded-sm bg-foreground shadow-sm outline-none ring-foreground/30 focus-visible:ring-4",
|
|
479
|
-
// Background-colored ring keeps the thumb legible against the accent fill at any position.
|
|
480
478
|
isMaxed && "ring-2 ring-background"
|
|
481
479
|
),
|
|
482
480
|
style: { left, x: thumbX, y: "-50%" }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/motion/shared-layout-bg.tsx","../../../src/components/motion/smooth-scroll.tsx","../../../src/components/motion/stepped-slider.tsx","../../../src/components/motion/tabs.tsx"],"sourcesContent":["// beui.dev/components/motion/shared-layout-bg\nimport {\n AnimatePresence,\n domMax,\n LazyMotion,\n m,\n useReducedMotion,\n type Variants,\n} from \"motion/react\";\nimport {\n Children,\n cloneElement,\n isValidElement,\n useId,\n useState,\n type ReactElement,\n type ReactNode,\n} from \"react\";\nimport { cn } from \"../../lib/utils\";\n\nconst SPRING_LAYOUT = {\n type: \"spring\" as const,\n stiffness: 400,\n damping: 40,\n mass: 0.6,\n};\n\nexport interface SharedLayoutBgProps {\n children: ReactNode;\n className?: string;\n pillClassName?: string;\n /** Horizontal inset of the pill relative to each row (px). */\n inset?: number;\n}\n\nconst variants: Variants = {\n initial: { opacity: 0, filter: \"blur(6px)\" },\n animate: { opacity: 1, filter: \"blur(0px)\" },\n exit: (isActive: boolean) =>\n !isActive ? { opacity: 0, filter: \"blur(6px)\" } : {},\n};\n\nconst reducedVariants: Variants = {\n initial: { opacity: 0 },\n animate: { opacity: 1 },\n exit: (isActive: boolean) => (!isActive ? { opacity: 0 } : {}),\n};\n\nexport function SharedLayoutBg({\n children,\n className,\n pillClassName,\n inset = 0,\n}: SharedLayoutBgProps) {\n const [activeId, setActiveId] = useState<string | null>(null);\n const uid = useId();\n const reduce = useReducedMotion();\n\n const rows: ReactNode[] = [];\n for (const child of Children.toArray(children)) {\n if (!isValidElement(child)) continue;\n const el = child as ReactElement<{\n className?: string;\n onMouseEnter?: (e?: any) => void;\n children?: ReactNode;\n }>;\n // rows.length is the index among *valid* children, so keyless rows keep stable fallback keys.\n const childKey = el.key ? String(el.key) : `item-${rows.length}`;\n rows.push(\n cloneElement(\n el,\n {\n key: childKey,\n className: cn(\"relative z-10\", el.props.className),\n onMouseEnter: (e: any) => {\n el.props.onMouseEnter?.(e);\n setActiveId(childKey);\n },\n },\n <>\n <div className=\"pointer-events-none absolute inset-0 z-0\">\n <AnimatePresence custom={activeId !== null}>\n {activeId !== null ? (\n <m.div\n variants={reduce ? reducedVariants : variants}\n initial=\"initial\"\n animate=\"animate\"\n exit=\"exit\"\n custom={activeId !== null}\n className=\"absolute inset-0\"\n style={{ left: -inset, right: -inset, top: 0, bottom: 0 }}\n >\n {activeId === childKey ? (\n <m.div\n layoutId={`shared-bg-${uid}`}\n transition={reduce ? { duration: 0 } : SPRING_LAYOUT}\n className={cn(\n \"pointer-events-none h-full w-full rounded-lg\",\n pillClassName,\n )}\n />\n ) : null}\n </m.div>\n ) : null}\n </AnimatePresence>\n </div>\n {el}\n </>\n ),\n );\n }\n\n return (\n <LazyMotion features={domMax}>\n <m.div\n layoutRoot\n onMouseLeave={() => setActiveId(null)}\n className={cn(\"flex w-full flex-col\", className)}\n >\n {rows}\n </m.div>\n </LazyMotion>\n );\n}\n","// beui.dev/components/motion/scroll-animation\nimport type Lenis from 'lenis';\nimport { ReactLenis, useLenis } from 'lenis/react';\nimport { type MotionValue, useMotionValue, useReducedMotion } from 'motion/react';\nimport {\n createContext,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n} from 'react';\n\n// Named fn, not a lib/ease token: Lenis needs a (t) => number easing fn, not bezier points.\nconst EASE_SCROLL = (t: number) => Math.min(1, 1.001 - 2 ** (-10 * t));\n\nexport type ScrollTarget = number | string | HTMLElement;\n\nexport type ScrollToOptions = {\n offset?: number;\n immediate?: boolean;\n duration?: number;\n};\n\nexport type SmoothScrollApi = {\n /** Null on the reduced-motion / native path. */\n lenis: Lenis | null;\n scrollY: MotionValue<number>;\n progress: MotionValue<number>;\n /** px/frame. */\n velocity: MotionValue<number>;\n /** Jumps instantly under reduced motion. */\n scrollTo: (target: ScrollTarget, options?: ScrollToOptions) => void;\n};\n\nconst SmoothScrollContext = createContext<SmoothScrollApi | null>(null);\n\nexport interface SmoothScrollProps {\n children: ReactNode;\n /** True drives window scroll; false scrolls a contained area. */\n root?: boolean;\n /** Lower = smoother, heavier. */\n lerp?: number;\n duration?: number;\n orientation?: 'vertical' | 'horizontal';\n wheelMultiplier?: number;\n /** Off by default: native touch momentum is already good on mobile. */\n touch?: boolean;\n className?: string;\n}\n\ntype ScrollSource = Window | HTMLElement;\n\nfunction readMetrics(target: ScrollSource) {\n if (target instanceof Window) {\n const max = Math.max(\n 0,\n document.documentElement.scrollHeight - window.innerHeight,\n );\n return { y: window.scrollY, max };\n }\n return {\n y: target.scrollTop,\n max: Math.max(0, target.scrollHeight - target.clientHeight),\n };\n}\n\nfunction resolveTop(\n target: ScrollTarget,\n source: ScrollSource,\n offset = 0,\n): number {\n if (typeof target === 'number') return target + offset;\n if (source instanceof Window) {\n const el =\n typeof target === 'string' ? document.querySelector(target) : target;\n if (!el) return window.scrollY;\n return el.getBoundingClientRect().top + window.scrollY + offset;\n }\n const el =\n typeof target === 'string' ? source.querySelector(target) : target;\n if (!(el instanceof HTMLElement)) return source.scrollTop;\n return el.offsetTop + offset;\n}\n\nfunction LenisBridge({\n scrollY,\n progress,\n velocity,\n lenisRef,\n}: {\n scrollY: MotionValue<number>;\n progress: MotionValue<number>;\n velocity: MotionValue<number>;\n lenisRef: { current: Lenis | null };\n}) {\n const lenis = useLenis((instance) => {\n scrollY.set(instance.scroll);\n progress.set(instance.progress);\n velocity.set(instance.velocity);\n });\n useEffect(() => {\n lenisRef.current = lenis ?? null;\n return () => {\n lenisRef.current = null;\n };\n }, [lenis, lenisRef]);\n return null;\n}\n\nfunction useNativeScrollSync(\n enabled: boolean,\n getTarget: () => ScrollSource | null,\n scrollY: MotionValue<number>,\n progress: MotionValue<number>,\n velocity: MotionValue<number>,\n) {\n useEffect(() => {\n if (!enabled) return;\n const target = getTarget();\n if (!target) return;\n let lastY = readMetrics(target).y;\n let lastT = performance.now();\n const onScroll = () => {\n const { y, max } = readMetrics(target);\n const now = performance.now();\n const dt = now - lastT || 16;\n scrollY.set(y);\n progress.set(max > 0 ? y / max : 0);\n velocity.set(((y - lastY) / dt) * 16);\n lastY = y;\n lastT = now;\n };\n onScroll();\n target.addEventListener('scroll', onScroll, { passive: true });\n return () => target.removeEventListener('scroll', onScroll);\n }, [enabled, getTarget, scrollY, progress, velocity]);\n}\n\nexport function SmoothScroll({\n children,\n root = true,\n lerp = 0.1,\n duration = 1.2,\n orientation = 'vertical',\n wheelMultiplier = 1,\n touch = false,\n className,\n}: SmoothScrollProps) {\n const reduce = useReducedMotion();\n const scrollY = useMotionValue(0);\n const progress = useMotionValue(0);\n const velocity = useMotionValue(0);\n const lenisRef = useRef<Lenis | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const nativeSource = useCallback(\n (): ScrollSource | null => (root ? window : containerRef.current),\n [root],\n );\n\n const scrollTo = useCallback(\n (target: ScrollTarget, options?: ScrollToOptions) => {\n const lenis = lenisRef.current;\n if (lenis && !reduce) {\n lenis.scrollTo(target, {\n offset: options?.offset,\n duration: options?.duration,\n immediate: options?.immediate,\n });\n return;\n }\n const source = nativeSource();\n const behavior = reduce || options?.immediate ? 'auto' : 'smooth';\n const top = resolveTop(target, source ?? window, options?.offset);\n (source ?? window).scrollTo({ top, behavior });\n },\n [reduce, nativeSource],\n );\n\n useNativeScrollSync(!!reduce, nativeSource, scrollY, progress, velocity);\n\n const api = useMemo<SmoothScrollApi>(\n () => ({ lenis: lenisRef.current, scrollY, progress, velocity, scrollTo }),\n [scrollY, progress, velocity, scrollTo],\n );\n\n if (reduce) {\n return (\n <SmoothScrollContext.Provider value={api}>\n <div ref={containerRef} className={className}>\n {children}\n </div>\n </SmoothScrollContext.Provider>\n );\n }\n\n return (\n <SmoothScrollContext.Provider value={api}>\n <ReactLenis\n root={root}\n className={className}\n options={{\n lerp,\n duration,\n orientation,\n wheelMultiplier,\n smoothWheel: true,\n syncTouch: touch,\n easing: EASE_SCROLL,\n // Else Lenis preventDefault()s every wheel event, blocking nested scroll areas.\n allowNestedScroll: true,\n }}\n >\n <LenisBridge\n scrollY={scrollY}\n progress={progress}\n velocity={velocity}\n lenisRef={lenisRef}\n />\n {children}\n </ReactLenis>\n </SmoothScrollContext.Provider>\n );\n}\n","// Adapted from a min/max/step range slider so labeled steps (e.g. Low/Medium/High/Max) line up on\n// evenly spaced stops; the value readout sits statically above the track (no floating/portal tooltip).\nimport {\n domAnimation,\n LazyMotion,\n m,\n useMotionTemplate,\n useMotionValue,\n useReducedMotion,\n useSpring,\n useTransform,\n} from 'motion/react';\nimport {\n type KeyboardEvent,\n type PointerEvent,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { cn } from '../../lib/utils';\nimport { useIsDarkMode } from '../../hooks/use-is-dark-mode';\n\nconst SPRING_GLIDE = { stiffness: 700, damping: 50, mass: 0.5 } as const;\nconst SPRING_BOUNCY = { type: 'spring', stiffness: 500, damping: 14, mass: 0.7 } as const;\n\n// Deterministic 0..1 seed from the slider's id, so two sliders maxed out at once get slightly\n// different hues/timing instead of pulsing in perfect unison.\nfunction seedFromId(id: string | undefined) {\n if (!id) return 0;\n let hash = 0;\n for (let i = 0; i < id.length; i += 1) {\n hash = (hash * 31 + id.charCodeAt(i)) >>> 0;\n }\n return (hash % 997) / 997;\n}\n\nexport interface SteppedSliderStep {\n value: number;\n label: string;\n}\n\nexport interface SteppedSliderProps {\n id?: string;\n value?: number;\n defaultValue?: number;\n onValueChange?: (value: number) => void;\n min?: number;\n max?: number;\n step?: number;\n /** Tick dots + labels rendered at each defined step. */\n steps?: SteppedSliderStep[];\n /** Live value readout shown above the track, and used as the accessible aria-valuetext. Defaults to the raw value. */\n formatValue?: (value: number) => string;\n disabled?: boolean;\n className?: string;\n 'aria-label'?: string;\n 'aria-labelledby'?: string;\n}\n\nconst clamp = (v: number, lo: number, hi: number) => Math.min(hi, Math.max(lo, v));\n\nexport function SteppedSlider({\n id,\n value,\n defaultValue = 0,\n onValueChange,\n min = 0,\n max = 100,\n step = 1,\n steps = [],\n formatValue,\n disabled = false,\n className,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n}: SteppedSliderProps) {\n const reduce = useReducedMotion();\n const isDark = useIsDarkMode();\n const seed = useMemo(() => seedFromId(id), [id]);\n const trackRef = useRef<HTMLDivElement>(null);\n const [internal, setInternal] = useState(defaultValue);\n const [active, setActive] = useState(false);\n // Decoupled from the committed value so onValueChange fires once per gesture (on release),\n // not on every pointer-move tick. Mirrored in a ref so release can read the pending value\n // without doing the commit inside a state updater.\n const [dragValue, setDragValue] = useState<number | null>(null);\n const dragValueRef = useRef<number | null>(null);\n const controlled = value !== undefined;\n const committedValue = clamp(controlled ? (value as number) : internal, min, max);\n const current = active && dragValue !== null ? clamp(dragValue, min, max) : committedValue;\n const percent = ((current - min) / (max - min)) * 100;\n const isMaxed = current === max;\n\n // Hue-shifted and timed per instance so simultaneous maxed-out sliders don't pulse in unison.\n const hue = 185 + (seed - 0.5) * 16;\n const glowColor = isDark ? `oklch(68% 0.14 ${hue})` : `oklch(52% 0.13 ${hue})`;\n const fillGradient = isDark\n ? `linear-gradient(90deg, oklch(28% 0.08 ${hue}), oklch(62% 0.12 ${hue}))`\n : `linear-gradient(90deg, oklch(93% 0.03 ${hue}), oklch(56% 0.13 ${hue}))`;\n const dotDriftDuration = 1.4 + seed * 0.5;\n const glowDuration = 1.6 + seed * 0.6;\n\n const target = useMotionValue(percent);\n useEffect(() => {\n target.set(percent);\n }, [percent, target]);\n const smooth = useSpring(target, SPRING_GLIDE);\n const pos = reduce ? target : smooth;\n const left = useMotionTemplate`${pos}%`;\n const thumbX = useTransform(pos, (p) => `${-p}%`);\n\n const snapValue = useCallback(\n (next: number) => clamp(Math.round((next - min) / step) * step + min, min, max),\n [min, max, step],\n );\n\n const commit = useCallback(\n (next: number) => {\n const snapped = snapValue(next);\n if (!controlled) setInternal(snapped);\n onValueChange?.(snapped);\n },\n [controlled, onValueChange, snapValue],\n );\n\n const valueFromX = useCallback(\n (clientX: number) => {\n const rect = trackRef.current?.getBoundingClientRect();\n if (!rect) return committedValue;\n const ratio = clamp((clientX - rect.left) / rect.width, 0, 1);\n return min + ratio * (max - min);\n },\n [committedValue, min, max],\n );\n\n const trackDragValue = useCallback((next: number | null) => {\n dragValueRef.current = next;\n setDragValue(next);\n }, []);\n\n const onPointerDown = useCallback(\n (event: PointerEvent<HTMLDivElement>) => {\n if (disabled) return;\n event.currentTarget.setPointerCapture(event.pointerId);\n setActive(true);\n trackDragValue(snapValue(valueFromX(event.clientX)));\n },\n [disabled, valueFromX, snapValue, trackDragValue],\n );\n\n const onPointerMove = useCallback(\n (event: PointerEvent<HTMLDivElement>) => {\n if (!active || disabled) return;\n trackDragValue(snapValue(valueFromX(event.clientX)));\n },\n [active, disabled, valueFromX, snapValue, trackDragValue],\n );\n\n const endDrag = useCallback(\n (event: PointerEvent<HTMLDivElement>) => {\n event.currentTarget.releasePointerCapture?.(event.pointerId);\n setActive(false);\n const pending = dragValueRef.current;\n trackDragValue(null);\n if (pending !== null) commit(pending);\n },\n [commit, trackDragValue],\n );\n\n const onKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n if (disabled) return;\n const map: Record<string, number> = {\n ArrowRight: committedValue + step,\n ArrowUp: committedValue + step,\n ArrowLeft: committedValue - step,\n ArrowDown: committedValue - step,\n Home: min,\n End: max,\n };\n if (event.key in map) {\n event.preventDefault();\n commit(map[event.key]);\n }\n },\n [disabled, committedValue, step, min, max, commit],\n );\n\n const valueLabel = formatValue ? formatValue(current) : String(current);\n\n return (\n <LazyMotion features={domAnimation}>\n <div className={cn('w-full', className)}>\n <div className=\"mb-1.5 flex justify-end\">\n <span className=\"text-xs font-medium text-foreground tabular-nums\">{valueLabel}</span>\n </div>\n\n <div\n ref={trackRef}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={endDrag}\n onPointerCancel={endDrag}\n className={cn(\n 'relative flex h-10 w-full touch-none select-none items-center overflow-hidden rounded-lg bg-muted',\n disabled ? 'pointer-events-none opacity-50' : 'cursor-grab active:cursor-grabbing',\n )}\n >\n {/* Pattern repeats every 10px, shifting by exactly one period, so the loop point is never visible. */}\n <m.div className=\"absolute inset-y-0 left-0 overflow-hidden\" style={{ width: left }}>\n {isMaxed ? (\n <div\n className=\"absolute inset-0\"\n style={{ backgroundImage: fillGradient }}\n >\n <m.div\n className=\"absolute inset-0\"\n style={{\n backgroundImage: 'radial-gradient(circle, rgba(255,255,255,0.85) 1.3px, transparent 1.3px)',\n backgroundSize: '10px 10px',\n }}\n animate={reduce ? undefined : { backgroundPositionX: ['0px', '10px'] }}\n transition={{ duration: dotDriftDuration, repeat: Infinity, ease: 'linear' }}\n />\n </div>\n ) : (\n <div className=\"absolute inset-0 bg-foreground/15\" />\n )}\n </m.div>\n\n {/* Inset so end dots don't clip; sized up at max so they don't blend into the dot texture. */}\n <div className=\"pointer-events-none absolute inset-x-2 inset-y-0\">\n {steps.map((tick) => {\n const tp = ((tick.value - min) / (max - min)) * 100;\n return (\n <span\n key={tick.value}\n className={cn(\n 'absolute top-1/2 -translate-x-1/2 -translate-y-1/2 rounded-full',\n isMaxed ? 'size-1.5 bg-white shadow-[0_0_0_1.5px_rgba(0,0,0,0.35)]' : 'size-1 bg-foreground/25',\n )}\n style={{ left: `${tp}%` }}\n />\n );\n })}\n </div>\n\n {/* Own layer so only opacity animates - Motion's box-shadow interpolator can't parse CSS custom properties in the color stops. */}\n {isMaxed && !reduce && (\n <m.div\n aria-hidden\n className=\"pointer-events-none absolute top-1/2 h-5 w-1.5 rounded-sm\"\n style={{ left, x: thumbX, y: '-50%', boxShadow: `0 0 9px 3px ${glowColor}` }}\n animate={{ opacity: [0.25, 0.9, 0.25], scale: [1, 1.15, 1] }}\n transition={{ duration: glowDuration, repeat: Infinity, ease: 'easeInOut', delay: seed * 0.5 }}\n />\n )}\n\n <m.div\n id={id}\n role=\"slider\"\n tabIndex={disabled ? -1 : 0}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={Math.round(current)}\n aria-valuetext={valueLabel}\n aria-disabled={disabled || undefined}\n onKeyDown={onKeyDown}\n animate={reduce ? undefined : { scaleY: active ? 1.35 : 1 }}\n transition={SPRING_BOUNCY}\n className={cn(\n 'absolute top-1/2 h-5 w-1.5 rounded-sm bg-foreground shadow-sm outline-none ring-foreground/30 focus-visible:ring-4',\n // Background-colored ring keeps the thumb legible against the accent fill at any position.\n isMaxed && 'ring-2 ring-background',\n )}\n style={{ left, x: thumbX, y: '-50%' }}\n />\n </div>\n\n {steps.length > 0 && (\n <div className=\"relative mt-1.5 h-4\">\n <div className=\"absolute inset-x-2 inset-y-0\">\n {steps.map((tick, index) => {\n const isFirst = index === 0;\n const isLast = index === steps.length - 1;\n const tp = ((tick.value - min) / (max - min)) * 100;\n return (\n <span\n key={tick.value}\n className={cn(\n 'absolute text-[10px] font-medium text-muted-foreground',\n isFirst && 'left-0',\n isLast && 'right-0',\n !isFirst && !isLast && '-translate-x-1/2',\n )}\n style={!isFirst && !isLast ? { left: `${tp}%` } : undefined}\n >\n {tick.label}\n </span>\n );\n })}\n </div>\n </div>\n )}\n </div>\n </LazyMotion>\n );\n}\n","// beui.dev/components/motion/tabs\n// domMax rather than domAnimation: the active-tab indicator animates via layoutId/layoutRoot, and\n// layout projection only ships in the max bundle.\nimport { LazyMotion, m, domMax, MotionConfig, useReducedMotion, type Transition } from 'motion/react';\nimport {\n createContext,\n useCallback,\n useContext,\n useId,\n useMemo,\n useState,\n type ReactNode,\n} from 'react';\nimport { cn } from '../../lib/utils';\n\ntype Variant = 'pill' | 'underline' | 'segment';\n\ntype Ctx = {\n value: string;\n setValue: (v: string) => void;\n layoutId: string;\n variant: Variant;\n};\n\nconst TabsCtx = createContext<Ctx | null>(null);\n\nfunction useTabs() {\n const ctx = useContext(TabsCtx);\n if (!ctx) throw new Error('Tabs.* must be used inside <Tabs>');\n return ctx;\n}\n\n// A touch of overshoot so the active-tab indicator settles with life instead of snapping.\nconst transition: Transition = {\n type: 'spring',\n stiffness: 170,\n damping: 24,\n mass: 1.2,\n};\n\nexport function Tabs({\n defaultValue,\n value,\n onValueChange,\n variant = 'pill',\n children,\n className,\n}: {\n defaultValue?: string;\n value?: string;\n onValueChange?: (v: string) => void;\n variant?: Variant;\n children: ReactNode;\n className?: string;\n}) {\n const [internal, setInternal] = useState(defaultValue ?? '');\n const layoutId = useId();\n const reduce = useReducedMotion();\n const controlled = value !== undefined;\n const current = controlled ? value : internal;\n const setValue = useCallback(\n (v: string) => {\n if (!controlled) setInternal(v);\n onValueChange?.(v);\n },\n [controlled, onValueChange],\n );\n const ctx = useMemo(\n () => ({ value: current, setValue, layoutId, variant }),\n [current, setValue, layoutId, variant],\n );\n return (\n <MotionConfig transition={reduce ? { duration: 0 } : transition}>\n <TabsCtx.Provider value={ctx}>\n <LazyMotion features={domMax}>\n {/* layoutRoot: the indicator's layoutId measures in page coordinates, so without this\n it would replay scroll offsets as movement inside fixed/scrolled containers. */}\n <m.div layoutRoot className={className}>\n {children}\n </m.div>\n </LazyMotion>\n </TabsCtx.Provider>\n </MotionConfig>\n );\n}\n\nconst listClasses: Record<Variant, string> = {\n pill: 'inline-flex items-center gap-1 rounded-full bg-card p-1',\n underline: 'inline-flex items-center gap-1 border-b border-border',\n segment: 'inline-flex items-center gap-0 rounded-md border border-ui-line bg-ui-fill/40 p-0.5',\n};\n\nexport function TabsList({ children, className }: { children: ReactNode; className?: string }) {\n const { variant } = useTabs();\n return (\n <div role=\"tablist\" className={cn(listClasses[variant], className)}>\n {children}\n </div>\n );\n}\n\nexport function TabsTrigger({\n value,\n children,\n className,\n indicatorClassName,\n}: {\n value: string;\n children: ReactNode;\n className?: string;\n indicatorClassName?: string;\n}) {\n const { value: current, setValue, layoutId, variant } = useTabs();\n const active = current === value;\n\n if (variant === 'underline') {\n return (\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={active}\n onClick={() => setValue(value)}\n className={cn(\n 'relative isolate px-3 pb-2.5 pt-1 -mb-px text-sm font-medium transition-colors min-h-[44px] inline-flex items-center',\n active ? 'text-foreground' : 'text-muted-foreground hover:text-foreground',\n className,\n )}\n >\n {children}\n {active ? (\n <m.span\n layoutId={layoutId}\n className={cn('absolute -bottom-px left-0 right-0 h-px bg-primary', indicatorClassName)}\n />\n ) : null}\n </button>\n );\n }\n\n // Segment uses a neutral raised surface (vs. pill's max-contrast) so it reads as a standard segmented control.\n const isSegment = variant === 'segment';\n const radius = variant === 'pill' ? 'rounded-full' : 'rounded-[5px]';\n const indicatorBg = isSegment ? 'bg-ui-base shadow-sm ring-1 ring-ui-line' : 'bg-primary';\n const activeText = isSegment ? 'text-ui-strong' : 'text-primary-foreground';\n const inactiveText = isSegment\n ? 'text-ui-subtle hover:text-ui-default'\n : 'text-muted-foreground hover:text-foreground';\n\n return (\n <div className=\"relative\">\n {active ? (\n <m.span\n layoutId={layoutId}\n style={{ borderRadius: variant === 'pill' ? 9999 : 5 }}\n className={cn('absolute inset-0', indicatorBg, radius, indicatorClassName)}\n />\n ) : null}\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={active}\n onClick={() => setValue(value)}\n className={cn(\n 'relative z-10 inline-flex items-center justify-center whitespace-nowrap bg-transparent px-3.5 py-1.5 text-sm font-medium capitalize transition-colors outline-none',\n active ? activeText : inactiveText,\n radius,\n className,\n )}\n >\n {children}\n </button>\n </div>\n );\n}\n"],"mappings":"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","names":["useReducedMotion","jsx","jsxs","el","LazyMotion","m","useMotionValue","useReducedMotion","useCallback","useEffect","useMemo","useRef","useState","jsx","jsxs","useReducedMotion","useMemo","useRef","useState","useMotionValue","useEffect","useCallback","LazyMotion","m","LazyMotion","m","domMax","useReducedMotion","createContext","useCallback","useId","useMemo","useState","jsx","jsxs","createContext","useState","useId","useReducedMotion","useCallback","useMemo","LazyMotion","domMax","m"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/motion/shared-layout-bg.tsx","../../../src/components/motion/smooth-scroll.tsx","../../../src/components/motion/stepped-slider.tsx","../../../src/components/motion/tabs.tsx"],"sourcesContent":["// beui.dev/components/motion/shared-layout-bg\nimport {\n AnimatePresence,\n domMax,\n LazyMotion,\n m,\n useReducedMotion,\n type Variants,\n} from \"motion/react\";\nimport {\n Children,\n cloneElement,\n isValidElement,\n useId,\n useState,\n type ReactElement,\n type ReactNode,\n} from \"react\";\nimport { cn } from \"../../lib/utils\";\n\nconst SPRING_LAYOUT = {\n type: \"spring\" as const,\n stiffness: 400,\n damping: 40,\n mass: 0.6,\n};\n\nexport interface SharedLayoutBgProps {\n children: ReactNode;\n className?: string;\n pillClassName?: string;\n /** Horizontal inset of the pill relative to each row (px). */\n inset?: number;\n}\n\nconst variants: Variants = {\n initial: { opacity: 0, filter: \"blur(6px)\" },\n animate: { opacity: 1, filter: \"blur(0px)\" },\n exit: (isActive: boolean) =>\n !isActive ? { opacity: 0, filter: \"blur(6px)\" } : {},\n};\n\nconst reducedVariants: Variants = {\n initial: { opacity: 0 },\n animate: { opacity: 1 },\n exit: (isActive: boolean) => (!isActive ? { opacity: 0 } : {}),\n};\n\nexport function SharedLayoutBg({\n children,\n className,\n pillClassName,\n inset = 0,\n}: SharedLayoutBgProps) {\n const [activeId, setActiveId] = useState<string | null>(null);\n const uid = useId();\n const reduce = useReducedMotion();\n\n const rows: ReactNode[] = [];\n for (const child of Children.toArray(children)) {\n if (!isValidElement(child)) continue;\n const el = child as ReactElement<{\n className?: string;\n onMouseEnter?: (e?: any) => void;\n children?: ReactNode;\n }>;\n // rows.length is the index among *valid* children, so keyless rows keep stable fallback keys.\n const childKey = el.key ? String(el.key) : `item-${rows.length}`;\n rows.push(\n cloneElement(\n el,\n {\n key: childKey,\n className: cn(\"relative z-10\", el.props.className),\n onMouseEnter: (e: any) => {\n el.props.onMouseEnter?.(e);\n setActiveId(childKey);\n },\n },\n <>\n <div className=\"pointer-events-none absolute inset-0 z-0\">\n <AnimatePresence custom={activeId !== null}>\n {activeId !== null ? (\n <m.div\n variants={reduce ? reducedVariants : variants}\n initial=\"initial\"\n animate=\"animate\"\n exit=\"exit\"\n custom={activeId !== null}\n className=\"absolute inset-0\"\n style={{ left: -inset, right: -inset, top: 0, bottom: 0 }}\n >\n {activeId === childKey ? (\n <m.div\n layoutId={`shared-bg-${uid}`}\n transition={reduce ? { duration: 0 } : SPRING_LAYOUT}\n className={cn(\n \"pointer-events-none h-full w-full rounded-lg\",\n pillClassName,\n )}\n />\n ) : null}\n </m.div>\n ) : null}\n </AnimatePresence>\n </div>\n {el}\n </>\n ),\n );\n }\n\n return (\n <LazyMotion features={domMax}>\n <m.div\n layoutRoot\n onMouseLeave={() => setActiveId(null)}\n className={cn(\"flex w-full flex-col\", className)}\n >\n {rows}\n </m.div>\n </LazyMotion>\n );\n}\n","// beui.dev/components/motion/scroll-animation\nimport type Lenis from 'lenis';\nimport { ReactLenis, useLenis } from 'lenis/react';\nimport { type MotionValue, useMotionValue, useReducedMotion } from 'motion/react';\nimport {\n createContext,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n} from 'react';\n\nconst EASE_SCROLL = (t: number) => Math.min(1, 1.001 - 2 ** (-10 * t));\n\nexport type ScrollTarget = number | string | HTMLElement;\n\nexport type ScrollToOptions = {\n offset?: number;\n immediate?: boolean;\n duration?: number;\n};\n\nexport type SmoothScrollApi = {\n lenis: Lenis | null;\n scrollY: MotionValue<number>;\n progress: MotionValue<number>;\n velocity: MotionValue<number>;\n scrollTo: (target: ScrollTarget, options?: ScrollToOptions) => void;\n};\n\nconst SmoothScrollContext = createContext<SmoothScrollApi | null>(null);\n\nexport interface SmoothScrollProps {\n children: ReactNode;\n root?: boolean;\n lerp?: number;\n duration?: number;\n orientation?: 'vertical' | 'horizontal';\n wheelMultiplier?: number;\n touch?: boolean;\n className?: string;\n}\n\ntype ScrollSource = Window | HTMLElement;\n\nfunction readMetrics(target: ScrollSource) {\n if (target instanceof Window) {\n const max = Math.max(\n 0,\n document.documentElement.scrollHeight - window.innerHeight,\n );\n return { y: window.scrollY, max };\n }\n return {\n y: target.scrollTop,\n max: Math.max(0, target.scrollHeight - target.clientHeight),\n };\n}\n\nfunction resolveTop(\n target: ScrollTarget,\n source: ScrollSource,\n offset = 0,\n): number {\n if (typeof target === 'number') return target + offset;\n if (source instanceof Window) {\n const el =\n typeof target === 'string' ? document.querySelector(target) : target;\n if (!el) return window.scrollY;\n return el.getBoundingClientRect().top + window.scrollY + offset;\n }\n const el =\n typeof target === 'string' ? source.querySelector(target) : target;\n if (!(el instanceof HTMLElement)) return source.scrollTop;\n return el.offsetTop + offset;\n}\n\nfunction LenisBridge({\n scrollY,\n progress,\n velocity,\n lenisRef,\n}: {\n scrollY: MotionValue<number>;\n progress: MotionValue<number>;\n velocity: MotionValue<number>;\n lenisRef: { current: Lenis | null };\n}) {\n const lenis = useLenis((instance) => {\n scrollY.set(instance.scroll);\n progress.set(instance.progress);\n velocity.set(instance.velocity);\n });\n useEffect(() => {\n lenisRef.current = lenis ?? null;\n return () => {\n lenisRef.current = null;\n };\n }, [lenis, lenisRef]);\n return null;\n}\n\nfunction useNativeScrollSync(\n enabled: boolean,\n getTarget: () => ScrollSource | null,\n scrollY: MotionValue<number>,\n progress: MotionValue<number>,\n velocity: MotionValue<number>,\n) {\n useEffect(() => {\n if (!enabled) return;\n const target = getTarget();\n if (!target) return;\n let lastY = readMetrics(target).y;\n let lastT = performance.now();\n const onScroll = () => {\n const { y, max } = readMetrics(target);\n const now = performance.now();\n const dt = now - lastT || 16;\n scrollY.set(y);\n progress.set(max > 0 ? y / max : 0);\n velocity.set(((y - lastY) / dt) * 16);\n lastY = y;\n lastT = now;\n };\n onScroll();\n target.addEventListener('scroll', onScroll, { passive: true });\n return () => target.removeEventListener('scroll', onScroll);\n }, [enabled, getTarget, scrollY, progress, velocity]);\n}\n\nexport function SmoothScroll({\n children,\n root = true,\n lerp = 0.1,\n duration = 1.2,\n orientation = 'vertical',\n wheelMultiplier = 1,\n touch = false,\n className,\n}: SmoothScrollProps) {\n const reduce = useReducedMotion();\n const scrollY = useMotionValue(0);\n const progress = useMotionValue(0);\n const velocity = useMotionValue(0);\n const lenisRef = useRef<Lenis | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const nativeSource = useCallback(\n (): ScrollSource | null => (root ? window : containerRef.current),\n [root],\n );\n\n const scrollTo = useCallback(\n (target: ScrollTarget, options?: ScrollToOptions) => {\n const lenis = lenisRef.current;\n if (lenis && !reduce) {\n lenis.scrollTo(target, {\n offset: options?.offset,\n duration: options?.duration,\n immediate: options?.immediate,\n });\n return;\n }\n const source = nativeSource();\n const behavior = reduce || options?.immediate ? 'auto' : 'smooth';\n const top = resolveTop(target, source ?? window, options?.offset);\n (source ?? window).scrollTo({ top, behavior });\n },\n [reduce, nativeSource],\n );\n\n useNativeScrollSync(!!reduce, nativeSource, scrollY, progress, velocity);\n\n const api = useMemo<SmoothScrollApi>(\n () => ({ lenis: lenisRef.current, scrollY, progress, velocity, scrollTo }),\n [scrollY, progress, velocity, scrollTo],\n );\n\n if (reduce) {\n return (\n <SmoothScrollContext.Provider value={api}>\n <div ref={containerRef} className={className}>\n {children}\n </div>\n </SmoothScrollContext.Provider>\n );\n }\n\n return (\n <SmoothScrollContext.Provider value={api}>\n <ReactLenis\n root={root}\n className={className}\n options={{\n lerp,\n duration,\n orientation,\n wheelMultiplier,\n smoothWheel: true,\n syncTouch: touch,\n easing: EASE_SCROLL,\n allowNestedScroll: true,\n }}\n >\n <LenisBridge\n scrollY={scrollY}\n progress={progress}\n velocity={velocity}\n lenisRef={lenisRef}\n />\n {children}\n </ReactLenis>\n </SmoothScrollContext.Provider>\n );\n}\n","// Stepped slider with static value readout.\nimport {\n domAnimation,\n LazyMotion,\n m,\n useMotionTemplate,\n useMotionValue,\n useReducedMotion,\n useSpring,\n useTransform,\n} from 'motion/react';\nimport {\n type KeyboardEvent,\n type PointerEvent,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { cn } from '../../lib/utils';\nimport { useIsDarkMode } from '../../hooks/use-is-dark-mode';\n\nconst SPRING_GLIDE = { stiffness: 700, damping: 50, mass: 0.5 } as const;\nconst SPRING_BOUNCY = { type: 'spring', stiffness: 500, damping: 14, mass: 0.7 } as const;\n\nfunction seedFromId(id: string | undefined) {\n if (!id) return 0;\n let hash = 0;\n for (let i = 0; i < id.length; i += 1) {\n hash = (hash * 31 + id.charCodeAt(i)) >>> 0;\n }\n return (hash % 997) / 997;\n}\n\nexport interface SteppedSliderStep {\n value: number;\n label: string;\n}\n\nexport interface SteppedSliderProps {\n id?: string;\n value?: number;\n defaultValue?: number;\n onValueChange?: (value: number) => void;\n min?: number;\n max?: number;\n step?: number;\n steps?: SteppedSliderStep[];\n formatValue?: (value: number) => string;\n disabled?: boolean;\n className?: string;\n 'aria-label'?: string;\n 'aria-labelledby'?: string;\n}\n\nconst clamp = (v: number, lo: number, hi: number) => Math.min(hi, Math.max(lo, v));\n\nexport function SteppedSlider({\n id,\n value,\n defaultValue = 0,\n onValueChange,\n min = 0,\n max = 100,\n step = 1,\n steps = [],\n formatValue,\n disabled = false,\n className,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n}: SteppedSliderProps) {\n const reduce = useReducedMotion();\n const isDark = useIsDarkMode();\n const seed = useMemo(() => seedFromId(id), [id]);\n const trackRef = useRef<HTMLDivElement>(null);\n const [internal, setInternal] = useState(defaultValue);\n const [active, setActive] = useState(false);\n const [dragValue, setDragValue] = useState<number | null>(null);\n const dragValueRef = useRef<number | null>(null);\n const controlled = value !== undefined;\n const committedValue = clamp(controlled ? (value as number) : internal, min, max);\n const current = active && dragValue !== null ? clamp(dragValue, min, max) : committedValue;\n const percent = ((current - min) / (max - min)) * 100;\n const isMaxed = current === max;\n const hue = 185 + (seed - 0.5) * 16;\n const glowColor = isDark ? `oklch(68% 0.14 ${hue})` : `oklch(52% 0.13 ${hue})`;\n const fillGradient = isDark\n ? `linear-gradient(90deg, oklch(28% 0.08 ${hue}), oklch(62% 0.12 ${hue}))`\n : `linear-gradient(90deg, oklch(93% 0.03 ${hue}), oklch(56% 0.13 ${hue}))`;\n const dotDriftDuration = 1.4 + seed * 0.5;\n const glowDuration = 1.6 + seed * 0.6;\n\n const target = useMotionValue(percent);\n useEffect(() => {\n target.set(percent);\n }, [percent, target]);\n const smooth = useSpring(target, SPRING_GLIDE);\n const pos = reduce ? target : smooth;\n const left = useMotionTemplate`${pos}%`;\n const thumbX = useTransform(pos, (p) => `${-p}%`);\n\n const snapValue = useCallback(\n (next: number) => clamp(Math.round((next - min) / step) * step + min, min, max),\n [min, max, step],\n );\n\n const commit = useCallback(\n (next: number) => {\n const snapped = snapValue(next);\n if (!controlled) setInternal(snapped);\n onValueChange?.(snapped);\n },\n [controlled, onValueChange, snapValue],\n );\n\n const valueFromX = useCallback(\n (clientX: number) => {\n const rect = trackRef.current?.getBoundingClientRect();\n if (!rect) return committedValue;\n const ratio = clamp((clientX - rect.left) / rect.width, 0, 1);\n return min + ratio * (max - min);\n },\n [committedValue, min, max],\n );\n\n const trackDragValue = useCallback((next: number | null) => {\n dragValueRef.current = next;\n setDragValue(next);\n }, []);\n\n const onPointerDown = useCallback(\n (event: PointerEvent<HTMLDivElement>) => {\n if (disabled) return;\n event.currentTarget.setPointerCapture(event.pointerId);\n setActive(true);\n trackDragValue(snapValue(valueFromX(event.clientX)));\n },\n [disabled, valueFromX, snapValue, trackDragValue],\n );\n\n const onPointerMove = useCallback(\n (event: PointerEvent<HTMLDivElement>) => {\n if (!active || disabled) return;\n trackDragValue(snapValue(valueFromX(event.clientX)));\n },\n [active, disabled, valueFromX, snapValue, trackDragValue],\n );\n\n const endDrag = useCallback(\n (event: PointerEvent<HTMLDivElement>) => {\n event.currentTarget.releasePointerCapture?.(event.pointerId);\n setActive(false);\n const pending = dragValueRef.current;\n trackDragValue(null);\n if (pending !== null) commit(pending);\n },\n [commit, trackDragValue],\n );\n\n const onKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n if (disabled) return;\n const map: Record<string, number> = {\n ArrowRight: committedValue + step,\n ArrowUp: committedValue + step,\n ArrowLeft: committedValue - step,\n ArrowDown: committedValue - step,\n Home: min,\n End: max,\n };\n if (event.key in map) {\n event.preventDefault();\n commit(map[event.key]);\n }\n },\n [disabled, committedValue, step, min, max, commit],\n );\n\n const valueLabel = formatValue ? formatValue(current) : String(current);\n\n return (\n <LazyMotion features={domAnimation}>\n <div className={cn('w-full', className)}>\n <div className=\"mb-1.5 flex justify-end\">\n <span className=\"text-xs font-medium text-foreground tabular-nums\">{valueLabel}</span>\n </div>\n\n <div\n ref={trackRef}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={endDrag}\n onPointerCancel={endDrag}\n className={cn(\n 'relative flex h-10 w-full select-none items-center overflow-hidden rounded-lg bg-muted',\n disabled ? 'pointer-events-none opacity-50' : 'cursor-grab active:cursor-grabbing',\n )}\n >\n <m.div className=\"absolute inset-y-0 left-0 overflow-hidden\" style={{ width: left }}>\n {isMaxed ? (\n <div\n className=\"absolute inset-0\"\n style={{ backgroundImage: fillGradient }}\n >\n <m.div\n className=\"absolute inset-0\"\n style={{\n backgroundImage: 'radial-gradient(circle, rgba(255,255,255,0.85) 1.3px, transparent 1.3px)',\n backgroundSize: '10px 10px',\n }}\n animate={reduce ? undefined : { backgroundPositionX: ['0px', '10px'] }}\n transition={{ duration: dotDriftDuration, repeat: Infinity, ease: 'linear' }}\n />\n </div>\n ) : (\n <div className=\"absolute inset-0 bg-foreground/15\" />\n )}\n </m.div>\n\n <div className=\"pointer-events-none absolute inset-x-2 inset-y-0\">\n {steps.map((tick) => {\n const tp = ((tick.value - min) / (max - min)) * 100;\n return (\n <span\n key={tick.value}\n className={cn(\n 'absolute top-1/2 -translate-x-1/2 -translate-y-1/2 rounded-full',\n isMaxed ? 'size-1.5 bg-white shadow-[0_0_0_1.5px_rgba(0,0,0,0.35)]' : 'size-1 bg-foreground/25',\n )}\n style={{ left: `${tp}%` }}\n />\n );\n })}\n </div>\n\n {isMaxed && !reduce && (\n <m.div\n aria-hidden\n className=\"pointer-events-none absolute top-1/2 h-5 w-1.5 rounded-sm\"\n style={{ left, x: thumbX, y: '-50%', boxShadow: `0 0 9px 3px ${glowColor}` }}\n animate={{ opacity: [0.25, 0.9, 0.25], scale: [1, 1.15, 1] }}\n transition={{ duration: glowDuration, repeat: Infinity, ease: 'easeInOut', delay: seed * 0.5 }}\n />\n )}\n\n <m.div\n id={id}\n role=\"slider\"\n tabIndex={disabled ? -1 : 0}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={Math.round(current)}\n aria-valuetext={valueLabel}\n aria-disabled={disabled || undefined}\n onKeyDown={onKeyDown}\n animate={reduce ? undefined : { scaleY: active ? 1.35 : 1 }}\n transition={SPRING_BOUNCY}\n className={cn(\n 'absolute top-1/2 h-5 w-1.5 rounded-sm bg-foreground shadow-sm outline-none ring-foreground/30 focus-visible:ring-4',\n isMaxed && 'ring-2 ring-background',\n )}\n style={{ left, x: thumbX, y: '-50%' }}\n />\n </div>\n\n {steps.length > 0 && (\n <div className=\"relative mt-1.5 h-4\">\n <div className=\"absolute inset-x-2 inset-y-0\">\n {steps.map((tick, index) => {\n const isFirst = index === 0;\n const isLast = index === steps.length - 1;\n const tp = ((tick.value - min) / (max - min)) * 100;\n return (\n <span\n key={tick.value}\n className={cn(\n 'absolute text-[10px] font-medium text-muted-foreground',\n isFirst && 'left-0',\n isLast && 'right-0',\n !isFirst && !isLast && '-translate-x-1/2',\n )}\n style={!isFirst && !isLast ? { left: `${tp}%` } : undefined}\n >\n {tick.label}\n </span>\n );\n })}\n </div>\n </div>\n )}\n </div>\n </LazyMotion>\n );\n}\n","// Beui tabs.\nimport { LazyMotion, m, domMax, MotionConfig, useReducedMotion, type Transition } from 'motion/react';\nimport {\n createContext,\n useCallback,\n useContext,\n useId,\n useMemo,\n useState,\n type ReactNode,\n} from 'react';\nimport { cn } from '../../lib/utils';\n\ntype Variant = 'pill' | 'underline' | 'segment';\n\ntype Ctx = {\n value: string;\n setValue: (v: string) => void;\n layoutId: string;\n variant: Variant;\n};\n\nconst TabsCtx = createContext<Ctx | null>(null);\n\nfunction useTabs() {\n const ctx = useContext(TabsCtx);\n if (!ctx) throw new Error('Tabs.* must be used inside <Tabs>');\n return ctx;\n}\n\nconst transition: Transition = {\n type: 'spring',\n stiffness: 170,\n damping: 24,\n mass: 1.2,\n};\n\nexport function Tabs({\n defaultValue,\n value,\n onValueChange,\n variant = 'pill',\n children,\n className,\n}: {\n defaultValue?: string;\n value?: string;\n onValueChange?: (v: string) => void;\n variant?: Variant;\n children: ReactNode;\n className?: string;\n}) {\n const [internal, setInternal] = useState(defaultValue ?? '');\n const layoutId = useId();\n const reduce = useReducedMotion();\n const controlled = value !== undefined;\n const current = controlled ? value : internal;\n const setValue = useCallback(\n (v: string) => {\n if (!controlled) setInternal(v);\n onValueChange?.(v);\n },\n [controlled, onValueChange],\n );\n const ctx = useMemo(\n () => ({ value: current, setValue, layoutId, variant }),\n [current, setValue, layoutId, variant],\n );\n return (\n <MotionConfig transition={reduce ? { duration: 0 } : transition}>\n <TabsCtx.Provider value={ctx}>\n <LazyMotion features={domMax}>\n <m.div layoutRoot className={className}>\n {children}\n </m.div>\n </LazyMotion>\n </TabsCtx.Provider>\n </MotionConfig>\n );\n}\n\nconst listClasses: Record<Variant, string> = {\n pill: 'inline-flex items-center gap-1 rounded-full bg-card p-1',\n underline: 'inline-flex items-center gap-1 border-b border-border',\n segment: 'inline-flex items-center gap-0 rounded-md border border-ui-line bg-ui-fill/40 p-0.5',\n};\n\nexport function TabsList({ children, className }: { children: ReactNode; className?: string }) {\n const { variant } = useTabs();\n return (\n <div role=\"tablist\" className={cn(listClasses[variant], className)}>\n {children}\n </div>\n );\n}\n\nexport function TabsTrigger({\n value,\n children,\n className,\n indicatorClassName,\n}: {\n value: string;\n children: ReactNode;\n className?: string;\n indicatorClassName?: string;\n}) {\n const { value: current, setValue, layoutId, variant } = useTabs();\n const active = current === value;\n\n if (variant === 'underline') {\n return (\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={active}\n onClick={() => setValue(value)}\n className={cn(\n 'relative isolate px-3 pb-2.5 pt-1 -mb-px text-sm font-medium transition-colors min-h-[44px] inline-flex items-center',\n active ? 'text-foreground' : 'text-muted-foreground hover:text-foreground',\n className,\n )}\n >\n {children}\n {active ? (\n <m.span\n layoutId={layoutId}\n className={cn('absolute -bottom-px left-0 right-0 h-px bg-primary', indicatorClassName)}\n />\n ) : null}\n </button>\n );\n }\n\n const isSegment = variant === 'segment';\n const radius = variant === 'pill' ? 'rounded-full' : 'rounded-[5px]';\n const indicatorBg = isSegment ? 'bg-ui-base shadow-sm ring-1 ring-ui-line' : 'bg-primary';\n const activeText = isSegment ? 'text-ui-strong' : 'text-primary-foreground';\n const inactiveText = isSegment\n ? 'text-ui-subtle hover:text-ui-default'\n : 'text-muted-foreground hover:text-foreground';\n\n return (\n <div className=\"relative\">\n {active ? (\n <m.span\n layoutId={layoutId}\n style={{ borderRadius: variant === 'pill' ? 9999 : 5 }}\n className={cn('absolute inset-0', indicatorBg, radius, indicatorClassName)}\n />\n ) : null}\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={active}\n onClick={() => setValue(value)}\n className={cn(\n 'relative z-10 inline-flex items-center justify-center whitespace-nowrap bg-transparent px-3.5 py-1.5 text-sm font-medium capitalize transition-colors outline-none',\n active ? activeText : inactiveText,\n radius,\n className,\n )}\n >\n {children}\n </button>\n </div>\n );\n}\n"],"mappings":"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","names":["useReducedMotion","jsx","jsxs","el","LazyMotion","m","useMotionValue","useReducedMotion","useCallback","useEffect","useMemo","useRef","useState","jsx","jsxs","useReducedMotion","useMemo","useRef","useState","useMotionValue","useEffect","useCallback","LazyMotion","m","LazyMotion","m","domMax","useReducedMotion","createContext","useCallback","useId","useMemo","useState","jsx","jsxs","createContext","useState","useId","useReducedMotion","useCallback","useMemo","LazyMotion","domMax","m"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -9,25 +9,25 @@ declare const variants: {
|
|
|
9
9
|
bg: string;
|
|
10
10
|
border: string;
|
|
11
11
|
color: string;
|
|
12
|
-
icon:
|
|
12
|
+
icon: lucide_react.LucideIcon;
|
|
13
13
|
};
|
|
14
14
|
destructive: {
|
|
15
15
|
bg: string;
|
|
16
16
|
border: string;
|
|
17
17
|
color: string;
|
|
18
|
-
icon:
|
|
18
|
+
icon: lucide_react.LucideIcon;
|
|
19
19
|
};
|
|
20
20
|
warning: {
|
|
21
21
|
bg: string;
|
|
22
22
|
border: string;
|
|
23
23
|
color: string;
|
|
24
|
-
icon:
|
|
24
|
+
icon: lucide_react.LucideIcon;
|
|
25
25
|
};
|
|
26
26
|
success: {
|
|
27
27
|
bg: string;
|
|
28
28
|
border: string;
|
|
29
29
|
color: string;
|
|
30
|
-
icon:
|
|
30
|
+
icon: lucide_react.LucideIcon;
|
|
31
31
|
};
|
|
32
32
|
};
|
|
33
33
|
interface AlertProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
@@ -53,16 +53,13 @@ type Shape = 'base' | 'square' | 'circle';
|
|
|
53
53
|
interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {
|
|
54
54
|
asChild?: boolean;
|
|
55
55
|
shape?: Shape;
|
|
56
|
-
/** Element rendered before children (skipped while `loading`). */
|
|
57
56
|
icon?: React.ReactNode;
|
|
58
|
-
/** Shows a spinner and disables the button. */
|
|
59
57
|
loading?: boolean;
|
|
60
58
|
}
|
|
61
59
|
declare const Button: React.ForwardRefExoticComponent<ButtonProps & React.RefAttributes<HTMLButtonElement>>;
|
|
62
60
|
interface LinkButtonProps extends React.AnchorHTMLAttributes<HTMLAnchorElement>, VariantProps<typeof buttonVariants> {
|
|
63
61
|
shape?: Shape;
|
|
64
62
|
icon?: React.ReactNode;
|
|
65
|
-
/** Open in a new tab with safe rel attributes. */
|
|
66
63
|
external?: boolean;
|
|
67
64
|
}
|
|
68
65
|
declare const LinkButton: React.ForwardRefExoticComponent<LinkButtonProps & React.RefAttributes<HTMLAnchorElement>>;
|
|
@@ -103,7 +100,6 @@ interface SelectProps {
|
|
|
103
100
|
triggerClassName?: string;
|
|
104
101
|
triggerStyle?: CSSProperties;
|
|
105
102
|
leadingIcon?: ReactNode;
|
|
106
|
-
/** Decides the dropdown's background so it stays distinguishable from where the trigger sits. */
|
|
107
103
|
variant?: 'page' | 'card';
|
|
108
104
|
}
|
|
109
105
|
declare function Select({ value, onValueChange, options, placeholder, label, className, triggerClassName, triggerStyle, leadingIcon, variant, }: SelectProps): React.JSX.Element;
|
|
@@ -180,9 +176,7 @@ declare function CopyButton({ value, label, className, }: {
|
|
|
180
176
|
}): React.JSX.Element;
|
|
181
177
|
|
|
182
178
|
interface BarSparklineProps {
|
|
183
|
-
/** Raw daily series; aggregated into `bars` buckets for the mini chart. */
|
|
184
179
|
data: number[];
|
|
185
|
-
/** Bar color (hex). A vertical gradient is derived from it. */
|
|
186
180
|
color: string;
|
|
187
181
|
bars?: number;
|
|
188
182
|
className?: string;
|
|
@@ -196,17 +190,13 @@ declare function GithubMark({ size, className }: {
|
|
|
196
190
|
}): React.JSX.Element;
|
|
197
191
|
|
|
198
192
|
interface LoadErrorProps {
|
|
199
|
-
/** Friendly headline, e.g. "Couldn't load dashboard data". */
|
|
200
193
|
title?: string;
|
|
201
|
-
/** Raw error detail (e.g. "Failed to fetch"), shown as a mono chip. */
|
|
202
194
|
detail?: string | null;
|
|
203
|
-
/** Guidance line under the title; defaults to connection-check copy. */
|
|
204
195
|
hint?: string;
|
|
205
196
|
onRetry?: () => void;
|
|
206
197
|
retrying?: boolean;
|
|
207
198
|
className?: string;
|
|
208
199
|
}
|
|
209
|
-
/** Friendly copy up front, raw error as a small mono chip - instead of a bare toast echoing "Failed to fetch". */
|
|
210
200
|
declare function LoadError({ title, detail, hint, onRetry, retrying, className, }: LoadErrorProps): React.JSX.Element;
|
|
211
201
|
|
|
212
202
|
interface OnboardingStep {
|
|
@@ -235,17 +225,10 @@ declare function GraphShell({ title, icon, legend, children, className, }: {
|
|
|
235
225
|
className?: string;
|
|
236
226
|
}): React.JSX.Element;
|
|
237
227
|
interface SeriesMarkerProps {
|
|
238
|
-
/** Flat CSS colour. Ignored when `hatched` is set, which paints its own fill. */
|
|
239
228
|
color?: string;
|
|
240
|
-
/** The cross-hatched fill used for the input-token series. */
|
|
241
229
|
hatched?: boolean;
|
|
242
|
-
/** A dashed rule instead of a swatch, for series drawn as a dashed line. */
|
|
243
230
|
dashed?: boolean;
|
|
244
231
|
}
|
|
245
|
-
/**
|
|
246
|
-
* The swatch that identifies a series. Shared by the legend and the tooltip so a series looks the
|
|
247
|
-
* same in both - a tooltip dot that doesn't match its legend chip reads as a different series.
|
|
248
|
-
*/
|
|
249
232
|
declare function SeriesMarker({ color, hatched, dashed }: SeriesMarkerProps): React.JSX.Element;
|
|
250
233
|
declare function LegendChip({ color, hatched, dashed, label, }: SeriesMarkerProps & {
|
|
251
234
|
label: string;
|
package/dist/index.js
CHANGED
|
@@ -232,9 +232,9 @@ function ConfirmDialog({
|
|
|
232
232
|
import * as React4 from "react";
|
|
233
233
|
import { jsx as jsx5 } from "react/jsx-runtime";
|
|
234
234
|
var SIZE_CLASS = {
|
|
235
|
-
xs: "h-6 rounded-md px-1.5 text-xs",
|
|
236
|
-
sm: "h-8 rounded-md px-2 text-xs",
|
|
237
|
-
base: "h-9 rounded-md px-3 text-sm",
|
|
235
|
+
xs: "h-6 rounded-md px-1.5 text-base sm:text-xs",
|
|
236
|
+
sm: "h-8 rounded-md px-2 text-base sm:text-xs",
|
|
237
|
+
base: "h-9 rounded-md px-3 text-base sm:text-sm",
|
|
238
238
|
lg: "h-10 rounded-md px-4 text-base"
|
|
239
239
|
};
|
|
240
240
|
var Input = React4.forwardRef(
|
|
@@ -394,7 +394,6 @@ function SelectPanel({
|
|
|
394
394
|
onMouseEnter: () => onHighlight(index),
|
|
395
395
|
onClick: () => onSelect(option.value),
|
|
396
396
|
className: cn(
|
|
397
|
-
// `whitespace-nowrap`: on the 72px "rows per page" select, the check icon ate the width and "10" wrapped to stacked digits.
|
|
398
397
|
"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",
|
|
399
398
|
selected ? "bg-ui-brand/10 font-medium text-ui-brand" : "text-ui-default hover:bg-ui-fill hover:text-ui-strong focus-visible:bg-ui-fill",
|
|
400
399
|
highlighted && !selected && "bg-ui-fill text-ui-strong"
|
|
@@ -1039,7 +1038,6 @@ function OnboardingCard({
|
|
|
1039
1038
|
{
|
|
1040
1039
|
className: "mb-3.5 grid h-[22px] gap-[4px]",
|
|
1041
1040
|
style: { gridTemplateColumns: `repeat(${safeSegments}, minmax(0, 1fr))` },
|
|
1042
|
-
"aria-label": `${doneCount} of ${totalSteps} steps complete`,
|
|
1043
1041
|
"aria-hidden": true,
|
|
1044
1042
|
children: Array.from({ length: safeSegments }).map((_, i) => /* @__PURE__ */ jsx19(
|
|
1045
1043
|
"span",
|
|
@@ -1070,7 +1068,7 @@ function OnboardingCard({
|
|
|
1070
1068
|
children: /* @__PURE__ */ jsx19(Check3, { size: 10, strokeWidth: 3 })
|
|
1071
1069
|
}
|
|
1072
1070
|
),
|
|
1073
|
-
/* @__PURE__ */ jsx19("span", { className: "
|
|
1071
|
+
/* @__PURE__ */ jsx19("span", { className: "truncate", children: step.label })
|
|
1074
1072
|
] });
|
|
1075
1073
|
if (step.onClick) {
|
|
1076
1074
|
return /* @__PURE__ */ jsx19("button", { onClick: step.onClick, className: "w-full outline-none focus-visible:bg-ui-fill/50", children: content }, step.id);
|
|
@@ -1103,29 +1101,25 @@ function GraphShell({
|
|
|
1103
1101
|
children,
|
|
1104
1102
|
className = ""
|
|
1105
1103
|
}) {
|
|
1106
|
-
return (
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
/* @__PURE__ */
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
] })
|
|
1126
|
-
]
|
|
1127
|
-
}
|
|
1128
|
-
)
|
|
1104
|
+
return /* @__PURE__ */ jsxs12(
|
|
1105
|
+
"div",
|
|
1106
|
+
{
|
|
1107
|
+
className: cn(
|
|
1108
|
+
"flex flex-col rounded-lg border border-ui-line bg-white p-3.5 dark:border-[oklch(0.27_0_0)] dark:bg-black",
|
|
1109
|
+
className
|
|
1110
|
+
),
|
|
1111
|
+
children: [
|
|
1112
|
+
/* @__PURE__ */ jsxs12("div", { className: "flex items-center gap-2 px-0.5", children: [
|
|
1113
|
+
icon && /* @__PURE__ */ jsx20("span", { className: "shrink-0 text-ui-subtle", children: icon }),
|
|
1114
|
+
/* @__PURE__ */ jsx20("h3", { className: "truncate text-[11px] font-semibold uppercase tracking-[0.14em] text-ui-default", children: title })
|
|
1115
|
+
] }),
|
|
1116
|
+
/* @__PURE__ */ jsxs12("div", { className: "ui-well relative mt-3 flex flex-1 flex-col overflow-hidden rounded-md", children: [
|
|
1117
|
+
/* @__PURE__ */ jsx20(CardDots, {}),
|
|
1118
|
+
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 }),
|
|
1119
|
+
/* @__PURE__ */ jsx20("div", { className: "relative flex flex-1 flex-col", children })
|
|
1120
|
+
] })
|
|
1121
|
+
]
|
|
1122
|
+
}
|
|
1129
1123
|
);
|
|
1130
1124
|
}
|
|
1131
1125
|
function SeriesMarker({ color, hatched, dashed }) {
|
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/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 const safeSegments = Math.max(1, segments);\n\n const filledCount =\n doneCount > 0\n ? Math.max(1, Math.round((doneCount / totalSteps) * safeSegments))\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(${safeSegments}, minmax(0, 1fr))` }}\n aria-label={`${doneCount} of ${totalSteps} steps complete`}\n aria-hidden\n >\n {Array.from({ length: safeSegments }).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=\"min-w-[2px] 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"]}
|
|
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\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 icon?: React.ReactNode;\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 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 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-base sm:text-xs',\n sm: 'h-8 rounded-md px-2 text-base sm:text-xs',\n base: 'h-9 rounded-md px-3 text-base sm: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 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 const highlightSource = useRef<'keyboard' | 'pointer'>('keyboard');\n\n const selectedOption = options.find((opt) => opt.value === value);\n\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 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 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 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 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 {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 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 '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\nexport interface TriggerRect {\n left: number;\n width: number;\n top: number;\n bottom: number;\n}\n\n// Spring with bounce powers the unfold.\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. */\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","// Core UI magic numbers and standard constants.\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 data: number[];\n color: string;\n bars?: number;\n className?: string;\n}\n\n// Resamples data to exactly bars values (summed down or nearest-neighbour stretched up).\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\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 title?: string;\n detail?: string | null;\n hint?: string;\n onRetry?: () => void;\n retrying?: boolean;\n className?: string;\n}\n\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 const safeSegments = Math.max(1, segments);\n\n const filledCount =\n doneCount > 0\n ? Math.max(1, Math.round((doneCount / totalSteps) * safeSegments))\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 <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 <div\n className=\"mb-3.5 grid h-[22px] gap-[4px]\"\n style={{ gridTemplateColumns: `repeat(${safeSegments}, minmax(0, 1fr))` }}\n aria-hidden\n >\n {Array.from({ length: safeSegments }).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 <span className=\"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 <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 <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 color?: string;\n hatched?: boolean;\n dashed?: boolean;\n}\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=\"min-w-[2px] 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"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/prompt-diff.ts"],"sourcesContent":["// Parses
|
|
1
|
+
{"version":3,"sources":["../../src/lib/prompt-diff.ts"],"sourcesContent":["// Parses prompt padded gutter diff (\"NNNN MMMM Pcontent\").\n\nexport interface DiffRow {\n kind: 'add' | 'del' | 'ctx' | 'hunk';\n oldNo: number | null;\n newNo: number | null;\n text: string;\n}\n\nconst HUNK_RE = /^@@ -(\\d+)(?:,\\d+)? \\+(\\d+)(?:,\\d+)? @@/;\n\nfunction parsePaddedLine(line: string) {\n if (line.length < 11 || line[4] !== ' ' || line[9] !== ' ') return null;\n const prefix = line[10];\n if (prefix !== '+' && prefix !== '-' && prefix !== ' ') return null;\n const oldNo = line.slice(0, 4).trim();\n const newNo = line.slice(5, 9).trim();\n if (oldNo && !/^\\d+$/.test(oldNo)) return null;\n if (newNo && !/^\\d+$/.test(newNo)) return null;\n return { prefix, oldNo, newNo, content: line.slice(11) };\n}\n\nexport function parsePromptDiff(diff: string): DiffRow[] {\n const rows: DiffRow[] = [];\n let started = false;\n let oldNo = 0;\n let newNo = 0;\n\n for (const line of diff.split('\\n')) {\n const hunk = HUNK_RE.exec(line);\n if (hunk) {\n oldNo = Number(hunk[1]);\n newNo = Number(hunk[2]);\n started = true;\n rows.push({ kind: 'hunk', oldNo: null, newNo: null, text: line });\n continue;\n }\n if (!started) continue;\n if (line.startsWith('diff --git')) { started = false; continue; }\n if (line.startsWith('\\\\')) continue;\n if (line.startsWith('[NOTE')) continue;\n\n const padded = parsePaddedLine(line);\n if (padded) {\n if (padded.prefix === '+') {\n rows.push({ kind: 'add', oldNo: null, newNo: padded.newNo ? Number(padded.newNo) : null, text: padded.content });\n } else if (padded.prefix === '-') {\n rows.push({ kind: 'del', oldNo: padded.oldNo ? Number(padded.oldNo) : null, newNo: null, text: padded.content });\n } else {\n rows.push({ kind: 'ctx', oldNo: padded.oldNo ? Number(padded.oldNo) : null, newNo: padded.newNo ? Number(padded.newNo) : null, text: padded.content });\n }\n continue;\n }\n\n const p = line[0];\n if (p === '+') rows.push({ kind: 'add', oldNo: null, newNo: newNo++, text: line.slice(1) });\n else if (p === '-') rows.push({ kind: 'del', oldNo: oldNo++, newNo: null, text: line.slice(1) });\n else if (p === ' ') rows.push({ kind: 'ctx', oldNo: oldNo++, newNo: newNo++, text: line.slice(1) });\n }\n\n // drop trailing blank row from final newline\n const last = rows[rows.length - 1];\n if (last && last.kind === 'ctx' && last.text === '') rows.pop();\n\n return rows;\n}\n\n// Line-only scan; avoids full parse for collapsed panels\nexport function diffStats(diff: string | null) {\n if (!diff) return { adds: 0, dels: 0, total: 0 };\n let adds = 0;\n let dels = 0;\n let total = 0;\n let started = false;\n for (const line of diff.split('\\n')) {\n if (HUNK_RE.test(line)) { started = true; total++; continue; }\n if (!started) continue;\n if (line.startsWith('diff --git')) { started = false; continue; }\n const padded = parsePaddedLine(line);\n if (padded) {\n total++;\n if (padded.prefix === '+') adds++;\n else if (padded.prefix === '-') dels++;\n continue;\n }\n const p = line[0];\n if (p === '+' && !line.startsWith('+++')) { adds++; total++; }\n else if (p === '-' && !line.startsWith('---')) { dels++; total++; }\n else if (p === ' ') total++;\n }\n return { adds, dels, total };\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@codraoss/ui",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.13",
|
|
4
4
|
"description": "Codra's reusable React design-system primitives and hooks.",
|
|
5
5
|
"author": "Devarshi Shimpi",
|
|
6
6
|
"license": "AGPL-3.0-only",
|
|
@@ -70,57 +70,7 @@
|
|
|
70
70
|
"README.md"
|
|
71
71
|
],
|
|
72
72
|
"publishConfig": {
|
|
73
|
-
"access": "public"
|
|
74
|
-
"main": "./dist/index.js",
|
|
75
|
-
"module": "./dist/index.js",
|
|
76
|
-
"types": "./dist/index.d.ts",
|
|
77
|
-
"exports": {
|
|
78
|
-
".": {
|
|
79
|
-
"types": "./dist/index.d.ts",
|
|
80
|
-
"import": "./dist/index.js"
|
|
81
|
-
},
|
|
82
|
-
"./theme": {
|
|
83
|
-
"types": "./dist/lib/theme.d.ts",
|
|
84
|
-
"import": "./dist/lib/theme.js"
|
|
85
|
-
},
|
|
86
|
-
"./utils": {
|
|
87
|
-
"types": "./dist/lib/utils.d.ts",
|
|
88
|
-
"import": "./dist/lib/utils.js"
|
|
89
|
-
},
|
|
90
|
-
"./ease": {
|
|
91
|
-
"types": "./dist/lib/ease.d.ts",
|
|
92
|
-
"import": "./dist/lib/ease.js"
|
|
93
|
-
},
|
|
94
|
-
"./highlight": {
|
|
95
|
-
"types": "./dist/lib/highlight.d.ts",
|
|
96
|
-
"import": "./dist/lib/highlight.js"
|
|
97
|
-
},
|
|
98
|
-
"./selection": {
|
|
99
|
-
"types": "./dist/lib/selection.d.ts",
|
|
100
|
-
"import": "./dist/lib/selection.js"
|
|
101
|
-
},
|
|
102
|
-
"./file-tree": {
|
|
103
|
-
"types": "./dist/lib/file-tree.d.ts",
|
|
104
|
-
"import": "./dist/lib/file-tree.js"
|
|
105
|
-
},
|
|
106
|
-
"./prompt-diff": {
|
|
107
|
-
"types": "./dist/lib/prompt-diff.d.ts",
|
|
108
|
-
"import": "./dist/lib/prompt-diff.js"
|
|
109
|
-
},
|
|
110
|
-
"./markdown-plugins": {
|
|
111
|
-
"types": "./dist/lib/markdown-plugins.d.ts",
|
|
112
|
-
"import": "./dist/lib/markdown-plugins.js"
|
|
113
|
-
},
|
|
114
|
-
"./motion": {
|
|
115
|
-
"types": "./dist/components/motion/index.d.ts",
|
|
116
|
-
"import": "./dist/components/motion/index.js"
|
|
117
|
-
},
|
|
118
|
-
"./hooks": {
|
|
119
|
-
"types": "./dist/hooks/index.d.ts",
|
|
120
|
-
"import": "./dist/hooks/index.js"
|
|
121
|
-
},
|
|
122
|
-
"./styles": "./dist/styles/tokens.css"
|
|
123
|
-
}
|
|
73
|
+
"access": "public"
|
|
124
74
|
},
|
|
125
75
|
"scripts": {
|
|
126
76
|
"build": "tsup && node ./scripts/copy-styles.mjs",
|
|
@@ -138,15 +88,15 @@
|
|
|
138
88
|
"sonner": ">=2.0.0"
|
|
139
89
|
},
|
|
140
90
|
"dependencies": {
|
|
141
|
-
"@codraoss/schema": "
|
|
91
|
+
"@codraoss/schema": "workspace:*",
|
|
142
92
|
"@base-ui/react": "^1.6.0",
|
|
143
93
|
"class-variance-authority": "^0.7.1",
|
|
144
94
|
"clsx": "^2.1.1",
|
|
145
95
|
"tailwind-merge": "^3.5.0",
|
|
146
|
-
"sugar-high": "^2.0.
|
|
96
|
+
"sugar-high": "^2.0.3"
|
|
147
97
|
},
|
|
148
98
|
"devDependencies": {
|
|
149
|
-
"tsup": "^8.0.
|
|
99
|
+
"tsup": "^8.0.2"
|
|
150
100
|
},
|
|
151
101
|
"main": "./dist/index.js",
|
|
152
102
|
"module": "./dist/index.js",
|