diff --git a/CHANGELOG.md b/CHANGELOG.md index 58c4a31c..81fb01bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -255,6 +255,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Fixed +### Internet Radio — Add / Edit station modal no longer clipped on empty library + +**By [@cucadmuh](https://github.com/cucadmuh), thanks to voidboywannabe for the report on the Psysonic Discord, PR [#699](https://github.com/Psychotoxical/psysonic/pull/699)** + +* **Add Station** / **Edit** now mount **`RadioEditModal`** with **`createPortal(..., document.body)`** (same layering approach as **Search Directory**). Previously the overlay lived under nested **`.content-body`** with **`contain: paint`**, so on an **empty** station list the fixed overlay was **painted inside a short box** and looked cropped; after the first station the layout was tall enough that the bug was easy to miss. + ### Search — hide duplicate artist hits with zero albums **By [@cucadmuh](https://github.com/cucadmuh), thanks to zunoz for the report on the Psysonic Discord, PR [#697](https://github.com/Psychotoxical/psysonic/pull/697)** diff --git a/src/components/internetRadio/RadioEditModal.tsx b/src/components/internetRadio/RadioEditModal.tsx index 564720ce..892aac86 100644 --- a/src/components/internetRadio/RadioEditModal.tsx +++ b/src/components/internetRadio/RadioEditModal.tsx @@ -1,4 +1,5 @@ import React, { useRef, useState } from 'react'; +import { createPortal } from 'react-dom'; import { useTranslation } from 'react-i18next'; import { Camera, Cast, Loader2, X } from 'lucide-react'; import { buildCoverArtUrl, coverArtCacheKey } from '../../api/subsonicStreamUrl'; @@ -62,7 +63,9 @@ export default function RadioEditModal({ station, onClose, onSave }: RadioEditMo if (e.target === e.currentTarget) onClose(); }; - return ( + /* Portal to document.body: nested .content-body uses contain:paint — in-tree + * modals are clipped when the station list is empty (short layout). Same pattern as RadioDirectoryModal. */ + return createPortal(