diff --git a/artifacts/teaboy-os/src/pages/home.tsx b/artifacts/teaboy-os/src/pages/home.tsx index 2841fd99..4caae1e7 100644 --- a/artifacts/teaboy-os/src/pages/home.tsx +++ b/artifacts/teaboy-os/src/pages/home.tsx @@ -155,12 +155,14 @@ function SortableClockTile({ hour12, size, onToggleSize, + pinColumn, }: { time: Date; lang: string; hour12: boolean | null | undefined; size: HomeClockSize; onToggleSize: () => void; + pinColumn?: number; }) { const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ id: CLOCK_TILE_ID, @@ -171,6 +173,9 @@ function SortableClockTile({ opacity: isDragging ? 0.6 : 1, zIndex: isDragging ? 20 : "auto", touchAction: "none", + ...(pinColumn && !isDragging + ? { gridColumnStart: pinColumn, gridRowStart: 1 } + : {}), }; const longPressTimer = useRef(null); @@ -314,18 +319,22 @@ export default function HomePage() { const [clockPos, setClockPos] = useHomeClockPosition(user?.id); const toggleClockSize = () => setClockSize(clockSize === "large" ? "compact" : "large"); + const isClockUnset = clockPos < 0; const combinedIds = useMemo(() => { const appIds = (orderedApps ?? []).map((a) => `app-${a.id}`); if (!homeClockVisible) return appIds; - const cols = gridCols; - const lastOfFirstRow = Math.min(appIds.length, Math.max(cols - 1, 0)); - const defaultPos = lang === "ar" ? lastOfFirstRow : 0; - const resolvedPos = clockPos < 0 ? defaultPos : clockPos; - const safePos = Math.min(Math.max(resolvedPos, 0), appIds.length); + if (isClockUnset) { + // Default placement: LTR -> visually leftmost (front of array); + // RTL -> appended to end and CSS-pinned to the last column of row 1 + // (truly far-left in RTL, even if there are fewer apps than columns). + return lang === "ar" ? [...appIds, CLOCK_TILE_ID] : [CLOCK_TILE_ID, ...appIds]; + } + const safePos = Math.min(Math.max(clockPos, 0), appIds.length); const out: string[] = [...appIds]; out.splice(safePos, 0, CLOCK_TILE_ID); return out; - }, [orderedApps, clockPos, homeClockVisible, lang, gridCols]); + }, [orderedApps, clockPos, homeClockVisible, lang, isClockUnset]); + const clockPinColumn = isClockUnset && lang === "ar" ? Math.max(gridCols, 1) : undefined; const sortableIds = combinedIds; const handleDragEnd = (event: DragEndEvent) => { @@ -525,6 +534,7 @@ export default function HomePage() { hour12={user?.clockHour12 ?? null} size={clockSize} onToggleSize={toggleClockSize} + pinColumn={clockPinColumn} /> ); }