@codraoss/ui 0.9.9 → 0.9.12
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.
|
@@ -411,7 +411,7 @@ function SteppedSlider({
|
|
|
411
411
|
onPointerUp: endDrag,
|
|
412
412
|
onPointerCancel: endDrag,
|
|
413
413
|
className: cn(
|
|
414
|
-
"relative flex h-10 w-full
|
|
414
|
+
"relative flex h-10 w-full select-none items-center overflow-hidden rounded-lg bg-muted",
|
|
415
415
|
disabled ? "pointer-events-none opacity-50" : "cursor-grab active:cursor-grabbing"
|
|
416
416
|
),
|
|
417
417
|
children: [
|
|
@@ -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\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 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"]}
|
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(
|
|
@@ -1039,7 +1039,6 @@ function OnboardingCard({
|
|
|
1039
1039
|
{
|
|
1040
1040
|
className: "mb-3.5 grid h-[22px] gap-[4px]",
|
|
1041
1041
|
style: { gridTemplateColumns: `repeat(${safeSegments}, minmax(0, 1fr))` },
|
|
1042
|
-
"aria-label": `${doneCount} of ${totalSteps} steps complete`,
|
|
1043
1042
|
"aria-hidden": true,
|
|
1044
1043
|
children: Array.from({ length: safeSegments }).map((_, i) => /* @__PURE__ */ jsx19(
|
|
1045
1044
|
"span",
|
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\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-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 /** 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-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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@codraoss/ui",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.12",
|
|
4
4
|
"description": "Codra's reusable React design-system primitives and hooks.",
|
|
5
5
|
"author": "Devarshi Shimpi",
|
|
6
6
|
"license": "AGPL-3.0-only",
|
|
@@ -138,7 +138,7 @@
|
|
|
138
138
|
"sonner": ">=2.0.0"
|
|
139
139
|
},
|
|
140
140
|
"dependencies": {
|
|
141
|
-
"@codraoss/schema": "
|
|
141
|
+
"@codraoss/schema": "*",
|
|
142
142
|
"@base-ui/react": "^1.6.0",
|
|
143
143
|
"class-variance-authority": "^0.7.1",
|
|
144
144
|
"clsx": "^2.1.1",
|