- );
- },
-);
-
-DataTablePagination.displayName = 'DataTablePagination';
-
-export { DataTablePagination };
diff --git a/packages/ui/src/components/DataTable/Root/DataTableRoot.styles.css b/packages/ui/src/components/DataTable/Root/DataTableRoot.styles.css
deleted file mode 100644
index 21b9be4eb8..0000000000
--- a/packages/ui/src/components/DataTable/Root/DataTableRoot.styles.css
+++ /dev/null
@@ -1,5 +0,0 @@
-.bui-DataTableRoot {
- display: flex;
- flex-direction: column;
- gap: var(--bui-space-3);
-}
diff --git a/packages/ui/src/components/DataTable/Root/DataTableRoot.tsx b/packages/ui/src/components/DataTable/Root/DataTableRoot.tsx
deleted file mode 100644
index 2e3f7a7c6d..0000000000
--- a/packages/ui/src/components/DataTable/Root/DataTableRoot.tsx
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright 2024 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, createContext, useContext } from 'react';
-import clsx from 'clsx';
-import { DataTableRootProps } from './types';
-import { Table } from '@tanstack/react-table';
-
-type DataTableContextType = {
- table: Table;
-};
-
-/** @public */
-export const DataTableContext = createContext | null>(
- null,
-);
-
-/** @public */
-const DataTableRoot = forwardRef(
- (
- props: DataTableRootProps,
- ref: React.ForwardedRef,
- ) => {
- const { className, table, ...rest } = props;
-
- return (
-
-
-
- );
- },
-);
-
-DataTableRoot.displayName = 'DataTableRoot';
-
-export { DataTableRoot };
-
-/** @public */
-export function useDataTable() {
- const context = useContext(DataTableContext);
- if (!context) {
- throw new Error('useDataTable must be used within a DataTableRoot');
- }
- return context as DataTableContextType;
-}
diff --git a/packages/ui/src/components/DataTable/Table/DataTableTable.tsx b/packages/ui/src/components/DataTable/Table/DataTableTable.tsx
deleted file mode 100644
index 368d31e78b..0000000000
--- a/packages/ui/src/components/DataTable/Table/DataTableTable.tsx
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright 2024 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 } from 'react';
-import clsx from 'clsx';
-import { DataTableTableProps } from './types';
-import {
- Table,
- TableRow,
- TableHeader,
- TableHead,
- TableBody,
- TableCell,
-} from '../../Table';
-import { useDataTable } from '../Root/DataTableRoot';
-import { flexRender } from '@tanstack/react-table';
-
-/** @public */
-const DataTableTable = forwardRef(
- (props: DataTableTableProps, ref: React.ForwardedRef) => {
- const { className, ...rest } = props;
- const { table } = useDataTable();
-
- return (
-
+ );
+}
+
+DataTablePagination.displayName = 'DataTablePagination';
+
+export { DataTablePagination };
diff --git a/packages/ui/src/components/DataTable/Pagination/types.ts b/packages/ui/src/components/DataTablePagination/index.ts
similarity index 83%
rename from packages/ui/src/components/DataTable/Pagination/types.ts
rename to packages/ui/src/components/DataTablePagination/index.ts
index b2a895c465..0ddc63a304 100644
--- a/packages/ui/src/components/DataTable/Pagination/types.ts
+++ b/packages/ui/src/components/DataTablePagination/index.ts
@@ -14,6 +14,5 @@
* limitations under the License.
*/
-/** @public */
-export interface DataTablePaginationProps
- extends React.HTMLAttributes {}
+export { DataTablePagination } from './DataTablePagination';
+export type { DataTablePaginationProps } from './types';
diff --git a/packages/ui/src/components/DataTablePagination/types.ts b/packages/ui/src/components/DataTablePagination/types.ts
new file mode 100644
index 0000000000..ca73af1ec7
--- /dev/null
+++ b/packages/ui/src/components/DataTablePagination/types.ts
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2025 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 { Table } from '@tanstack/react-table';
+
+/** @public */
+export interface DataTablePaginationProps
+ extends React.HTMLAttributes {
+ table?: Table;
+ onNextPage?: () => void;
+ onPreviousPage?: () => void;
+ onPageSizeChange?: (pageSize: number) => void;
+ showPageSizeOptions?: boolean;
+}
+
+/** @public */
+export type DataTablePaginationComponent = (
+ props: DataTablePaginationProps & {
+ ref?: React.ForwardedRef;
+ },
+) => React.ReactElement;
diff --git a/packages/ui/src/components/Hidden/Hidden.stories.tsx b/packages/ui/src/components/Hidden/Hidden.stories.tsx
new file mode 100644
index 0000000000..0957bf2e18
--- /dev/null
+++ b/packages/ui/src/components/Hidden/Hidden.stories.tsx
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2025 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 { Meta, StoryObj } from '@storybook/react';
+import { Hidden } from './Hidden';
+
+const meta = {
+ title: 'Components/Hidden',
+ component: Hidden,
+} satisfies Meta;
+
+export default meta;
+type Story = StoryObj;
+
+export const Default: Story = {
+ args: {
+ children: 'Visually hidden content',
+ },
+};
diff --git a/packages/ui/src/components/Hidden/Hidden.styles.css b/packages/ui/src/components/Hidden/Hidden.styles.css
new file mode 100644
index 0000000000..f168e27742
--- /dev/null
+++ b/packages/ui/src/components/Hidden/Hidden.styles.css
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2025 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.
+ */
+
+.bui-Hidden {
+ position: absolute !important;
+ width: 1px !important;
+ height: 1px !important;
+ padding: 0 !important;
+ margin: -1px !important; /* move it off-screen */
+ overflow: hidden !important;
+ clip: rect(0 0 0 0) !important; /* legacy clip for IE/Edge */
+ clip-path: inset(100%) !important; /* modern clip */
+ white-space: nowrap !important; /* avoid line breaks */
+ border: 0 !important;
+}
diff --git a/packages/ui/src/components/Hidden/Hidden.tsx b/packages/ui/src/components/Hidden/Hidden.tsx
new file mode 100644
index 0000000000..1a65256806
--- /dev/null
+++ b/packages/ui/src/components/Hidden/Hidden.tsx
@@ -0,0 +1,22 @@
+/*
+ * Copyright 2025 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 { Box, BoxProps } from '../Box';
+import clsx from 'clsx';
+
+export const Hidden = (props: BoxProps) => {
+ return ;
+};
diff --git a/packages/ui/src/components/DataTable/Table/types.ts b/packages/ui/src/components/Hidden/index.ts
similarity index 85%
rename from packages/ui/src/components/DataTable/Table/types.ts
rename to packages/ui/src/components/Hidden/index.ts
index a4ef96c732..206d2c5c47 100644
--- a/packages/ui/src/components/DataTable/Table/types.ts
+++ b/packages/ui/src/components/Hidden/index.ts
@@ -14,6 +14,4 @@
* limitations under the License.
*/
-/** @public */
-export interface DataTableTableProps
- extends React.HTMLAttributes {}
+export { Hidden } from './Hidden';
diff --git a/packages/ui/src/components/Table/TableCell/TableCell.tsx b/packages/ui/src/components/Table/TableCell/TableCell.tsx
index cbd025178c..4e12470933 100644
--- a/packages/ui/src/components/Table/TableCell/TableCell.tsx
+++ b/packages/ui/src/components/Table/TableCell/TableCell.tsx
@@ -1,5 +1,5 @@
/*
- * Copyright 2024 The Backstage Authors
+ * Copyright 2025 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.
diff --git a/packages/ui/src/css/components.css b/packages/ui/src/css/components.css
index 68f834b36a..3fd7469b11 100644
--- a/packages/ui/src/css/components.css
+++ b/packages/ui/src/css/components.css
@@ -1,5 +1,5 @@
/*
- * Copyright 2024 The Backstage Authors
+ * Copyright 2025 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.
@@ -22,14 +22,15 @@
@import '../components/Checkbox/styles.css';
@import '../components/Collapsible/Collapsible.styles.css';
@import '../components/Container/styles.css';
-@import '../components/DataTable/Root/DataTableRoot.styles.css';
-@import '../components/DataTable/Pagination/DataTablePagination.styles.css';
+@import '../components/DataTable/DataTable.styles.css';
+@import '../components/DataTablePagination/DataTablePagination.styles.css';
@import '../components/FieldError/FieldError.styles.css';
@import '../components/FieldLabel/FieldLabel.styles.css';
@import '../components/Flex/styles.css';
@import '../components/Grid/styles.css';
@import '../components/Header/Header.styles.css';
@import '../components/HeaderPage/HeaderPage.styles.css';
+@import '../components/Hidden/Hidden.styles.css';
@import '../components/Icon/styles.css';
@import '../components/Link/styles.css';
@import '../components/Menu/Menu.styles.css';
diff --git a/packages/ui/src/index.ts b/packages/ui/src/index.ts
index b91d4fc74b..eaeff29eea 100644
--- a/packages/ui/src/index.ts
+++ b/packages/ui/src/index.ts
@@ -35,9 +35,11 @@ export * from './components/Button';
export * from './components/Card';
export * from './components/Collapsible';
export * from './components/DataTable';
+export * from './components/DataTablePagination';
export * from './components/FieldLabel';
export * from './components/Header';
export * from './components/HeaderPage';
+export * from './components/Hidden';
export * from './components/Icon';
export * from './components/ButtonIcon';
export * from './components/ButtonLink';