diff --git a/packages/ui/src/components/Button/Button.tsx b/packages/ui/src/components/Button/Button.tsx
index f010e5e57d..2ead32fccd 100644
--- a/packages/ui/src/components/Button/Button.tsx
+++ b/packages/ui/src/components/Button/Button.tsx
@@ -23,7 +23,36 @@ import { useStyles } from '../../hooks/useStyles';
import { ButtonDefinition } from './definition';
import styles from './Button.module.css';
-/** @public */
+/**
+ * A button component built on React Aria Components that provides accessible
+ * interactive elements for triggering actions.
+ *
+ * @remarks
+ * The Button component supports multiple variants (primary, secondary, tertiary, danger),
+ * sizes (small, medium), and states including loading and disabled. It automatically
+ * handles keyboard navigation, focus management, and ARIA attributes for accessibility.
+ *
+ * @example
+ * Basic usage:
+ * ```tsx
+ *
+ * ```
+ *
+ * @example
+ * With icons and loading state:
+ * ```tsx
+ * }
+ * loading={isSubmitting}
+ * >
+ * Submit
+ *
+ * ```
+ *
+ * @public
+ */
export const Button = forwardRef(
(props: ButtonProps, ref: Ref) => {
const { classNames, dataAttributes, cleanedProps } = useStyles(
diff --git a/packages/ui/src/components/Card/Card.stories.tsx b/packages/ui/src/components/Card/Card.stories.tsx
index f2a9c9bf07..438dd0e353 100644
--- a/packages/ui/src/components/Card/Card.stories.tsx
+++ b/packages/ui/src/components/Card/Card.stories.tsx
@@ -33,14 +33,13 @@ export const Default = meta.story({
),
});
-export const CustomSize = meta.story({
+export const CustomSize = Default.extend({
args: {
style: {
width: '300px',
height: '200px',
},
},
- render: Default.input.render,
});
export const WithLongBody = meta.story({
diff --git a/packages/ui/src/components/Dialog/Dialog.stories.tsx b/packages/ui/src/components/Dialog/Dialog.stories.tsx
index 7c7edc1801..a91fecdbd6 100644
--- a/packages/ui/src/components/Dialog/Dialog.stories.tsx
+++ b/packages/ui/src/components/Dialog/Dialog.stories.tsx
@@ -143,30 +143,26 @@ export const FixedWidth = meta.story({
),
});
-export const FixedHeight = meta.story({
+export const FixedHeight = FixedWidth.extend({
args: {
defaultOpen: true,
+ width: undefined,
height: 500,
},
- render: FixedWidth.input.render,
});
-export const FixedWidthAndHeight = meta.story({
+export const FixedWidthAndHeight = FixedWidth.extend({
args: {
- defaultOpen: true,
- width: 600,
height: 400,
},
- render: FixedWidth.input.render,
});
-export const FullWidthAndHeight = meta.story({
+export const FullWidthAndHeight = FixedWidth.extend({
args: {
defaultOpen: true,
width: '100%',
height: '100%',
},
- render: FixedWidth.input.render,
});
export const Confirmation = meta.story({
@@ -233,18 +229,16 @@ export const WithForm = meta.story({
),
});
-export const PreviewFixedWidthAndHeight = meta.story({
+export const PreviewFixedWidthAndHeight = FixedWidth.extend({
args: {
defaultOpen: undefined,
width: 600,
height: 400,
},
- render: FixedWidth.input.render,
});
-export const PreviewWithForm = meta.story({
+export const PreviewWithForm = WithForm.extend({
args: {
defaultOpen: undefined,
},
- render: WithForm.input.render,
});
diff --git a/packages/ui/src/components/Grid/Grid.stories.tsx b/packages/ui/src/components/Grid/Grid.stories.tsx
index 56251b6085..1a71310d29 100644
--- a/packages/ui/src/components/Grid/Grid.stories.tsx
+++ b/packages/ui/src/components/Grid/Grid.stories.tsx
@@ -22,6 +22,8 @@ import { Flex } from '../Flex';
const meta = preview.meta({
title: 'Backstage UI/Grid',
component: Grid.Root,
+ // We will add this story in the manifest when the component is not composed.
+ tags: ['!manifest'],
});
const FakeBox = () => (
diff --git a/packages/ui/src/components/Header/Header.stories.tsx b/packages/ui/src/components/Header/Header.stories.tsx
index 7d1aa3a00a..ba2c5b9abf 100644
--- a/packages/ui/src/components/Header/Header.stories.tsx
+++ b/packages/ui/src/components/Header/Header.stories.tsx
@@ -240,13 +240,10 @@ export const WithCustomActions = meta.story({
),
});
-export const WithAllOptionsAndTabs = meta.story({
+export const WithAllOptionsAndTabs = WithCustomActions.extend({
args: {
- ...WithCustomActions.input.args,
tabs,
},
- decorators: [withRouter],
- render: WithCustomActions.input.render,
});
export const WithHeaderPage = meta.story({
diff --git a/packages/ui/src/components/PasswordField/PasswordField.stories.tsx b/packages/ui/src/components/PasswordField/PasswordField.stories.tsx
index 5f6a74d992..8025ce7217 100644
--- a/packages/ui/src/components/PasswordField/PasswordField.stories.tsx
+++ b/packages/ui/src/components/PasswordField/PasswordField.stories.tsx
@@ -99,12 +99,10 @@ export const WithIcon = meta.story({
),
});
-export const DisabledWithIcon = meta.story({
+export const DisabledWithIcon = WithIcon.extend({
args: {
- ...WithIcon.input.args,
isDisabled: true,
},
- render: WithIcon.input.render,
});
export const ShowError = meta.story({
diff --git a/packages/ui/src/components/TagGroup/TagGroup.stories.tsx b/packages/ui/src/components/TagGroup/TagGroup.stories.tsx
index d33eed8bf1..7d4ee4173e 100644
--- a/packages/ui/src/components/TagGroup/TagGroup.stories.tsx
+++ b/packages/ui/src/components/TagGroup/TagGroup.stories.tsx
@@ -37,7 +37,7 @@ export interface ListItem {
const meta = preview.meta({
title: 'Backstage UI/TagGroup',
- component: TagGroup,
+ component: TagGroup,
argTypes: {
selectionMode: {
control: { type: 'inline-radio' },
@@ -117,11 +117,11 @@ export const SelectionModeSingle = meta.story({
const [selected, setSelected] = useState(new Set(['travel']));
return (
-
+ {...args}
items={initialList}
selectedKeys={selected}
onSelectionChange={setSelected}
- {...args}
>
{item => {item.name}}
@@ -140,11 +140,11 @@ export const SelectionModeMultiple = meta.story({
);
return (
-
+ {...args}
items={initialList}
selectedKeys={selected}
onSelectionChange={setSelected}
- {...args}
>
{item => {item.name}}
@@ -198,17 +198,17 @@ export const RemovingTags = meta.story({
render: args => {
const [selected, setSelected] = useState(new Set(['travel']));
- const list = useListData({
+ const list = useListData({
initialItems: initialList,
});
return (
-
+ {...args}
items={list.items}
onRemove={keys => list.remove(...keys)}
selectedKeys={selected}
onSelectionChange={setSelected}
- {...args}
>
{item => {item.name}}
@@ -223,17 +223,17 @@ export const WithIconAndRemoveButton = meta.story({
render: args => {
const [selected, setSelected] = useState(new Set(['travel']));
- const list = useListData({
+ const list = useListData({
initialItems: initialList,
});
return (
-
+ {...args}
items={list.items}
onRemove={keys => list.remove(...keys)}
selectedKeys={selected}
onSelectionChange={setSelected}
- {...args}
>
{item => (
{item.name}
diff --git a/packages/ui/src/components/TextField/TextField.stories.tsx b/packages/ui/src/components/TextField/TextField.stories.tsx
index 54457f351b..03c5f35b11 100644
--- a/packages/ui/src/components/TextField/TextField.stories.tsx
+++ b/packages/ui/src/components/TextField/TextField.stories.tsx
@@ -104,12 +104,10 @@ export const WithIcon = meta.story({
),
});
-export const DisabledWithIcon = meta.story({
+export const DisabledWithIcon = WithIcon.extend({
args: {
- ...WithIcon.input.args,
isDisabled: true,
},
- render: WithIcon.input.render,
});
export const ShowError = meta.story({