|
@@ -5398,17 +5398,27 @@ function PrinterCard({
|
|
|
<div className="fixed inset-0 z-[100]" onClick={() => setDryingPopoverAmsId(null)} />
|
|
<div className="fixed inset-0 z-[100]" onClick={() => setDryingPopoverAmsId(null)} />
|
|
|
{/* Popover */}
|
|
{/* Popover */}
|
|
|
<div
|
|
<div
|
|
|
- className="fixed z-[101] w-[240px] bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-xl shadow-2xl overflow-hidden"
|
|
|
|
|
- style={{ top: dryingPopoverPos.top, left: dryingPopoverPos.left }}
|
|
|
|
|
|
|
+ className="fixed z-[101] flex flex-col w-[240px] bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-xl shadow-2xl overflow-hidden"
|
|
|
|
|
+ style={{
|
|
|
|
|
+ top: dryingPopoverPos.top,
|
|
|
|
|
+ left: dryingPopoverPos.left,
|
|
|
|
|
+ // Cap to the space between the popover's top and the bottom
|
|
|
|
|
+ // viewport margin (8px, matching computePopoverPosition's
|
|
|
|
|
+ // margin). When the popover is taller than that space — short
|
|
|
|
|
+ // viewport, landscape phone, zoomed-in — the body scrolls and
|
|
|
|
|
+ // the footer stays pinned, so the Start button is always
|
|
|
|
|
+ // reachable (#1458 / #1447 follow-up).
|
|
|
|
|
+ maxHeight: `calc(100vh - ${dryingPopoverPos.top}px - 8px)`,
|
|
|
|
|
+ }}
|
|
|
onClick={e => e.stopPropagation()}
|
|
onClick={e => e.stopPropagation()}
|
|
|
>
|
|
>
|
|
|
{/* Header */}
|
|
{/* Header */}
|
|
|
- <div className="flex items-center gap-2 px-3 py-2.5 border-b border-bambu-dark-tertiary">
|
|
|
|
|
|
|
+ <div className="shrink-0 flex items-center gap-2 px-3 py-2.5 border-b border-bambu-dark-tertiary">
|
|
|
<Flame className="w-3.5 h-3.5 text-amber-400" />
|
|
<Flame className="w-3.5 h-3.5 text-amber-400" />
|
|
|
<span className="text-xs text-white font-medium">{t('printers.drying.start')}</span>
|
|
<span className="text-xs text-white font-medium">{t('printers.drying.start')}</span>
|
|
|
</div>
|
|
</div>
|
|
|
{/* Body */}
|
|
{/* Body */}
|
|
|
- <div className="px-3 py-2.5 space-y-2.5">
|
|
|
|
|
|
|
+ <div className="px-3 py-2.5 space-y-2.5 overflow-y-auto min-h-0">
|
|
|
{/* Filament type select */}
|
|
{/* Filament type select */}
|
|
|
<div>
|
|
<div>
|
|
|
<label className="text-[10px] text-bambu-gray mb-1 block">{t('printers.filaments')}</label>
|
|
<label className="text-[10px] text-bambu-gray mb-1 block">{t('printers.filaments')}</label>
|
|
@@ -5501,7 +5511,7 @@ function PrinterCard({
|
|
|
</label>
|
|
</label>
|
|
|
</div>
|
|
</div>
|
|
|
{/* Footer */}
|
|
{/* Footer */}
|
|
|
- <div className="px-3 pb-3">
|
|
|
|
|
|
|
+ <div className="shrink-0 px-3 pt-2.5 pb-3">
|
|
|
<button
|
|
<button
|
|
|
onClick={() => {
|
|
onClick={() => {
|
|
|
if (dryingPopoverAmsId !== null) {
|
|
if (dryingPopoverAmsId !== null) {
|