diff --git a/CHANGELOG.md b/CHANGELOG.md
index 181facccf..dd551b0d0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -20,6 +20,8 @@
- Host status, import and export, and credential tools now start on for new installs
- Sync now starts on in a new desktop app, so it can link to a server
- The first run plugin picker leaves plugins you did not choose off instead of removing them
+- Dropdowns and text areas are the same size as the text fields next to them
+- A page's own tabs sit above its search bar
### Fixed
@@ -30,6 +32,13 @@
- An installed plugin update older than the copy in a newer image is removed at startup instead of logging an error every boot
- Canceling a download to the desktop app right as it starts no longer leaves a partial file behind
- Changing two interface settings at once, like resetting the dashboard, now saves both instead of only the last one
+- Release notes on a plugin's page are no longer cut off on the left
+- The Community badge in Browse is no longer missing its top border
+- Official plugin pages no longer show a stray divider before the author
+- The version picker on a plugin's page is no longer empty for a plugin installed from a local build
+- The plugin video no longer has a second border around it
+- The hint at the bottom of Browse and the stored data footer on plugin pages have the same padding as the rest of the page
+- Sign in methods on the Security page have a line between them
## 26.11.0
diff --git a/src/ui/components/panel-layout.tsx b/src/ui/components/panel-layout.tsx
index 9a09ea04a..c90d384ac 100644
--- a/src/ui/components/panel-layout.tsx
+++ b/src/ui/components/panel-layout.tsx
@@ -118,6 +118,9 @@ export function PanelShell({
const bands = (
<>
+ {tabs && (
+
{tabs}
+ )}
{toolbar && (
)}
- {tabs && (
-
{tabs}
- )}
>
);
diff --git a/src/ui/components/select.tsx b/src/ui/components/select.tsx
index 9207fe81c..1ac0f2ab3 100644
--- a/src/ui/components/select.tsx
+++ b/src/ui/components/select.tsx
@@ -35,7 +35,7 @@ function SelectTrigger({
data-slot="select-trigger"
data-size={size}
className={cn(
- "border-input data-[placeholder]:text-muted-foreground [&_svg:not([class*='text-'])]:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 dark:hover:bg-input/50 flex w-fit items-center justify-between gap-2 rounded-none border bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
+ "border-input data-[placeholder]:text-muted-foreground [&_svg:not([class*='text-'])]:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 dark:hover:bg-input/50 flex w-fit items-center justify-between gap-2 rounded-none border bg-transparent px-2.5 py-1 text-xs whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-8 data-[size=sm]:h-7 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
className,
)}
{...props}
@@ -105,7 +105,7 @@ function SelectItem({
{
@@ -189,7 +189,7 @@ function Select2({
value={query}
onChange={(event) => setQuery(event.target.value)}
placeholder={t("common.search")}
- className="h-9 w-full bg-transparent text-sm outline-none placeholder:text-muted-foreground"
+ className="h-8 w-full bg-transparent text-xs outline-none placeholder:text-muted-foreground"
autoFocus
/>
@@ -198,7 +198,7 @@ function Select2({
className="max-h-64 overflow-y-auto p-1 thin-scrollbar"
>
{filteredOptions.length === 0 ? (
-
+
{t("common.noResults")}
) : (
@@ -222,7 +222,7 @@ function Select2({
aria-selected={isSelected}
disabled={option.disabled}
className={cn(
- "flex w-full items-center gap-2 rounded-none px-2 py-1.5 text-left text-sm outline-none transition-colors hover:bg-muted disabled:pointer-events-none disabled:opacity-50",
+ "flex w-full items-center gap-2 rounded-none px-2 py-1.5 text-left text-xs outline-none transition-colors hover:bg-muted disabled:pointer-events-none disabled:opacity-50",
isSelected && "bg-muted text-accent-foreground",
)}
onClick={() => selectValue(option.value)}
diff --git a/src/ui/components/textarea.tsx b/src/ui/components/textarea.tsx
index 0293c3af8..3c5f1d457 100644
--- a/src/ui/components/textarea.tsx
+++ b/src/ui/components/textarea.tsx
@@ -9,7 +9,7 @@ const Textarea = React.forwardRef
(
return (