@spacesync/client 0.1.6 → 0.1.9

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/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
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"layout-canvas-view.js"}
@@ -1,5 +1,5 @@
1
1
  import { FilePickerField } from './chunk-OMSJWTSZ.js';
2
- import { Tooltip, TooltipTrigger, TooltipContent, Textarea } from './chunk-H3CNZCYU.js';
2
+ import { Tooltip, TooltipTrigger, TooltipContent, Textarea } from './chunk-F7MU5T46.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
@@ -8,7 +8,6 @@ import { VariantProps } from 'class-variance-authority';
8
8
  import * as AspectRatioPrimitive from '@radix-ui/react-aspect-ratio';
9
9
  import * as AvatarPrimitive from '@radix-ui/react-avatar';
10
10
  import { DayPicker } from 'react-day-picker';
11
- import useEmblaCarousel, { UseEmblaCarouselType } from 'embla-carousel-react';
12
11
  import * as RechartsPrimitive from 'recharts';
13
12
  import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
14
13
  import * as CollapsiblePrimitive from '@radix-ui/react-collapsible';
@@ -113,17 +112,17 @@ declare function CardAction({ className, ...props }: React$1.ComponentProps<"div
113
112
  declare function CardContent({ className, ...props }: React$1.ComponentProps<"div">): React$1.JSX.Element;
114
113
  declare function CardFooter({ className, ...props }: React$1.ComponentProps<"div">): React$1.JSX.Element;
115
114
 
116
- type CarouselApi = UseEmblaCarouselType[1];
117
- type UseCarouselParameters = Parameters<typeof useEmblaCarousel>;
118
- type CarouselOptions = UseCarouselParameters[0];
119
- type CarouselPlugin = UseCarouselParameters[1];
115
+ type CarouselApi = {
116
+ scrollPrev: () => void;
117
+ scrollNext: () => void;
118
+ canScrollPrev: boolean;
119
+ canScrollNext: boolean;
120
+ };
120
121
  type CarouselProps = {
121
- opts?: CarouselOptions;
122
- plugins?: CarouselPlugin;
123
122
  orientation?: "horizontal" | "vertical";
124
123
  setApi?: (api: CarouselApi) => void;
125
124
  };
126
- declare function Carousel({ orientation, opts, setApi, plugins, className, children, ...props }: React$1.ComponentProps<"div"> & CarouselProps): React$1.JSX.Element;
125
+ declare function Carousel({ orientation, setApi, className, children, ...props }: React$1.ComponentProps<"div"> & CarouselProps): React$1.JSX.Element;
127
126
  declare function CarouselContent({ className, ...props }: React$1.ComponentProps<"div">): React$1.JSX.Element;
128
127
  declare function CarouselItem({ className, ...props }: React$1.ComponentProps<"div">): React$1.JSX.Element;
129
128
  declare function CarouselPrevious({ className, variant, size, ...props }: React$1.ComponentProps<typeof Button>): React$1.JSX.Element;
@@ -757,8 +756,14 @@ declare function parseHm(value: string): {
757
756
  m: number;
758
757
  } | undefined;
759
758
  declare function toTimeStr(h: number, m: number): string;
759
+ declare function hmToMinutes(value: string): number | null;
760
+ declare function minutesToHm(total: number): string | null;
761
+ declare function addMinutesToHm(value: string, delta: number): string | null;
762
+ /** Same-day end times at whole hours after `from` (2:10 → 3:10, 4:10, …). */
763
+ declare function hourlyEndTimes(from: string): string[];
764
+ declare function snapScheduleEndTime(from: string, to: string, chargeBy: "hours" | "minutes"): string;
760
765
  declare function formatTimeForDisplay(value: string, timeFormat: "12h" | "24h"): string;
761
- declare function TimeField({ value, onChange, disabled, id, placeholder, triggerClassName, align, timeFormat, }: {
766
+ declare function TimeField({ value, onChange, disabled, id, placeholder, triggerClassName, align, timeFormat, minTime, allowedTimes, }: {
762
767
  value: string;
763
768
  onChange: (v: string) => void;
764
769
  disabled?: boolean;
@@ -767,6 +772,10 @@ declare function TimeField({ value, onChange, disabled, id, placeholder, trigger
767
772
  triggerClassName?: string;
768
773
  align?: "start" | "center" | "end";
769
774
  timeFormat?: "12h" | "24h";
775
+ /** Inclusive lower bound (`HH:mm`); earlier times are omitted. */
776
+ minTime?: string;
777
+ /** When set, only these times can be chosen (used for whole-hour ends). */
778
+ allowedTimes?: string[];
770
779
  }): React$1.JSX.Element;
771
780
 
772
781
  declare const toggleVariants: (props?: ({
@@ -782,4 +791,4 @@ declare function useIsMobile(): boolean;
782
791
 
783
792
  declare function cn(...inputs: ClassValue[]): string;
784
793
 
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 };
794
+ 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, addMinutesToHm, badgeVariants, buttonVariants, cn, fieldLabelClass, formatTimeForDisplay, hmToMinutes, hourlyEndTimes, inputVariants, minutesToHm, navigationMenuTriggerStyle, parseHm, snapScheduleEndTime, 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, 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, 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-H3CNZCYU.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, 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, addMinutesToHm, badgeVariants, fieldLabelClass, formatTimeForDisplay, hmToMinutes, hourlyEndTimes, minutesToHm, navigationMenuTriggerStyle, parseHm, snapScheduleEndTime, tabsListVariants, tabsTriggerVariants, textVariants, toTimeStr, toggleVariants, useFormField, useIsMobile, useResponsiveDialogDrawer, useSidebar } from './chunk-F7MU5T46.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.6",
3
+ "version": "0.1.9",
4
4
  "description": "Reusable SpaceSync React UI, shell, theme, and API client primitives.",
5
5
  "type": "module",
6
6
  "files": [
@@ -124,6 +124,10 @@
124
124
  "types": "./dist/booking-schedule-calendars.d.ts",
125
125
  "import": "./dist/booking-schedule-calendars.js"
126
126
  },
127
+ "./booking-space-layout-picker": {
128
+ "types": "./dist/booking-space-layout-picker.d.ts",
129
+ "import": "./dist/booking-space-layout-picker.js"
130
+ },
127
131
  "./analog-clock-picker": {
128
132
  "types": "./dist/analog-clock-picker.d.ts",
129
133
  "import": "./dist/analog-clock-picker.js"
@@ -183,7 +187,6 @@
183
187
  "class-variance-authority": "0.7.1",
184
188
  "clsx": "2.1.1",
185
189
  "cmdk": "1.1.1",
186
- "embla-carousel-react": "8.6.0",
187
190
  "input-otp": "1.4.2",
188
191
  "lucide-react": "0.487.0",
189
192
  "next-themes": "0.4.6",
@@ -1,381 +0,0 @@
1
- import { parseHm, toTimeStr, formatTimeForDisplay } from './chunk-H3CNZCYU.js';
2
- import { cn } from './chunk-DMPSQ22Q.js';
3
- import { useRef, useState, useCallback, useMemo } from 'react';
4
- import { jsxs, jsx } from 'react/jsx-runtime';
5
-
6
- var SIZE = 248;
7
- var CX = SIZE / 2;
8
- var CY = SIZE / 2;
9
- var FACE_R = 98;
10
- var HOUR_LABEL_R = 72;
11
- var MINUTE_TICK_R = 84;
12
- function pointToAngleDeg(x, y) {
13
- const dx = x - CX;
14
- const dy = y - CY;
15
- let deg = Math.atan2(dy, dx) * 180 / Math.PI + 90;
16
- if (deg < 0) deg += 360;
17
- return deg;
18
- }
19
- function angleToHour12(deg) {
20
- const h = Math.round(deg / 30) % 12;
21
- return h === 0 ? 12 : h;
22
- }
23
- function angleToHour24(deg) {
24
- return Math.round(deg / 15) % 24;
25
- }
26
- function angleToMinute(deg) {
27
- return Math.round(deg / 6) % 60;
28
- }
29
- function hour12To24(h12, ap) {
30
- if (ap === "am") return h12 === 12 ? 0 : h12;
31
- return h12 === 12 ? 12 : h12 + 12;
32
- }
33
- function hour24To12(h24) {
34
- return { h12: h24 % 12 || 12, ap: h24 >= 12 ? "pm" : "am" };
35
- }
36
- function handEnd(deg, length) {
37
- const rad = (deg - 90) * Math.PI / 180;
38
- return { x: CX + Math.cos(rad) * length, y: CY + Math.sin(rad) * length };
39
- }
40
- function hourCenterDeg(h, timeFormat) {
41
- if (timeFormat === "24h") return h * 15;
42
- return h % 12 * 30;
43
- }
44
- function sectorPath(centerDeg, spread, radius) {
45
- const start = handEnd(centerDeg - spread, radius);
46
- const end = handEnd(centerDeg + spread, radius);
47
- return `M ${CX} ${CY} L ${start.x} ${start.y} A ${radius} ${radius} 0 0 1 ${end.x} ${end.y} Z`;
48
- }
49
- function pointerTarget(clientX, clientY, svg, phase, timeFormat) {
50
- const rect = svg.getBoundingClientRect();
51
- const scale = SIZE / rect.width;
52
- const x = (clientX - rect.left) * scale;
53
- const y = (clientY - rect.top) * scale;
54
- const dist = Math.hypot(x - CX, y - CY);
55
- if (dist < 24 || dist > FACE_R + 8) return null;
56
- const deg = pointToAngleDeg(x, y);
57
- if (phase === "hour") {
58
- return timeFormat === "24h" ? angleToHour24(deg) : angleToHour12(deg);
59
- }
60
- return angleToMinute(deg);
61
- }
62
- function AnalogClockPicker({
63
- value,
64
- onChange,
65
- timeFormat = "24h",
66
- className
67
- }) {
68
- const svgRef = useRef(null);
69
- const parsed = parseHm(value);
70
- const editor = parsed ?? { h: 9, m: 0 };
71
- const { h12, ap } = hour24To12(editor.h);
72
- const [phase, setPhase] = useState("hour");
73
- const [hoverTarget, setHoverTarget] = useState(null);
74
- const setTime = useCallback(
75
- (h, m) => {
76
- onChange(toTimeStr(h, m));
77
- },
78
- [onChange]
79
- );
80
- const handlePointer = useCallback(
81
- (clientX, clientY) => {
82
- const svg = svgRef.current;
83
- if (!svg) return;
84
- const rect = svg.getBoundingClientRect();
85
- const scale = SIZE / rect.width;
86
- const x = (clientX - rect.left) * scale;
87
- const y = (clientY - rect.top) * scale;
88
- const deg = pointToAngleDeg(x, y);
89
- if (phase === "hour") {
90
- if (timeFormat === "24h") {
91
- const h24 = angleToHour24(deg);
92
- setTime(h24, editor.m);
93
- } else {
94
- const h = angleToHour12(deg);
95
- setTime(hour12To24(h, ap), editor.m);
96
- }
97
- setPhase("minute");
98
- } else {
99
- const m = angleToMinute(deg);
100
- setTime(editor.h, m);
101
- }
102
- },
103
- [phase, timeFormat, ap, editor.h, editor.m, setTime]
104
- );
105
- const updateHover = useCallback(
106
- (clientX, clientY) => {
107
- const svg = svgRef.current;
108
- if (!svg) return;
109
- setHoverTarget(pointerTarget(clientX, clientY, svg, phase, timeFormat));
110
- },
111
- [phase, timeFormat]
112
- );
113
- const previewHour = phase === "hour" && hoverTarget != null ? timeFormat === "24h" ? hoverTarget : hour12To24(hoverTarget, ap) : editor.h;
114
- const previewMinute = phase === "minute" && hoverTarget != null ? hoverTarget : editor.m;
115
- const hourHandDeg = previewHour % 12 * 30 + previewMinute * 0.5;
116
- const minuteHandDeg = previewMinute * 6;
117
- const hourEnd = handEnd(hourHandDeg, 46);
118
- const minuteEnd = handEnd(minuteHandDeg, 64);
119
- const selectedHourKey = timeFormat === "24h" ? editor.h : h12;
120
- const hoveredHourKey = phase === "hour" ? hoverTarget : null;
121
- const hourMarkers = useMemo(() => {
122
- if (timeFormat === "24h") {
123
- return Array.from({ length: 24 }, (_, h) => {
124
- const deg = h * 15;
125
- const rad = (deg - 90) * Math.PI / 180;
126
- const showLabel = h % 3 === 0;
127
- const r = showLabel ? HOUR_LABEL_R - 6 : HOUR_LABEL_R + 4;
128
- return {
129
- key: h,
130
- label: showLabel ? String(h).padStart(2, "0") : null,
131
- x: CX + Math.cos(rad) * r,
132
- y: CY + Math.sin(rad) * r,
133
- deg,
134
- h
135
- };
136
- });
137
- }
138
- return Array.from({ length: 12 }, (_, i) => {
139
- const h = i === 0 ? 12 : i;
140
- const deg = h * 30;
141
- const rad = (deg - 90) * Math.PI / 180;
142
- return {
143
- key: h,
144
- label: String(h),
145
- x: CX + Math.cos(rad) * HOUR_LABEL_R,
146
- y: CY + Math.sin(rad) * HOUR_LABEL_R,
147
- deg,
148
- h
149
- };
150
- });
151
- }, [timeFormat]);
152
- const minuteMarkers = useMemo(
153
- () => Array.from({ length: 12 }, (_, i) => {
154
- const m = i * 5;
155
- const deg = m * 6;
156
- const rad = (deg - 90) * Math.PI / 180;
157
- const selected = editor.m === m;
158
- const hovered = hoverTarget != null && Math.round(hoverTarget / 5) * 5 === m;
159
- return {
160
- m,
161
- x: CX + Math.cos(rad) * MINUTE_TICK_R,
162
- y: CY + Math.sin(rad) * MINUTE_TICK_R,
163
- selected,
164
- hovered
165
- };
166
- }),
167
- [editor.m, hoverTarget]
168
- );
169
- const displayTime = formatTimeForDisplay(value || toTimeStr(editor.h, editor.m), timeFormat);
170
- return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col items-center gap-4", className), children: [
171
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1 rounded-2xl border border-border bg-muted/60 px-4 py-2.5", children: [
172
- /* @__PURE__ */ jsx(
173
- "button",
174
- {
175
- type: "button",
176
- onClick: () => setPhase("hour"),
177
- className: cn(
178
- "rounded-lg px-3 py-1 text-2xl font-semibold tabular-nums transition-colors",
179
- phase === "hour" ? "bg-blue-500 text-white shadow-sm" : "text-foreground hover:bg-accent"
180
- ),
181
- children: timeFormat === "24h" ? String(editor.h).padStart(2, "0") : String(h12).padStart(2, "0")
182
- }
183
- ),
184
- /* @__PURE__ */ jsx("span", { className: "text-2xl font-semibold text-muted-foreground", children: ":" }),
185
- /* @__PURE__ */ jsx(
186
- "button",
187
- {
188
- type: "button",
189
- onClick: () => setPhase("minute"),
190
- className: cn(
191
- "rounded-lg px-3 py-1 text-2xl font-semibold tabular-nums transition-colors",
192
- phase === "minute" ? "bg-blue-500 text-white shadow-sm" : "text-foreground hover:bg-accent"
193
- ),
194
- children: String(editor.m).padStart(2, "0")
195
- }
196
- ),
197
- timeFormat === "12h" ? /* @__PURE__ */ jsx("div", { className: "ml-2 flex flex-col gap-0.5", children: ["am", "pm"].map((p) => /* @__PURE__ */ jsx(
198
- "button",
199
- {
200
- type: "button",
201
- onClick: () => setTime(hour12To24(h12, p), editor.m),
202
- className: cn(
203
- "rounded-md px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wide transition-colors",
204
- ap === p ? "bg-blue-100 text-blue-700 dark:bg-blue-950/50 dark:text-blue-300" : "text-muted-foreground hover:bg-accent"
205
- ),
206
- children: p
207
- },
208
- p
209
- )) }) : null
210
- ] }),
211
- /* @__PURE__ */ jsx("div", { className: "relative", children: /* @__PURE__ */ jsxs(
212
- "svg",
213
- {
214
- ref: svgRef,
215
- width: SIZE,
216
- height: SIZE,
217
- viewBox: `0 0 ${SIZE} ${SIZE}`,
218
- className: "cursor-pointer touch-none select-none",
219
- onClick: (e) => handlePointer(e.clientX, e.clientY),
220
- onPointerMove: (e) => updateHover(e.clientX, e.clientY),
221
- onPointerLeave: () => setHoverTarget(null),
222
- onPointerDown: (e) => {
223
- e.preventDefault();
224
- handlePointer(e.clientX, e.clientY);
225
- },
226
- children: [
227
- /* @__PURE__ */ jsx("circle", { cx: CX, cy: CY, r: FACE_R, className: "fill-blue-50/80 dark:fill-blue-950/30" }),
228
- /* @__PURE__ */ jsx(
229
- "circle",
230
- {
231
- cx: CX,
232
- cy: CY,
233
- r: FACE_R,
234
- className: "fill-none stroke-border",
235
- strokeWidth: 1.5
236
- }
237
- ),
238
- phase === "hour" && hoverTarget != null ? /* @__PURE__ */ jsx(
239
- "path",
240
- {
241
- d: sectorPath(
242
- hourCenterDeg(hoverTarget, timeFormat),
243
- timeFormat === "24h" ? 7.5 : 15,
244
- FACE_R - 2
245
- ),
246
- className: "fill-blue-200/70 transition-opacity dark:fill-blue-500/25"
247
- }
248
- ) : null,
249
- phase === "minute" && hoverTarget != null ? /* @__PURE__ */ jsx(
250
- "path",
251
- {
252
- d: sectorPath(hoverTarget * 6, 3, FACE_R - 2),
253
- className: "fill-blue-200/70 transition-opacity dark:fill-blue-500/25"
254
- }
255
- ) : null,
256
- phase === "hour" ? hourMarkers.map((m) => {
257
- const isSelected = m.h === selectedHourKey || timeFormat === "12h" && m.h === h12;
258
- const isHovered = m.h === hoveredHourKey;
259
- const active = isHovered || isSelected && hoveredHourKey == null;
260
- return /* @__PURE__ */ jsxs("g", { children: [
261
- active ? /* @__PURE__ */ jsx(
262
- "circle",
263
- {
264
- cx: m.x,
265
- cy: m.y,
266
- r: isHovered ? 18 : 16,
267
- className: cn(
268
- "transition-all duration-100",
269
- isHovered ? "fill-blue-500 shadow-sm" : "fill-blue-400/90"
270
- )
271
- }
272
- ) : null,
273
- m.label ? /* @__PURE__ */ jsx(
274
- "text",
275
- {
276
- x: m.x,
277
- y: m.y,
278
- textAnchor: "middle",
279
- dominantBaseline: "central",
280
- className: cn(
281
- "pointer-events-none text-[11px] font-semibold transition-colors duration-100",
282
- active ? "fill-white" : "fill-muted-foreground",
283
- isHovered && "text-[12px] font-bold"
284
- ),
285
- children: m.label
286
- }
287
- ) : /* @__PURE__ */ jsx(
288
- "circle",
289
- {
290
- cx: m.x,
291
- cy: m.y,
292
- r: isHovered ? 5 : 2,
293
- className: cn(
294
- "pointer-events-none transition-all duration-100",
295
- isHovered ? "fill-white" : "fill-muted-foreground/40"
296
- )
297
- }
298
- )
299
- ] }, m.key);
300
- }) : minuteMarkers.map((m) => {
301
- const active = m.selected || m.hovered;
302
- return /* @__PURE__ */ jsxs("g", { children: [
303
- /* @__PURE__ */ jsx(
304
- "circle",
305
- {
306
- cx: m.x,
307
- cy: m.y,
308
- r: m.hovered ? 16 : m.selected ? 14 : 4,
309
- className: cn(
310
- "transition-all duration-100",
311
- m.hovered ? "fill-blue-400" : m.selected ? "fill-blue-500" : "fill-blue-200/80 dark:fill-blue-800/60"
312
- )
313
- }
314
- ),
315
- active || m.m % 15 === 0 ? /* @__PURE__ */ jsx(
316
- "text",
317
- {
318
- x: m.x,
319
- y: m.y,
320
- textAnchor: "middle",
321
- dominantBaseline: "central",
322
- className: cn(
323
- "pointer-events-none text-[10px] font-semibold transition-colors duration-100",
324
- active ? "fill-white" : "fill-blue-700 dark:fill-blue-300"
325
- ),
326
- children: String(m.m).padStart(2, "0")
327
- }
328
- ) : null
329
- ] }, m.m);
330
- }),
331
- /* @__PURE__ */ jsx(
332
- "line",
333
- {
334
- x1: CX,
335
- y1: CY,
336
- x2: hourEnd.x,
337
- y2: hourEnd.y,
338
- className: cn(
339
- "stroke-blue-600 transition-all duration-100 dark:stroke-blue-400",
340
- phase === "hour" && hoverTarget != null && "stroke-blue-500 opacity-90"
341
- ),
342
- strokeWidth: 3.5,
343
- strokeLinecap: "round"
344
- }
345
- ),
346
- /* @__PURE__ */ jsx(
347
- "line",
348
- {
349
- x1: CX,
350
- y1: CY,
351
- x2: minuteEnd.x,
352
- y2: minuteEnd.y,
353
- className: cn(
354
- "stroke-blue-500 transition-all duration-100 dark:stroke-blue-300",
355
- phase === "minute" && hoverTarget != null && "stroke-blue-400 opacity-90"
356
- ),
357
- strokeWidth: 2.5,
358
- strokeLinecap: "round"
359
- }
360
- ),
361
- /* @__PURE__ */ jsx("circle", { cx: CX, cy: CY, r: 5, className: "fill-blue-600 dark:fill-blue-400" }),
362
- /* @__PURE__ */ jsx("circle", { cx: CX, cy: CY, r: 2.5, className: "fill-white" })
363
- ]
364
- }
365
- ) }),
366
- /* @__PURE__ */ jsxs("p", { className: "text-center text-[11px] text-muted-foreground", children: [
367
- phase === "hour" ? "Hover or tap an hour" : "Hover or tap minutes \xB7 ",
368
- /* @__PURE__ */ jsx("span", { className: "font-medium text-foreground", children: hoverTarget != null && phase === "hour" ? formatTimeForDisplay(
369
- toTimeStr(
370
- timeFormat === "24h" ? hoverTarget : hour12To24(hoverTarget, ap),
371
- editor.m
372
- ),
373
- timeFormat
374
- ) : hoverTarget != null && phase === "minute" ? formatTimeForDisplay(toTimeStr(editor.h, hoverTarget), timeFormat) : displayTime })
375
- ] })
376
- ] });
377
- }
378
-
379
- export { AnalogClockPicker };
380
- //# sourceMappingURL=chunk-34332W2P.js.map
381
- //# sourceMappingURL=chunk-34332W2P.js.map