(null);
- const ref = useCallback((el: Element | null) => {
- observer.current?.disconnect();
- observer.current = null;
- // jsdom implements neither; unmeasured falls through to the wide variant.
- if (!el || typeof ResizeObserver === "undefined") return;
- const ro = new ResizeObserver((entries) => {
- setWidth(entries[0]?.contentRect.width ?? 0);
- setCompact(prefersCompact());
- });
- ro.observe(el);
- observer.current = ro;
- }, []);
+ const ref = useCallback(
+ (el: Element | null) => {
+ observer.current?.disconnect();
+ observer.current = null;
+ // jsdom implements neither; unmeasured falls through to the wide variant.
+ if (!el || typeof ResizeObserver === "undefined") return;
+ const ro = new ResizeObserver((entries) => {
+ const measured = entries[0]?.contentRect.width ?? 0;
+ setWidth(measured);
+ setCompact(
+ prefersCompact() ||
+ (minWideWidth !== undefined && measured > 0 && measured < minWideWidth),
+ );
+ });
+ ro.observe(el);
+ observer.current = ro;
+ },
+ [minWideWidth],
+ );
const variant = compact ? variants.compact : variants.wide;
diff --git a/src/scenes/SpineScene.tsx b/src/scenes/SpineScene.tsx
index 4abeb9c..e377706 100644
--- a/src/scenes/SpineScene.tsx
+++ b/src/scenes/SpineScene.tsx
@@ -64,7 +64,13 @@ export function SpineScene() {
{label}
-
+ {/* scrollable, so it must be reachable by keyboard (WCAG 2.1.1) */}
+
{JSON.stringify(sample, null, 2)}