diff --git a/packages/loot-design/src/components/ElementQuery.js b/packages/loot-design/src/components/ElementQuery.js
deleted file mode 100644
index 8ef6273b657fc14ecbdb68d2204bd42adbbaa660..0000000000000000000000000000000000000000
--- a/packages/loot-design/src/components/ElementQuery.js
+++ /dev/null
@@ -1,37 +0,0 @@
-import lively from '@jlongster/lively';
-
-function findMatch(element, sizes) {
-  const rect = element.getBoundingClientRect();
-  const matched = sizes.find(size => {
-    return (
-      (size.width != null && rect.width < size.width) ||
-      (size.height != null && rect.height < size.height)
-    );
-  });
-
-  return matched || sizes[sizes.length - 1];
-}
-
-// Component
-
-function ElementQuery({ props: { children }, state: { matched }, inst }) {
-  return children(matched, el => (inst.element = el));
-}
-
-export default lively(ElementQuery, {
-  getInitialState() {
-    return { matched: null };
-  },
-  componentDidMount({ inst, props, setState }) {
-    inst.observer = new ResizeObserver(entries => {
-      entries.forEach(entry => {
-        setState({ matched: findMatch(inst.element, props.sizes) });
-      });
-    });
-
-    inst.observer.observe(inst.element);
-  },
-  componentWillUnmount({ inst }) {
-    inst.observer.disconnect();
-  },
-});
diff --git a/packages/loot-design/src/components/budget/index.js b/packages/loot-design/src/components/budget/index.js
index 21c2297ffa4e0a95cf0a8813a6856230e7839d08..05b54cb85dd83ed932f8ebafcb3792df398da35f 100644
--- a/packages/loot-design/src/components/budget/index.js
+++ b/packages/loot-design/src/components/budget/index.js
@@ -15,7 +15,6 @@ import {
   Menu,
   IntersectionBoundary,
 } from '../common';
-import ElementQuery from '../ElementQuery';
 import NotesButton from '../NotesButton';
 import {
   useDraggable,
@@ -25,6 +24,7 @@ import {
 } from '../sort.js';
 import NamespaceContext from '../spreadsheet/NamespaceContext';
 import { Row, InputCell, ROW_HEIGHT } from '../table';
+import useResizeObserver from '../useResizeObserver';
 
 import BudgetSummaries from './BudgetSummaries';
 import { INCOME_HEADER_HEIGHT, MONTH_BOX_SHADOW } from './constants';
@@ -1274,6 +1274,11 @@ export const MonthPicker = ({
   const year = monthUtils.getYear(startMonth);
   const selectedIndex = monthUtils.getMonthIndex(startMonth);
 
+  const [size, setSize] = useState('small');
+  const containerRef = useResizeObserver(rect => {
+    setSize(rect.width <= 320 ? 'small' : rect.width <= 400 ? 'medium' : 'big');
+  });
+
   return (
     <View
       style={[
@@ -1296,83 +1301,68 @@ export const MonthPicker = ({
       >
         {monthUtils.format(year, 'yyyy')}
       </View>
-      <ElementQuery
-        sizes={[
-          { width: 320, size: 'small' },
-          { width: 400, size: 'medium' },
-          { size: 'big' },
-        ]}
+      <View
+        innerRef={containerRef}
+        style={{
+          flexDirection: 'row',
+          flex: 1,
+          alignItems: 'center',
+          justifyContent: 'center',
+        }}
       >
-        {(matched, ref) => (
-          <View
-            innerRef={ref}
-            style={{
-              flexDirection: 'row',
-              flex: 1,
-              alignItems: 'center',
-              justifyContent: 'center',
-            }}
-          >
-            {monthNames.map((monthName, idx) => {
-              const lastSelectedIndex = selectedIndex + numDisplayed;
-              const selected = idx >= selectedIndex && idx < lastSelectedIndex;
-              const current = monthName === currentMonthName;
-              const month = getMonth(year, idx);
-              const isMonthBudgeted =
-                month >= monthBounds.start && month <= monthBounds.end;
-
-              return (
-                <View
-                  key={monthName}
-                  style={[
-                    {
-                      marginRight: 1,
-                      padding:
-                        matched && matched.size === 'big'
-                          ? '3px 5px'
-                          : '3px 3px',
-                      textAlign: 'center',
-                      cursor: 'default',
-                      borderRadius: 2,
-                      ':hover': isMonthBudgeted && {
-                        backgroundColor: colors.p6,
-                        color: 'white',
-                      },
-                    },
-                    !isMonthBudgeted && { color: colors.n7 },
-                    styles.smallText,
-                    selected && {
-                      backgroundColor: colors.p6,
-                      color: 'white',
-                      borderRadius: 0,
-                    },
-                    idx === selectedIndex && {
-                      borderTopLeftRadius: 2,
-                      borderBottomLeftRadius: 2,
-                    },
-                    idx === lastSelectedIndex - 1 && {
-                      borderTopRightRadius: 2,
-                      borderBottomRightRadius: 2,
-                    },
-                    idx >= selectedIndex &&
-                      idx < lastSelectedIndex - 1 && {
-                        marginRight: 0,
-                        borderRight: 'solid 1px',
-                        borderColor: colors.p6,
-                      },
-                    current && { textDecoration: 'underline' },
-                  ]}
-                  onClick={() => onSelect(month)}
-                >
-                  {matched && matched.size === 'small'
-                    ? monthName[0]
-                    : monthName}
-                </View>
-              );
-            })}
-          </View>
-        )}
-      </ElementQuery>
+        {monthNames.map((monthName, idx) => {
+          const lastSelectedIndex = selectedIndex + numDisplayed;
+          const selected = idx >= selectedIndex && idx < lastSelectedIndex;
+          const current = monthName === currentMonthName;
+          const month = getMonth(year, idx);
+          const isMonthBudgeted =
+            month >= monthBounds.start && month <= monthBounds.end;
+
+          return (
+            <View
+              key={monthName}
+              style={[
+                {
+                  marginRight: 1,
+                  padding: size === 'big' ? '3px 5px' : '3px 3px',
+                  textAlign: 'center',
+                  cursor: 'default',
+                  borderRadius: 2,
+                  ':hover': isMonthBudgeted && {
+                    backgroundColor: colors.p6,
+                    color: 'white',
+                  },
+                },
+                !isMonthBudgeted && { color: colors.n7 },
+                styles.smallText,
+                selected && {
+                  backgroundColor: colors.p6,
+                  color: 'white',
+                  borderRadius: 0,
+                },
+                idx === selectedIndex && {
+                  borderTopLeftRadius: 2,
+                  borderBottomLeftRadius: 2,
+                },
+                idx === lastSelectedIndex - 1 && {
+                  borderTopRightRadius: 2,
+                  borderBottomRightRadius: 2,
+                },
+                idx >= selectedIndex &&
+                  idx < lastSelectedIndex - 1 && {
+                    marginRight: 0,
+                    borderRight: 'solid 1px',
+                    borderColor: colors.p6,
+                  },
+                current && { textDecoration: 'underline' },
+              ]}
+              onClick={() => onSelect(month)}
+            >
+              {size === 'small' ? monthName[0] : monthName}
+            </View>
+          );
+        })}
+      </View>
       <View
         style={{
           flexDirection: 'row',