diff --git a/packages/widgets/src/app/app.module.css b/packages/widgets/src/app/app.module.css
index b14962396..f5535be88 100644
--- a/packages/widgets/src/app/app.module.css
+++ b/packages/widgets/src/app/app.module.css
@@ -1,4 +1,16 @@
+.appText {
+ min-height: 0;
+ min-width: 0;
+ overflow: hidden;
+}
+
+.appText > * {
+ flex-shrink: 0;
+}
+
.appIcon {
+ /* Keep labels and descriptions from consuming all of a short tile. */
+ min-height: 40%;
max-height: 100%;
max-width: 100%;
overflow: auto;
diff --git a/packages/widgets/src/app/component.tsx b/packages/widgets/src/app/component.tsx
index cb8c3cef6..87d48cd62 100644
--- a/packages/widgets/src/app/component.tsx
+++ b/packages/widgets/src/app/component.tsx
@@ -21,7 +21,13 @@ import classes from "./app.module.css";
import { PingDot } from "./ping/ping-dot";
import { PingIndicator } from "./ping/ping-indicator";
-export default function AppWidget({ options, isEditMode, height, width }: WidgetComponentProps<"app">) {
+export default function AppWidget({
+ options,
+ isEditMode,
+ height,
+ width,
+ displayScale = 1,
+}: WidgetComponentProps<"app">) {
const tCommon = useI18n("common");
const settings = useSettings();
const board = useRequiredBoard();
@@ -33,33 +39,50 @@ export default function AppWidget({ options, isEditMode, height, width }: Widget
if (isInitialWidgetQueryPending(appQuery)) return ;
if (!app) return ;
- const isTiny = height < 100 || width < 100;
+ let layoutScale = displayScale;
+ if (!Number.isFinite(layoutScale) || layoutScale <= 0) layoutScale = 1;
+
+ // Widget dimensions are logical pixels; compact sizing follows the displayed tile.
+ const isTiny = height * layoutScale < 100 || width * layoutScale < 100;
const isColumnLayout = options.layout.startsWith("column");
+ let padding = 12;
+ let fontSize = rem(14);
+ let gap = 12;
+ let titleLineClamp = 2;
+ if (isTiny) {
+ padding = 4;
+ fontSize = rem(8);
+ titleLineClamp = 1;
+ }
+ if (isColumnLayout) gap = 0;
return (
-
+
e.preventDefault() : undefined}
>
-
+
{options.showTitle && (
{app.name}
@@ -68,7 +91,8 @@ export default function AppWidget({ options, isEditMode, height, width }: Widget
{options.descriptionDisplayMode === "normal" && (