@spacesync/client 0.1.1 → 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.
- package/dist/analog-clock-picker.js +2 -2
- package/dist/booking-schedule-calendars.js +2 -2
- package/dist/chat-stick-to-bottom.js +1 -1
- package/dist/{chunk-4A6RCBB5.js → chunk-J3JSRCG5.js} +114 -13
- package/dist/chunk-J3JSRCG5.js.map +1 -0
- package/dist/{chunk-YAVEMXXV.js → chunk-OIZMURIX.js} +3 -3
- package/dist/{chunk-YAVEMXXV.js.map → chunk-OIZMURIX.js.map} +1 -1
- package/dist/file-viewer-dialog.js +1 -1
- package/dist/floor-switcher.js +1 -1
- package/dist/image-picker-field.d.ts +5 -2
- package/dist/image-picker-field.js +14 -12
- package/dist/image-picker-field.js.map +1 -1
- package/dist/layout-canvas-view.js +56 -75
- package/dist/layout-canvas-view.js.map +1 -1
- package/dist/platform-support-message-composer.js +1 -1
- package/dist/ui.d.ts +22 -1
- package/dist/ui.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-4A6RCBB5.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { parseHm, toTimeStr, formatTimeForDisplay } from './chunk-
|
|
1
|
+
import { parseHm, toTimeStr, formatTimeForDisplay } from './chunk-J3JSRCG5.js';
|
|
2
2
|
import { cn } from './chunk-DMPSQ22Q.js';
|
|
3
3
|
import { useRef, useState, useCallback, useMemo } from 'react';
|
|
4
4
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
@@ -377,5 +377,5 @@ function AnalogClockPicker({
|
|
|
377
377
|
}
|
|
378
378
|
|
|
379
379
|
export { AnalogClockPicker };
|
|
380
|
-
//# sourceMappingURL=chunk-
|
|
381
|
-
//# sourceMappingURL=chunk-
|
|
380
|
+
//# sourceMappingURL=chunk-OIZMURIX.js.map
|
|
381
|
+
//# sourceMappingURL=chunk-OIZMURIX.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/booking/analog-clock-picker.tsx"],"names":[],"mappings":"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","file":"chunk-YAVEMXXV.js","sourcesContent":["import { useCallback, useMemo, useRef, useState } from \"react\";\nimport {\n formatTimeForDisplay,\n parseHm,\n toTimeStr,\n} from \"../ui/time-field\";\nimport { cn } from \"../ui\";\n\nconst SIZE = 248;\nconst CX = SIZE / 2;\nconst CY = SIZE / 2;\nconst FACE_R = 98;\nconst HOUR_LABEL_R = 72;\nconst MINUTE_TICK_R = 84;\n\ntype ClockPhase = \"hour\" | \"minute\";\n\nfunction pointToAngleDeg(x: number, y: number): number {\n const dx = x - CX;\n const dy = y - CY;\n let deg = (Math.atan2(dy, dx) * 180) / Math.PI + 90;\n if (deg < 0) deg += 360;\n return deg;\n}\n\nfunction angleToHour12(deg: number): number {\n const h = Math.round(deg / 30) % 12;\n return h === 0 ? 12 : h;\n}\n\nfunction angleToHour24(deg: number): number {\n return Math.round(deg / 15) % 24;\n}\n\nfunction angleToMinute(deg: number): number {\n return Math.round(deg / 6) % 60;\n}\n\nfunction hour12To24(h12: number, ap: \"am\" | \"pm\"): number {\n if (ap === \"am\") return h12 === 12 ? 0 : h12;\n return h12 === 12 ? 12 : h12 + 12;\n}\n\nfunction hour24To12(h24: number): { h12: number; ap: \"am\" | \"pm\" } {\n return { h12: h24 % 12 || 12, ap: h24 >= 12 ? \"pm\" : \"am\" };\n}\n\nfunction handEnd(deg: number, length: number): { x: number; y: number } {\n const rad = ((deg - 90) * Math.PI) / 180;\n return { x: CX + Math.cos(rad) * length, y: CY + Math.sin(rad) * length };\n}\n\nfunction hourCenterDeg(h: number, timeFormat: \"12h\" | \"24h\"): number {\n if (timeFormat === \"24h\") return h * 15;\n return (h % 12) * 30;\n}\n\nfunction sectorPath(centerDeg: number, spread: number, radius: number): string {\n const start = handEnd(centerDeg - spread, radius);\n const end = handEnd(centerDeg + spread, radius);\n return `M ${CX} ${CY} L ${start.x} ${start.y} A ${radius} ${radius} 0 0 1 ${end.x} ${end.y} Z`;\n}\n\nfunction pointerTarget(\n clientX: number,\n clientY: number,\n svg: SVGSVGElement,\n phase: ClockPhase,\n timeFormat: \"12h\" | \"24h\",\n): number | null {\n const rect = svg.getBoundingClientRect();\n const scale = SIZE / rect.width;\n const x = (clientX - rect.left) * scale;\n const y = (clientY - rect.top) * scale;\n const dist = Math.hypot(x - CX, y - CY);\n if (dist < 24 || dist > FACE_R + 8) return null;\n\n const deg = pointToAngleDeg(x, y);\n if (phase === \"hour\") {\n return timeFormat === \"24h\" ? angleToHour24(deg) : angleToHour12(deg);\n }\n return angleToMinute(deg);\n}\n\nexport function AnalogClockPicker({\n value,\n onChange,\n timeFormat = \"24h\",\n className,\n}: {\n value: string;\n onChange: (v: string) => void;\n timeFormat?: \"12h\" | \"24h\";\n className?: string;\n}) {\n const svgRef = useRef<SVGSVGElement>(null);\n const parsed = parseHm(value);\n const editor = parsed ?? { h: 9, m: 0 };\n const { h12, ap } = hour24To12(editor.h);\n\n const [phase, setPhase] = useState<ClockPhase>(\"hour\");\n const [hoverTarget, setHoverTarget] = useState<number | null>(null);\n\n const setTime = useCallback(\n (h: number, m: number) => {\n onChange(toTimeStr(h, m));\n },\n [onChange],\n );\n\n const handlePointer = useCallback(\n (clientX: number, clientY: number) => {\n const svg = svgRef.current;\n if (!svg) return;\n const rect = svg.getBoundingClientRect();\n const scale = SIZE / rect.width;\n const x = (clientX - rect.left) * scale;\n const y = (clientY - rect.top) * scale;\n const deg = pointToAngleDeg(x, y);\n\n if (phase === \"hour\") {\n if (timeFormat === \"24h\") {\n const h24 = angleToHour24(deg);\n setTime(h24, editor.m);\n } else {\n const h = angleToHour12(deg);\n setTime(hour12To24(h, ap), editor.m);\n }\n setPhase(\"minute\");\n } else {\n const m = angleToMinute(deg);\n setTime(editor.h, m);\n }\n },\n [phase, timeFormat, ap, editor.h, editor.m, setTime],\n );\n\n const updateHover = useCallback(\n (clientX: number, clientY: number) => {\n const svg = svgRef.current;\n if (!svg) return;\n setHoverTarget(pointerTarget(clientX, clientY, svg, phase, timeFormat));\n },\n [phase, timeFormat],\n );\n\n const previewHour =\n phase === \"hour\" && hoverTarget != null\n ? timeFormat === \"24h\"\n ? hoverTarget\n : hour12To24(hoverTarget, ap)\n : editor.h;\n\n const previewMinute = phase === \"minute\" && hoverTarget != null ? hoverTarget : editor.m;\n\n const hourHandDeg = (previewHour % 12) * 30 + previewMinute * 0.5;\n const minuteHandDeg = previewMinute * 6;\n const hourEnd = handEnd(hourHandDeg, 46);\n const minuteEnd = handEnd(minuteHandDeg, 64);\n\n const selectedHourKey =\n timeFormat === \"24h\" ? editor.h : h12;\n const hoveredHourKey = phase === \"hour\" ? hoverTarget : null;\n\n const hourMarkers = useMemo(() => {\n if (timeFormat === \"24h\") {\n return Array.from({ length: 24 }, (_, h) => {\n const deg = h * 15;\n const rad = ((deg - 90) * Math.PI) / 180;\n const showLabel = h % 3 === 0;\n const r = showLabel ? HOUR_LABEL_R - 6 : HOUR_LABEL_R + 4;\n return {\n key: h,\n label: showLabel ? String(h).padStart(2, \"0\") : null,\n x: CX + Math.cos(rad) * r,\n y: CY + Math.sin(rad) * r,\n deg,\n h,\n };\n });\n }\n return Array.from({ length: 12 }, (_, i) => {\n const h = i === 0 ? 12 : i;\n const deg = h * 30;\n const rad = ((deg - 90) * Math.PI) / 180;\n return {\n key: h,\n label: String(h),\n x: CX + Math.cos(rad) * HOUR_LABEL_R,\n y: CY + Math.sin(rad) * HOUR_LABEL_R,\n deg,\n h,\n };\n });\n }, [timeFormat]);\n\n const minuteMarkers = useMemo(\n () =>\n Array.from({ length: 12 }, (_, i) => {\n const m = i * 5;\n const deg = m * 6;\n const rad = ((deg - 90) * Math.PI) / 180;\n const selected = editor.m === m;\n const hovered =\n hoverTarget != null && Math.round(hoverTarget / 5) * 5 === m;\n return {\n m,\n x: CX + Math.cos(rad) * MINUTE_TICK_R,\n y: CY + Math.sin(rad) * MINUTE_TICK_R,\n selected,\n hovered,\n };\n }),\n [editor.m, hoverTarget],\n );\n\n const displayTime = formatTimeForDisplay(value || toTimeStr(editor.h, editor.m), timeFormat);\n\n return (\n <div className={cn(\"flex flex-col items-center gap-4\", className)}>\n <div className=\"flex items-center gap-1 rounded-2xl border border-border bg-muted/60 px-4 py-2.5\">\n <button\n type=\"button\"\n onClick={() => setPhase(\"hour\")}\n className={cn(\n \"rounded-lg px-3 py-1 text-2xl font-semibold tabular-nums transition-colors\",\n phase === \"hour\"\n ? \"bg-blue-500 text-white shadow-sm\"\n : \"text-foreground hover:bg-accent\",\n )}\n >\n {timeFormat === \"24h\"\n ? String(editor.h).padStart(2, \"0\")\n : String(h12).padStart(2, \"0\")}\n </button>\n <span className=\"text-2xl font-semibold text-muted-foreground\">:</span>\n <button\n type=\"button\"\n onClick={() => setPhase(\"minute\")}\n className={cn(\n \"rounded-lg px-3 py-1 text-2xl font-semibold tabular-nums transition-colors\",\n phase === \"minute\"\n ? \"bg-blue-500 text-white shadow-sm\"\n : \"text-foreground hover:bg-accent\",\n )}\n >\n {String(editor.m).padStart(2, \"0\")}\n </button>\n {timeFormat === \"12h\" ? (\n <div className=\"ml-2 flex flex-col gap-0.5\">\n {([\"am\", \"pm\"] as const).map((p) => (\n <button\n key={p}\n type=\"button\"\n onClick={() => setTime(hour12To24(h12, p), editor.m)}\n className={cn(\n \"rounded-md px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wide transition-colors\",\n ap === p\n ? \"bg-blue-100 text-blue-700 dark:bg-blue-950/50 dark:text-blue-300\"\n : \"text-muted-foreground hover:bg-accent\",\n )}\n >\n {p}\n </button>\n ))}\n </div>\n ) : null}\n </div>\n\n <div className=\"relative\">\n <svg\n ref={svgRef}\n width={SIZE}\n height={SIZE}\n viewBox={`0 0 ${SIZE} ${SIZE}`}\n className=\"cursor-pointer touch-none select-none\"\n onClick={(e) => handlePointer(e.clientX, e.clientY)}\n onPointerMove={(e) => updateHover(e.clientX, e.clientY)}\n onPointerLeave={() => setHoverTarget(null)}\n onPointerDown={(e) => {\n e.preventDefault();\n handlePointer(e.clientX, e.clientY);\n }}\n >\n <circle cx={CX} cy={CY} r={FACE_R} className=\"fill-blue-50/80 dark:fill-blue-950/30\" />\n <circle\n cx={CX}\n cy={CY}\n r={FACE_R}\n className=\"fill-none stroke-border\"\n strokeWidth={1.5}\n />\n\n {phase === \"hour\" && hoverTarget != null ? (\n <path\n d={sectorPath(\n hourCenterDeg(hoverTarget, timeFormat),\n timeFormat === \"24h\" ? 7.5 : 15,\n FACE_R - 2,\n )}\n className=\"fill-blue-200/70 transition-opacity dark:fill-blue-500/25\"\n />\n ) : null}\n\n {phase === \"minute\" && hoverTarget != null ? (\n <path\n d={sectorPath(hoverTarget * 6, 3, FACE_R - 2)}\n className=\"fill-blue-200/70 transition-opacity dark:fill-blue-500/25\"\n />\n ) : null}\n\n {phase === \"hour\"\n ? hourMarkers.map((m) => {\n const isSelected = m.h === selectedHourKey || (timeFormat === \"12h\" && m.h === h12);\n const isHovered = m.h === hoveredHourKey;\n const active = isHovered || (isSelected && hoveredHourKey == null);\n return (\n <g key={m.key}>\n {active ? (\n <circle\n cx={m.x}\n cy={m.y}\n r={isHovered ? 18 : 16}\n className={cn(\n \"transition-all duration-100\",\n isHovered\n ? \"fill-blue-500 shadow-sm\"\n : \"fill-blue-400/90\",\n )}\n />\n ) : null}\n {m.label ? (\n <text\n x={m.x}\n y={m.y}\n textAnchor=\"middle\"\n dominantBaseline=\"central\"\n className={cn(\n \"pointer-events-none text-[11px] font-semibold transition-colors duration-100\",\n active ? \"fill-white\" : \"fill-muted-foreground\",\n isHovered && \"text-[12px] font-bold\",\n )}\n >\n {m.label}\n </text>\n ) : (\n <circle\n cx={m.x}\n cy={m.y}\n r={isHovered ? 5 : 2}\n className={cn(\n \"pointer-events-none transition-all duration-100\",\n isHovered ? \"fill-white\" : \"fill-muted-foreground/40\",\n )}\n />\n )}\n </g>\n );\n })\n : minuteMarkers.map((m) => {\n const active = m.selected || m.hovered;\n return (\n <g key={m.m}>\n <circle\n cx={m.x}\n cy={m.y}\n r={m.hovered ? 16 : m.selected ? 14 : 4}\n className={cn(\n \"transition-all duration-100\",\n m.hovered\n ? \"fill-blue-400\"\n : m.selected\n ? \"fill-blue-500\"\n : \"fill-blue-200/80 dark:fill-blue-800/60\",\n )}\n />\n {active || m.m % 15 === 0 ? (\n <text\n x={m.x}\n y={m.y}\n textAnchor=\"middle\"\n dominantBaseline=\"central\"\n className={cn(\n \"pointer-events-none text-[10px] font-semibold transition-colors duration-100\",\n active ? \"fill-white\" : \"fill-blue-700 dark:fill-blue-300\",\n )}\n >\n {String(m.m).padStart(2, \"0\")}\n </text>\n ) : null}\n </g>\n );\n })}\n\n <line\n x1={CX}\n y1={CY}\n x2={hourEnd.x}\n y2={hourEnd.y}\n className={cn(\n \"stroke-blue-600 transition-all duration-100 dark:stroke-blue-400\",\n phase === \"hour\" && hoverTarget != null && \"stroke-blue-500 opacity-90\",\n )}\n strokeWidth={3.5}\n strokeLinecap=\"round\"\n />\n <line\n x1={CX}\n y1={CY}\n x2={minuteEnd.x}\n y2={minuteEnd.y}\n className={cn(\n \"stroke-blue-500 transition-all duration-100 dark:stroke-blue-300\",\n phase === \"minute\" && hoverTarget != null && \"stroke-blue-400 opacity-90\",\n )}\n strokeWidth={2.5}\n strokeLinecap=\"round\"\n />\n <circle cx={CX} cy={CY} r={5} className=\"fill-blue-600 dark:fill-blue-400\" />\n <circle cx={CX} cy={CY} r={2.5} className=\"fill-white\" />\n </svg>\n </div>\n\n <p className=\"text-center text-[11px] text-muted-foreground\">\n {phase === \"hour\" ? \"Hover or tap an hour\" : \"Hover or tap minutes · \"}\n <span className=\"font-medium text-foreground\">\n {hoverTarget != null && phase === \"hour\"\n ? formatTimeForDisplay(\n toTimeStr(\n timeFormat === \"24h\" ? hoverTarget : hour12To24(hoverTarget, ap),\n editor.m,\n ),\n timeFormat,\n )\n : hoverTarget != null && phase === \"minute\"\n ? formatTimeForDisplay(toTimeStr(editor.h, hoverTarget), timeFormat)\n : displayTime}\n </span>\n </p>\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/booking/analog-clock-picker.tsx"],"names":[],"mappings":"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","file":"chunk-OIZMURIX.js","sourcesContent":["import { useCallback, useMemo, useRef, useState } from \"react\";\nimport {\n formatTimeForDisplay,\n parseHm,\n toTimeStr,\n} from \"../ui/time-field\";\nimport { cn } from \"../ui\";\n\nconst SIZE = 248;\nconst CX = SIZE / 2;\nconst CY = SIZE / 2;\nconst FACE_R = 98;\nconst HOUR_LABEL_R = 72;\nconst MINUTE_TICK_R = 84;\n\ntype ClockPhase = \"hour\" | \"minute\";\n\nfunction pointToAngleDeg(x: number, y: number): number {\n const dx = x - CX;\n const dy = y - CY;\n let deg = (Math.atan2(dy, dx) * 180) / Math.PI + 90;\n if (deg < 0) deg += 360;\n return deg;\n}\n\nfunction angleToHour12(deg: number): number {\n const h = Math.round(deg / 30) % 12;\n return h === 0 ? 12 : h;\n}\n\nfunction angleToHour24(deg: number): number {\n return Math.round(deg / 15) % 24;\n}\n\nfunction angleToMinute(deg: number): number {\n return Math.round(deg / 6) % 60;\n}\n\nfunction hour12To24(h12: number, ap: \"am\" | \"pm\"): number {\n if (ap === \"am\") return h12 === 12 ? 0 : h12;\n return h12 === 12 ? 12 : h12 + 12;\n}\n\nfunction hour24To12(h24: number): { h12: number; ap: \"am\" | \"pm\" } {\n return { h12: h24 % 12 || 12, ap: h24 >= 12 ? \"pm\" : \"am\" };\n}\n\nfunction handEnd(deg: number, length: number): { x: number; y: number } {\n const rad = ((deg - 90) * Math.PI) / 180;\n return { x: CX + Math.cos(rad) * length, y: CY + Math.sin(rad) * length };\n}\n\nfunction hourCenterDeg(h: number, timeFormat: \"12h\" | \"24h\"): number {\n if (timeFormat === \"24h\") return h * 15;\n return (h % 12) * 30;\n}\n\nfunction sectorPath(centerDeg: number, spread: number, radius: number): string {\n const start = handEnd(centerDeg - spread, radius);\n const end = handEnd(centerDeg + spread, radius);\n return `M ${CX} ${CY} L ${start.x} ${start.y} A ${radius} ${radius} 0 0 1 ${end.x} ${end.y} Z`;\n}\n\nfunction pointerTarget(\n clientX: number,\n clientY: number,\n svg: SVGSVGElement,\n phase: ClockPhase,\n timeFormat: \"12h\" | \"24h\",\n): number | null {\n const rect = svg.getBoundingClientRect();\n const scale = SIZE / rect.width;\n const x = (clientX - rect.left) * scale;\n const y = (clientY - rect.top) * scale;\n const dist = Math.hypot(x - CX, y - CY);\n if (dist < 24 || dist > FACE_R + 8) return null;\n\n const deg = pointToAngleDeg(x, y);\n if (phase === \"hour\") {\n return timeFormat === \"24h\" ? angleToHour24(deg) : angleToHour12(deg);\n }\n return angleToMinute(deg);\n}\n\nexport function AnalogClockPicker({\n value,\n onChange,\n timeFormat = \"24h\",\n className,\n}: {\n value: string;\n onChange: (v: string) => void;\n timeFormat?: \"12h\" | \"24h\";\n className?: string;\n}) {\n const svgRef = useRef<SVGSVGElement>(null);\n const parsed = parseHm(value);\n const editor = parsed ?? { h: 9, m: 0 };\n const { h12, ap } = hour24To12(editor.h);\n\n const [phase, setPhase] = useState<ClockPhase>(\"hour\");\n const [hoverTarget, setHoverTarget] = useState<number | null>(null);\n\n const setTime = useCallback(\n (h: number, m: number) => {\n onChange(toTimeStr(h, m));\n },\n [onChange],\n );\n\n const handlePointer = useCallback(\n (clientX: number, clientY: number) => {\n const svg = svgRef.current;\n if (!svg) return;\n const rect = svg.getBoundingClientRect();\n const scale = SIZE / rect.width;\n const x = (clientX - rect.left) * scale;\n const y = (clientY - rect.top) * scale;\n const deg = pointToAngleDeg(x, y);\n\n if (phase === \"hour\") {\n if (timeFormat === \"24h\") {\n const h24 = angleToHour24(deg);\n setTime(h24, editor.m);\n } else {\n const h = angleToHour12(deg);\n setTime(hour12To24(h, ap), editor.m);\n }\n setPhase(\"minute\");\n } else {\n const m = angleToMinute(deg);\n setTime(editor.h, m);\n }\n },\n [phase, timeFormat, ap, editor.h, editor.m, setTime],\n );\n\n const updateHover = useCallback(\n (clientX: number, clientY: number) => {\n const svg = svgRef.current;\n if (!svg) return;\n setHoverTarget(pointerTarget(clientX, clientY, svg, phase, timeFormat));\n },\n [phase, timeFormat],\n );\n\n const previewHour =\n phase === \"hour\" && hoverTarget != null\n ? timeFormat === \"24h\"\n ? hoverTarget\n : hour12To24(hoverTarget, ap)\n : editor.h;\n\n const previewMinute = phase === \"minute\" && hoverTarget != null ? hoverTarget : editor.m;\n\n const hourHandDeg = (previewHour % 12) * 30 + previewMinute * 0.5;\n const minuteHandDeg = previewMinute * 6;\n const hourEnd = handEnd(hourHandDeg, 46);\n const minuteEnd = handEnd(minuteHandDeg, 64);\n\n const selectedHourKey =\n timeFormat === \"24h\" ? editor.h : h12;\n const hoveredHourKey = phase === \"hour\" ? hoverTarget : null;\n\n const hourMarkers = useMemo(() => {\n if (timeFormat === \"24h\") {\n return Array.from({ length: 24 }, (_, h) => {\n const deg = h * 15;\n const rad = ((deg - 90) * Math.PI) / 180;\n const showLabel = h % 3 === 0;\n const r = showLabel ? HOUR_LABEL_R - 6 : HOUR_LABEL_R + 4;\n return {\n key: h,\n label: showLabel ? String(h).padStart(2, \"0\") : null,\n x: CX + Math.cos(rad) * r,\n y: CY + Math.sin(rad) * r,\n deg,\n h,\n };\n });\n }\n return Array.from({ length: 12 }, (_, i) => {\n const h = i === 0 ? 12 : i;\n const deg = h * 30;\n const rad = ((deg - 90) * Math.PI) / 180;\n return {\n key: h,\n label: String(h),\n x: CX + Math.cos(rad) * HOUR_LABEL_R,\n y: CY + Math.sin(rad) * HOUR_LABEL_R,\n deg,\n h,\n };\n });\n }, [timeFormat]);\n\n const minuteMarkers = useMemo(\n () =>\n Array.from({ length: 12 }, (_, i) => {\n const m = i * 5;\n const deg = m * 6;\n const rad = ((deg - 90) * Math.PI) / 180;\n const selected = editor.m === m;\n const hovered =\n hoverTarget != null && Math.round(hoverTarget / 5) * 5 === m;\n return {\n m,\n x: CX + Math.cos(rad) * MINUTE_TICK_R,\n y: CY + Math.sin(rad) * MINUTE_TICK_R,\n selected,\n hovered,\n };\n }),\n [editor.m, hoverTarget],\n );\n\n const displayTime = formatTimeForDisplay(value || toTimeStr(editor.h, editor.m), timeFormat);\n\n return (\n <div className={cn(\"flex flex-col items-center gap-4\", className)}>\n <div className=\"flex items-center gap-1 rounded-2xl border border-border bg-muted/60 px-4 py-2.5\">\n <button\n type=\"button\"\n onClick={() => setPhase(\"hour\")}\n className={cn(\n \"rounded-lg px-3 py-1 text-2xl font-semibold tabular-nums transition-colors\",\n phase === \"hour\"\n ? \"bg-blue-500 text-white shadow-sm\"\n : \"text-foreground hover:bg-accent\",\n )}\n >\n {timeFormat === \"24h\"\n ? String(editor.h).padStart(2, \"0\")\n : String(h12).padStart(2, \"0\")}\n </button>\n <span className=\"text-2xl font-semibold text-muted-foreground\">:</span>\n <button\n type=\"button\"\n onClick={() => setPhase(\"minute\")}\n className={cn(\n \"rounded-lg px-3 py-1 text-2xl font-semibold tabular-nums transition-colors\",\n phase === \"minute\"\n ? \"bg-blue-500 text-white shadow-sm\"\n : \"text-foreground hover:bg-accent\",\n )}\n >\n {String(editor.m).padStart(2, \"0\")}\n </button>\n {timeFormat === \"12h\" ? (\n <div className=\"ml-2 flex flex-col gap-0.5\">\n {([\"am\", \"pm\"] as const).map((p) => (\n <button\n key={p}\n type=\"button\"\n onClick={() => setTime(hour12To24(h12, p), editor.m)}\n className={cn(\n \"rounded-md px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wide transition-colors\",\n ap === p\n ? \"bg-blue-100 text-blue-700 dark:bg-blue-950/50 dark:text-blue-300\"\n : \"text-muted-foreground hover:bg-accent\",\n )}\n >\n {p}\n </button>\n ))}\n </div>\n ) : null}\n </div>\n\n <div className=\"relative\">\n <svg\n ref={svgRef}\n width={SIZE}\n height={SIZE}\n viewBox={`0 0 ${SIZE} ${SIZE}`}\n className=\"cursor-pointer touch-none select-none\"\n onClick={(e) => handlePointer(e.clientX, e.clientY)}\n onPointerMove={(e) => updateHover(e.clientX, e.clientY)}\n onPointerLeave={() => setHoverTarget(null)}\n onPointerDown={(e) => {\n e.preventDefault();\n handlePointer(e.clientX, e.clientY);\n }}\n >\n <circle cx={CX} cy={CY} r={FACE_R} className=\"fill-blue-50/80 dark:fill-blue-950/30\" />\n <circle\n cx={CX}\n cy={CY}\n r={FACE_R}\n className=\"fill-none stroke-border\"\n strokeWidth={1.5}\n />\n\n {phase === \"hour\" && hoverTarget != null ? (\n <path\n d={sectorPath(\n hourCenterDeg(hoverTarget, timeFormat),\n timeFormat === \"24h\" ? 7.5 : 15,\n FACE_R - 2,\n )}\n className=\"fill-blue-200/70 transition-opacity dark:fill-blue-500/25\"\n />\n ) : null}\n\n {phase === \"minute\" && hoverTarget != null ? (\n <path\n d={sectorPath(hoverTarget * 6, 3, FACE_R - 2)}\n className=\"fill-blue-200/70 transition-opacity dark:fill-blue-500/25\"\n />\n ) : null}\n\n {phase === \"hour\"\n ? hourMarkers.map((m) => {\n const isSelected = m.h === selectedHourKey || (timeFormat === \"12h\" && m.h === h12);\n const isHovered = m.h === hoveredHourKey;\n const active = isHovered || (isSelected && hoveredHourKey == null);\n return (\n <g key={m.key}>\n {active ? (\n <circle\n cx={m.x}\n cy={m.y}\n r={isHovered ? 18 : 16}\n className={cn(\n \"transition-all duration-100\",\n isHovered\n ? \"fill-blue-500 shadow-sm\"\n : \"fill-blue-400/90\",\n )}\n />\n ) : null}\n {m.label ? (\n <text\n x={m.x}\n y={m.y}\n textAnchor=\"middle\"\n dominantBaseline=\"central\"\n className={cn(\n \"pointer-events-none text-[11px] font-semibold transition-colors duration-100\",\n active ? \"fill-white\" : \"fill-muted-foreground\",\n isHovered && \"text-[12px] font-bold\",\n )}\n >\n {m.label}\n </text>\n ) : (\n <circle\n cx={m.x}\n cy={m.y}\n r={isHovered ? 5 : 2}\n className={cn(\n \"pointer-events-none transition-all duration-100\",\n isHovered ? \"fill-white\" : \"fill-muted-foreground/40\",\n )}\n />\n )}\n </g>\n );\n })\n : minuteMarkers.map((m) => {\n const active = m.selected || m.hovered;\n return (\n <g key={m.m}>\n <circle\n cx={m.x}\n cy={m.y}\n r={m.hovered ? 16 : m.selected ? 14 : 4}\n className={cn(\n \"transition-all duration-100\",\n m.hovered\n ? \"fill-blue-400\"\n : m.selected\n ? \"fill-blue-500\"\n : \"fill-blue-200/80 dark:fill-blue-800/60\",\n )}\n />\n {active || m.m % 15 === 0 ? (\n <text\n x={m.x}\n y={m.y}\n textAnchor=\"middle\"\n dominantBaseline=\"central\"\n className={cn(\n \"pointer-events-none text-[10px] font-semibold transition-colors duration-100\",\n active ? \"fill-white\" : \"fill-blue-700 dark:fill-blue-300\",\n )}\n >\n {String(m.m).padStart(2, \"0\")}\n </text>\n ) : null}\n </g>\n );\n })}\n\n <line\n x1={CX}\n y1={CY}\n x2={hourEnd.x}\n y2={hourEnd.y}\n className={cn(\n \"stroke-blue-600 transition-all duration-100 dark:stroke-blue-400\",\n phase === \"hour\" && hoverTarget != null && \"stroke-blue-500 opacity-90\",\n )}\n strokeWidth={3.5}\n strokeLinecap=\"round\"\n />\n <line\n x1={CX}\n y1={CY}\n x2={minuteEnd.x}\n y2={minuteEnd.y}\n className={cn(\n \"stroke-blue-500 transition-all duration-100 dark:stroke-blue-300\",\n phase === \"minute\" && hoverTarget != null && \"stroke-blue-400 opacity-90\",\n )}\n strokeWidth={2.5}\n strokeLinecap=\"round\"\n />\n <circle cx={CX} cy={CY} r={5} className=\"fill-blue-600 dark:fill-blue-400\" />\n <circle cx={CX} cy={CY} r={2.5} className=\"fill-white\" />\n </svg>\n </div>\n\n <p className=\"text-center text-[11px] text-muted-foreground\">\n {phase === \"hour\" ? \"Hover or tap an hour\" : \"Hover or tap minutes · \"}\n <span className=\"font-medium text-foreground\">\n {hoverTarget != null && phase === \"hour\"\n ? formatTimeForDisplay(\n toTimeStr(\n timeFormat === \"24h\" ? hoverTarget : hour12To24(hoverTarget, ap),\n editor.m,\n ),\n timeFormat,\n )\n : hoverTarget != null && phase === \"minute\"\n ? formatTimeForDisplay(toTimeStr(editor.h, hoverTarget), timeFormat)\n : displayTime}\n </span>\n </p>\n </div>\n );\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ResponsiveDialog, ResponsiveDialogContent, ResponsiveDialogTitle } from './chunk-
|
|
1
|
+
import { ResponsiveDialog, ResponsiveDialogContent, ResponsiveDialogTitle } from './chunk-J3JSRCG5.js';
|
|
2
2
|
import './chunk-RV5PMZYZ.js';
|
|
3
3
|
import './chunk-L65F4EMK.js';
|
|
4
4
|
import './chunk-PBNBLCC2.js';
|
package/dist/floor-switcher.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator } from './chunk-
|
|
1
|
+
import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator } from './chunk-J3JSRCG5.js';
|
|
2
2
|
import { Label } from './chunk-RV5PMZYZ.js';
|
|
3
3
|
import './chunk-L65F4EMK.js';
|
|
4
4
|
import './chunk-PBNBLCC2.js';
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
|
|
3
|
-
declare function ImagePickerField({ label, value,
|
|
3
|
+
declare function ImagePickerField({ label, value, onFileSelected, onRemove, description, previewAlt, disabled, }: {
|
|
4
4
|
label?: string;
|
|
5
|
+
/** Preview URL supplied by the parent (`blob:`, signed HTTPS, or empty). */
|
|
5
6
|
value?: string;
|
|
6
|
-
|
|
7
|
+
onFileSelected: (file: File) => void;
|
|
8
|
+
onRemove?: () => void;
|
|
7
9
|
description?: string;
|
|
8
10
|
previewAlt?: string;
|
|
11
|
+
disabled?: boolean;
|
|
9
12
|
}): React.JSX.Element;
|
|
10
13
|
|
|
11
14
|
export { ImagePickerField };
|
|
@@ -7,19 +7,17 @@ import { jsxs, jsx } from 'react/jsx-runtime';
|
|
|
7
7
|
function ImagePickerField({
|
|
8
8
|
label = "Image",
|
|
9
9
|
value,
|
|
10
|
-
|
|
10
|
+
onFileSelected,
|
|
11
|
+
onRemove,
|
|
11
12
|
description,
|
|
12
|
-
previewAlt = "Selected image"
|
|
13
|
+
previewAlt = "Selected image",
|
|
14
|
+
disabled = false
|
|
13
15
|
}) {
|
|
14
16
|
const inputRef = useRef(null);
|
|
15
17
|
const handleFileChange = (files) => {
|
|
16
18
|
const file = files?.[0];
|
|
17
|
-
if (!file) return;
|
|
18
|
-
|
|
19
|
-
reader.onload = () => {
|
|
20
|
-
if (typeof reader.result === "string") onChange(reader.result);
|
|
21
|
-
};
|
|
22
|
-
reader.readAsDataURL(file);
|
|
19
|
+
if (!file || disabled) return;
|
|
20
|
+
onFileSelected(file);
|
|
23
21
|
};
|
|
24
22
|
return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1.5", children: [
|
|
25
23
|
/* @__PURE__ */ jsx("label", { className: "text-xs font-medium text-muted-foreground", children: label }),
|
|
@@ -32,6 +30,7 @@ function ImagePickerField({
|
|
|
32
30
|
type: "button",
|
|
33
31
|
variant: "link",
|
|
34
32
|
size: "sm",
|
|
33
|
+
disabled,
|
|
35
34
|
onClick: () => inputRef.current?.click(),
|
|
36
35
|
className: "h-auto gap-1.5 p-0 text-xs font-medium text-blue-600 dark:text-blue-400",
|
|
37
36
|
children: [
|
|
@@ -40,32 +39,34 @@ function ImagePickerField({
|
|
|
40
39
|
]
|
|
41
40
|
}
|
|
42
41
|
),
|
|
43
|
-
/* @__PURE__ */ jsxs(
|
|
42
|
+
onRemove ? /* @__PURE__ */ jsxs(
|
|
44
43
|
Button,
|
|
45
44
|
{
|
|
46
45
|
type: "button",
|
|
47
46
|
variant: "link",
|
|
48
47
|
size: "sm",
|
|
49
|
-
|
|
48
|
+
disabled,
|
|
49
|
+
onClick: onRemove,
|
|
50
50
|
className: "h-auto gap-1.5 p-0 text-xs font-medium text-red-600",
|
|
51
51
|
children: [
|
|
52
52
|
/* @__PURE__ */ jsx(Trash2, { size: 13 }),
|
|
53
53
|
"Remove"
|
|
54
54
|
]
|
|
55
55
|
}
|
|
56
|
-
)
|
|
56
|
+
) : null
|
|
57
57
|
] })
|
|
58
58
|
] }) : /* @__PURE__ */ jsxs(
|
|
59
59
|
Button,
|
|
60
60
|
{
|
|
61
61
|
type: "button",
|
|
62
62
|
variant: "outline",
|
|
63
|
+
disabled,
|
|
63
64
|
onClick: () => inputRef.current?.click(),
|
|
64
65
|
className: "flex aspect-[4/3] h-auto max-w-sm w-full flex-col items-center justify-center gap-2 rounded-xl border-dashed bg-muted/50 px-4 py-5 text-center shadow-none hover:border-blue-300 hover:bg-blue-50/30 dark:hover:bg-blue-950/25",
|
|
65
66
|
children: [
|
|
66
67
|
/* @__PURE__ */ jsx("span", { className: "flex h-9 w-9 items-center justify-center rounded-xl border border-border bg-card", children: /* @__PURE__ */ jsx(Upload, { size: 15, className: "text-muted-foreground" }) }),
|
|
67
68
|
/* @__PURE__ */ jsx("span", { className: "text-xs font-medium text-foreground", children: "Choose image" }),
|
|
68
|
-
/* @__PURE__ */ jsx("span", { className: "text-[11px] font-normal text-muted-foreground whitespace-normal", children: description ?? "JPG, PNG
|
|
69
|
+
/* @__PURE__ */ jsx("span", { className: "text-[11px] font-normal text-muted-foreground whitespace-normal", children: description ?? "JPG, PNG, WebP or GIF." })
|
|
69
70
|
]
|
|
70
71
|
}
|
|
71
72
|
),
|
|
@@ -75,6 +76,7 @@ function ImagePickerField({
|
|
|
75
76
|
ref: inputRef,
|
|
76
77
|
type: "file",
|
|
77
78
|
accept: "image/*",
|
|
79
|
+
disabled,
|
|
78
80
|
className: "hidden",
|
|
79
81
|
onChange: (event) => {
|
|
80
82
|
handleFileChange(event.target.files);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/files/image-picker-field.tsx"],"names":[],"mappings":";;;;;;AAIO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,KAAA,GAAQ,OAAA;AAAA,EACR,KAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA,GAAa;
|
|
1
|
+
{"version":3,"sources":["../src/files/image-picker-field.tsx"],"names":[],"mappings":"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","file":"image-picker-field.js","sourcesContent":["import { useRef } from \"react\";\nimport { ImagePlus, Trash2, Upload } from \"lucide-react\";\nimport { Button } from \"../ui/button\";\n\nexport function ImagePickerField({\n label = \"Image\",\n value,\n onFileSelected,\n onRemove,\n description,\n previewAlt = \"Selected image\",\n disabled = false,\n}: {\n label?: string;\n /** Preview URL supplied by the parent (`blob:`, signed HTTPS, or empty). */\n value?: string;\n onFileSelected: (file: File) => void;\n onRemove?: () => void;\n description?: string;\n previewAlt?: string;\n disabled?: boolean;\n}) {\n const inputRef = useRef<HTMLInputElement>(null);\n\n const handleFileChange = (files: FileList | null) => {\n const file = files?.[0];\n if (!file || disabled) return;\n onFileSelected(file);\n };\n\n return (\n <div className=\"flex flex-col gap-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground\">{label}</label>\n {value ? (\n <div className=\"max-w-sm overflow-hidden rounded-xl border border-border bg-card\">\n <img src={value} alt={previewAlt} className=\"aspect-[4/3] w-full object-cover\" />\n <div className=\"flex items-center justify-between gap-2 border-t border-border px-3 py-2\">\n <Button\n type=\"button\"\n variant=\"link\"\n size=\"sm\"\n disabled={disabled}\n onClick={() => inputRef.current?.click()}\n className=\"h-auto gap-1.5 p-0 text-xs font-medium text-blue-600 dark:text-blue-400\"\n >\n <ImagePlus size={13} />\n Change image\n </Button>\n {onRemove ? (\n <Button\n type=\"button\"\n variant=\"link\"\n size=\"sm\"\n disabled={disabled}\n onClick={onRemove}\n className=\"h-auto gap-1.5 p-0 text-xs font-medium text-red-600\"\n >\n <Trash2 size={13} />\n Remove\n </Button>\n ) : null}\n </div>\n </div>\n ) : (\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={disabled}\n onClick={() => inputRef.current?.click()}\n className=\"flex aspect-[4/3] h-auto max-w-sm w-full flex-col items-center justify-center gap-2 rounded-xl border-dashed bg-muted/50 px-4 py-5 text-center shadow-none hover:border-blue-300 hover:bg-blue-50/30 dark:hover:bg-blue-950/25\"\n >\n <span className=\"flex h-9 w-9 items-center justify-center rounded-xl border border-border bg-card\">\n <Upload size={15} className=\"text-muted-foreground\" />\n </span>\n <span className=\"text-xs font-medium text-foreground\">Choose image</span>\n <span className=\"text-[11px] font-normal text-muted-foreground whitespace-normal\">\n {description ?? \"JPG, PNG, WebP or GIF.\"}\n </span>\n </Button>\n )}\n <input\n ref={inputRef}\n type=\"file\"\n accept=\"image/*\"\n disabled={disabled}\n className=\"hidden\"\n onChange={(event) => {\n handleFileChange(event.target.files);\n event.target.value = \"\";\n }}\n />\n </div>\n );\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { useTheme } from './chunk-XU3EFSQX.js';
|
|
2
2
|
import './chunk-4Y5DBM6Z.js';
|
|
3
3
|
import { LIVE_RESOURCE_TYPE_META } from './chunk-ZIJQ7BXU.js';
|
|
4
|
-
import { Tooltip, TooltipTrigger, TooltipContent, Popover, PopoverAnchor, PopoverContent } from './chunk-
|
|
4
|
+
import { Tooltip, TooltipTrigger, TooltipContent, Popover, PopoverAnchor, PopoverContent } from './chunk-J3JSRCG5.js';
|
|
5
5
|
import './chunk-RV5PMZYZ.js';
|
|
6
6
|
import './chunk-L65F4EMK.js';
|
|
7
7
|
import './chunk-PBNBLCC2.js';
|
|
@@ -14,12 +14,47 @@ import './chunk-FCY5FYJB.js';
|
|
|
14
14
|
import './chunk-OWNUMPUC.js';
|
|
15
15
|
import { cn } from './chunk-DMPSQ22Q.js';
|
|
16
16
|
import { useMemo, useState, useRef, useCallback, useEffect } from 'react';
|
|
17
|
-
import { Minus, Plus, Maximize2, Box,
|
|
17
|
+
import { Minus, Plus, Maximize2, Box, Calendar } from 'lucide-react';
|
|
18
18
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
19
19
|
|
|
20
20
|
// src/live-space/layout-canvas-types.ts
|
|
21
21
|
var DEFAULT_CANVAS_WIDTH = 1200;
|
|
22
22
|
var DEFAULT_CANVAS_HEIGHT = 900;
|
|
23
|
+
|
|
24
|
+
// src/live-space/plan-color.ts
|
|
25
|
+
var PLAN_COLOR_PRESETS = [
|
|
26
|
+
"#4285F4",
|
|
27
|
+
"#10b981",
|
|
28
|
+
"#06b6d4",
|
|
29
|
+
"#f59e0b",
|
|
30
|
+
"#ef4444",
|
|
31
|
+
"#6366f1",
|
|
32
|
+
"#a16207",
|
|
33
|
+
"#64748b"
|
|
34
|
+
];
|
|
35
|
+
var DEFAULT_PLAN_COLOR = PLAN_COLOR_PRESETS[0];
|
|
36
|
+
var HEX_RE = /^#[0-9A-Fa-f]{6}$/;
|
|
37
|
+
function isPlanColorHex(value) {
|
|
38
|
+
return typeof value === "string" && HEX_RE.test(value);
|
|
39
|
+
}
|
|
40
|
+
function resolvePlanColor(color) {
|
|
41
|
+
if (isPlanColorHex(color)) return color.toUpperCase();
|
|
42
|
+
return DEFAULT_PLAN_COLOR;
|
|
43
|
+
}
|
|
44
|
+
function planColorBadgeStyle(hex) {
|
|
45
|
+
const normalized = isPlanColorHex(hex) ? hex : DEFAULT_PLAN_COLOR;
|
|
46
|
+
return {
|
|
47
|
+
backgroundColor: `${normalized}1F`,
|
|
48
|
+
color: normalized
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
function planColorCardStyle(hex) {
|
|
52
|
+
const normalized = isPlanColorHex(hex) ? hex : DEFAULT_PLAN_COLOR;
|
|
53
|
+
return {
|
|
54
|
+
backgroundColor: `color-mix(in srgb, ${normalized} 9%, color-mix(in srgb, var(--card) 78%, transparent))`,
|
|
55
|
+
borderColor: `color-mix(in srgb, ${normalized} 28%, color-mix(in srgb, var(--border) 82%, transparent))`
|
|
56
|
+
};
|
|
57
|
+
}
|
|
23
58
|
function matchesCanvasResourceSearch(resourceName, planName, query) {
|
|
24
59
|
const q = query.trim().toLowerCase();
|
|
25
60
|
if (!q) return true;
|
|
@@ -127,37 +162,6 @@ function canvasGridBackground(isDark) {
|
|
|
127
162
|
return `linear-gradient(to right, ${line} 1px, transparent 1px),linear-gradient(to bottom, ${line} 1px, transparent 1px)`;
|
|
128
163
|
}
|
|
129
164
|
var CANVAS_GRID_BG_SIZE = `${CANVAS_GRID_SIZE}px ${CANVAS_GRID_SIZE}px`;
|
|
130
|
-
var TYPE_META_CARD = {
|
|
131
|
-
desks: {
|
|
132
|
-
border: "border-amber-200",
|
|
133
|
-
bg: "bg-card",
|
|
134
|
-
iconBg: "bg-amber-100",
|
|
135
|
-
iconColor: "text-amber-600",
|
|
136
|
-
badgeBg: "bg-amber-50",
|
|
137
|
-
badgeText: "text-amber-700"
|
|
138
|
-
},
|
|
139
|
-
rooms: {
|
|
140
|
-
border: "border-blue-200",
|
|
141
|
-
bg: "bg-card",
|
|
142
|
-
iconBg: "bg-blue-100",
|
|
143
|
-
iconColor: "text-blue-600 dark:text-blue-400",
|
|
144
|
-
badgeBg: "bg-blue-50",
|
|
145
|
-
badgeText: "text-blue-700 dark:text-blue-400"
|
|
146
|
-
},
|
|
147
|
-
other: {
|
|
148
|
-
border: "border-slate-200",
|
|
149
|
-
bg: "bg-card",
|
|
150
|
-
iconBg: "bg-slate-100",
|
|
151
|
-
iconColor: "text-slate-600",
|
|
152
|
-
badgeBg: "bg-slate-50",
|
|
153
|
-
badgeText: "text-slate-600"
|
|
154
|
-
}
|
|
155
|
-
};
|
|
156
|
-
var TYPE_ICON = {
|
|
157
|
-
desks: Armchair,
|
|
158
|
-
rooms: DoorOpen,
|
|
159
|
-
other: Box
|
|
160
|
-
};
|
|
161
165
|
function isFloorResourceType(type) {
|
|
162
166
|
return type === "desks" || type === "rooms";
|
|
163
167
|
}
|
|
@@ -172,8 +176,8 @@ function PoolResourceChip({
|
|
|
172
176
|
searchQuery,
|
|
173
177
|
isMatch
|
|
174
178
|
}) {
|
|
175
|
-
const { resource, merged } = row;
|
|
176
|
-
const
|
|
179
|
+
const { resource, merged, plan } = row;
|
|
180
|
+
const planColor = resolvePlanColor(plan?.color);
|
|
177
181
|
const slots = poolSlotsLabel(resource.totalSlots);
|
|
178
182
|
const searchActive = searchQuery.trim().length > 0;
|
|
179
183
|
const chip = /* @__PURE__ */ jsxs(
|
|
@@ -197,19 +201,16 @@ function PoolResourceChip({
|
|
|
197
201
|
if (quickBookConfig?.hover.prefersHover) quickBookConfig.hover.scheduleClose();
|
|
198
202
|
},
|
|
199
203
|
className: cn(
|
|
200
|
-
"inline-flex items-center gap-2 shrink-0 px-3 py-1.5 rounded-lg border
|
|
201
|
-
m.border,
|
|
204
|
+
"inline-flex items-center gap-2 shrink-0 px-3 py-1.5 rounded-lg border hover:bg-accent transition-colors text-left",
|
|
202
205
|
searchActive && !isMatch && "opacity-40 saturate-50"
|
|
203
206
|
),
|
|
207
|
+
style: planColorCardStyle(planColor),
|
|
204
208
|
children: [
|
|
205
209
|
/* @__PURE__ */ jsx(
|
|
206
210
|
"div",
|
|
207
211
|
{
|
|
208
|
-
className:
|
|
209
|
-
|
|
210
|
-
m.iconBg,
|
|
211
|
-
m.iconColor
|
|
212
|
-
),
|
|
212
|
+
className: "w-6 h-6 rounded-md flex items-center justify-center shrink-0",
|
|
213
|
+
style: planColorBadgeStyle(planColor),
|
|
213
214
|
children: /* @__PURE__ */ jsx(Box, { size: 12 })
|
|
214
215
|
}
|
|
215
216
|
),
|
|
@@ -270,9 +271,7 @@ function PlacedCardView({
|
|
|
270
271
|
isMatch
|
|
271
272
|
}) {
|
|
272
273
|
const { resource, merged, plan } = row;
|
|
273
|
-
const
|
|
274
|
-
const m = TYPE_META_CARD[type];
|
|
275
|
-
const TypeIcon = TYPE_ICON[type];
|
|
274
|
+
const planColor = resolvePlanColor(plan?.color);
|
|
276
275
|
const w = Math.max(rect.w, MIN_CARD_W);
|
|
277
276
|
const h = Math.max(rect.h, MIN_CARD_H);
|
|
278
277
|
const statusLabel = merged.occupied ? "Occupied" : merged.manual ? "Vacant" : "Free";
|
|
@@ -313,12 +312,11 @@ function PlacedCardView({
|
|
|
313
312
|
top: rect.y,
|
|
314
313
|
width: w,
|
|
315
314
|
height: h,
|
|
316
|
-
touchAction: "manipulation"
|
|
315
|
+
touchAction: "manipulation",
|
|
316
|
+
...planColorCardStyle(planColor)
|
|
317
317
|
},
|
|
318
318
|
className: cn(
|
|
319
319
|
"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",
|
|
320
|
-
m.border,
|
|
321
|
-
m.bg,
|
|
322
320
|
searchActive && !isMatch && "opacity-40 saturate-50"
|
|
323
321
|
),
|
|
324
322
|
onPointerDown: handlePointerDown,
|
|
@@ -345,36 +343,19 @@ function PlacedCardView({
|
|
|
345
343
|
/* @__PURE__ */ jsx(TooltipContent, { side: "top", className: "text-xs", children: statusLabel })
|
|
346
344
|
] }) }),
|
|
347
345
|
/* @__PURE__ */ jsxs("div", { className: "absolute inset-0 flex flex-col justify-between p-3 pointer-events-none", children: [
|
|
348
|
-
/* @__PURE__ */
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
),
|
|
357
|
-
style: { width: 28, height: 28 },
|
|
358
|
-
children: /* @__PURE__ */ jsx(TypeIcon, { size: 14, strokeWidth: 2 })
|
|
359
|
-
}
|
|
360
|
-
),
|
|
361
|
-
/* @__PURE__ */ jsx(
|
|
362
|
-
"span",
|
|
363
|
-
{
|
|
364
|
-
className: "text-xs font-semibold text-foreground leading-tight pt-0.5 line-clamp-2 min-w-0 flex-1",
|
|
365
|
-
style: { wordBreak: "break-word" },
|
|
366
|
-
children: resource.name
|
|
367
|
-
}
|
|
368
|
-
)
|
|
369
|
-
] }),
|
|
346
|
+
/* @__PURE__ */ jsx("div", { className: "min-w-0 pr-4", children: /* @__PURE__ */ jsx(
|
|
347
|
+
"span",
|
|
348
|
+
{
|
|
349
|
+
className: "text-xs font-semibold text-foreground leading-tight line-clamp-2",
|
|
350
|
+
style: { wordBreak: "break-word" },
|
|
351
|
+
children: resource.name
|
|
352
|
+
}
|
|
353
|
+
) }),
|
|
370
354
|
plan && /* @__PURE__ */ jsx(
|
|
371
355
|
"span",
|
|
372
356
|
{
|
|
373
|
-
className:
|
|
374
|
-
|
|
375
|
-
m.badgeBg,
|
|
376
|
-
m.badgeText
|
|
377
|
-
),
|
|
357
|
+
className: "text-[9px] font-medium px-1.5 py-0.5 rounded-md self-start",
|
|
358
|
+
style: planColorBadgeStyle(planColor),
|
|
378
359
|
children: plan.name
|
|
379
360
|
}
|
|
380
361
|
)
|