@billsdk/time-travel 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/index.js +9 -5
- package/dist/client/index.js.map +1 -1
- package/package.json +1 -1
package/dist/client/index.js
CHANGED
|
@@ -100,12 +100,16 @@ function useDrag({
|
|
|
100
100
|
stateRef.current = "animating";
|
|
101
101
|
const handleTransitionEnd = (e) => {
|
|
102
102
|
if (e.propertyName === "translate") {
|
|
103
|
-
el.style.transition = "";
|
|
104
|
-
el.style.translate = "";
|
|
105
|
-
translationRef.current = { x: 0, y: 0 };
|
|
106
|
-
stateRef.current = "idle";
|
|
107
|
-
onPositionChange(target.corner);
|
|
108
103
|
el.removeEventListener("transitionend", handleTransitionEnd);
|
|
104
|
+
onPositionChange(target.corner);
|
|
105
|
+
requestAnimationFrame(() => {
|
|
106
|
+
requestAnimationFrame(() => {
|
|
107
|
+
el.style.transition = "";
|
|
108
|
+
el.style.translate = "";
|
|
109
|
+
translationRef.current = { x: 0, y: 0 };
|
|
110
|
+
stateRef.current = "idle";
|
|
111
|
+
});
|
|
112
|
+
});
|
|
109
113
|
}
|
|
110
114
|
};
|
|
111
115
|
el.style.transition = "translate 400ms var(--tt-timing-bounce)";
|
package/dist/client/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/client/overlay.tsx","../../src/client/hooks.ts","../../src/client/icons.tsx","../../src/client/styles.ts"],"sourcesContent":["\"use client\";\n\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport { useClickOutside, useDrag } from \"./hooks\";\nimport { BillSDKLogo, ChevronIcon, CloseIcon } from \"./icons\";\nimport { OVERLAY_STYLES } from \"./styles\";\nimport type {\n Corner,\n CustomerTimeState,\n RenewalResult,\n TimeTravelOverlayProps,\n TimeTravelState,\n} from \"./types\";\n\nexport type { Corner, TimeTravelOverlayProps } from \"./types\";\n\nconst STORAGE_KEY = \"billsdk-time-travel-position\";\n\n/**\n * Time Travel Overlay Component\n *\n * A floating UI component that allows you to control simulated time\n * for testing billing cycles, trials, and renewals.\n *\n * @example\n * ```tsx\n * import { TimeTravelOverlay } from \"@billsdk/time-travel/react\";\n *\n * function App() {\n * const { user } = useAuth();\n * return (\n * <>\n * <YourApp />\n * {process.env.NODE_ENV === \"development\" && user?.customerId && (\n * <TimeTravelOverlay\n * baseUrl=\"/api/billing\"\n * customerId={user.customerId}\n * />\n * )}\n * </>\n * );\n * }\n * ```\n */\nexport function TimeTravelOverlay({\n baseUrl = \"/api/billing\",\n defaultPosition = \"bottom-right\",\n defaultCollapsed = true,\n customerId,\n}: TimeTravelOverlayProps) {\n // Load position from localStorage\n const [position, setPosition] = useState<Corner>(() => {\n if (typeof window === \"undefined\") return defaultPosition;\n try {\n const saved = localStorage.getItem(STORAGE_KEY);\n if (\n saved &&\n [\"bottom-right\", \"bottom-left\", \"top-right\", \"top-left\"].includes(saved)\n ) {\n return saved as Corner;\n }\n } catch {}\n return defaultPosition;\n });\n\n const [state, setState] = useState<TimeTravelState | null>(null);\n const [allCustomers, setAllCustomers] = useState<CustomerTimeState[]>([]);\n const [isCollapsed, setIsCollapsed] = useState(defaultCollapsed);\n const [isLoading, setIsLoading] = useState(false);\n const [isProcessingRenewals, setIsProcessingRenewals] = useState(false);\n const [renewalResult, setRenewalResult] = useState<RenewalResult | null>(\n null,\n );\n const [dateInput, setDateInput] = useState(\"\");\n const [customerIdInput, setCustomerIdInput] = useState(customerId ?? \"\");\n const [showAllCustomers, setShowAllCustomers] = useState(false);\n const [panelVisible, setPanelVisible] = useState(false);\n\n const panelRef = useRef<HTMLDivElement>(null);\n const activeCustomerId = customerId ?? customerIdInput;\n\n // Handle position change and persist to localStorage\n const handlePositionChange = useCallback((newPosition: Corner) => {\n setPosition(newPosition);\n try {\n localStorage.setItem(STORAGE_KEY, newPosition);\n } catch {}\n }, []);\n\n // Draggable badge\n const { ref: dragRef, isDragging } = useDrag({\n position,\n onPositionChange: handlePositionChange,\n disabled: !isCollapsed,\n });\n\n // Close panel on click outside\n useClickOutside(\n panelRef,\n () => {\n setIsCollapsed(true);\n setPanelVisible(false);\n },\n !isCollapsed,\n );\n\n // Animate panel visibility\n useLayoutEffect(() => {\n if (!isCollapsed) {\n // Small delay to trigger CSS transition\n requestAnimationFrame(() => {\n setPanelVisible(true);\n });\n } else {\n setPanelVisible(false);\n }\n }, [isCollapsed]);\n\n // Fetch current state for the active customer\n const fetchState = useCallback(async () => {\n if (!activeCustomerId) {\n setState(null);\n return;\n }\n\n try {\n const res = await fetch(`${baseUrl}/time-travel/get`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ customerId: activeCustomerId }),\n });\n if (res.ok) {\n const data = (await res.json()) as TimeTravelState;\n setState(data);\n if (data.simulatedTime) {\n const datePart = data.simulatedTime.split(\"T\")[0];\n if (datePart) {\n setDateInput(datePart);\n }\n }\n }\n } catch (error) {\n console.error(\"[TimeTravelOverlay] Failed to fetch state:\", error);\n }\n }, [baseUrl, activeCustomerId]);\n\n // Fetch all customers with simulated time\n const fetchAllCustomers = useCallback(async () => {\n try {\n const res = await fetch(`${baseUrl}/time-travel/list`);\n if (res.ok) {\n const data = (await res.json()) as { customers: CustomerTimeState[] };\n setAllCustomers(data.customers);\n }\n } catch (error) {\n console.error(\"[TimeTravelOverlay] Failed to fetch customers:\", error);\n }\n }, [baseUrl]);\n\n useEffect(() => {\n fetchState();\n fetchAllCustomers();\n }, [fetchState, fetchAllCustomers]);\n\n // Advance time\n const advance = async (days: number, months = 0) => {\n if (!activeCustomerId) return;\n\n setIsLoading(true);\n try {\n const res = await fetch(`${baseUrl}/time-travel/advance`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n customerId: activeCustomerId,\n days,\n months,\n }),\n });\n if (res.ok) {\n await Promise.all([fetchState(), fetchAllCustomers()]);\n }\n } catch (error) {\n console.error(\"[TimeTravelOverlay] Failed to advance:\", error);\n } finally {\n setIsLoading(false);\n }\n };\n\n // Set specific time\n const setTime = async (date: string | null) => {\n if (!activeCustomerId) return;\n\n setIsLoading(true);\n try {\n const res = await fetch(`${baseUrl}/time-travel/set`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ customerId: activeCustomerId, date }),\n });\n if (res.ok) {\n await Promise.all([fetchState(), fetchAllCustomers()]);\n }\n } catch (error) {\n console.error(\"[TimeTravelOverlay] Failed to set time:\", error);\n } finally {\n setIsLoading(false);\n }\n };\n\n // Reset to real time\n const reset = async () => {\n if (!activeCustomerId) return;\n\n setIsLoading(true);\n try {\n const res = await fetch(`${baseUrl}/time-travel/reset`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ customerId: activeCustomerId }),\n });\n if (res.ok) {\n setDateInput(\"\");\n await Promise.all([fetchState(), fetchAllCustomers()]);\n }\n } catch (error) {\n console.error(\"[TimeTravelOverlay] Failed to reset:\", error);\n } finally {\n setIsLoading(false);\n }\n };\n\n // Handle date input submission\n const handleDateSubmit = () => {\n if (dateInput) {\n const date = new Date(dateInput);\n date.setUTCHours(12, 0, 0, 0);\n setTime(date.toISOString());\n }\n };\n\n // Process renewals for the current customer\n const processRenewals = async (dryRun = false) => {\n if (!activeCustomerId) return;\n\n setIsProcessingRenewals(true);\n setRenewalResult(null);\n try {\n const params = new URLSearchParams({\n customerId: activeCustomerId,\n ...(dryRun && { dryRun: \"true\" }),\n });\n const res = await fetch(`${baseUrl}/renewals?${params.toString()}`);\n if (res.ok) {\n const data = (await res.json()) as RenewalResult;\n setRenewalResult(data);\n }\n } catch (error) {\n console.error(\"[TimeTravelOverlay] Failed to process renewals:\", error);\n } finally {\n setIsProcessingRenewals(false);\n }\n };\n\n const formatDate = (isoString: string) => {\n const date = new Date(isoString);\n return date.toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n };\n\n const formatShortDate = (isoString: string) => {\n const date = new Date(isoString);\n return date.toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n });\n };\n\n const formatTime = (isoString: string) => {\n const date = new Date(isoString);\n return date.toLocaleTimeString(undefined, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n };\n\n const truncateId = (id: string) => {\n if (id.length <= 10) return id;\n return `${id.slice(0, 5)}…${id.slice(-4)}`;\n };\n\n // Position styles\n const [vertical, horizontal] = position.split(\"-\") as [string, string];\n const positionStyles: Record<string, string> = {\n [vertical]: \"var(--tt-padding)\",\n [horizontal]: \"var(--tt-padding)\",\n };\n\n // Panel transform origin based on position\n const panelOrigin = position.replace(\"-\", \" \");\n\n return (\n <div\n data-tt-root\n style={{\n position: \"fixed\",\n ...positionStyles,\n zIndex: 2147483646,\n }}\n >\n <style>{OVERLAY_STYLES}</style>\n\n {isCollapsed ? (\n /* Collapsed Badge */\n <div ref={dragRef}>\n <button\n type=\"button\"\n data-tt-badge\n data-simulated={state?.isSimulated ?? false}\n onClick={() => {\n // Only open if not dragging\n if (!isDragging) {\n setIsCollapsed(false);\n }\n }}\n aria-label=\"Open Time Travel panel\"\n >\n <span data-tt-badge-icon>\n <BillSDKLogo />\n </span>\n <span>\n {state?.isSimulated && state.simulatedTime\n ? formatShortDate(state.simulatedTime)\n : \"Real Time\"}\n </span>\n {allCustomers.length > 0 && (\n <span data-tt-badge-count>{allCustomers.length}</span>\n )}\n </button>\n </div>\n ) : (\n /* Expanded Panel */\n <div\n ref={panelRef}\n data-tt-panel\n data-visible={panelVisible}\n style={{ \"--tt-panel-origin\": panelOrigin } as React.CSSProperties}\n >\n {/* Header */}\n <div\n data-tt-panel-header\n data-simulated={state?.isSimulated ?? false}\n >\n <div data-tt-panel-title>\n <BillSDKLogo />\n <span>Time Travel</span>\n </div>\n <button\n type=\"button\"\n data-tt-panel-close\n onClick={() => setIsCollapsed(true)}\n aria-label=\"Close panel\"\n >\n <CloseIcon />\n </button>\n </div>\n\n <div data-tt-panel-content>\n {/* Customer ID Input (only if not provided via prop) */}\n {!customerId && (\n <div style={{ marginBottom: 12 }}>\n <label htmlFor=\"tt-customer-id\" data-tt-label>\n Customer ID\n </label>\n <input\n id=\"tt-customer-id\"\n type=\"text\"\n data-tt-input\n value={customerIdInput}\n onChange={(e) => setCustomerIdInput(e.target.value)}\n onBlur={fetchState}\n onKeyDown={(e) => e.key === \"Enter\" && fetchState()}\n placeholder=\"Enter customer ID…\"\n spellCheck={false}\n />\n </div>\n )}\n\n {/* Customer indicator (when provided via prop) */}\n {customerId && (\n <div data-tt-customer>\n Customer: <strong>{truncateId(customerId)}</strong>\n </div>\n )}\n\n {activeCustomerId ? (\n <>\n {/* Current Time Display */}\n <div data-tt-time-display>\n <div data-tt-time-label>\n {state?.isSimulated ? \"Simulated Time\" : \"Current Time\"}\n </div>\n <div data-tt-time-value>\n {state?.simulatedTime\n ? formatDate(state.simulatedTime)\n : state?.realTime\n ? formatDate(state.realTime)\n : \"Loading…\"}\n </div>\n <div data-tt-time-sub>\n {state?.simulatedTime\n ? formatTime(state.simulatedTime)\n : state?.realTime\n ? formatTime(state.realTime)\n : \"\"}\n </div>\n </div>\n\n {/* Quick Actions */}\n <div data-tt-label>Quick Advance</div>\n <div data-tt-actions>\n <button\n type=\"button\"\n data-tt-action\n onClick={() => advance(1, 0)}\n disabled={isLoading}\n >\n +1 day\n </button>\n <button\n type=\"button\"\n data-tt-action\n onClick={() => advance(7, 0)}\n disabled={isLoading}\n >\n +1 week\n </button>\n <button\n type=\"button\"\n data-tt-action\n onClick={() => advance(0, 1)}\n disabled={isLoading}\n >\n +1 month\n </button>\n </div>\n\n {/* Date Picker */}\n <label htmlFor=\"tt-date-input\" data-tt-label>\n Go to Date\n </label>\n <input\n id=\"tt-date-input\"\n type=\"date\"\n data-tt-input\n style={{ width: \"100%\", marginBottom: 6 }}\n value={dateInput}\n onChange={(e) => setDateInput(e.target.value)}\n onKeyDown={(e) => e.key === \"Enter\" && handleDateSubmit()}\n />\n <div data-tt-actions style={{ marginBottom: 12 }}>\n <button\n type=\"button\"\n data-tt-btn-primary\n onClick={handleDateSubmit}\n disabled={isLoading || !dateInput}\n >\n Go\n </button>\n <button\n type=\"button\"\n data-tt-btn-reset\n onClick={reset}\n disabled={isLoading || !state?.isSimulated}\n >\n Reset\n </button>\n </div>\n\n {/* Billing Actions */}\n <div data-tt-label>Billing</div>\n <button\n type=\"button\"\n data-tt-btn-primary\n style={{ width: \"100%\", marginBottom: 12 }}\n onClick={() => processRenewals(false)}\n disabled={isProcessingRenewals}\n >\n {isProcessingRenewals ? \"Processing…\" : \"Process Renewals\"}\n </button>\n\n {/* Renewal Result */}\n {renewalResult && (\n <div\n data-tt-result\n data-has-errors={renewalResult.failed > 0}\n >\n <div data-tt-result-grid>\n <div data-tt-result-item>\n Processed:{\" \"}\n <span data-tt-result-value>\n {renewalResult.processed}\n </span>\n </div>\n <div data-tt-result-item>\n Succeeded:{\" \"}\n <span data-tt-result-value data-success>\n {renewalResult.succeeded}\n </span>\n </div>\n <div data-tt-result-item>\n Failed:{\" \"}\n <span data-tt-result-value data-danger>\n {renewalResult.failed}\n </span>\n </div>\n <div data-tt-result-item>\n Skipped:{\" \"}\n <span data-tt-result-value>\n {renewalResult.skipped}\n </span>\n </div>\n </div>\n </div>\n )}\n </>\n ) : (\n <div data-tt-empty>Enter a customer ID to control time</div>\n )}\n\n {/* All Customers Toggle */}\n {allCustomers.length > 0 && (\n <div>\n <button\n type=\"button\"\n data-tt-customers-toggle\n onClick={() => setShowAllCustomers(!showAllCustomers)}\n >\n <span>\n {allCustomers.length} customer(s) with simulated time\n </span>\n <ChevronIcon open={showAllCustomers} />\n </button>\n\n {showAllCustomers && (\n <div data-tt-customers-list>\n {allCustomers.map((c) => (\n <div\n key={c.customerId}\n data-tt-customer-item\n data-active={c.customerId === activeCustomerId}\n >\n <span data-tt-customer-id>\n {truncateId(c.customerId)}\n </span>\n <span data-tt-customer-date>\n {c.simulatedTime\n ? formatShortDate(c.simulatedTime)\n : \"—\"}\n </span>\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n\n {/* Footer Warning */}\n <div data-tt-footer>Development only — Do not use in production</div>\n </div>\n )}\n </div>\n );\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { Corner, Point } from \"./types\";\n\nconst DRAG_THRESHOLD = 5;\n\ninterface UseDragOptions {\n disabled?: boolean;\n position: Corner;\n onPositionChange: (position: Corner) => void;\n onDragStart?: () => void;\n onDragEnd?: () => void;\n}\n\ninterface UseDragResult {\n ref: React.RefObject<HTMLDivElement | null>;\n isDragging: boolean;\n}\n\nexport function useDrag({\n disabled,\n position,\n onPositionChange,\n onDragStart,\n onDragEnd,\n}: UseDragOptions): UseDragResult {\n const ref = useRef<HTMLDivElement>(null);\n const stateRef = useRef<\"idle\" | \"press\" | \"drag\" | \"animating\">(\"idle\");\n const originRef = useRef<Point>({ x: 0, y: 0 });\n const translationRef = useRef<Point>({ x: 0, y: 0 });\n const velocitiesRef = useRef<Array<{ position: Point; timestamp: number }>>(\n [],\n );\n const [isDragging, setIsDragging] = useState(false);\n\n const getCorners = useCallback((): Record<Corner, Point> => {\n const el = ref.current;\n if (!el) return {} as Record<Corner, Point>;\n\n const padding = 20;\n const width = el.offsetWidth;\n const height = el.offsetHeight;\n const scrollbarWidth =\n window.innerWidth - document.documentElement.clientWidth;\n\n const [currentV, currentH] = position.split(\"-\");\n const baseX =\n currentH === \"right\"\n ? window.innerWidth - scrollbarWidth - padding - width\n : padding;\n const baseY =\n currentV === \"bottom\" ? window.innerHeight - padding - height : padding;\n\n return {\n \"top-left\": {\n x: padding - baseX,\n y: padding - baseY,\n },\n \"top-right\": {\n x: window.innerWidth - scrollbarWidth - padding - width - baseX,\n y: padding - baseY,\n },\n \"bottom-left\": {\n x: padding - baseX,\n y: window.innerHeight - padding - height - baseY,\n },\n \"bottom-right\": {\n x: window.innerWidth - scrollbarWidth - padding - width - baseX,\n y: window.innerHeight - padding - height - baseY,\n },\n };\n }, [position]);\n\n const getNearestCorner = useCallback(\n (projected: Point): { corner: Corner; translation: Point } => {\n const corners = getCorners();\n let nearest: Corner = position;\n let minDistance = Number.POSITIVE_INFINITY;\n\n for (const [corner, point] of Object.entries(corners)) {\n const distance = Math.sqrt(\n (projected.x - point.x) ** 2 + (projected.y - point.y) ** 2,\n );\n if (distance < minDistance) {\n minDistance = distance;\n nearest = corner as Corner;\n }\n }\n\n return { corner: nearest, translation: corners[nearest] };\n },\n [getCorners, position],\n );\n\n const calculateVelocity = useCallback((): Point => {\n const history = velocitiesRef.current;\n if (history.length < 2) return { x: 0, y: 0 };\n\n const oldest = history[0];\n const latest = history[history.length - 1];\n\n if (!oldest || !latest) return { x: 0, y: 0 };\n\n const timeDelta = latest.timestamp - oldest.timestamp;\n\n if (timeDelta === 0) return { x: 0, y: 0 };\n\n return {\n x: ((latest.position.x - oldest.position.x) / timeDelta) * 1000,\n y: ((latest.position.y - oldest.position.y) / timeDelta) * 1000,\n };\n }, []);\n\n const project = useCallback(\n (velocity: number, deceleration = 0.999): number => {\n return ((velocity / 1000) * deceleration) / (1 - deceleration);\n },\n [],\n );\n\n const animateToCorner = useCallback(\n (target: { corner: Corner; translation: Point }) => {\n const el = ref.current;\n if (!el) return;\n\n stateRef.current = \"animating\";\n\n const handleTransitionEnd = (e: TransitionEvent) => {\n if (e.propertyName === \"translate\") {\n el.style.transition = \"\";\n el.style.translate = \"\";\n translationRef.current = { x: 0, y: 0 };\n stateRef.current = \"idle\";\n onPositionChange(target.corner);\n el.removeEventListener(\"transitionend\", handleTransitionEnd);\n }\n };\n\n el.style.transition = \"translate 400ms var(--tt-timing-bounce)\";\n el.addEventListener(\"transitionend\", handleTransitionEnd);\n el.style.translate = `${target.translation.x}px ${target.translation.y}px`;\n },\n [onPositionChange],\n );\n\n useEffect(() => {\n if (disabled) return;\n\n const el = ref.current;\n if (!el) return;\n\n const root = el.closest(\"[data-tt-root]\") as HTMLElement | null;\n\n const onPointerDown = (e: PointerEvent) => {\n if (e.button !== 0) return;\n if (stateRef.current === \"animating\") return;\n\n originRef.current = { x: e.clientX, y: e.clientY };\n stateRef.current = \"press\";\n velocitiesRef.current = [];\n\n window.addEventListener(\"pointermove\", onPointerMove);\n window.addEventListener(\"pointerup\", onPointerUp);\n };\n\n const onPointerMove = (e: PointerEvent) => {\n const dx = e.clientX - originRef.current.x;\n const dy = e.clientY - originRef.current.y;\n\n if (stateRef.current === \"press\") {\n const distance = Math.sqrt(dx * dx + dy * dy);\n if (distance >= DRAG_THRESHOLD) {\n stateRef.current = \"drag\";\n setIsDragging(true);\n root?.classList.add(\"tt-grabbing\");\n onDragStart?.();\n }\n }\n\n if (stateRef.current !== \"drag\") return;\n\n translationRef.current = { x: dx, y: dy };\n el.style.translate = `${dx}px ${dy}px`;\n\n const now = Date.now();\n velocitiesRef.current = [\n ...velocitiesRef.current.slice(-5),\n { position: { x: e.clientX, y: e.clientY }, timestamp: now },\n ];\n };\n\n const onPointerUp = () => {\n window.removeEventListener(\"pointermove\", onPointerMove);\n window.removeEventListener(\"pointerup\", onPointerUp);\n root?.classList.remove(\"tt-grabbing\");\n\n if (stateRef.current === \"drag\") {\n const velocity = calculateVelocity();\n const projected = {\n x: translationRef.current.x + project(velocity.x),\n y: translationRef.current.y + project(velocity.y),\n };\n const nearest = getNearestCorner(projected);\n animateToCorner(nearest);\n onDragEnd?.();\n // Reset isDragging after animation completes (prevent click)\n setTimeout(() => setIsDragging(false), 450);\n } else {\n stateRef.current = \"idle\";\n }\n };\n\n el.addEventListener(\"pointerdown\", onPointerDown);\n\n return () => {\n el.removeEventListener(\"pointerdown\", onPointerDown);\n window.removeEventListener(\"pointermove\", onPointerMove);\n window.removeEventListener(\"pointerup\", onPointerUp);\n };\n }, [\n disabled,\n calculateVelocity,\n project,\n getNearestCorner,\n animateToCorner,\n onDragStart,\n onDragEnd,\n ]);\n\n return { ref, isDragging };\n}\n\nexport function useClickOutside(\n ref: React.RefObject<HTMLElement | null>,\n handler: () => void,\n enabled: boolean,\n) {\n // Store handler in ref to avoid re-subscribing on handler changes\n const handlerRef = useRef(handler);\n useEffect(() => {\n handlerRef.current = handler;\n });\n\n useEffect(() => {\n if (!enabled) return;\n\n const listener = (e: MouseEvent | TouchEvent) => {\n const el = ref.current;\n if (!el || el.contains(e.target as Node)) return;\n handlerRef.current();\n };\n\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n handlerRef.current();\n }\n };\n\n document.addEventListener(\"mousedown\", listener);\n document.addEventListener(\"touchstart\", listener);\n document.addEventListener(\"keydown\", onKeyDown);\n\n return () => {\n document.removeEventListener(\"mousedown\", listener);\n document.removeEventListener(\"touchstart\", listener);\n document.removeEventListener(\"keydown\", onKeyDown);\n };\n }, [ref, enabled]);\n}\n","export function BillSDKLogo() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 512 512\" fill=\"none\">\n <rect width=\"512\" height=\"512\" fill=\"currentColor\" opacity=\"0.15\" />\n <text\n x=\"256\"\n y=\"256\"\n dominantBaseline=\"central\"\n textAnchor=\"middle\"\n fontSize=\"384\"\n fontFamily=\"Arial, sans-serif\"\n fontWeight=\"bold\"\n fill=\"currentColor\"\n >\n B\n </text>\n </svg>\n );\n}\n\nexport function CloseIcon() {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n >\n <path d=\"M12 4L4 12M4 4L12 12\" />\n </svg>\n );\n}\n\nexport function ChevronIcon({ open }: { open: boolean }) {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{\n transform: open ? \"rotate(180deg)\" : \"rotate(0deg)\",\n transition: \"transform 150ms ease\",\n }}\n >\n <path d=\"M3 4.5L6 7.5L9 4.5\" />\n </svg>\n );\n}\n","export const OVERLAY_STYLES = `\n[data-tt-root] {\n /* Sage Clay Palette (BillSDK) - Minimal */\n --tt-bg: #1c1e1d;\n --tt-bg-subtle: #222524;\n --tt-text: #e8ece6;\n --tt-text-muted: #8a8e88;\n --tt-border: hsla(100, 6%, 32%, 40%);\n --tt-danger: #ef4444;\n --tt-success: #6ee7b7;\n\n /* Timing */\n --tt-timing: cubic-bezier(0.23, 0.88, 0.26, 0.92);\n --tt-timing-bounce: linear(0 0%, 0.006 1%, 0.022 2%, 0.047 3%, 0.078 4%, 0.114 5%, 0.154 6%, 0.197 7%, 0.242 8%, 0.288 9%, 0.334 10%, 0.38 11%, 0.425 12%, 0.469 13%, 0.511 14%, 0.552 15%, 0.591 16%, 0.627 17%, 0.662 18%, 0.695 19%, 0.726 20%, 0.754 21%, 0.78 22%, 0.805 23%, 0.827 24%, 0.848 25%, 0.867 26%, 0.884 27%, 0.899 28%, 0.913 29%, 0.926 30%, 0.937 31%, 0.947 32%, 0.956 33%, 0.964 34%, 0.971 35%, 0.977 36%, 0.982 37%, 0.987 38%, 0.991 39%, 0.994 40%, 0.997 41%, 1 42%, 1.002 43%, 1.003 44%, 1.005 45%, 1.006 46%, 1.007 47%, 1.007 48%, 1.008 49%, 1.008 50%, 1.008 51%, 1.008 52%, 1.008 53%, 1.008 54%, 1.007 55%, 1.007 56%, 1.007 57%, 1.007 58%, 1.006 59%, 1.006 60%, 1.006 61%, 1.005 62%, 1.005 63%, 1.004 64%, 1.004 65%, 1.004 66%, 1.003 67%, 1.003 68%, 1.003 69%, 1.003 70%, 1.002 71%, 1.002 72%, 1.002 73%, 1.002 74%, 1.001 75%, 1.001 76%, 1.001 77%, 1.001 78%, 1.001 79%, 1.001 80%, 1.001 81%, 1 82%, 1 83%, 1 84%, 1 85%, 1 86%, 1 87%, 1 88%, 1 89%, 1 90%);\n\n /* Spacing */\n --tt-padding: 20px;\n\n /* Font */\n --tt-font: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n --tt-font-mono: ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, monospace;\n\n font-family: var(--tt-font);\n font-size: 14px;\n line-height: 1.5;\n -webkit-font-smoothing: antialiased;\n}\n\n/* Badge */\n[data-tt-badge] {\n display: flex;\n align-items: center;\n gap: 8px;\n height: 36px;\n padding: 0 12px;\n background: var(--tt-bg);\n border: 1px solid var(--tt-border);\n color: var(--tt-text);\n font-family: var(--tt-font);\n font-size: 13px;\n font-weight: 500;\n cursor: grab;\n user-select: none;\n white-space: nowrap;\n transition: background 150ms ease;\n touch-action: manipulation;\n -webkit-tap-highlight-color: transparent;\n}\n\n[data-tt-badge]:hover {\n background: var(--tt-bg-subtle);\n}\n\n[data-tt-badge]:active {\n cursor: grabbing;\n}\n\n[data-tt-badge][data-simulated=\"true\"] {\n background: var(--tt-success);\n border-color: var(--tt-success);\n color: var(--tt-bg);\n}\n\n[data-tt-badge][data-simulated=\"true\"]:hover {\n filter: brightness(0.95);\n}\n\n[data-tt-badge-icon] {\n display: flex;\n width: 16px;\n height: 16px;\n}\n\n[data-tt-badge-count] {\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n background: var(--tt-text-muted);\n font-size: 11px;\n font-weight: 600;\n color: var(--tt-bg);\n}\n\n/* Panel */\n[data-tt-panel] {\n width: 308px;\n background: var(--tt-bg);\n border: 1px solid var(--tt-border);\n overflow: hidden;\n opacity: 0;\n transform: scale(0.96);\n transform-origin: var(--tt-panel-origin, bottom right);\n transition: opacity 200ms var(--tt-timing), transform 200ms var(--tt-timing);\n}\n\n[data-tt-panel][data-visible=\"true\"] {\n opacity: 1;\n transform: scale(1);\n}\n\n[data-tt-panel-header] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 12px;\n border-bottom: 1px solid var(--tt-border);\n}\n\n[data-tt-panel-header][data-simulated=\"true\"] {\n background: rgba(110, 231, 183, 0.1);\n}\n\n[data-tt-panel-title] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n font-weight: 600;\n color: var(--tt-text);\n}\n\n[data-tt-panel-close] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n background: transparent;\n border: none;\n color: var(--tt-text-muted);\n cursor: pointer;\n}\n\n[data-tt-panel-close]:hover {\n color: var(--tt-text);\n}\n\n[data-tt-panel-content] {\n padding: 12px;\n}\n\n/* Time Display */\n[data-tt-time-display] {\n padding: 10px 12px;\n background: var(--tt-bg-subtle);\n margin-bottom: 12px;\n}\n\n[data-tt-time-label] {\n font-size: 11px;\n font-weight: 500;\n color: var(--tt-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n margin-bottom: 2px;\n}\n\n[data-tt-time-value] {\n font-size: 15px;\n font-weight: 600;\n color: var(--tt-text);\n}\n\n[data-tt-time-sub] {\n font-size: 12px;\n color: var(--tt-text-muted);\n}\n\n/* Buttons - All use same base style */\n[data-tt-actions] {\n display: flex;\n gap: 6px;\n margin-bottom: 12px;\n}\n\n[data-tt-action],\n[data-tt-btn-primary],\n[data-tt-btn-reset] {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n height: 32px;\n padding: 0 12px;\n background: var(--tt-bg-subtle);\n border: none;\n font-family: var(--tt-font);\n font-size: 12px;\n font-weight: 500;\n color: var(--tt-text);\n cursor: pointer;\n transition: filter 150ms ease;\n}\n\n[data-tt-action]:hover:not(:disabled),\n[data-tt-btn-primary]:hover:not(:disabled),\n[data-tt-btn-reset]:hover:not(:disabled) {\n filter: brightness(0.85);\n}\n\n[data-tt-action]:disabled,\n[data-tt-btn-primary]:disabled,\n[data-tt-btn-reset]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* Primary variant */\n[data-tt-btn-primary] {\n background: var(--tt-text);\n color: var(--tt-bg);\n}\n\n/* Destructive variant */\n[data-tt-btn-reset] {\n background: var(--tt-danger);\n color: var(--tt-bg);\n}\n\n/* Input */\n[data-tt-input] {\n flex: 1;\n height: 32px;\n padding: 0 10px;\n background: var(--tt-bg-subtle);\n border: 1px solid var(--tt-border);\n font-family: var(--tt-font);\n font-size: 13px;\n color: var(--tt-text);\n color-scheme: dark;\n}\n\n[data-tt-input]:focus {\n border-color: var(--tt-text-muted);\n}\n\n[data-tt-input]:focus:not(:focus-visible) {\n outline: none;\n}\n\n[data-tt-input]::placeholder {\n color: var(--tt-text-muted);\n}\n\n/* Result */\n[data-tt-result] {\n padding: 10px;\n background: var(--tt-bg-subtle);\n margin-bottom: 12px;\n}\n\n[data-tt-result][data-has-errors=\"true\"] {\n background: rgba(239, 68, 68, 0.1);\n}\n\n[data-tt-result-grid] {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 4px;\n font-size: 12px;\n}\n\n[data-tt-result-item] {\n color: var(--tt-text-muted);\n}\n\n[data-tt-result-value] {\n font-weight: 600;\n color: var(--tt-text);\n}\n\n[data-tt-result-value][data-success] {\n color: var(--tt-success);\n}\n\n[data-tt-result-value][data-danger] {\n color: var(--tt-danger);\n}\n\n/* Customer Info */\n[data-tt-customer] {\n padding: 8px 10px;\n background: var(--tt-bg-subtle);\n font-size: 12px;\n color: var(--tt-text);\n margin-bottom: 12px;\n}\n\n[data-tt-customer] strong {\n font-family: var(--tt-font-mono);\n}\n\n/* Customers List */\n[data-tt-customers-toggle] {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 10px;\n background: var(--tt-bg-subtle);\n border: none;\n font-family: var(--tt-font);\n font-size: 12px;\n font-weight: 500;\n color: var(--tt-text);\n cursor: pointer;\n transition: filter 150ms ease;\n}\n\n[data-tt-customers-toggle]:hover {\n filter: brightness(0.85);\n}\n\n[data-tt-customers-list] {\n margin-top: 8px;\n max-height: 120px;\n overflow-y: auto;\n border: 1px solid var(--tt-border);\n}\n\n[data-tt-customer-item] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 6px 10px;\n font-size: 11px;\n border-bottom: 1px solid var(--tt-border);\n}\n\n[data-tt-customer-item]:last-child {\n border-bottom: none;\n}\n\n[data-tt-customer-item][data-active=\"true\"] {\n background: var(--tt-bg-subtle);\n}\n\n[data-tt-customer-id] {\n font-family: var(--tt-font-mono);\n color: var(--tt-text);\n}\n\n[data-tt-customer-date] {\n color: var(--tt-text-muted);\n}\n\n/* Footer */\n[data-tt-footer] {\n padding: 6px 12px;\n border-top: 1px solid var(--tt-border);\n font-size: 10px;\n font-weight: 500;\n color: var(--tt-danger);\n text-align: center;\n}\n\n/* Grabbing state */\n[data-tt-root].tt-grabbing {\n cursor: grabbing !important;\n}\n\n[data-tt-root].tt-grabbing * {\n cursor: grabbing !important;\n user-select: none !important;\n}\n\n/* Empty state */\n[data-tt-empty] {\n padding: 20px;\n text-align: center;\n color: var(--tt-text-muted);\n font-size: 13px;\n}\n\n/* Label */\n[data-tt-label] {\n display: block;\n font-size: 11px;\n font-weight: 500;\n color: var(--tt-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n margin-bottom: 6px;\n}\n\n/* Focus visible */\n[data-tt-input]:focus-visible {\n outline: 2px solid var(--tt-text-muted);\n outline-offset: 1px;\n border-color: transparent;\n}\n\n[data-tt-badge]:focus-visible,\n[data-tt-action]:focus-visible,\n[data-tt-btn-primary]:focus-visible,\n[data-tt-btn-reset]:focus-visible,\n[data-tt-panel-close]:focus-visible,\n[data-tt-customers-toggle]:focus-visible {\n outline: 2px solid var(--tt-text-muted);\n outline-offset: 2px;\n}\n\n/* Reduced motion */\n@media (prefers-reduced-motion: reduce) {\n [data-tt-panel],\n [data-tt-badge],\n [data-tt-customers-toggle],\n [data-tt-action],\n [data-tt-btn-primary],\n [data-tt-btn-reset],\n [data-tt-input] {\n transition: none !important;\n }\n}\n`;\n"],"mappings":";;;AAEA;AAAA,EACE,eAAAA;AAAA,EACA,aAAAC;AAAA,EACA;AAAA,EACA,UAAAC;AAAA,EACA,YAAAC;AAAA,OACK;;;ACRP,SAAS,aAAa,WAAW,QAAQ,gBAAgB;AAGzD,IAAM,iBAAiB;AAehB,SAAS,QAAQ;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAkC;AAChC,QAAM,MAAM,OAAuB,IAAI;AACvC,QAAM,WAAW,OAAgD,MAAM;AACvE,QAAM,YAAY,OAAc,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;AAC9C,QAAM,iBAAiB,OAAc,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;AACnD,QAAM,gBAAgB;AAAA,IACpB,CAAC;AAAA,EACH;AACA,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,KAAK;AAElD,QAAM,aAAa,YAAY,MAA6B;AAC1D,UAAM,KAAK,IAAI;AACf,QAAI,CAAC,GAAI,QAAO,CAAC;AAEjB,UAAM,UAAU;AAChB,UAAM,QAAQ,GAAG;AACjB,UAAM,SAAS,GAAG;AAClB,UAAM,iBACJ,OAAO,aAAa,SAAS,gBAAgB;AAE/C,UAAM,CAAC,UAAU,QAAQ,IAAI,SAAS,MAAM,GAAG;AAC/C,UAAM,QACJ,aAAa,UACT,OAAO,aAAa,iBAAiB,UAAU,QAC/C;AACN,UAAM,QACJ,aAAa,WAAW,OAAO,cAAc,UAAU,SAAS;AAElE,WAAO;AAAA,MACL,YAAY;AAAA,QACV,GAAG,UAAU;AAAA,QACb,GAAG,UAAU;AAAA,MACf;AAAA,MACA,aAAa;AAAA,QACX,GAAG,OAAO,aAAa,iBAAiB,UAAU,QAAQ;AAAA,QAC1D,GAAG,UAAU;AAAA,MACf;AAAA,MACA,eAAe;AAAA,QACb,GAAG,UAAU;AAAA,QACb,GAAG,OAAO,cAAc,UAAU,SAAS;AAAA,MAC7C;AAAA,MACA,gBAAgB;AAAA,QACd,GAAG,OAAO,aAAa,iBAAiB,UAAU,QAAQ;AAAA,QAC1D,GAAG,OAAO,cAAc,UAAU,SAAS;AAAA,MAC7C;AAAA,IACF;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,mBAAmB;AAAA,IACvB,CAAC,cAA6D;AAC5D,YAAM,UAAU,WAAW;AAC3B,UAAI,UAAkB;AACtB,UAAI,cAAc,OAAO;AAEzB,iBAAW,CAAC,QAAQ,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AACrD,cAAM,WAAW,KAAK;AAAA,WACnB,UAAU,IAAI,MAAM,MAAM,KAAK,UAAU,IAAI,MAAM,MAAM;AAAA,QAC5D;AACA,YAAI,WAAW,aAAa;AAC1B,wBAAc;AACd,oBAAU;AAAA,QACZ;AAAA,MACF;AAEA,aAAO,EAAE,QAAQ,SAAS,aAAa,QAAQ,OAAO,EAAE;AAAA,IAC1D;AAAA,IACA,CAAC,YAAY,QAAQ;AAAA,EACvB;AAEA,QAAM,oBAAoB,YAAY,MAAa;AACjD,UAAM,UAAU,cAAc;AAC9B,QAAI,QAAQ,SAAS,EAAG,QAAO,EAAE,GAAG,GAAG,GAAG,EAAE;AAE5C,UAAM,SAAS,QAAQ,CAAC;AACxB,UAAM,SAAS,QAAQ,QAAQ,SAAS,CAAC;AAEzC,QAAI,CAAC,UAAU,CAAC,OAAQ,QAAO,EAAE,GAAG,GAAG,GAAG,EAAE;AAE5C,UAAM,YAAY,OAAO,YAAY,OAAO;AAE5C,QAAI,cAAc,EAAG,QAAO,EAAE,GAAG,GAAG,GAAG,EAAE;AAEzC,WAAO;AAAA,MACL,IAAK,OAAO,SAAS,IAAI,OAAO,SAAS,KAAK,YAAa;AAAA,MAC3D,IAAK,OAAO,SAAS,IAAI,OAAO,SAAS,KAAK,YAAa;AAAA,IAC7D;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,UAAU;AAAA,IACd,CAAC,UAAkB,eAAe,UAAkB;AAClD,aAAS,WAAW,MAAQ,gBAAiB,IAAI;AAAA,IACnD;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,kBAAkB;AAAA,IACtB,CAAC,WAAmD;AAClD,YAAM,KAAK,IAAI;AACf,UAAI,CAAC,GAAI;AAET,eAAS,UAAU;AAEnB,YAAM,sBAAsB,CAAC,MAAuB;AAClD,YAAI,EAAE,iBAAiB,aAAa;AAClC,aAAG,MAAM,aAAa;AACtB,aAAG,MAAM,YAAY;AACrB,yBAAe,UAAU,EAAE,GAAG,GAAG,GAAG,EAAE;AACtC,mBAAS,UAAU;AACnB,2BAAiB,OAAO,MAAM;AAC9B,aAAG,oBAAoB,iBAAiB,mBAAmB;AAAA,QAC7D;AAAA,MACF;AAEA,SAAG,MAAM,aAAa;AACtB,SAAG,iBAAiB,iBAAiB,mBAAmB;AACxD,SAAG,MAAM,YAAY,GAAG,OAAO,YAAY,CAAC,MAAM,OAAO,YAAY,CAAC;AAAA,IACxE;AAAA,IACA,CAAC,gBAAgB;AAAA,EACnB;AAEA,YAAU,MAAM;AACd,QAAI,SAAU;AAEd,UAAM,KAAK,IAAI;AACf,QAAI,CAAC,GAAI;AAET,UAAM,OAAO,GAAG,QAAQ,gBAAgB;AAExC,UAAM,gBAAgB,CAAC,MAAoB;AACzC,UAAI,EAAE,WAAW,EAAG;AACpB,UAAI,SAAS,YAAY,YAAa;AAEtC,gBAAU,UAAU,EAAE,GAAG,EAAE,SAAS,GAAG,EAAE,QAAQ;AACjD,eAAS,UAAU;AACnB,oBAAc,UAAU,CAAC;AAEzB,aAAO,iBAAiB,eAAe,aAAa;AACpD,aAAO,iBAAiB,aAAa,WAAW;AAAA,IAClD;AAEA,UAAM,gBAAgB,CAAC,MAAoB;AACzC,YAAM,KAAK,EAAE,UAAU,UAAU,QAAQ;AACzC,YAAM,KAAK,EAAE,UAAU,UAAU,QAAQ;AAEzC,UAAI,SAAS,YAAY,SAAS;AAChC,cAAM,WAAW,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE;AAC5C,YAAI,YAAY,gBAAgB;AAC9B,mBAAS,UAAU;AACnB,wBAAc,IAAI;AAClB,gBAAM,UAAU,IAAI,aAAa;AACjC,wBAAc;AAAA,QAChB;AAAA,MACF;AAEA,UAAI,SAAS,YAAY,OAAQ;AAEjC,qBAAe,UAAU,EAAE,GAAG,IAAI,GAAG,GAAG;AACxC,SAAG,MAAM,YAAY,GAAG,EAAE,MAAM,EAAE;AAElC,YAAM,MAAM,KAAK,IAAI;AACrB,oBAAc,UAAU;AAAA,QACtB,GAAG,cAAc,QAAQ,MAAM,EAAE;AAAA,QACjC,EAAE,UAAU,EAAE,GAAG,EAAE,SAAS,GAAG,EAAE,QAAQ,GAAG,WAAW,IAAI;AAAA,MAC7D;AAAA,IACF;AAEA,UAAM,cAAc,MAAM;AACxB,aAAO,oBAAoB,eAAe,aAAa;AACvD,aAAO,oBAAoB,aAAa,WAAW;AACnD,YAAM,UAAU,OAAO,aAAa;AAEpC,UAAI,SAAS,YAAY,QAAQ;AAC/B,cAAM,WAAW,kBAAkB;AACnC,cAAM,YAAY;AAAA,UAChB,GAAG,eAAe,QAAQ,IAAI,QAAQ,SAAS,CAAC;AAAA,UAChD,GAAG,eAAe,QAAQ,IAAI,QAAQ,SAAS,CAAC;AAAA,QAClD;AACA,cAAM,UAAU,iBAAiB,SAAS;AAC1C,wBAAgB,OAAO;AACvB,oBAAY;AAEZ,mBAAW,MAAM,cAAc,KAAK,GAAG,GAAG;AAAA,MAC5C,OAAO;AACL,iBAAS,UAAU;AAAA,MACrB;AAAA,IACF;AAEA,OAAG,iBAAiB,eAAe,aAAa;AAEhD,WAAO,MAAM;AACX,SAAG,oBAAoB,eAAe,aAAa;AACnD,aAAO,oBAAoB,eAAe,aAAa;AACvD,aAAO,oBAAoB,aAAa,WAAW;AAAA,IACrD;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,SAAO,EAAE,KAAK,WAAW;AAC3B;AAEO,SAAS,gBACd,KACA,SACA,SACA;AAEA,QAAM,aAAa,OAAO,OAAO;AACjC,YAAU,MAAM;AACd,eAAW,UAAU;AAAA,EACvB,CAAC;AAED,YAAU,MAAM;AACd,QAAI,CAAC,QAAS;AAEd,UAAM,WAAW,CAAC,MAA+B;AAC/C,YAAM,KAAK,IAAI;AACf,UAAI,CAAC,MAAM,GAAG,SAAS,EAAE,MAAc,EAAG;AAC1C,iBAAW,QAAQ;AAAA,IACrB;AAEA,UAAM,YAAY,CAAC,MAAqB;AACtC,UAAI,EAAE,QAAQ,UAAU;AACtB,mBAAW,QAAQ;AAAA,MACrB;AAAA,IACF;AAEA,aAAS,iBAAiB,aAAa,QAAQ;AAC/C,aAAS,iBAAiB,cAAc,QAAQ;AAChD,aAAS,iBAAiB,WAAW,SAAS;AAE9C,WAAO,MAAM;AACX,eAAS,oBAAoB,aAAa,QAAQ;AAClD,eAAS,oBAAoB,cAAc,QAAQ;AACnD,eAAS,oBAAoB,WAAW,SAAS;AAAA,IACnD;AAAA,EACF,GAAG,CAAC,KAAK,OAAO,CAAC;AACnB;;;ACzQI,SACE,KADF;AAFG,SAAS,cAAc;AAC5B,SACE,qBAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,eAAc,MAAK,QACrD;AAAA,wBAAC,UAAK,OAAM,OAAM,QAAO,OAAM,MAAK,gBAAe,SAAQ,QAAO;AAAA,IAClE;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAE;AAAA,QACF,kBAAiB;AAAA,QACjB,YAAW;AAAA,QACX,UAAS;AAAA,QACT,YAAW;AAAA,QACX,YAAW;AAAA,QACX,MAAK;AAAA,QACN;AAAA;AAAA,IAED;AAAA,KACF;AAEJ;AAEO,SAAS,YAAY;AAC1B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MAEd,8BAAC,UAAK,GAAE,wBAAuB;AAAA;AAAA,EACjC;AAEJ;AAEO,SAAS,YAAY,EAAE,KAAK,GAAsB;AACvD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA,MACf,OAAO;AAAA,QACL,WAAW,OAAO,mBAAmB;AAAA,QACrC,YAAY;AAAA,MACd;AAAA,MAEA,8BAAC,UAAK,GAAE,sBAAqB;AAAA;AAAA,EAC/B;AAEJ;;;ACvDO,IAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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","names":["useCallback","useEffect","useRef","useState","jsx","jsxs","useState","useRef","useCallback","useEffect"]}
|
|
1
|
+
{"version":3,"sources":["../../src/client/overlay.tsx","../../src/client/hooks.ts","../../src/client/icons.tsx","../../src/client/styles.ts"],"sourcesContent":["\"use client\";\n\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport { useClickOutside, useDrag } from \"./hooks\";\nimport { BillSDKLogo, ChevronIcon, CloseIcon } from \"./icons\";\nimport { OVERLAY_STYLES } from \"./styles\";\nimport type {\n Corner,\n CustomerTimeState,\n RenewalResult,\n TimeTravelOverlayProps,\n TimeTravelState,\n} from \"./types\";\n\nexport type { Corner, TimeTravelOverlayProps } from \"./types\";\n\nconst STORAGE_KEY = \"billsdk-time-travel-position\";\n\n/**\n * Time Travel Overlay Component\n *\n * A floating UI component that allows you to control simulated time\n * for testing billing cycles, trials, and renewals.\n *\n * @example\n * ```tsx\n * import { TimeTravelOverlay } from \"@billsdk/time-travel/react\";\n *\n * function App() {\n * const { user } = useAuth();\n * return (\n * <>\n * <YourApp />\n * {process.env.NODE_ENV === \"development\" && user?.customerId && (\n * <TimeTravelOverlay\n * baseUrl=\"/api/billing\"\n * customerId={user.customerId}\n * />\n * )}\n * </>\n * );\n * }\n * ```\n */\nexport function TimeTravelOverlay({\n baseUrl = \"/api/billing\",\n defaultPosition = \"bottom-right\",\n defaultCollapsed = true,\n customerId,\n}: TimeTravelOverlayProps) {\n // Load position from localStorage\n const [position, setPosition] = useState<Corner>(() => {\n if (typeof window === \"undefined\") return defaultPosition;\n try {\n const saved = localStorage.getItem(STORAGE_KEY);\n if (\n saved &&\n [\"bottom-right\", \"bottom-left\", \"top-right\", \"top-left\"].includes(saved)\n ) {\n return saved as Corner;\n }\n } catch {}\n return defaultPosition;\n });\n\n const [state, setState] = useState<TimeTravelState | null>(null);\n const [allCustomers, setAllCustomers] = useState<CustomerTimeState[]>([]);\n const [isCollapsed, setIsCollapsed] = useState(defaultCollapsed);\n const [isLoading, setIsLoading] = useState(false);\n const [isProcessingRenewals, setIsProcessingRenewals] = useState(false);\n const [renewalResult, setRenewalResult] = useState<RenewalResult | null>(\n null,\n );\n const [dateInput, setDateInput] = useState(\"\");\n const [customerIdInput, setCustomerIdInput] = useState(customerId ?? \"\");\n const [showAllCustomers, setShowAllCustomers] = useState(false);\n const [panelVisible, setPanelVisible] = useState(false);\n\n const panelRef = useRef<HTMLDivElement>(null);\n const activeCustomerId = customerId ?? customerIdInput;\n\n // Handle position change and persist to localStorage\n const handlePositionChange = useCallback((newPosition: Corner) => {\n setPosition(newPosition);\n try {\n localStorage.setItem(STORAGE_KEY, newPosition);\n } catch {}\n }, []);\n\n // Draggable badge\n const { ref: dragRef, isDragging } = useDrag({\n position,\n onPositionChange: handlePositionChange,\n disabled: !isCollapsed,\n });\n\n // Close panel on click outside\n useClickOutside(\n panelRef,\n () => {\n setIsCollapsed(true);\n setPanelVisible(false);\n },\n !isCollapsed,\n );\n\n // Animate panel visibility\n useLayoutEffect(() => {\n if (!isCollapsed) {\n // Small delay to trigger CSS transition\n requestAnimationFrame(() => {\n setPanelVisible(true);\n });\n } else {\n setPanelVisible(false);\n }\n }, [isCollapsed]);\n\n // Fetch current state for the active customer\n const fetchState = useCallback(async () => {\n if (!activeCustomerId) {\n setState(null);\n return;\n }\n\n try {\n const res = await fetch(`${baseUrl}/time-travel/get`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ customerId: activeCustomerId }),\n });\n if (res.ok) {\n const data = (await res.json()) as TimeTravelState;\n setState(data);\n if (data.simulatedTime) {\n const datePart = data.simulatedTime.split(\"T\")[0];\n if (datePart) {\n setDateInput(datePart);\n }\n }\n }\n } catch (error) {\n console.error(\"[TimeTravelOverlay] Failed to fetch state:\", error);\n }\n }, [baseUrl, activeCustomerId]);\n\n // Fetch all customers with simulated time\n const fetchAllCustomers = useCallback(async () => {\n try {\n const res = await fetch(`${baseUrl}/time-travel/list`);\n if (res.ok) {\n const data = (await res.json()) as { customers: CustomerTimeState[] };\n setAllCustomers(data.customers);\n }\n } catch (error) {\n console.error(\"[TimeTravelOverlay] Failed to fetch customers:\", error);\n }\n }, [baseUrl]);\n\n useEffect(() => {\n fetchState();\n fetchAllCustomers();\n }, [fetchState, fetchAllCustomers]);\n\n // Advance time\n const advance = async (days: number, months = 0) => {\n if (!activeCustomerId) return;\n\n setIsLoading(true);\n try {\n const res = await fetch(`${baseUrl}/time-travel/advance`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n customerId: activeCustomerId,\n days,\n months,\n }),\n });\n if (res.ok) {\n await Promise.all([fetchState(), fetchAllCustomers()]);\n }\n } catch (error) {\n console.error(\"[TimeTravelOverlay] Failed to advance:\", error);\n } finally {\n setIsLoading(false);\n }\n };\n\n // Set specific time\n const setTime = async (date: string | null) => {\n if (!activeCustomerId) return;\n\n setIsLoading(true);\n try {\n const res = await fetch(`${baseUrl}/time-travel/set`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ customerId: activeCustomerId, date }),\n });\n if (res.ok) {\n await Promise.all([fetchState(), fetchAllCustomers()]);\n }\n } catch (error) {\n console.error(\"[TimeTravelOverlay] Failed to set time:\", error);\n } finally {\n setIsLoading(false);\n }\n };\n\n // Reset to real time\n const reset = async () => {\n if (!activeCustomerId) return;\n\n setIsLoading(true);\n try {\n const res = await fetch(`${baseUrl}/time-travel/reset`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ customerId: activeCustomerId }),\n });\n if (res.ok) {\n setDateInput(\"\");\n await Promise.all([fetchState(), fetchAllCustomers()]);\n }\n } catch (error) {\n console.error(\"[TimeTravelOverlay] Failed to reset:\", error);\n } finally {\n setIsLoading(false);\n }\n };\n\n // Handle date input submission\n const handleDateSubmit = () => {\n if (dateInput) {\n const date = new Date(dateInput);\n date.setUTCHours(12, 0, 0, 0);\n setTime(date.toISOString());\n }\n };\n\n // Process renewals for the current customer\n const processRenewals = async (dryRun = false) => {\n if (!activeCustomerId) return;\n\n setIsProcessingRenewals(true);\n setRenewalResult(null);\n try {\n const params = new URLSearchParams({\n customerId: activeCustomerId,\n ...(dryRun && { dryRun: \"true\" }),\n });\n const res = await fetch(`${baseUrl}/renewals?${params.toString()}`);\n if (res.ok) {\n const data = (await res.json()) as RenewalResult;\n setRenewalResult(data);\n }\n } catch (error) {\n console.error(\"[TimeTravelOverlay] Failed to process renewals:\", error);\n } finally {\n setIsProcessingRenewals(false);\n }\n };\n\n const formatDate = (isoString: string) => {\n const date = new Date(isoString);\n return date.toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n };\n\n const formatShortDate = (isoString: string) => {\n const date = new Date(isoString);\n return date.toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n });\n };\n\n const formatTime = (isoString: string) => {\n const date = new Date(isoString);\n return date.toLocaleTimeString(undefined, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n };\n\n const truncateId = (id: string) => {\n if (id.length <= 10) return id;\n return `${id.slice(0, 5)}…${id.slice(-4)}`;\n };\n\n // Position styles\n const [vertical, horizontal] = position.split(\"-\") as [string, string];\n const positionStyles: Record<string, string> = {\n [vertical]: \"var(--tt-padding)\",\n [horizontal]: \"var(--tt-padding)\",\n };\n\n // Panel transform origin based on position\n const panelOrigin = position.replace(\"-\", \" \");\n\n return (\n <div\n data-tt-root\n style={{\n position: \"fixed\",\n ...positionStyles,\n zIndex: 2147483646,\n }}\n >\n <style>{OVERLAY_STYLES}</style>\n\n {isCollapsed ? (\n /* Collapsed Badge */\n <div ref={dragRef}>\n <button\n type=\"button\"\n data-tt-badge\n data-simulated={state?.isSimulated ?? false}\n onClick={() => {\n // Only open if not dragging\n if (!isDragging) {\n setIsCollapsed(false);\n }\n }}\n aria-label=\"Open Time Travel panel\"\n >\n <span data-tt-badge-icon>\n <BillSDKLogo />\n </span>\n <span>\n {state?.isSimulated && state.simulatedTime\n ? formatShortDate(state.simulatedTime)\n : \"Real Time\"}\n </span>\n {allCustomers.length > 0 && (\n <span data-tt-badge-count>{allCustomers.length}</span>\n )}\n </button>\n </div>\n ) : (\n /* Expanded Panel */\n <div\n ref={panelRef}\n data-tt-panel\n data-visible={panelVisible}\n style={{ \"--tt-panel-origin\": panelOrigin } as React.CSSProperties}\n >\n {/* Header */}\n <div\n data-tt-panel-header\n data-simulated={state?.isSimulated ?? false}\n >\n <div data-tt-panel-title>\n <BillSDKLogo />\n <span>Time Travel</span>\n </div>\n <button\n type=\"button\"\n data-tt-panel-close\n onClick={() => setIsCollapsed(true)}\n aria-label=\"Close panel\"\n >\n <CloseIcon />\n </button>\n </div>\n\n <div data-tt-panel-content>\n {/* Customer ID Input (only if not provided via prop) */}\n {!customerId && (\n <div style={{ marginBottom: 12 }}>\n <label htmlFor=\"tt-customer-id\" data-tt-label>\n Customer ID\n </label>\n <input\n id=\"tt-customer-id\"\n type=\"text\"\n data-tt-input\n value={customerIdInput}\n onChange={(e) => setCustomerIdInput(e.target.value)}\n onBlur={fetchState}\n onKeyDown={(e) => e.key === \"Enter\" && fetchState()}\n placeholder=\"Enter customer ID…\"\n spellCheck={false}\n />\n </div>\n )}\n\n {/* Customer indicator (when provided via prop) */}\n {customerId && (\n <div data-tt-customer>\n Customer: <strong>{truncateId(customerId)}</strong>\n </div>\n )}\n\n {activeCustomerId ? (\n <>\n {/* Current Time Display */}\n <div data-tt-time-display>\n <div data-tt-time-label>\n {state?.isSimulated ? \"Simulated Time\" : \"Current Time\"}\n </div>\n <div data-tt-time-value>\n {state?.simulatedTime\n ? formatDate(state.simulatedTime)\n : state?.realTime\n ? formatDate(state.realTime)\n : \"Loading…\"}\n </div>\n <div data-tt-time-sub>\n {state?.simulatedTime\n ? formatTime(state.simulatedTime)\n : state?.realTime\n ? formatTime(state.realTime)\n : \"\"}\n </div>\n </div>\n\n {/* Quick Actions */}\n <div data-tt-label>Quick Advance</div>\n <div data-tt-actions>\n <button\n type=\"button\"\n data-tt-action\n onClick={() => advance(1, 0)}\n disabled={isLoading}\n >\n +1 day\n </button>\n <button\n type=\"button\"\n data-tt-action\n onClick={() => advance(7, 0)}\n disabled={isLoading}\n >\n +1 week\n </button>\n <button\n type=\"button\"\n data-tt-action\n onClick={() => advance(0, 1)}\n disabled={isLoading}\n >\n +1 month\n </button>\n </div>\n\n {/* Date Picker */}\n <label htmlFor=\"tt-date-input\" data-tt-label>\n Go to Date\n </label>\n <input\n id=\"tt-date-input\"\n type=\"date\"\n data-tt-input\n style={{ width: \"100%\", marginBottom: 6 }}\n value={dateInput}\n onChange={(e) => setDateInput(e.target.value)}\n onKeyDown={(e) => e.key === \"Enter\" && handleDateSubmit()}\n />\n <div data-tt-actions style={{ marginBottom: 12 }}>\n <button\n type=\"button\"\n data-tt-btn-primary\n onClick={handleDateSubmit}\n disabled={isLoading || !dateInput}\n >\n Go\n </button>\n <button\n type=\"button\"\n data-tt-btn-reset\n onClick={reset}\n disabled={isLoading || !state?.isSimulated}\n >\n Reset\n </button>\n </div>\n\n {/* Billing Actions */}\n <div data-tt-label>Billing</div>\n <button\n type=\"button\"\n data-tt-btn-primary\n style={{ width: \"100%\", marginBottom: 12 }}\n onClick={() => processRenewals(false)}\n disabled={isProcessingRenewals}\n >\n {isProcessingRenewals ? \"Processing…\" : \"Process Renewals\"}\n </button>\n\n {/* Renewal Result */}\n {renewalResult && (\n <div\n data-tt-result\n data-has-errors={renewalResult.failed > 0}\n >\n <div data-tt-result-grid>\n <div data-tt-result-item>\n Processed:{\" \"}\n <span data-tt-result-value>\n {renewalResult.processed}\n </span>\n </div>\n <div data-tt-result-item>\n Succeeded:{\" \"}\n <span data-tt-result-value data-success>\n {renewalResult.succeeded}\n </span>\n </div>\n <div data-tt-result-item>\n Failed:{\" \"}\n <span data-tt-result-value data-danger>\n {renewalResult.failed}\n </span>\n </div>\n <div data-tt-result-item>\n Skipped:{\" \"}\n <span data-tt-result-value>\n {renewalResult.skipped}\n </span>\n </div>\n </div>\n </div>\n )}\n </>\n ) : (\n <div data-tt-empty>Enter a customer ID to control time</div>\n )}\n\n {/* All Customers Toggle */}\n {allCustomers.length > 0 && (\n <div>\n <button\n type=\"button\"\n data-tt-customers-toggle\n onClick={() => setShowAllCustomers(!showAllCustomers)}\n >\n <span>\n {allCustomers.length} customer(s) with simulated time\n </span>\n <ChevronIcon open={showAllCustomers} />\n </button>\n\n {showAllCustomers && (\n <div data-tt-customers-list>\n {allCustomers.map((c) => (\n <div\n key={c.customerId}\n data-tt-customer-item\n data-active={c.customerId === activeCustomerId}\n >\n <span data-tt-customer-id>\n {truncateId(c.customerId)}\n </span>\n <span data-tt-customer-date>\n {c.simulatedTime\n ? formatShortDate(c.simulatedTime)\n : \"—\"}\n </span>\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n\n {/* Footer Warning */}\n <div data-tt-footer>Development only — Do not use in production</div>\n </div>\n )}\n </div>\n );\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { Corner, Point } from \"./types\";\n\nconst DRAG_THRESHOLD = 5;\n\ninterface UseDragOptions {\n disabled?: boolean;\n position: Corner;\n onPositionChange: (position: Corner) => void;\n onDragStart?: () => void;\n onDragEnd?: () => void;\n}\n\ninterface UseDragResult {\n ref: React.RefObject<HTMLDivElement | null>;\n isDragging: boolean;\n}\n\nexport function useDrag({\n disabled,\n position,\n onPositionChange,\n onDragStart,\n onDragEnd,\n}: UseDragOptions): UseDragResult {\n const ref = useRef<HTMLDivElement>(null);\n const stateRef = useRef<\"idle\" | \"press\" | \"drag\" | \"animating\">(\"idle\");\n const originRef = useRef<Point>({ x: 0, y: 0 });\n const translationRef = useRef<Point>({ x: 0, y: 0 });\n const velocitiesRef = useRef<Array<{ position: Point; timestamp: number }>>(\n [],\n );\n const [isDragging, setIsDragging] = useState(false);\n\n const getCorners = useCallback((): Record<Corner, Point> => {\n const el = ref.current;\n if (!el) return {} as Record<Corner, Point>;\n\n const padding = 20;\n const width = el.offsetWidth;\n const height = el.offsetHeight;\n const scrollbarWidth =\n window.innerWidth - document.documentElement.clientWidth;\n\n const [currentV, currentH] = position.split(\"-\");\n const baseX =\n currentH === \"right\"\n ? window.innerWidth - scrollbarWidth - padding - width\n : padding;\n const baseY =\n currentV === \"bottom\" ? window.innerHeight - padding - height : padding;\n\n return {\n \"top-left\": {\n x: padding - baseX,\n y: padding - baseY,\n },\n \"top-right\": {\n x: window.innerWidth - scrollbarWidth - padding - width - baseX,\n y: padding - baseY,\n },\n \"bottom-left\": {\n x: padding - baseX,\n y: window.innerHeight - padding - height - baseY,\n },\n \"bottom-right\": {\n x: window.innerWidth - scrollbarWidth - padding - width - baseX,\n y: window.innerHeight - padding - height - baseY,\n },\n };\n }, [position]);\n\n const getNearestCorner = useCallback(\n (projected: Point): { corner: Corner; translation: Point } => {\n const corners = getCorners();\n let nearest: Corner = position;\n let minDistance = Number.POSITIVE_INFINITY;\n\n for (const [corner, point] of Object.entries(corners)) {\n const distance = Math.sqrt(\n (projected.x - point.x) ** 2 + (projected.y - point.y) ** 2,\n );\n if (distance < minDistance) {\n minDistance = distance;\n nearest = corner as Corner;\n }\n }\n\n return { corner: nearest, translation: corners[nearest] };\n },\n [getCorners, position],\n );\n\n const calculateVelocity = useCallback((): Point => {\n const history = velocitiesRef.current;\n if (history.length < 2) return { x: 0, y: 0 };\n\n const oldest = history[0];\n const latest = history[history.length - 1];\n\n if (!oldest || !latest) return { x: 0, y: 0 };\n\n const timeDelta = latest.timestamp - oldest.timestamp;\n\n if (timeDelta === 0) return { x: 0, y: 0 };\n\n return {\n x: ((latest.position.x - oldest.position.x) / timeDelta) * 1000,\n y: ((latest.position.y - oldest.position.y) / timeDelta) * 1000,\n };\n }, []);\n\n const project = useCallback(\n (velocity: number, deceleration = 0.999): number => {\n return ((velocity / 1000) * deceleration) / (1 - deceleration);\n },\n [],\n );\n\n const animateToCorner = useCallback(\n (target: { corner: Corner; translation: Point }) => {\n const el = ref.current;\n if (!el) return;\n\n stateRef.current = \"animating\";\n\n const handleTransitionEnd = (e: TransitionEvent) => {\n if (e.propertyName === \"translate\") {\n el.removeEventListener(\"transitionend\", handleTransitionEnd);\n onPositionChange(target.corner);\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n el.style.transition = \"\";\n el.style.translate = \"\";\n translationRef.current = { x: 0, y: 0 };\n stateRef.current = \"idle\";\n });\n });\n }\n };\n\n el.style.transition = \"translate 400ms var(--tt-timing-bounce)\";\n el.addEventListener(\"transitionend\", handleTransitionEnd);\n el.style.translate = `${target.translation.x}px ${target.translation.y}px`;\n },\n [onPositionChange],\n );\n\n useEffect(() => {\n if (disabled) return;\n\n const el = ref.current;\n if (!el) return;\n\n const root = el.closest(\"[data-tt-root]\") as HTMLElement | null;\n\n const onPointerDown = (e: PointerEvent) => {\n if (e.button !== 0) return;\n if (stateRef.current === \"animating\") return;\n\n originRef.current = { x: e.clientX, y: e.clientY };\n stateRef.current = \"press\";\n velocitiesRef.current = [];\n\n window.addEventListener(\"pointermove\", onPointerMove);\n window.addEventListener(\"pointerup\", onPointerUp);\n };\n\n const onPointerMove = (e: PointerEvent) => {\n const dx = e.clientX - originRef.current.x;\n const dy = e.clientY - originRef.current.y;\n\n if (stateRef.current === \"press\") {\n const distance = Math.sqrt(dx * dx + dy * dy);\n if (distance >= DRAG_THRESHOLD) {\n stateRef.current = \"drag\";\n setIsDragging(true);\n root?.classList.add(\"tt-grabbing\");\n onDragStart?.();\n }\n }\n\n if (stateRef.current !== \"drag\") return;\n\n translationRef.current = { x: dx, y: dy };\n el.style.translate = `${dx}px ${dy}px`;\n\n const now = Date.now();\n velocitiesRef.current = [\n ...velocitiesRef.current.slice(-5),\n { position: { x: e.clientX, y: e.clientY }, timestamp: now },\n ];\n };\n\n const onPointerUp = () => {\n window.removeEventListener(\"pointermove\", onPointerMove);\n window.removeEventListener(\"pointerup\", onPointerUp);\n root?.classList.remove(\"tt-grabbing\");\n\n if (stateRef.current === \"drag\") {\n const velocity = calculateVelocity();\n const projected = {\n x: translationRef.current.x + project(velocity.x),\n y: translationRef.current.y + project(velocity.y),\n };\n const nearest = getNearestCorner(projected);\n animateToCorner(nearest);\n onDragEnd?.();\n // Reset isDragging after animation completes (prevent click)\n setTimeout(() => setIsDragging(false), 450);\n } else {\n stateRef.current = \"idle\";\n }\n };\n\n el.addEventListener(\"pointerdown\", onPointerDown);\n\n return () => {\n el.removeEventListener(\"pointerdown\", onPointerDown);\n window.removeEventListener(\"pointermove\", onPointerMove);\n window.removeEventListener(\"pointerup\", onPointerUp);\n };\n }, [\n disabled,\n calculateVelocity,\n project,\n getNearestCorner,\n animateToCorner,\n onDragStart,\n onDragEnd,\n ]);\n\n return { ref, isDragging };\n}\n\nexport function useClickOutside(\n ref: React.RefObject<HTMLElement | null>,\n handler: () => void,\n enabled: boolean,\n) {\n // Store handler in ref to avoid re-subscribing on handler changes\n const handlerRef = useRef(handler);\n useEffect(() => {\n handlerRef.current = handler;\n });\n\n useEffect(() => {\n if (!enabled) return;\n\n const listener = (e: MouseEvent | TouchEvent) => {\n const el = ref.current;\n if (!el || el.contains(e.target as Node)) return;\n handlerRef.current();\n };\n\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n handlerRef.current();\n }\n };\n\n document.addEventListener(\"mousedown\", listener);\n document.addEventListener(\"touchstart\", listener);\n document.addEventListener(\"keydown\", onKeyDown);\n\n return () => {\n document.removeEventListener(\"mousedown\", listener);\n document.removeEventListener(\"touchstart\", listener);\n document.removeEventListener(\"keydown\", onKeyDown);\n };\n }, [ref, enabled]);\n}\n","export function BillSDKLogo() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 512 512\" fill=\"none\">\n <rect width=\"512\" height=\"512\" fill=\"currentColor\" opacity=\"0.15\" />\n <text\n x=\"256\"\n y=\"256\"\n dominantBaseline=\"central\"\n textAnchor=\"middle\"\n fontSize=\"384\"\n fontFamily=\"Arial, sans-serif\"\n fontWeight=\"bold\"\n fill=\"currentColor\"\n >\n B\n </text>\n </svg>\n );\n}\n\nexport function CloseIcon() {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n >\n <path d=\"M12 4L4 12M4 4L12 12\" />\n </svg>\n );\n}\n\nexport function ChevronIcon({ open }: { open: boolean }) {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{\n transform: open ? \"rotate(180deg)\" : \"rotate(0deg)\",\n transition: \"transform 150ms ease\",\n }}\n >\n <path d=\"M3 4.5L6 7.5L9 4.5\" />\n </svg>\n );\n}\n","export const OVERLAY_STYLES = `\n[data-tt-root] {\n /* Sage Clay Palette (BillSDK) - Minimal */\n --tt-bg: #1c1e1d;\n --tt-bg-subtle: #222524;\n --tt-text: #e8ece6;\n --tt-text-muted: #8a8e88;\n --tt-border: hsla(100, 6%, 32%, 40%);\n --tt-danger: #ef4444;\n --tt-success: #6ee7b7;\n\n /* Timing */\n --tt-timing: cubic-bezier(0.23, 0.88, 0.26, 0.92);\n --tt-timing-bounce: linear(0 0%, 0.006 1%, 0.022 2%, 0.047 3%, 0.078 4%, 0.114 5%, 0.154 6%, 0.197 7%, 0.242 8%, 0.288 9%, 0.334 10%, 0.38 11%, 0.425 12%, 0.469 13%, 0.511 14%, 0.552 15%, 0.591 16%, 0.627 17%, 0.662 18%, 0.695 19%, 0.726 20%, 0.754 21%, 0.78 22%, 0.805 23%, 0.827 24%, 0.848 25%, 0.867 26%, 0.884 27%, 0.899 28%, 0.913 29%, 0.926 30%, 0.937 31%, 0.947 32%, 0.956 33%, 0.964 34%, 0.971 35%, 0.977 36%, 0.982 37%, 0.987 38%, 0.991 39%, 0.994 40%, 0.997 41%, 1 42%, 1.002 43%, 1.003 44%, 1.005 45%, 1.006 46%, 1.007 47%, 1.007 48%, 1.008 49%, 1.008 50%, 1.008 51%, 1.008 52%, 1.008 53%, 1.008 54%, 1.007 55%, 1.007 56%, 1.007 57%, 1.007 58%, 1.006 59%, 1.006 60%, 1.006 61%, 1.005 62%, 1.005 63%, 1.004 64%, 1.004 65%, 1.004 66%, 1.003 67%, 1.003 68%, 1.003 69%, 1.003 70%, 1.002 71%, 1.002 72%, 1.002 73%, 1.002 74%, 1.001 75%, 1.001 76%, 1.001 77%, 1.001 78%, 1.001 79%, 1.001 80%, 1.001 81%, 1 82%, 1 83%, 1 84%, 1 85%, 1 86%, 1 87%, 1 88%, 1 89%, 1 90%);\n\n /* Spacing */\n --tt-padding: 20px;\n\n /* Font */\n --tt-font: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n --tt-font-mono: ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, monospace;\n\n font-family: var(--tt-font);\n font-size: 14px;\n line-height: 1.5;\n -webkit-font-smoothing: antialiased;\n}\n\n/* Badge */\n[data-tt-badge] {\n display: flex;\n align-items: center;\n gap: 8px;\n height: 36px;\n padding: 0 12px;\n background: var(--tt-bg);\n border: 1px solid var(--tt-border);\n color: var(--tt-text);\n font-family: var(--tt-font);\n font-size: 13px;\n font-weight: 500;\n cursor: grab;\n user-select: none;\n white-space: nowrap;\n transition: background 150ms ease;\n touch-action: manipulation;\n -webkit-tap-highlight-color: transparent;\n}\n\n[data-tt-badge]:hover {\n background: var(--tt-bg-subtle);\n}\n\n[data-tt-badge]:active {\n cursor: grabbing;\n}\n\n[data-tt-badge][data-simulated=\"true\"] {\n background: var(--tt-success);\n border-color: var(--tt-success);\n color: var(--tt-bg);\n}\n\n[data-tt-badge][data-simulated=\"true\"]:hover {\n filter: brightness(0.95);\n}\n\n[data-tt-badge-icon] {\n display: flex;\n width: 16px;\n height: 16px;\n}\n\n[data-tt-badge-count] {\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n background: var(--tt-text-muted);\n font-size: 11px;\n font-weight: 600;\n color: var(--tt-bg);\n}\n\n/* Panel */\n[data-tt-panel] {\n width: 308px;\n background: var(--tt-bg);\n border: 1px solid var(--tt-border);\n overflow: hidden;\n opacity: 0;\n transform: scale(0.96);\n transform-origin: var(--tt-panel-origin, bottom right);\n transition: opacity 200ms var(--tt-timing), transform 200ms var(--tt-timing);\n}\n\n[data-tt-panel][data-visible=\"true\"] {\n opacity: 1;\n transform: scale(1);\n}\n\n[data-tt-panel-header] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 12px;\n border-bottom: 1px solid var(--tt-border);\n}\n\n[data-tt-panel-header][data-simulated=\"true\"] {\n background: rgba(110, 231, 183, 0.1);\n}\n\n[data-tt-panel-title] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n font-weight: 600;\n color: var(--tt-text);\n}\n\n[data-tt-panel-close] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n background: transparent;\n border: none;\n color: var(--tt-text-muted);\n cursor: pointer;\n}\n\n[data-tt-panel-close]:hover {\n color: var(--tt-text);\n}\n\n[data-tt-panel-content] {\n padding: 12px;\n}\n\n/* Time Display */\n[data-tt-time-display] {\n padding: 10px 12px;\n background: var(--tt-bg-subtle);\n margin-bottom: 12px;\n}\n\n[data-tt-time-label] {\n font-size: 11px;\n font-weight: 500;\n color: var(--tt-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n margin-bottom: 2px;\n}\n\n[data-tt-time-value] {\n font-size: 15px;\n font-weight: 600;\n color: var(--tt-text);\n}\n\n[data-tt-time-sub] {\n font-size: 12px;\n color: var(--tt-text-muted);\n}\n\n/* Buttons - All use same base style */\n[data-tt-actions] {\n display: flex;\n gap: 6px;\n margin-bottom: 12px;\n}\n\n[data-tt-action],\n[data-tt-btn-primary],\n[data-tt-btn-reset] {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n height: 32px;\n padding: 0 12px;\n background: var(--tt-bg-subtle);\n border: none;\n font-family: var(--tt-font);\n font-size: 12px;\n font-weight: 500;\n color: var(--tt-text);\n cursor: pointer;\n transition: filter 150ms ease;\n}\n\n[data-tt-action]:hover:not(:disabled),\n[data-tt-btn-primary]:hover:not(:disabled),\n[data-tt-btn-reset]:hover:not(:disabled) {\n filter: brightness(0.85);\n}\n\n[data-tt-action]:disabled,\n[data-tt-btn-primary]:disabled,\n[data-tt-btn-reset]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* Primary variant */\n[data-tt-btn-primary] {\n background: var(--tt-text);\n color: var(--tt-bg);\n}\n\n/* Destructive variant */\n[data-tt-btn-reset] {\n background: var(--tt-danger);\n color: var(--tt-bg);\n}\n\n/* Input */\n[data-tt-input] {\n flex: 1;\n height: 32px;\n padding: 0 10px;\n background: var(--tt-bg-subtle);\n border: 1px solid var(--tt-border);\n font-family: var(--tt-font);\n font-size: 13px;\n color: var(--tt-text);\n color-scheme: dark;\n}\n\n[data-tt-input]:focus {\n border-color: var(--tt-text-muted);\n}\n\n[data-tt-input]:focus:not(:focus-visible) {\n outline: none;\n}\n\n[data-tt-input]::placeholder {\n color: var(--tt-text-muted);\n}\n\n/* Result */\n[data-tt-result] {\n padding: 10px;\n background: var(--tt-bg-subtle);\n margin-bottom: 12px;\n}\n\n[data-tt-result][data-has-errors=\"true\"] {\n background: rgba(239, 68, 68, 0.1);\n}\n\n[data-tt-result-grid] {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 4px;\n font-size: 12px;\n}\n\n[data-tt-result-item] {\n color: var(--tt-text-muted);\n}\n\n[data-tt-result-value] {\n font-weight: 600;\n color: var(--tt-text);\n}\n\n[data-tt-result-value][data-success] {\n color: var(--tt-success);\n}\n\n[data-tt-result-value][data-danger] {\n color: var(--tt-danger);\n}\n\n/* Customer Info */\n[data-tt-customer] {\n padding: 8px 10px;\n background: var(--tt-bg-subtle);\n font-size: 12px;\n color: var(--tt-text);\n margin-bottom: 12px;\n}\n\n[data-tt-customer] strong {\n font-family: var(--tt-font-mono);\n}\n\n/* Customers List */\n[data-tt-customers-toggle] {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 10px;\n background: var(--tt-bg-subtle);\n border: none;\n font-family: var(--tt-font);\n font-size: 12px;\n font-weight: 500;\n color: var(--tt-text);\n cursor: pointer;\n transition: filter 150ms ease;\n}\n\n[data-tt-customers-toggle]:hover {\n filter: brightness(0.85);\n}\n\n[data-tt-customers-list] {\n margin-top: 8px;\n max-height: 120px;\n overflow-y: auto;\n border: 1px solid var(--tt-border);\n}\n\n[data-tt-customer-item] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 6px 10px;\n font-size: 11px;\n border-bottom: 1px solid var(--tt-border);\n}\n\n[data-tt-customer-item]:last-child {\n border-bottom: none;\n}\n\n[data-tt-customer-item][data-active=\"true\"] {\n background: var(--tt-bg-subtle);\n}\n\n[data-tt-customer-id] {\n font-family: var(--tt-font-mono);\n color: var(--tt-text);\n}\n\n[data-tt-customer-date] {\n color: var(--tt-text-muted);\n}\n\n/* Footer */\n[data-tt-footer] {\n padding: 6px 12px;\n border-top: 1px solid var(--tt-border);\n font-size: 10px;\n font-weight: 500;\n color: var(--tt-danger);\n text-align: center;\n}\n\n/* Grabbing state */\n[data-tt-root].tt-grabbing {\n cursor: grabbing !important;\n}\n\n[data-tt-root].tt-grabbing * {\n cursor: grabbing !important;\n user-select: none !important;\n}\n\n/* Empty state */\n[data-tt-empty] {\n padding: 20px;\n text-align: center;\n color: var(--tt-text-muted);\n font-size: 13px;\n}\n\n/* Label */\n[data-tt-label] {\n display: block;\n font-size: 11px;\n font-weight: 500;\n color: var(--tt-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n margin-bottom: 6px;\n}\n\n/* Focus visible */\n[data-tt-input]:focus-visible {\n outline: 2px solid var(--tt-text-muted);\n outline-offset: 1px;\n border-color: transparent;\n}\n\n[data-tt-badge]:focus-visible,\n[data-tt-action]:focus-visible,\n[data-tt-btn-primary]:focus-visible,\n[data-tt-btn-reset]:focus-visible,\n[data-tt-panel-close]:focus-visible,\n[data-tt-customers-toggle]:focus-visible {\n outline: 2px solid var(--tt-text-muted);\n outline-offset: 2px;\n}\n\n/* Reduced motion */\n@media (prefers-reduced-motion: reduce) {\n [data-tt-panel],\n [data-tt-badge],\n [data-tt-customers-toggle],\n [data-tt-action],\n [data-tt-btn-primary],\n [data-tt-btn-reset],\n [data-tt-input] {\n transition: none !important;\n }\n}\n`;\n"],"mappings":"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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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","names":["useCallback","useEffect","useRef","useState","jsx","jsxs","useState","useRef","useCallback","useEffect"]}
|