+
+
+ {showValueLabel && (
+
+ {({ state }) => {
+ const values = state.values;
+ if (values.length === 2) {
+ return `${formatValue(values[0])} - ${formatValue(
+ values[1],
+ )}`;
+ }
+ return formatValue(values[0]);
+ }}
+
+ )}
+
+
+ {({ state }) => (
+ <>
+
+
+
+ >
+ )}
+
+
+
+ );
+ },
+);
+
+RangeSlider.displayName = 'RangeSlider';
diff --git a/packages/ui/src/components/RangeSlider/definition.ts b/packages/ui/src/components/RangeSlider/definition.ts
new file mode 100644
index 0000000000..3efbb78456
--- /dev/null
+++ b/packages/ui/src/components/RangeSlider/definition.ts
@@ -0,0 +1,34 @@
+/*
+ * 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 type { ComponentDefinition } from '../../types';
+
+/**
+ * Component definition for RangeSlider
+ * @public
+ */
+export const RangeSliderDefinition = {
+ classNames: {
+ root: 'bui-RangeSlider',
+ track: 'bui-RangeSliderTrack',
+ trackFill: 'bui-RangeSliderTrackFill',
+ thumb: 'bui-RangeSliderThumb',
+ output: 'bui-RangeSliderOutput',
+ },
+ dataAttributes: {
+ disabled: [true, false] as const,
+ },
+} as const satisfies ComponentDefinition;
diff --git a/packages/ui/src/components/RangeSlider/index.ts b/packages/ui/src/components/RangeSlider/index.ts
new file mode 100644
index 0000000000..72dde65c8f
--- /dev/null
+++ b/packages/ui/src/components/RangeSlider/index.ts
@@ -0,0 +1,19 @@
+/*
+ * 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.
+ */
+
+export * from './RangeSlider';
+export * from './types';
+export { RangeSliderDefinition } from './definition';
diff --git a/packages/ui/src/components/RangeSlider/types.ts b/packages/ui/src/components/RangeSlider/types.ts
new file mode 100644
index 0000000000..3054a2ebbe
--- /dev/null
+++ b/packages/ui/src/components/RangeSlider/types.ts
@@ -0,0 +1,39 @@
+/*
+ * 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 type { SliderProps as AriaSliderProps } from 'react-aria-components';
+import type { FieldLabelProps } from '../FieldLabel/types';
+
+/** @public */
+export interface RangeSliderProps
+ extends Omit