diff --git a/frontend/src/components/KeyGate.tsx b/frontend/src/components/KeyGate.tsx index 87704e02..d04b17dc 100644 --- a/frontend/src/components/KeyGate.tsx +++ b/frontend/src/components/KeyGate.tsx @@ -168,15 +168,18 @@ export default function KeyGate({ meId, compact = false }: { meId: number; compa {err} )} - - {configured && ( - - )} + {configured && ( + + )} + {!configured && !compact &&

{t("messages.setupWarn")}

} ); diff --git a/frontend/src/components/channelColumns.tsx b/frontend/src/components/channelColumns.tsx index d394b8cd..35a5f466 100644 --- a/frontend/src/components/channelColumns.tsx +++ b/frontend/src/components/channelColumns.tsx @@ -93,7 +93,9 @@ export function buildChannelColumns(deps: ChannelColumnDeps): Column (c.last_video_at ? new Date(c.last_video_at).getTime() : 0), render: (c) => , diff --git a/frontend/src/components/ui/SelectTrigger.tsx b/frontend/src/components/ui/SelectTrigger.tsx index 3d8f16d7..be7edc6b 100644 --- a/frontend/src/components/ui/SelectTrigger.tsx +++ b/frontend/src/components/ui/SelectTrigger.tsx @@ -33,7 +33,7 @@ export const SelectTrigger = forwardRef< ref={ref} type="button" className={clsx( - "glass-hover inline-flex shrink-0 items-center gap-1.5 border text-left text-sm transition touch-target", + "glass-hover inline-flex max-w-full shrink-0 items-center gap-1.5 border text-left text-sm whitespace-nowrap transition touch-target", context === "toolbar" ? "glass-card h-7 rounded-full px-3" : "h-8 w-full rounded-lg bg-transparent px-2.5", @@ -43,17 +43,23 @@ export const SelectTrigger = forwardRef< {...rest} > {icon} - {label != null && {label}:} + {label != null && {label}:} {/* The toolbar value is a row, whatever the caller puts in it: an is display:block under the preflight, and in a plain span it broke the value onto its own line (the saved-view chip, - E28). The form value is text that truncates, which a flex box would not do. */} + E28). The form value is text that truncates, which a flex box would not do — nor would a bare + text node in the toolbar row, so a text value gets its own truncating span: in a narrow place + (the playlists rail) a long value ("Rendezés: Egyéni sorrend") used to wrap out of the pill. */} - {children} + {context === "toolbar" && typeof children === "string" ? ( + {children} + ) : ( + children + )} {trailing} ({ {/* Only a sortable header is a control. A non-sortable one used to render a focusable no-op button, which put unlabeled dead stops in the tab order — two of them per playlist table, whose grip and actions headers are empty. */} + {/* min-w-6 as well as min-h-6: a short header ("Ki", Hungarian "Who") was a 12px + target beside its funnel, under the 24px floor. */} {col.sortable ? ( onToggleSort(col.key)} - className="inline-flex min-h-6 items-center gap-1 hover:text-fg cursor-pointer touch-target" + className="inline-flex min-h-6 min-w-6 items-center gap-1 hover:text-fg cursor-pointer touch-target" > {col.header} {isSorted &&