@spacesync/client 0.1.2 → 0.1.3

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/live-space/layout-canvas-types.ts","../src/live-space/layout-canvas-view.tsx"],"names":[],"mappings":"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","file":"layout-canvas-view.js","sourcesContent":["export type LayoutCanvasResourceType = \"desks\" | \"rooms\" | \"other\";\n\nexport interface LayoutCanvasRect {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nexport interface LayoutCanvasFloorLayout {\n placedItems: Record<string, LayoutCanvasRect>;\n bgImage: string | null;\n canvasWidth?: number;\n canvasHeight?: number;\n}\n\nexport const DEFAULT_CANVAS_WIDTH = 1200;\nexport const DEFAULT_CANVAS_HEIGHT = 900;\n\nexport interface LayoutCanvasPlanHint {\n id: string;\n name: string;\n color?: string;\n}\n","import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type PointerEvent as ReactPointerEvent,\n} from \"react\";\nimport { Armchair, Box, Calendar, DoorOpen, Maximize2, Minus, Plus } from \"lucide-react\";\nimport {\n DEFAULT_CANVAS_HEIGHT,\n DEFAULT_CANVAS_WIDTH,\n type LayoutCanvasFloorLayout,\n type LayoutCanvasPlanHint,\n type LayoutCanvasResourceType,\n} from \"./layout-canvas-types\";\nimport { LIVE_RESOURCE_TYPE_META } from \"./live-resource-meta\";\nimport { PageListSearchField } from \"../shell/page-list-chrome\";\nimport {\n Button,\n cn,\n Popover,\n PopoverAnchor,\n PopoverContent,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"../ui\";\nimport { useTheme } from \"../theme/theme-provider\";\n\ninterface Rect {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nexport interface LayoutCanvasViewRow {\n resource: {\n id: string;\n name: string;\n pricingPlanId: string;\n resourceType: LayoutCanvasResourceType;\n totalSlots?: number;\n };\n merged: { occupied: boolean; manual?: boolean; expectedFreeLabel?: string };\n plan?: LayoutCanvasPlanHint;\n}\n\nexport interface LayoutCanvasResourceQuickBook {\n /** When omitted, popover shows that booking is unavailable for this member. */\n onBook?: (resourceId: string) => void;\n /** Optional href for the book action (middle-click / fallback). */\n getBookingHref?: (resourceId: string) => string;\n}\n\nexport interface LayoutCanvasViewProps {\n layout: LayoutCanvasFloorLayout;\n rows: LayoutCanvasViewRow[];\n onResourceSelect?: (id: string) => void;\n /** Hover/tap popover with a quick book action (member live space). */\n resourceQuickBook?: LayoutCanvasResourceQuickBook;\n /** When set with `onSearchQueryChange`, shows a search bar and dims non-matching resources. */\n searchQuery?: string;\n onSearchQueryChange?: (value: string) => void;\n searchPlaceholder?: string;\n}\n\nexport function matchesCanvasResourceSearch(\n resourceName: string,\n planName: string | undefined,\n query: string,\n): boolean {\n const q = query.trim().toLowerCase();\n if (!q) return true;\n const name = resourceName.toLowerCase();\n const plan = planName?.toLowerCase() ?? \"\";\n return name.includes(q) || plan.includes(q);\n}\n\nfunction resourceMatchesSearch(row: LayoutCanvasViewRow, query: string): boolean {\n return matchesCanvasResourceSearch(row.resource.name, row.plan?.name, query);\n}\n\nconst CLICK_THRESHOLD_PX = 5;\nconst POPOVER_CLOSE_DELAY_MS = 250;\nconst CANVAS_QUICK_BOOK_POPOVER_CLASS =\n \"z-[100] w-56 border-border bg-card p-3 text-card-foreground shadow-lg\";\n\nfunction usePrefersHover() {\n const [prefersHover, setPrefersHover] = useState(\n () => typeof window !== \"undefined\" && window.matchMedia(\"(hover: hover)\").matches,\n );\n\n useEffect(() => {\n const mql = window.matchMedia(\"(hover: hover)\");\n const onChange = () => setPrefersHover(mql.matches);\n mql.addEventListener(\"change\", onChange);\n return () => mql.removeEventListener(\"change\", onChange);\n }, []);\n\n return prefersHover;\n}\n\ntype PopoverHoverHandlers = {\n prefersHover: boolean;\n clearClose: () => void;\n scheduleClose: () => void;\n};\n\ntype ResourceQuickBookConfig = {\n quickBook: LayoutCanvasResourceQuickBook;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n hover: PopoverHoverHandlers;\n onOpen: () => void;\n onToggle: () => void;\n shouldIgnoreToggle: () => boolean;\n};\n\nfunction isCanvasResourceTarget(target: EventTarget | null): boolean {\n return target instanceof HTMLElement && target.closest(\"[data-canvas-resource]\") != null;\n}\n\nfunction ResourceQuickBookPopoverContent({\n row,\n onBook,\n getBookingHref,\n}: {\n row: LayoutCanvasViewRow;\n onBook?: (resourceId: string) => void;\n getBookingHref?: (resourceId: string) => string;\n}) {\n const { resource, merged } = row;\n const meta = LIVE_RESOURCE_TYPE_META[resource.resourceType];\n const TypeIcon = meta.Icon;\n const bookingHref = getBookingHref?.(resource.id);\n\n const handleBookPointerDown = (e: ReactPointerEvent) => {\n // Radix popover can close before click fires; book on pointerdown instead.\n e.preventDefault();\n e.stopPropagation();\n onBook?.(resource.id);\n };\n\n const bookLabel = (\n <>\n <Calendar size={14} />\n Book\n </>\n );\n\n return (\n <div className=\"space-y-3\">\n <div className=\"flex min-w-0 items-start gap-2.5\">\n <span\n className={cn(\n \"flex h-8 w-8 shrink-0 items-center justify-center rounded-lg border\",\n meta.iconTile,\n )}\n aria-hidden\n >\n <TypeIcon size={16} strokeWidth={1.75} />\n </span>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-semibold leading-snug text-card-foreground\">\n {resource.name}\n </p>\n <span\n className={cn(\n \"mt-1.5 inline-flex items-center gap-1 rounded-full border px-2 py-0.5 text-[11px] font-medium\",\n merged.occupied\n ? \"border-red-100 bg-red-50 text-red-700 dark:border-red-900/50 dark:bg-red-950/50 dark:text-red-300\"\n : \"border-emerald-100 bg-emerald-50 text-emerald-800 dark:border-emerald-900/50 dark:bg-emerald-950/50 dark:text-emerald-300\",\n )}\n >\n <span\n className={cn(\n \"h-1.5 w-1.5 shrink-0 rounded-full\",\n merged.occupied ? \"bg-red-500\" : \"bg-emerald-500\",\n )}\n />\n {merged.occupied ? \"Occupied\" : \"Free\"}\n </span>\n {merged.occupied && merged.expectedFreeLabel && merged.expectedFreeLabel !== \"—\" ? (\n <p className=\"mt-1 text-xs text-muted-foreground\">{merged.expectedFreeLabel}</p>\n ) : null}\n </div>\n </div>\n {onBook ? (\n bookingHref ? (\n <Button asChild size=\"sm\" className=\"w-full\">\n <a href={bookingHref} onPointerDown={handleBookPointerDown}>\n {bookLabel}\n </a>\n </Button>\n ) : (\n <Button\n type=\"button\"\n size=\"sm\"\n className=\"w-full\"\n onPointerDown={handleBookPointerDown}\n >\n {bookLabel}\n </Button>\n )\n ) : (\n <p className=\"text-xs leading-relaxed text-muted-foreground\">\n Booking is not available for your account.\n </p>\n )}\n </div>\n );\n}\n\nconst MIN_ZOOM = 0.12;\nconst MAX_ZOOM = 4;\nconst MIN_CARD_W = 90;\nconst MIN_CARD_H = 56;\nconst CANVAS_GRID_SIZE = 40;\n\nfunction canvasGridBackground(isDark: boolean): string {\n const line = isDark ? \"oklch(0.35 0 0)\" : \"#e5e7eb\";\n return (\n `linear-gradient(to right, ${line} 1px, transparent 1px),` +\n `linear-gradient(to bottom, ${line} 1px, transparent 1px)`\n );\n}\n\nconst CANVAS_GRID_BG_SIZE = `${CANVAS_GRID_SIZE}px ${CANVAS_GRID_SIZE}px`;\n\nconst TYPE_META_CARD: Record<\n LayoutCanvasResourceType,\n {\n border: string;\n bg: string;\n iconBg: string;\n iconColor: string;\n badgeBg: string;\n badgeText: string;\n }\n> = {\n desks: {\n border: \"border-amber-200\",\n bg: \"bg-card\",\n iconBg: \"bg-amber-100\",\n iconColor: \"text-amber-600\",\n badgeBg: \"bg-amber-50\",\n badgeText: \"text-amber-700\",\n },\n rooms: {\n border: \"border-blue-200\",\n bg: \"bg-card\",\n iconBg: \"bg-blue-100\",\n iconColor: \"text-blue-600 dark:text-blue-400\",\n badgeBg: \"bg-blue-50\",\n badgeText: \"text-blue-700 dark:text-blue-400\",\n },\n other: {\n border: \"border-slate-200\",\n bg: \"bg-card\",\n iconBg: \"bg-slate-100\",\n iconColor: \"text-slate-600\",\n badgeBg: \"bg-slate-50\",\n badgeText: \"text-slate-600\",\n },\n};\n\nconst TYPE_ICON: Record<LayoutCanvasResourceType, typeof Armchair> = {\n desks: Armchair,\n rooms: DoorOpen,\n other: Box,\n};\n\nfunction isFloorResourceType(type: LayoutCanvasResourceType): boolean {\n return type === \"desks\" || type === \"rooms\";\n}\n\nfunction poolSlotsLabel(totalSlots: number | undefined): string | null {\n if (totalSlots == null) return null;\n return `${totalSlots} slot${totalSlots !== 1 ? \"s\" : \"\"}`;\n}\n\nfunction PoolResourceChip({\n row,\n onClick,\n quickBookConfig,\n searchQuery,\n isMatch,\n}: {\n row: LayoutCanvasViewRow;\n onClick?: () => void;\n quickBookConfig?: ResourceQuickBookConfig;\n searchQuery: string;\n isMatch: boolean;\n}) {\n const { resource, merged } = row;\n const m = TYPE_META_CARD.other;\n const slots = poolSlotsLabel(resource.totalSlots);\n const searchActive = searchQuery.trim().length > 0;\n\n const chip = (\n <button\n type=\"button\"\n data-canvas-resource=\"\"\n onClick={(e) => {\n e.stopPropagation();\n if (quickBookConfig) {\n if (!quickBookConfig.shouldIgnoreToggle()) quickBookConfig.onToggle();\n } else onClick?.();\n }}\n onMouseEnter={() => {\n if (quickBookConfig?.hover.prefersHover) {\n quickBookConfig.hover.clearClose();\n quickBookConfig.onOpen();\n }\n }}\n onMouseLeave={() => {\n if (quickBookConfig?.hover.prefersHover) quickBookConfig.hover.scheduleClose();\n }}\n className={cn(\n \"inline-flex items-center gap-2 shrink-0 px-3 py-1.5 rounded-lg border bg-card hover:bg-accent transition-colors text-left\",\n m.border,\n searchActive && !isMatch && \"opacity-40 saturate-50\",\n )}\n >\n <div\n className={cn(\n \"w-6 h-6 rounded-md flex items-center justify-center shrink-0\",\n m.iconBg,\n m.iconColor,\n )}\n >\n <Box size={12} />\n </div>\n <span className=\"text-xs font-medium text-foreground whitespace-nowrap\">{resource.name}</span>\n <span\n className={cn(\n \"h-2 w-2 rounded-full shrink-0\",\n merged.occupied ? \"bg-red-500\" : \"bg-emerald-500\",\n )}\n />\n {slots && (\n <span className=\"text-[10px] text-muted-foreground whitespace-nowrap\">{slots}</span>\n )}\n </button>\n );\n\n if (!quickBookConfig) return chip;\n\n return (\n <Popover\n modal={false}\n open={quickBookConfig.open}\n onOpenChange={quickBookConfig.onOpenChange}\n >\n <PopoverAnchor asChild>{chip}</PopoverAnchor>\n <PopoverContent\n side=\"top\"\n align=\"center\"\n sideOffset={6}\n className={CANVAS_QUICK_BOOK_POPOVER_CLASS}\n onOpenAutoFocus={(e) => e.preventDefault()}\n onMouseEnter={quickBookConfig.hover.clearClose}\n onMouseLeave={quickBookConfig.hover.scheduleClose}\n >\n <ResourceQuickBookPopoverContent\n row={row}\n onBook={quickBookConfig.quickBook.onBook}\n getBookingHref={quickBookConfig.quickBook.getBookingHref}\n />\n </PopoverContent>\n </Popover>\n );\n}\n\nfunction PlacedCardView({\n id,\n rect,\n row,\n onSelect,\n quickBookConfig,\n searchQuery,\n isMatch,\n}: {\n id: string;\n rect: Rect;\n row: LayoutCanvasViewRow;\n onSelect?: (id: string) => void;\n quickBookConfig?: ResourceQuickBookConfig;\n searchQuery: string;\n isMatch: boolean;\n}) {\n const { resource, merged, plan } = row;\n const type = resource.resourceType;\n const m = TYPE_META_CARD[type];\n const TypeIcon = TYPE_ICON[type];\n const w = Math.max(rect.w, MIN_CARD_W);\n const h = Math.max(rect.h, MIN_CARD_H);\n const statusLabel = merged.occupied ? \"Occupied\" : merged.manual ? \"Vacant\" : \"Free\";\n const pointerStart = useRef<{ x: number; y: number } | null>(null);\n const searchActive = searchQuery.trim().length > 0;\n\n const handlePointerDown = (e: ReactPointerEvent) => {\n if (e.button !== 0) return;\n // Keep viewport pan/zoom from capturing the pointer before tap completes.\n e.stopPropagation();\n pointerStart.current = { x: e.clientX, y: e.clientY };\n };\n\n const handlePointerUp = (e: ReactPointerEvent) => {\n e.stopPropagation();\n const start = pointerStart.current;\n pointerStart.current = null;\n if (!start || quickBookConfig) return;\n if (Math.hypot(e.clientX - start.x, e.clientY - start.y) < CLICK_THRESHOLD_PX) {\n onSelect?.(id);\n }\n };\n\n const statusDot = (\n <span\n className={cn(\n \"block h-2.5 w-2.5 rounded-full ring-2 ring-white shadow-sm\",\n merged.occupied ? \"bg-red-500 animate-pulse\" : \"bg-emerald-500\",\n )}\n aria-label={statusLabel}\n />\n );\n\n const card = (\n <button\n type=\"button\"\n data-canvas-resource=\"\"\n style={{\n position: \"absolute\",\n left: rect.x,\n top: rect.y,\n width: w,\n height: h,\n touchAction: \"manipulation\",\n }}\n className={cn(\n \"rounded-xl border shadow-sm overflow-hidden select-none text-left cursor-pointer hover:shadow-md transition-shadow focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500/40\",\n m.border,\n m.bg,\n searchActive && !isMatch && \"opacity-40 saturate-50\",\n )}\n onPointerDown={handlePointerDown}\n onPointerUp={handlePointerUp}\n onPointerCancel={handlePointerUp}\n onClick={(e) => {\n e.stopPropagation();\n if (quickBookConfig && !quickBookConfig.shouldIgnoreToggle()) {\n quickBookConfig.onToggle();\n }\n }}\n onMouseEnter={() => {\n if (quickBookConfig?.hover.prefersHover) {\n quickBookConfig.hover.clearClose();\n quickBookConfig.onOpen();\n }\n }}\n onMouseLeave={() => {\n if (quickBookConfig?.hover.prefersHover) quickBookConfig.hover.scheduleClose();\n }}\n >\n <div className=\"absolute top-2 right-2 z-10 pointer-events-none\">\n {quickBookConfig ? (\n statusDot\n ) : (\n <Tooltip>\n <TooltipTrigger asChild>{statusDot}</TooltipTrigger>\n <TooltipContent side=\"top\" className=\"text-xs\">\n {statusLabel}\n </TooltipContent>\n </Tooltip>\n )}\n </div>\n\n <div className=\"absolute inset-0 flex flex-col justify-between p-3 pointer-events-none\">\n <div className=\"flex items-start gap-2 min-w-0 pr-4\">\n <div\n className={cn(\n \"shrink-0 rounded-lg flex items-center justify-center\",\n m.iconBg,\n m.iconColor,\n )}\n style={{ width: 28, height: 28 }}\n >\n <TypeIcon size={14} strokeWidth={2} />\n </div>\n <span\n className=\"text-xs font-semibold text-foreground leading-tight pt-0.5 line-clamp-2 min-w-0 flex-1\"\n style={{ wordBreak: \"break-word\" }}\n >\n {resource.name}\n </span>\n </div>\n\n {plan && (\n <span\n className={cn(\n \"text-[9px] font-medium px-1.5 py-0.5 rounded-md self-start\",\n m.badgeBg,\n m.badgeText,\n )}\n >\n {plan.name}\n </span>\n )}\n </div>\n </button>\n );\n\n if (!quickBookConfig) return card;\n\n return (\n <Popover\n modal={false}\n open={quickBookConfig.open}\n onOpenChange={quickBookConfig.onOpenChange}\n >\n <PopoverAnchor asChild>{card}</PopoverAnchor>\n <PopoverContent\n side=\"top\"\n align=\"center\"\n sideOffset={6}\n className={CANVAS_QUICK_BOOK_POPOVER_CLASS}\n onOpenAutoFocus={(e) => e.preventDefault()}\n onMouseEnter={quickBookConfig.hover.clearClose}\n onMouseLeave={quickBookConfig.hover.scheduleClose}\n >\n <ResourceQuickBookPopoverContent\n row={row}\n onBook={quickBookConfig.quickBook.onBook}\n getBookingHref={quickBookConfig.quickBook.getBookingHref}\n />\n </PopoverContent>\n </Popover>\n );\n}\n\ntype PanGesture = {\n type: \"pan\";\n startMX: number;\n startMY: number;\n startPanX: number;\n startPanY: number;\n};\n\nexport function LayoutCanvasView({\n layout,\n rows,\n onResourceSelect,\n resourceQuickBook,\n searchQuery = \"\",\n onSearchQueryChange,\n searchPlaceholder = \"Search resources…\",\n}: LayoutCanvasViewProps) {\n const { resolvedTheme } = useTheme();\n const isDarkCanvas = resolvedTheme === \"dark\";\n const { placedItems, bgImage } = layout;\n const prefersHover = usePrefersHover();\n\n const canvasSize = useMemo(\n () => ({\n w: layout.canvasWidth ?? DEFAULT_CANVAS_WIDTH,\n h: layout.canvasHeight ?? DEFAULT_CANVAS_HEIGHT,\n }),\n [layout.canvasWidth, layout.canvasHeight],\n );\n\n const [zoom, setZoom] = useState(0.5);\n const [pan, setPan] = useState({ x: 40, y: 40 });\n const [isPanning, setIsPanning] = useState(false);\n const [openResourceId, setOpenResourceId] = useState<string | null>(null);\n\n const viewportRef = useRef<HTMLDivElement>(null);\n const gestureRef = useRef<PanGesture | null>(null);\n const zoomRef = useRef(zoom);\n const panRef = useRef(pan);\n const popoverCloseTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const suppressResourceToggleRef = useRef(false);\n\n const clearPopoverCloseTimer = useCallback(() => {\n if (popoverCloseTimerRef.current) {\n clearTimeout(popoverCloseTimerRef.current);\n popoverCloseTimerRef.current = null;\n }\n }, []);\n\n const schedulePopoverClose = useCallback(() => {\n clearPopoverCloseTimer();\n popoverCloseTimerRef.current = setTimeout(() => {\n setOpenResourceId(null);\n popoverCloseTimerRef.current = null;\n }, POPOVER_CLOSE_DELAY_MS);\n }, [clearPopoverCloseTimer]);\n\n const popoverHover = useMemo<PopoverHoverHandlers>(\n () => ({\n prefersHover,\n clearClose: clearPopoverCloseTimer,\n scheduleClose: schedulePopoverClose,\n }),\n [prefersHover, clearPopoverCloseTimer, schedulePopoverClose],\n );\n\n const openPopover = useCallback(\n (id: string) => {\n clearPopoverCloseTimer();\n setOpenResourceId(id);\n },\n [clearPopoverCloseTimer],\n );\n\n const togglePopover = useCallback(\n (id: string) => {\n clearPopoverCloseTimer();\n setOpenResourceId((current) => (current === id ? null : id));\n },\n [clearPopoverCloseTimer],\n );\n\n useEffect(() => () => clearPopoverCloseTimer(), [clearPopoverCloseTimer]);\n\n useEffect(() => {\n zoomRef.current = zoom;\n }, [zoom]);\n useEffect(() => {\n panRef.current = pan;\n }, [pan]);\n\n const rowById = useMemo(() => new Map(rows.map((r) => [r.resource.id, r])), [rows]);\n const otherRows = useMemo(\n () => rows.filter((r) => r.resource.resourceType === \"other\"),\n [rows],\n );\n\n const fitCanvas = useCallback(() => {\n const vp = viewportRef.current;\n if (!vp) return;\n const vpRect = vp.getBoundingClientRect();\n const newZoom = Math.max(\n MIN_ZOOM,\n Math.min(\n MAX_ZOOM,\n Math.min((vpRect.width - 80) / canvasSize.w, (vpRect.height - 80) / canvasSize.h),\n ),\n );\n setPan({\n x: (vpRect.width - canvasSize.w * newZoom) / 2,\n y: (vpRect.height - canvasSize.h * newZoom) / 2,\n });\n setZoom(newZoom);\n }, [canvasSize.h, canvasSize.w]);\n\n useEffect(() => {\n fitCanvas();\n }, [fitCanvas]);\n\n useEffect(() => {\n const el = viewportRef.current;\n if (!el) return;\n const onWheel = (e: WheelEvent) => {\n e.preventDefault();\n const vpRect = el.getBoundingClientRect();\n const mx = e.clientX - vpRect.left;\n const my = e.clientY - vpRect.top;\n const factor = e.deltaY < 0 ? 1.08 : 1 / 1.08;\n const curZ = zoomRef.current;\n const newZ = Math.max(MIN_ZOOM, Math.min(MAX_ZOOM, curZ * factor));\n const curP = panRef.current;\n setZoom(newZ);\n setPan({\n x: mx - (mx - curP.x) * (newZ / curZ),\n y: my - (my - curP.y) * (newZ / curZ),\n });\n };\n el.addEventListener(\"wheel\", onWheel, { passive: false });\n return () => el.removeEventListener(\"wheel\", onWheel);\n }, []);\n\n const stepZoom = (delta: number) => {\n const vp = viewportRef.current;\n const curZ = zoomRef.current;\n const newZ = Math.max(MIN_ZOOM, Math.min(MAX_ZOOM, curZ + delta));\n if (vp) {\n const vpRect = vp.getBoundingClientRect();\n const cx = vpRect.width / 2;\n const cy = vpRect.height / 2;\n const curP = panRef.current;\n setPan({\n x: cx - (cx - curP.x) * (newZ / curZ),\n y: cy - (cy - curP.y) * (newZ / curZ),\n });\n }\n setZoom(newZ);\n };\n\n useEffect(() => {\n const onKeyDown = (e: KeyboardEvent) => {\n const tag = (e.target as HTMLElement)?.tagName;\n if (tag === \"INPUT\" || tag === \"TEXTAREA\" || tag === \"SELECT\") return;\n if (e.key === \"+\" || e.key === \"=\") {\n e.preventDefault();\n stepZoom(0.15);\n } else if (e.key === \"-\" || e.key === \"_\") {\n e.preventDefault();\n stepZoom(-0.15);\n }\n };\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n });\n\n const handleViewportPointerDown = (e: React.PointerEvent) => {\n if (e.button !== 0 && e.button !== 1) return;\n if (isCanvasResourceTarget(e.target)) return;\n clearPopoverCloseTimer();\n setOpenResourceId(null);\n e.preventDefault();\n e.currentTarget.setPointerCapture(e.pointerId);\n setIsPanning(true);\n gestureRef.current = {\n type: \"pan\",\n startMX: e.clientX,\n startMY: e.clientY,\n startPanX: panRef.current.x,\n startPanY: panRef.current.y,\n };\n };\n\n const handleViewportPointerMove = (e: React.PointerEvent) => {\n const g = gestureRef.current;\n if (g?.type !== \"pan\") return;\n setPan({\n x: g.startPanX + (e.clientX - g.startMX),\n y: g.startPanY + (e.clientY - g.startMY),\n });\n };\n\n const handleViewportPointerUp = () => {\n if (gestureRef.current?.type === \"pan\") {\n gestureRef.current = null;\n setIsPanning(false);\n }\n };\n\n const handleSelect = (id: string) => onResourceSelect?.(id);\n\n const quickBookConfigFor = useCallback(\n (resourceId: string): ResourceQuickBookConfig | undefined => {\n if (!resourceQuickBook) return undefined;\n const wrappedOnBook = resourceQuickBook.onBook\n ? (id: string) => {\n suppressResourceToggleRef.current = true;\n clearPopoverCloseTimer();\n setOpenResourceId(null);\n resourceQuickBook.onBook?.(id);\n window.setTimeout(() => {\n suppressResourceToggleRef.current = false;\n }, 400);\n }\n : undefined;\n\n return {\n quickBook: {\n ...resourceQuickBook,\n onBook: wrappedOnBook,\n },\n open: openResourceId === resourceId,\n onOpenChange: (open) => {\n clearPopoverCloseTimer();\n setOpenResourceId(open ? resourceId : null);\n },\n hover: popoverHover,\n onOpen: () => openPopover(resourceId),\n onToggle: () => togglePopover(resourceId),\n shouldIgnoreToggle: () => suppressResourceToggleRef.current,\n };\n },\n [\n resourceQuickBook,\n openResourceId,\n clearPopoverCloseTimer,\n popoverHover,\n openPopover,\n togglePopover,\n ],\n );\n\n return (\n <div className=\"flex flex-col flex-1 min-h-0 bg-card\">\n <div className=\"flex flex-wrap items-center gap-2 p-2 border-b border-border bg-card shrink-0\">\n {onSearchQueryChange != null ? (\n <PageListSearchField\n value={searchQuery}\n onChange={onSearchQueryChange}\n placeholder={searchPlaceholder}\n className=\"min-w-0 flex-1 max-w-md h-9\"\n />\n ) : null}\n <div className=\"flex items-center gap-1 shrink-0 ml-auto\">\n <button\n type=\"button\"\n onClick={() => stepZoom(-0.15)}\n className=\"w-7 h-7 rounded-lg border border-border bg-card flex items-center justify-center text-muted-foreground hover:bg-accent transition-colors\"\n aria-label=\"Zoom out\"\n >\n <Minus size={12} />\n </button>\n <span className=\"text-xs text-muted-foreground w-10 text-center tabular-nums select-none\">\n {Math.round(zoom * 100)}%\n </span>\n <button\n type=\"button\"\n onClick={() => stepZoom(0.15)}\n className=\"w-7 h-7 rounded-lg border border-border bg-card flex items-center justify-center text-muted-foreground hover:bg-accent transition-colors\"\n aria-label=\"Zoom in\"\n >\n <Plus size={12} />\n </button>\n <button\n type=\"button\"\n onClick={fitCanvas}\n className=\"inline-flex items-center gap-1 px-2.5 h-7 rounded-lg border border-border bg-card text-xs text-muted-foreground hover:bg-accent transition-colors\"\n >\n <Maximize2 size={11} />\n Fit\n </button>\n </div>\n </div>\n\n <div className=\"flex flex-col flex-1 min-w-0 min-h-0\">\n <div\n ref={viewportRef}\n tabIndex={0}\n className=\"flex-1 min-h-[420px] overflow-hidden relative bg-card outline-none\"\n style={{ cursor: isPanning ? \"grabbing\" : \"grab\" }}\n onPointerDown={handleViewportPointerDown}\n onPointerMove={handleViewportPointerMove}\n onPointerUp={handleViewportPointerUp}\n onPointerCancel={handleViewportPointerUp}\n >\n <div\n style={{\n position: \"absolute\",\n transformOrigin: \"0px 0px\",\n transform: `translate(${pan.x}px, ${pan.y}px) scale(${zoom})`,\n width: canvasSize.w,\n height: canvasSize.h,\n backgroundImage: bgImage ? \"none\" : canvasGridBackground(isDarkCanvas),\n backgroundSize: bgImage ? \"auto\" : CANVAS_GRID_BG_SIZE,\n backgroundColor: \"var(--card)\",\n boxShadow: isDarkCanvas\n ? \"0 2px 16px rgba(0,0,0,0.45)\"\n : \"0 2px 16px rgba(0,0,0,0.12)\",\n }}\n >\n {bgImage && (\n <img\n src={bgImage}\n alt=\"Floor plan\"\n draggable={false}\n style={{\n position: \"absolute\",\n inset: 0,\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n pointerEvents: \"none\",\n userSelect: \"none\",\n }}\n />\n )}\n\n {Object.entries(placedItems).map(([id, rect]) => {\n const row = rowById.get(id);\n if (!row || !isFloorResourceType(row.resource.resourceType)) return null;\n return (\n <PlacedCardView\n key={id}\n id={id}\n rect={rect as Rect}\n row={row}\n onSelect={resourceQuickBook ? undefined : handleSelect}\n quickBookConfig={quickBookConfigFor(id)}\n searchQuery={searchQuery}\n isMatch={resourceMatchesSearch(row, searchQuery)}\n />\n );\n })}\n </div>\n </div>\n\n {otherRows.length > 0 && (\n <div className=\"shrink-0 border-t border-border bg-card px-4 py-2.5\">\n <div className=\"flex items-center gap-2 overflow-x-auto pb-0.5\">\n {otherRows.map((row) => {\n const resourceId = row.resource.id;\n return (\n <PoolResourceChip\n key={resourceId}\n row={row}\n onClick={resourceQuickBook ? undefined : () => handleSelect(resourceId)}\n quickBookConfig={quickBookConfigFor(resourceId)}\n searchQuery={searchQuery}\n isMatch={resourceMatchesSearch(row, searchQuery)}\n />\n );\n })}\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/live-space/layout-canvas-types.ts","../src/live-space/plan-color.ts","../src/live-space/layout-canvas-view.tsx"],"names":[],"mappings":"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","file":"layout-canvas-view.js","sourcesContent":["export type LayoutCanvasResourceType = \"desks\" | \"rooms\" | \"other\";\n\nexport interface LayoutCanvasRect {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nexport interface LayoutCanvasFloorLayout {\n placedItems: Record<string, LayoutCanvasRect>;\n bgImage: string | null;\n canvasWidth?: number;\n canvasHeight?: number;\n}\n\nexport const DEFAULT_CANVAS_WIDTH = 1200;\nexport const DEFAULT_CANVAS_HEIGHT = 900;\n\nexport interface LayoutCanvasPlanHint {\n id: string;\n name: string;\n color?: string;\n}\n","/** Hex colors offered as presets when creating/editing a plan. */\nexport const PLAN_COLOR_PRESETS = [\n \"#4285F4\",\n \"#10b981\",\n \"#06b6d4\",\n \"#f59e0b\",\n \"#ef4444\",\n \"#6366f1\",\n \"#a16207\",\n \"#64748b\",\n] as const;\n\nconst DEFAULT_PLAN_COLOR = PLAN_COLOR_PRESETS[0];\n\nconst HEX_RE = /^#[0-9A-Fa-f]{6}$/;\n\nexport function isPlanColorHex(value: string | undefined | null): value is string {\n return typeof value === \"string\" && HEX_RE.test(value);\n}\n\n/** Normalize stored/custom colors; fall back to a default when missing. */\nexport function resolvePlanColor(color: string | undefined | null): string {\n if (isPlanColorHex(color)) return color.toUpperCase();\n return DEFAULT_PLAN_COLOR;\n}\n\n/**\n * Soft badge / chip style from a plan hex: tinted background + saturated text.\n * Works for light surfaces; readable on dark UIs as well via alpha tint.\n */\nexport function planColorBadgeStyle(hex: string): {\n backgroundColor: string;\n color: string;\n} {\n const normalized = isPlanColorHex(hex) ? hex : DEFAULT_PLAN_COLOR;\n return {\n backgroundColor: `${normalized}1F`,\n color: normalized,\n };\n}\n\n/**\n * Subtle card wash + border from a plan hex, mixed with the theme card/border\n * so foreground text stays readable. Background is partly transparent so floor\n * plans show through underneath.\n */\nexport function planColorCardStyle(hex: string): {\n backgroundColor: string;\n borderColor: string;\n} {\n const normalized = isPlanColorHex(hex) ? hex : DEFAULT_PLAN_COLOR;\n return {\n backgroundColor: `color-mix(in srgb, ${normalized} 9%, color-mix(in srgb, var(--card) 78%, transparent))`,\n borderColor: `color-mix(in srgb, ${normalized} 28%, color-mix(in srgb, var(--border) 82%, transparent))`,\n };\n}\n","import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type PointerEvent as ReactPointerEvent,\n} from \"react\";\nimport { Box, Calendar, Maximize2, Minus, Plus } from \"lucide-react\";\nimport {\n DEFAULT_CANVAS_HEIGHT,\n DEFAULT_CANVAS_WIDTH,\n type LayoutCanvasFloorLayout,\n type LayoutCanvasPlanHint,\n type LayoutCanvasResourceType,\n} from \"./layout-canvas-types\";\nimport { LIVE_RESOURCE_TYPE_META } from \"./live-resource-meta\";\nimport { planColorBadgeStyle, planColorCardStyle, resolvePlanColor } from \"./plan-color\";\nimport { PageListSearchField } from \"../shell/page-list-chrome\";\nimport {\n Button,\n cn,\n Popover,\n PopoverAnchor,\n PopoverContent,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"../ui\";\nimport { useTheme } from \"../theme/theme-provider\";\n\ninterface Rect {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nexport interface LayoutCanvasViewRow {\n resource: {\n id: string;\n name: string;\n pricingPlanId: string;\n resourceType: LayoutCanvasResourceType;\n totalSlots?: number;\n };\n merged: { occupied: boolean; manual?: boolean; expectedFreeLabel?: string };\n plan?: LayoutCanvasPlanHint;\n}\n\nexport interface LayoutCanvasResourceQuickBook {\n /** When omitted, popover shows that booking is unavailable for this member. */\n onBook?: (resourceId: string) => void;\n /** Optional href for the book action (middle-click / fallback). */\n getBookingHref?: (resourceId: string) => string;\n}\n\nexport interface LayoutCanvasViewProps {\n layout: LayoutCanvasFloorLayout;\n rows: LayoutCanvasViewRow[];\n onResourceSelect?: (id: string) => void;\n /** Hover/tap popover with a quick book action (member live space). */\n resourceQuickBook?: LayoutCanvasResourceQuickBook;\n /** When set with `onSearchQueryChange`, shows a search bar and dims non-matching resources. */\n searchQuery?: string;\n onSearchQueryChange?: (value: string) => void;\n searchPlaceholder?: string;\n}\n\nexport function matchesCanvasResourceSearch(\n resourceName: string,\n planName: string | undefined,\n query: string,\n): boolean {\n const q = query.trim().toLowerCase();\n if (!q) return true;\n const name = resourceName.toLowerCase();\n const plan = planName?.toLowerCase() ?? \"\";\n return name.includes(q) || plan.includes(q);\n}\n\nfunction resourceMatchesSearch(row: LayoutCanvasViewRow, query: string): boolean {\n return matchesCanvasResourceSearch(row.resource.name, row.plan?.name, query);\n}\n\nconst CLICK_THRESHOLD_PX = 5;\nconst POPOVER_CLOSE_DELAY_MS = 250;\nconst CANVAS_QUICK_BOOK_POPOVER_CLASS =\n \"z-[100] w-56 border-border bg-card p-3 text-card-foreground shadow-lg\";\n\nfunction usePrefersHover() {\n const [prefersHover, setPrefersHover] = useState(\n () => typeof window !== \"undefined\" && window.matchMedia(\"(hover: hover)\").matches,\n );\n\n useEffect(() => {\n const mql = window.matchMedia(\"(hover: hover)\");\n const onChange = () => setPrefersHover(mql.matches);\n mql.addEventListener(\"change\", onChange);\n return () => mql.removeEventListener(\"change\", onChange);\n }, []);\n\n return prefersHover;\n}\n\ntype PopoverHoverHandlers = {\n prefersHover: boolean;\n clearClose: () => void;\n scheduleClose: () => void;\n};\n\ntype ResourceQuickBookConfig = {\n quickBook: LayoutCanvasResourceQuickBook;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n hover: PopoverHoverHandlers;\n onOpen: () => void;\n onToggle: () => void;\n shouldIgnoreToggle: () => boolean;\n};\n\nfunction isCanvasResourceTarget(target: EventTarget | null): boolean {\n return target instanceof HTMLElement && target.closest(\"[data-canvas-resource]\") != null;\n}\n\nfunction ResourceQuickBookPopoverContent({\n row,\n onBook,\n getBookingHref,\n}: {\n row: LayoutCanvasViewRow;\n onBook?: (resourceId: string) => void;\n getBookingHref?: (resourceId: string) => string;\n}) {\n const { resource, merged } = row;\n const meta = LIVE_RESOURCE_TYPE_META[resource.resourceType];\n const TypeIcon = meta.Icon;\n const bookingHref = getBookingHref?.(resource.id);\n\n const handleBookPointerDown = (e: ReactPointerEvent) => {\n // Radix popover can close before click fires; book on pointerdown instead.\n e.preventDefault();\n e.stopPropagation();\n onBook?.(resource.id);\n };\n\n const bookLabel = (\n <>\n <Calendar size={14} />\n Book\n </>\n );\n\n return (\n <div className=\"space-y-3\">\n <div className=\"flex min-w-0 items-start gap-2.5\">\n <span\n className={cn(\n \"flex h-8 w-8 shrink-0 items-center justify-center rounded-lg border\",\n meta.iconTile,\n )}\n aria-hidden\n >\n <TypeIcon size={16} strokeWidth={1.75} />\n </span>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-semibold leading-snug text-card-foreground\">\n {resource.name}\n </p>\n <span\n className={cn(\n \"mt-1.5 inline-flex items-center gap-1 rounded-full border px-2 py-0.5 text-[11px] font-medium\",\n merged.occupied\n ? \"border-red-100 bg-red-50 text-red-700 dark:border-red-900/50 dark:bg-red-950/50 dark:text-red-300\"\n : \"border-emerald-100 bg-emerald-50 text-emerald-800 dark:border-emerald-900/50 dark:bg-emerald-950/50 dark:text-emerald-300\",\n )}\n >\n <span\n className={cn(\n \"h-1.5 w-1.5 shrink-0 rounded-full\",\n merged.occupied ? \"bg-red-500\" : \"bg-emerald-500\",\n )}\n />\n {merged.occupied ? \"Occupied\" : \"Free\"}\n </span>\n {merged.occupied && merged.expectedFreeLabel && merged.expectedFreeLabel !== \"—\" ? (\n <p className=\"mt-1 text-xs text-muted-foreground\">{merged.expectedFreeLabel}</p>\n ) : null}\n </div>\n </div>\n {onBook ? (\n bookingHref ? (\n <Button asChild size=\"sm\" className=\"w-full\">\n <a href={bookingHref} onPointerDown={handleBookPointerDown}>\n {bookLabel}\n </a>\n </Button>\n ) : (\n <Button\n type=\"button\"\n size=\"sm\"\n className=\"w-full\"\n onPointerDown={handleBookPointerDown}\n >\n {bookLabel}\n </Button>\n )\n ) : (\n <p className=\"text-xs leading-relaxed text-muted-foreground\">\n Booking is not available for your account.\n </p>\n )}\n </div>\n );\n}\n\nconst MIN_ZOOM = 0.12;\nconst MAX_ZOOM = 4;\nconst MIN_CARD_W = 90;\nconst MIN_CARD_H = 56;\nconst CANVAS_GRID_SIZE = 40;\n\nfunction canvasGridBackground(isDark: boolean): string {\n const line = isDark ? \"oklch(0.35 0 0)\" : \"#e5e7eb\";\n return (\n `linear-gradient(to right, ${line} 1px, transparent 1px),` +\n `linear-gradient(to bottom, ${line} 1px, transparent 1px)`\n );\n}\n\nconst CANVAS_GRID_BG_SIZE = `${CANVAS_GRID_SIZE}px ${CANVAS_GRID_SIZE}px`;\n\nfunction isFloorResourceType(type: LayoutCanvasResourceType): boolean {\n return type === \"desks\" || type === \"rooms\";\n}\n\nfunction poolSlotsLabel(totalSlots: number | undefined): string | null {\n if (totalSlots == null) return null;\n return `${totalSlots} slot${totalSlots !== 1 ? \"s\" : \"\"}`;\n}\n\nfunction PoolResourceChip({\n row,\n onClick,\n quickBookConfig,\n searchQuery,\n isMatch,\n}: {\n row: LayoutCanvasViewRow;\n onClick?: () => void;\n quickBookConfig?: ResourceQuickBookConfig;\n searchQuery: string;\n isMatch: boolean;\n}) {\n const { resource, merged, plan } = row;\n const planColor = resolvePlanColor(plan?.color);\n const slots = poolSlotsLabel(resource.totalSlots);\n const searchActive = searchQuery.trim().length > 0;\n\n const chip = (\n <button\n type=\"button\"\n data-canvas-resource=\"\"\n onClick={(e) => {\n e.stopPropagation();\n if (quickBookConfig) {\n if (!quickBookConfig.shouldIgnoreToggle()) quickBookConfig.onToggle();\n } else onClick?.();\n }}\n onMouseEnter={() => {\n if (quickBookConfig?.hover.prefersHover) {\n quickBookConfig.hover.clearClose();\n quickBookConfig.onOpen();\n }\n }}\n onMouseLeave={() => {\n if (quickBookConfig?.hover.prefersHover) quickBookConfig.hover.scheduleClose();\n }}\n className={cn(\n \"inline-flex items-center gap-2 shrink-0 px-3 py-1.5 rounded-lg border hover:bg-accent transition-colors text-left\",\n searchActive && !isMatch && \"opacity-40 saturate-50\",\n )}\n style={planColorCardStyle(planColor)}\n >\n <div\n className=\"w-6 h-6 rounded-md flex items-center justify-center shrink-0\"\n style={planColorBadgeStyle(planColor)}\n >\n <Box size={12} />\n </div>\n <span className=\"text-xs font-medium text-foreground whitespace-nowrap\">{resource.name}</span>\n <span\n className={cn(\n \"h-2 w-2 rounded-full shrink-0\",\n merged.occupied ? \"bg-red-500\" : \"bg-emerald-500\",\n )}\n />\n {slots && (\n <span className=\"text-[10px] text-muted-foreground whitespace-nowrap\">{slots}</span>\n )}\n </button>\n );\n\n if (!quickBookConfig) return chip;\n\n return (\n <Popover\n modal={false}\n open={quickBookConfig.open}\n onOpenChange={quickBookConfig.onOpenChange}\n >\n <PopoverAnchor asChild>{chip}</PopoverAnchor>\n <PopoverContent\n side=\"top\"\n align=\"center\"\n sideOffset={6}\n className={CANVAS_QUICK_BOOK_POPOVER_CLASS}\n onOpenAutoFocus={(e) => e.preventDefault()}\n onMouseEnter={quickBookConfig.hover.clearClose}\n onMouseLeave={quickBookConfig.hover.scheduleClose}\n >\n <ResourceQuickBookPopoverContent\n row={row}\n onBook={quickBookConfig.quickBook.onBook}\n getBookingHref={quickBookConfig.quickBook.getBookingHref}\n />\n </PopoverContent>\n </Popover>\n );\n}\n\nfunction PlacedCardView({\n id,\n rect,\n row,\n onSelect,\n quickBookConfig,\n searchQuery,\n isMatch,\n}: {\n id: string;\n rect: Rect;\n row: LayoutCanvasViewRow;\n onSelect?: (id: string) => void;\n quickBookConfig?: ResourceQuickBookConfig;\n searchQuery: string;\n isMatch: boolean;\n}) {\n const { resource, merged, plan } = row;\n const planColor = resolvePlanColor(plan?.color);\n const w = Math.max(rect.w, MIN_CARD_W);\n const h = Math.max(rect.h, MIN_CARD_H);\n const statusLabel = merged.occupied ? \"Occupied\" : merged.manual ? \"Vacant\" : \"Free\";\n const pointerStart = useRef<{ x: number; y: number } | null>(null);\n const searchActive = searchQuery.trim().length > 0;\n\n const handlePointerDown = (e: ReactPointerEvent) => {\n if (e.button !== 0) return;\n // Keep viewport pan/zoom from capturing the pointer before tap completes.\n e.stopPropagation();\n pointerStart.current = { x: e.clientX, y: e.clientY };\n };\n\n const handlePointerUp = (e: ReactPointerEvent) => {\n e.stopPropagation();\n const start = pointerStart.current;\n pointerStart.current = null;\n if (!start || quickBookConfig) return;\n if (Math.hypot(e.clientX - start.x, e.clientY - start.y) < CLICK_THRESHOLD_PX) {\n onSelect?.(id);\n }\n };\n\n const statusDot = (\n <span\n className={cn(\n \"block h-2.5 w-2.5 rounded-full ring-2 ring-white shadow-sm\",\n merged.occupied ? \"bg-red-500 animate-pulse\" : \"bg-emerald-500\",\n )}\n aria-label={statusLabel}\n />\n );\n\n const card = (\n <button\n type=\"button\"\n data-canvas-resource=\"\"\n style={{\n position: \"absolute\",\n left: rect.x,\n top: rect.y,\n width: w,\n height: h,\n touchAction: \"manipulation\",\n ...planColorCardStyle(planColor),\n }}\n className={cn(\n \"rounded-xl border shadow-sm overflow-hidden select-none text-left cursor-pointer hover:shadow-md transition-shadow focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500/40\",\n searchActive && !isMatch && \"opacity-40 saturate-50\",\n )}\n onPointerDown={handlePointerDown}\n onPointerUp={handlePointerUp}\n onPointerCancel={handlePointerUp}\n onClick={(e) => {\n e.stopPropagation();\n if (quickBookConfig && !quickBookConfig.shouldIgnoreToggle()) {\n quickBookConfig.onToggle();\n }\n }}\n onMouseEnter={() => {\n if (quickBookConfig?.hover.prefersHover) {\n quickBookConfig.hover.clearClose();\n quickBookConfig.onOpen();\n }\n }}\n onMouseLeave={() => {\n if (quickBookConfig?.hover.prefersHover) quickBookConfig.hover.scheduleClose();\n }}\n >\n <div className=\"absolute top-2 right-2 z-10 pointer-events-none\">\n {quickBookConfig ? (\n statusDot\n ) : (\n <Tooltip>\n <TooltipTrigger asChild>{statusDot}</TooltipTrigger>\n <TooltipContent side=\"top\" className=\"text-xs\">\n {statusLabel}\n </TooltipContent>\n </Tooltip>\n )}\n </div>\n\n <div className=\"absolute inset-0 flex flex-col justify-between p-3 pointer-events-none\">\n <div className=\"min-w-0 pr-4\">\n <span\n className=\"text-xs font-semibold text-foreground leading-tight line-clamp-2\"\n style={{ wordBreak: \"break-word\" }}\n >\n {resource.name}\n </span>\n </div>\n\n {plan && (\n <span\n className=\"text-[9px] font-medium px-1.5 py-0.5 rounded-md self-start\"\n style={planColorBadgeStyle(planColor)}\n >\n {plan.name}\n </span>\n )}\n </div>\n </button>\n );\n\n if (!quickBookConfig) return card;\n\n return (\n <Popover\n modal={false}\n open={quickBookConfig.open}\n onOpenChange={quickBookConfig.onOpenChange}\n >\n <PopoverAnchor asChild>{card}</PopoverAnchor>\n <PopoverContent\n side=\"top\"\n align=\"center\"\n sideOffset={6}\n className={CANVAS_QUICK_BOOK_POPOVER_CLASS}\n onOpenAutoFocus={(e) => e.preventDefault()}\n onMouseEnter={quickBookConfig.hover.clearClose}\n onMouseLeave={quickBookConfig.hover.scheduleClose}\n >\n <ResourceQuickBookPopoverContent\n row={row}\n onBook={quickBookConfig.quickBook.onBook}\n getBookingHref={quickBookConfig.quickBook.getBookingHref}\n />\n </PopoverContent>\n </Popover>\n );\n}\n\ntype PanGesture = {\n type: \"pan\";\n startMX: number;\n startMY: number;\n startPanX: number;\n startPanY: number;\n};\n\nexport function LayoutCanvasView({\n layout,\n rows,\n onResourceSelect,\n resourceQuickBook,\n searchQuery = \"\",\n onSearchQueryChange,\n searchPlaceholder = \"Search resources…\",\n}: LayoutCanvasViewProps) {\n const { resolvedTheme } = useTheme();\n const isDarkCanvas = resolvedTheme === \"dark\";\n const { placedItems, bgImage } = layout;\n const prefersHover = usePrefersHover();\n\n const canvasSize = useMemo(\n () => ({\n w: layout.canvasWidth ?? DEFAULT_CANVAS_WIDTH,\n h: layout.canvasHeight ?? DEFAULT_CANVAS_HEIGHT,\n }),\n [layout.canvasWidth, layout.canvasHeight],\n );\n\n const [zoom, setZoom] = useState(0.5);\n const [pan, setPan] = useState({ x: 40, y: 40 });\n const [isPanning, setIsPanning] = useState(false);\n const [openResourceId, setOpenResourceId] = useState<string | null>(null);\n\n const viewportRef = useRef<HTMLDivElement>(null);\n const gestureRef = useRef<PanGesture | null>(null);\n const zoomRef = useRef(zoom);\n const panRef = useRef(pan);\n const popoverCloseTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const suppressResourceToggleRef = useRef(false);\n\n const clearPopoverCloseTimer = useCallback(() => {\n if (popoverCloseTimerRef.current) {\n clearTimeout(popoverCloseTimerRef.current);\n popoverCloseTimerRef.current = null;\n }\n }, []);\n\n const schedulePopoverClose = useCallback(() => {\n clearPopoverCloseTimer();\n popoverCloseTimerRef.current = setTimeout(() => {\n setOpenResourceId(null);\n popoverCloseTimerRef.current = null;\n }, POPOVER_CLOSE_DELAY_MS);\n }, [clearPopoverCloseTimer]);\n\n const popoverHover = useMemo<PopoverHoverHandlers>(\n () => ({\n prefersHover,\n clearClose: clearPopoverCloseTimer,\n scheduleClose: schedulePopoverClose,\n }),\n [prefersHover, clearPopoverCloseTimer, schedulePopoverClose],\n );\n\n const openPopover = useCallback(\n (id: string) => {\n clearPopoverCloseTimer();\n setOpenResourceId(id);\n },\n [clearPopoverCloseTimer],\n );\n\n const togglePopover = useCallback(\n (id: string) => {\n clearPopoverCloseTimer();\n setOpenResourceId((current) => (current === id ? null : id));\n },\n [clearPopoverCloseTimer],\n );\n\n useEffect(() => () => clearPopoverCloseTimer(), [clearPopoverCloseTimer]);\n\n useEffect(() => {\n zoomRef.current = zoom;\n }, [zoom]);\n useEffect(() => {\n panRef.current = pan;\n }, [pan]);\n\n const rowById = useMemo(() => new Map(rows.map((r) => [r.resource.id, r])), [rows]);\n const otherRows = useMemo(\n () => rows.filter((r) => r.resource.resourceType === \"other\"),\n [rows],\n );\n\n const fitCanvas = useCallback(() => {\n const vp = viewportRef.current;\n if (!vp) return;\n const vpRect = vp.getBoundingClientRect();\n const newZoom = Math.max(\n MIN_ZOOM,\n Math.min(\n MAX_ZOOM,\n Math.min((vpRect.width - 80) / canvasSize.w, (vpRect.height - 80) / canvasSize.h),\n ),\n );\n setPan({\n x: (vpRect.width - canvasSize.w * newZoom) / 2,\n y: (vpRect.height - canvasSize.h * newZoom) / 2,\n });\n setZoom(newZoom);\n }, [canvasSize.h, canvasSize.w]);\n\n useEffect(() => {\n fitCanvas();\n }, [fitCanvas]);\n\n useEffect(() => {\n const el = viewportRef.current;\n if (!el) return;\n const onWheel = (e: WheelEvent) => {\n e.preventDefault();\n const vpRect = el.getBoundingClientRect();\n const mx = e.clientX - vpRect.left;\n const my = e.clientY - vpRect.top;\n const factor = e.deltaY < 0 ? 1.08 : 1 / 1.08;\n const curZ = zoomRef.current;\n const newZ = Math.max(MIN_ZOOM, Math.min(MAX_ZOOM, curZ * factor));\n const curP = panRef.current;\n setZoom(newZ);\n setPan({\n x: mx - (mx - curP.x) * (newZ / curZ),\n y: my - (my - curP.y) * (newZ / curZ),\n });\n };\n el.addEventListener(\"wheel\", onWheel, { passive: false });\n return () => el.removeEventListener(\"wheel\", onWheel);\n }, []);\n\n const stepZoom = (delta: number) => {\n const vp = viewportRef.current;\n const curZ = zoomRef.current;\n const newZ = Math.max(MIN_ZOOM, Math.min(MAX_ZOOM, curZ + delta));\n if (vp) {\n const vpRect = vp.getBoundingClientRect();\n const cx = vpRect.width / 2;\n const cy = vpRect.height / 2;\n const curP = panRef.current;\n setPan({\n x: cx - (cx - curP.x) * (newZ / curZ),\n y: cy - (cy - curP.y) * (newZ / curZ),\n });\n }\n setZoom(newZ);\n };\n\n useEffect(() => {\n const onKeyDown = (e: KeyboardEvent) => {\n const tag = (e.target as HTMLElement)?.tagName;\n if (tag === \"INPUT\" || tag === \"TEXTAREA\" || tag === \"SELECT\") return;\n if (e.key === \"+\" || e.key === \"=\") {\n e.preventDefault();\n stepZoom(0.15);\n } else if (e.key === \"-\" || e.key === \"_\") {\n e.preventDefault();\n stepZoom(-0.15);\n }\n };\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n });\n\n const handleViewportPointerDown = (e: React.PointerEvent) => {\n if (e.button !== 0 && e.button !== 1) return;\n if (isCanvasResourceTarget(e.target)) return;\n clearPopoverCloseTimer();\n setOpenResourceId(null);\n e.preventDefault();\n e.currentTarget.setPointerCapture(e.pointerId);\n setIsPanning(true);\n gestureRef.current = {\n type: \"pan\",\n startMX: e.clientX,\n startMY: e.clientY,\n startPanX: panRef.current.x,\n startPanY: panRef.current.y,\n };\n };\n\n const handleViewportPointerMove = (e: React.PointerEvent) => {\n const g = gestureRef.current;\n if (g?.type !== \"pan\") return;\n setPan({\n x: g.startPanX + (e.clientX - g.startMX),\n y: g.startPanY + (e.clientY - g.startMY),\n });\n };\n\n const handleViewportPointerUp = () => {\n if (gestureRef.current?.type === \"pan\") {\n gestureRef.current = null;\n setIsPanning(false);\n }\n };\n\n const handleSelect = (id: string) => onResourceSelect?.(id);\n\n const quickBookConfigFor = useCallback(\n (resourceId: string): ResourceQuickBookConfig | undefined => {\n if (!resourceQuickBook) return undefined;\n const wrappedOnBook = resourceQuickBook.onBook\n ? (id: string) => {\n suppressResourceToggleRef.current = true;\n clearPopoverCloseTimer();\n setOpenResourceId(null);\n resourceQuickBook.onBook?.(id);\n window.setTimeout(() => {\n suppressResourceToggleRef.current = false;\n }, 400);\n }\n : undefined;\n\n return {\n quickBook: {\n ...resourceQuickBook,\n onBook: wrappedOnBook,\n },\n open: openResourceId === resourceId,\n onOpenChange: (open) => {\n clearPopoverCloseTimer();\n setOpenResourceId(open ? resourceId : null);\n },\n hover: popoverHover,\n onOpen: () => openPopover(resourceId),\n onToggle: () => togglePopover(resourceId),\n shouldIgnoreToggle: () => suppressResourceToggleRef.current,\n };\n },\n [\n resourceQuickBook,\n openResourceId,\n clearPopoverCloseTimer,\n popoverHover,\n openPopover,\n togglePopover,\n ],\n );\n\n return (\n <div className=\"flex flex-col flex-1 min-h-0 bg-card\">\n <div className=\"flex flex-wrap items-center gap-2 p-2 border-b border-border bg-card shrink-0\">\n {onSearchQueryChange != null ? (\n <PageListSearchField\n value={searchQuery}\n onChange={onSearchQueryChange}\n placeholder={searchPlaceholder}\n className=\"min-w-0 flex-1 max-w-md h-9\"\n />\n ) : null}\n <div className=\"flex items-center gap-1 shrink-0 ml-auto\">\n <button\n type=\"button\"\n onClick={() => stepZoom(-0.15)}\n className=\"w-7 h-7 rounded-lg border border-border bg-card flex items-center justify-center text-muted-foreground hover:bg-accent transition-colors\"\n aria-label=\"Zoom out\"\n >\n <Minus size={12} />\n </button>\n <span className=\"text-xs text-muted-foreground w-10 text-center tabular-nums select-none\">\n {Math.round(zoom * 100)}%\n </span>\n <button\n type=\"button\"\n onClick={() => stepZoom(0.15)}\n className=\"w-7 h-7 rounded-lg border border-border bg-card flex items-center justify-center text-muted-foreground hover:bg-accent transition-colors\"\n aria-label=\"Zoom in\"\n >\n <Plus size={12} />\n </button>\n <button\n type=\"button\"\n onClick={fitCanvas}\n className=\"inline-flex items-center gap-1 px-2.5 h-7 rounded-lg border border-border bg-card text-xs text-muted-foreground hover:bg-accent transition-colors\"\n >\n <Maximize2 size={11} />\n Fit\n </button>\n </div>\n </div>\n\n <div className=\"flex flex-col flex-1 min-w-0 min-h-0\">\n <div\n ref={viewportRef}\n tabIndex={0}\n className=\"flex-1 min-h-[420px] overflow-hidden relative bg-card outline-none\"\n style={{ cursor: isPanning ? \"grabbing\" : \"grab\" }}\n onPointerDown={handleViewportPointerDown}\n onPointerMove={handleViewportPointerMove}\n onPointerUp={handleViewportPointerUp}\n onPointerCancel={handleViewportPointerUp}\n >\n <div\n style={{\n position: \"absolute\",\n transformOrigin: \"0px 0px\",\n transform: `translate(${pan.x}px, ${pan.y}px) scale(${zoom})`,\n width: canvasSize.w,\n height: canvasSize.h,\n backgroundImage: bgImage ? \"none\" : canvasGridBackground(isDarkCanvas),\n backgroundSize: bgImage ? \"auto\" : CANVAS_GRID_BG_SIZE,\n backgroundColor: \"var(--card)\",\n boxShadow: isDarkCanvas\n ? \"0 2px 16px rgba(0,0,0,0.45)\"\n : \"0 2px 16px rgba(0,0,0,0.12)\",\n }}\n >\n {bgImage && (\n <img\n src={bgImage}\n alt=\"Floor plan\"\n draggable={false}\n style={{\n position: \"absolute\",\n inset: 0,\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n pointerEvents: \"none\",\n userSelect: \"none\",\n }}\n />\n )}\n\n {Object.entries(placedItems).map(([id, rect]) => {\n const row = rowById.get(id);\n if (!row || !isFloorResourceType(row.resource.resourceType)) return null;\n return (\n <PlacedCardView\n key={id}\n id={id}\n rect={rect as Rect}\n row={row}\n onSelect={resourceQuickBook ? undefined : handleSelect}\n quickBookConfig={quickBookConfigFor(id)}\n searchQuery={searchQuery}\n isMatch={resourceMatchesSearch(row, searchQuery)}\n />\n );\n })}\n </div>\n </div>\n\n {otherRows.length > 0 && (\n <div className=\"shrink-0 border-t border-border bg-card px-4 py-2.5\">\n <div className=\"flex items-center gap-2 overflow-x-auto pb-0.5\">\n {otherRows.map((row) => {\n const resourceId = row.resource.id;\n return (\n <PoolResourceChip\n key={resourceId}\n row={row}\n onClick={resourceQuickBook ? undefined : () => handleSelect(resourceId)}\n quickBookConfig={quickBookConfigFor(resourceId)}\n searchQuery={searchQuery}\n isMatch={resourceMatchesSearch(row, searchQuery)}\n />\n );\n })}\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import { FilePickerField } from './chunk-OMSJWTSZ.js';
2
- import { Tooltip, TooltipTrigger, TooltipContent, Textarea } from './chunk-4A6RCBB5.js';
2
+ import { Tooltip, TooltipTrigger, TooltipContent, Textarea } from './chunk-J3JSRCG5.js';
3
3
  import './chunk-RV5PMZYZ.js';
4
4
  import './chunk-L65F4EMK.js';
5
5
  import './chunk-PBNBLCC2.js';
package/dist/ui.d.ts CHANGED
@@ -208,6 +208,11 @@ declare function CommandSeparator({ className, ...props }: React$1.ComponentProp
208
208
  declare function CommandItem({ className, ...props }: React$1.ComponentProps<typeof Command$1.Item>): React$1.JSX.Element;
209
209
  declare function CommandShortcut({ className, ...props }: React$1.ComponentProps<"span">): React$1.JSX.Element;
210
210
 
211
+ declare function ContentFade({ children, className }: {
212
+ children: ReactNode;
213
+ className?: string;
214
+ }): React$1.JSX.Element;
215
+
211
216
  declare function ContextMenu({ ...props }: React$1.ComponentProps<typeof ContextMenuPrimitive.Root>): React$1.JSX.Element;
212
217
  declare function ContextMenuTrigger({ ...props }: React$1.ComponentProps<typeof ContextMenuPrimitive.Trigger>): React$1.JSX.Element;
213
218
  declare function ContextMenuGroup({ ...props }: React$1.ComponentProps<typeof ContextMenuPrimitive.Group>): React$1.JSX.Element;
@@ -231,6 +236,12 @@ declare function ContextMenuLabel({ className, inset, ...props }: React$1.Compon
231
236
  declare function ContextMenuSeparator({ className, ...props }: React$1.ComponentProps<typeof ContextMenuPrimitive.Separator>): React$1.JSX.Element;
232
237
  declare function ContextMenuShortcut({ className, ...props }: React$1.ComponentProps<"span">): React$1.JSX.Element;
233
238
 
239
+ declare function DashFade({ children, delayMs, className, }: {
240
+ children: ReactNode;
241
+ delayMs?: number;
242
+ className?: string;
243
+ }): React$1.JSX.Element;
244
+
234
245
  declare function DateField({ value, onChange, min, max, disabled, id, placeholder, triggerClassName, align, }: {
235
246
  value: string;
236
247
  onChange: (v: string) => void;
@@ -277,6 +288,11 @@ declare function DropdownMenuSubTrigger({ className, inset, children, ...props }
277
288
  }): React$1.JSX.Element;
278
289
  declare function DropdownMenuSubContent({ className, ...props }: React$1.ComponentProps<typeof DropdownMenuPrimitive.SubContent>): React$1.JSX.Element;
279
290
 
291
+ declare function FeedSkeleton({ rows, variant, }: {
292
+ rows?: number;
293
+ variant?: "list" | "cards";
294
+ }): React$1.JSX.Element;
295
+
280
296
  declare const fieldLabelClass = "text-[10px] uppercase tracking-widest text-muted-foreground";
281
297
  type FieldLabelElement = "span" | "label" | "p";
282
298
  type FieldLabelProps<T extends FieldLabelElement = "span"> = {
@@ -650,6 +666,11 @@ declare function Skeleton({ className, ...props }: React.ComponentProps<"div">):
650
666
 
651
667
  declare function Slider({ className, defaultValue, value, min, max, ...props }: React$1.ComponentProps<typeof SliderPrimitive.Root>): React$1.JSX.Element;
652
668
 
669
+ declare function SmoothSize({ children, className }: {
670
+ children: ReactNode;
671
+ className?: string;
672
+ }): React$1.JSX.Element;
673
+
653
674
  declare const Toaster: ({ ...props }: ToasterProps) => React$1.JSX.Element;
654
675
 
655
676
  declare function Switch({ className, ...props }: React$1.ComponentProps<typeof SwitchPrimitive.Root>): React$1.JSX.Element;
@@ -761,4 +782,4 @@ declare function useIsMobile(): boolean;
761
782
 
762
783
  declare function cn(...inputs: ClassValue[]): string;
763
784
 
764
- export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AspectRatio, Avatar, AvatarFallback, AvatarImage, Badge, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Button, Calendar, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Carousel, type CarouselApi, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious, type ChartConfig, ChartContainer, ChartLegend, ChartLegendContent, ChartStyle, ChartTooltip, ChartTooltipContent, Checkbox, CheckboxField, Collapsible, CollapsibleContent, CollapsibleTrigger, ColorPicker, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, DateField, Dialog, DialogClose, DialogContent, DialogDescription, DialogTitle, DialogTrigger, Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, FieldLabel, type FieldLabelProps, FilterPopover, type FilterPopoverProps, Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, HoverCard, HoverCardContent, HoverCardTrigger, IconInput, Input, InputGroup, InputGroupInput, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, Label, Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, NumberInput, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, PasswordInput, PhoneInput, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, Progress, RadioGroup, RadioGroupItem, ReceiptCard, ReceiptSummaryRow, ResizableHandle, ResizablePanel, ResizablePanelGroup, ResponsiveAlertDialog, ResponsiveAlertDialogAction, ResponsiveAlertDialogCancel, ResponsiveAlertDialogContent, ResponsiveAlertDialogDescription, AlertDialogFooter as ResponsiveAlertDialogFooter, AlertDialogHeader as ResponsiveAlertDialogHeader, ResponsiveAlertDialogTitle, ResponsiveDialog, ResponsiveDialogClose, ResponsiveDialogContent, ResponsiveDialogDescription, ResponsiveDialogTitle, ResponsiveDialogTrigger, ScrollArea, ScrollBar, SearchField, SegmentedTabList, type SegmentedTabListProps, SegmentedTabTrigger, type SegmentedTabTriggerProps, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, SelectableCard, type SelectableCardProps, SelectableListRow, type SelectableListRowProps, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, ShellTopBarViewToggle, ShellTopBarViewToggleItem, type ShellTopBarViewToggleItemProps, type ShellTopBarViewToggleProps, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, Slider, Switch, TabCountBadge, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, type TabsListProps, type TabsListVariant, TabsTrigger, type TabsTriggerProps, Text, Textarea, TimeField, Toaster, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, badgeVariants, buttonVariants, cn, fieldLabelClass, formatTimeForDisplay, inputVariants, navigationMenuTriggerStyle, parseHm, tabsListVariants, tabsTriggerVariants, textVariants, toTimeStr, toggleVariants, useFormField, useIsMobile, useResponsiveDialogDrawer, useSidebar };
785
+ export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AspectRatio, Avatar, AvatarFallback, AvatarImage, Badge, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Button, Calendar, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Carousel, type CarouselApi, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious, type ChartConfig, ChartContainer, ChartLegend, ChartLegendContent, ChartStyle, ChartTooltip, ChartTooltipContent, Checkbox, CheckboxField, Collapsible, CollapsibleContent, CollapsibleTrigger, ColorPicker, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, ContentFade, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, DashFade, DateField, Dialog, DialogClose, DialogContent, DialogDescription, DialogTitle, DialogTrigger, Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, FeedSkeleton, FieldLabel, type FieldLabelProps, FilterPopover, type FilterPopoverProps, Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, HoverCard, HoverCardContent, HoverCardTrigger, IconInput, Input, InputGroup, InputGroupInput, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, Label, Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, NumberInput, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, PasswordInput, PhoneInput, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, Progress, RadioGroup, RadioGroupItem, ReceiptCard, ReceiptSummaryRow, ResizableHandle, ResizablePanel, ResizablePanelGroup, ResponsiveAlertDialog, ResponsiveAlertDialogAction, ResponsiveAlertDialogCancel, ResponsiveAlertDialogContent, ResponsiveAlertDialogDescription, AlertDialogFooter as ResponsiveAlertDialogFooter, AlertDialogHeader as ResponsiveAlertDialogHeader, ResponsiveAlertDialogTitle, ResponsiveDialog, ResponsiveDialogClose, ResponsiveDialogContent, ResponsiveDialogDescription, ResponsiveDialogTitle, ResponsiveDialogTrigger, ScrollArea, ScrollBar, SearchField, SegmentedTabList, type SegmentedTabListProps, SegmentedTabTrigger, type SegmentedTabTriggerProps, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, SelectableCard, type SelectableCardProps, SelectableListRow, type SelectableListRowProps, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, ShellTopBarViewToggle, ShellTopBarViewToggleItem, type ShellTopBarViewToggleItemProps, type ShellTopBarViewToggleProps, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, Slider, SmoothSize, Switch, TabCountBadge, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, type TabsListProps, type TabsListVariant, TabsTrigger, type TabsTriggerProps, Text, Textarea, TimeField, Toaster, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, badgeVariants, buttonVariants, cn, fieldLabelClass, formatTimeForDisplay, inputVariants, navigationMenuTriggerStyle, parseHm, tabsListVariants, tabsTriggerVariants, textVariants, toTimeStr, toggleVariants, useFormField, useIsMobile, useResponsiveDialogDrawer, useSidebar };
package/dist/ui.js CHANGED
@@ -1,4 +1,4 @@
1
- export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AspectRatio, Avatar, AvatarFallback, AvatarImage, Badge, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Calendar, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Carousel, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious, ChartContainer, ChartLegend, ChartLegendContent, ChartStyle, ChartTooltip, ChartTooltipContent, Checkbox, CheckboxField, Collapsible, CollapsibleContent, CollapsibleTrigger, ColorPicker, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, DateField, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, FieldLabel, FilterPopover, Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, IconInput, InputGroup, InputGroupInput, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, NumberInput, PasswordInput, PhoneInput, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, Progress, ReceiptCard, ReceiptSummaryRow, ResizableHandle, ResizablePanel, ResizablePanelGroup, ResponsiveAlertDialog, ResponsiveAlertDialogAction, ResponsiveAlertDialogCancel, ResponsiveAlertDialogContent, ResponsiveAlertDialogDescription, AlertDialogFooter as ResponsiveAlertDialogFooter, AlertDialogHeader as ResponsiveAlertDialogHeader, ResponsiveAlertDialogTitle, ResponsiveDialog, ResponsiveDialogClose, ResponsiveDialogContent, ResponsiveDialogDescription, ResponsiveDialogTitle, ResponsiveDialogTrigger, ScrollArea, ScrollBar, SegmentedTabList, SegmentedTabTrigger, SelectableCard, SelectableListRow, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, ShellTopBarViewToggle, ShellTopBarViewToggleItem, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, Slider, Switch, TabCountBadge, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Text, Textarea, TimeField, Toaster, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, badgeVariants, fieldLabelClass, formatTimeForDisplay, navigationMenuTriggerStyle, parseHm, tabsListVariants, tabsTriggerVariants, textVariants, toTimeStr, toggleVariants, useFormField, useIsMobile, useResponsiveDialogDrawer, useSidebar } from './chunk-4A6RCBB5.js';
1
+ export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AspectRatio, Avatar, AvatarFallback, AvatarImage, Badge, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Calendar, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Carousel, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious, ChartContainer, ChartLegend, ChartLegendContent, ChartStyle, ChartTooltip, ChartTooltipContent, Checkbox, CheckboxField, Collapsible, CollapsibleContent, CollapsibleTrigger, ColorPicker, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, ContentFade, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, DashFade, DateField, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, FeedSkeleton, FieldLabel, FilterPopover, Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, IconInput, InputGroup, InputGroupInput, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, NumberInput, PasswordInput, PhoneInput, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, Progress, ReceiptCard, ReceiptSummaryRow, ResizableHandle, ResizablePanel, ResizablePanelGroup, ResponsiveAlertDialog, ResponsiveAlertDialogAction, ResponsiveAlertDialogCancel, ResponsiveAlertDialogContent, ResponsiveAlertDialogDescription, AlertDialogFooter as ResponsiveAlertDialogFooter, AlertDialogHeader as ResponsiveAlertDialogHeader, ResponsiveAlertDialogTitle, ResponsiveDialog, ResponsiveDialogClose, ResponsiveDialogContent, ResponsiveDialogDescription, ResponsiveDialogTitle, ResponsiveDialogTrigger, ScrollArea, ScrollBar, SegmentedTabList, SegmentedTabTrigger, SelectableCard, SelectableListRow, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, ShellTopBarViewToggle, ShellTopBarViewToggleItem, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, Slider, SmoothSize, Switch, TabCountBadge, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Text, Textarea, TimeField, Toaster, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, badgeVariants, fieldLabelClass, formatTimeForDisplay, navigationMenuTriggerStyle, parseHm, tabsListVariants, tabsTriggerVariants, textVariants, toTimeStr, toggleVariants, useFormField, useIsMobile, useResponsiveDialogDrawer, useSidebar } from './chunk-J3JSRCG5.js';
2
2
  export { Label, RadioGroup, RadioGroupItem } from './chunk-RV5PMZYZ.js';
3
3
  export { HoverCard, HoverCardContent, HoverCardTrigger } from './chunk-L65F4EMK.js';
4
4
  import './chunk-PBNBLCC2.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spacesync/client",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "description": "Reusable SpaceSync React UI, shell, theme, and API client primitives.",
5
5
  "type": "module",
6
6
  "files": [