+
+ NumberField automatically detects its parent bg context and increments
+ the neutral level by 1. No prop is needed — it's fully automatic.
+
+
+ Neutral 1 container
+
+
+
+
+
+
+ Neutral 2 container
+
+
+
+
+
+
+
+
+ Neutral 3 container
+
+
+
+
+
+
+
+ ),
+});
diff --git a/packages/ui/src/components/NumberField/NumberField.tsx b/packages/ui/src/components/NumberField/NumberField.tsx
new file mode 100644
index 0000000000..d909909c7a
--- /dev/null
+++ b/packages/ui/src/components/NumberField/NumberField.tsx
@@ -0,0 +1,121 @@
+/*
+ * Copyright 2026 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { forwardRef, useEffect, useMemo } from 'react';
+import {
+ Group,
+ Input,
+ NumberField as AriaNumberField,
+} from 'react-aria-components';
+import { RiAddLine, RiSubtractLine } from '@remixicon/react';
+import { FieldLabel } from '../FieldLabel';
+import { FieldError } from '../FieldError';
+import { ButtonIcon } from '../ButtonIcon';
+import type { NumberFieldProps } from './types';
+import { useDefinition } from '../../hooks/useDefinition';
+import { NumberFieldDefinition } from './definition';
+
+/**
+ * A numeric input with an integrated label, optional icon, and inline error display.
+ *
+ * @public
+ */
+export const NumberField = forwardRef