diff --git a/docs/configure/styling-and-css.md b/docs/configure/styling-and-css.md
index b328359af00f..92ac363e6b47 100644
--- a/docs/configure/styling-and-css.md
+++ b/docs/configure/styling-and-css.md
@@ -35,6 +35,8 @@ CSS-in-JS libraries are designed to use basic JavaScript, and they often work in
If you need webfonts to be available, you may need to add some code to the [`.storybook/preview-head.html`](./story-rendering.md#adding-to-head) file. We recommend including any assets with your Storybook if possible, in which case you likely want to configure the [static file location](./images-and-assets.md#serving-static-files-via-storybook-configuration).
+
+
## Troubleshooting
### Styles aren't being applied with Angular
@@ -56,7 +58,7 @@ The latest Angular releases introduced significant changes in configuring and st
}
```
-Additionally, if you need Storybook-specific styles that are separate from your application, you can configure the styles with [Storybook's custom builder](../get-started/install.md), which will override the application's styles:
+Additionally, if you need Storybook-specific styles that are separate from your application, you can configure the styles with [Storybook's custom builder](../get-started/install.md#troubleshooting), which will override the application's styles:
```json
{
@@ -121,3 +123,5 @@ Starting with version `14.1.8`, Nx uses the Storybook builder directly, which me
```
When Nx runs, it will load Storybook's configuration and styling based on [`storybook`'s `browserTarget`](https://nx.dev/storybook/extra-topics-for-angular-projects#setting-up-browsertarget).
+
+
diff --git a/docs/snippets/common/storybook-addon-panel-initial.js.mdx b/docs/snippets/common/storybook-addon-panel-initial.js.mdx
index 707e8bb199a7..f097d264461a 100644
--- a/docs/snippets/common/storybook-addon-panel-initial.js.mdx
+++ b/docs/snippets/common/storybook-addon-panel-initial.js.mdx
@@ -3,7 +3,7 @@
import React from 'react';
-import { addons, types } from '@storybook/preview-api';
+import { addons, types } from '@storybook/manager-api';
import { AddonPanel } from '@storybook/components';
diff --git a/docs/snippets/react/page-story-args-within-story.js.mdx b/docs/snippets/react/page-story-args-within-story.js.mdx
new file mode 100644
index 000000000000..282e81f79cf7
--- /dev/null
+++ b/docs/snippets/react/page-story-args-within-story.js.mdx
@@ -0,0 +1,31 @@
+```js
+// my-component/component.stories.js|jsx
+
+import { useArgs } from '@storybook/preview-api';
+import { Checkbox } from './checkbox';
+
+export default {
+ title: 'Inputs/Checkbox',
+ component: Checkbox,
+};
+
+export const Example = {
+ args: {
+ isChecked: false,
+ label: 'Try Me!',
+ },
+ /**
+ * 👇 To avoid linting issues, it is recommended to use a function with a capitalized name.
+ * If you are not concerned with linting, you may use an arrow function.
+ */
+ render: function Render(args) {
+ const [{ isChecked }, updateArgs] = useArgs();
+
+ function onChange() {
+ updateArgs({ isChecked: !isChecked });
+ }
+
+ return ;
+ },
+};
+```
diff --git a/docs/snippets/react/page-story-args-within-story.ts-4-9.mdx b/docs/snippets/react/page-story-args-within-story.ts-4-9.mdx
new file mode 100644
index 000000000000..5a23cb8f523e
--- /dev/null
+++ b/docs/snippets/react/page-story-args-within-story.ts-4-9.mdx
@@ -0,0 +1,35 @@
+```ts
+// my-component/component.stories.ts|tsx
+
+import { StoryObj, Meta } from '@storybook/react';
+import { useArgs } from '@storybook/preview-api';
+import { Checkbox } from './checkbox';
+
+const meta = {
+ title: 'Inputs/Checkbox',
+ component: Checkbox,
+} satisfies Meta;
+export default meta;
+
+type Story = StoryObj;
+
+export const Example = {
+ args: {
+ isChecked: false,
+ label: 'Try Me!',
+ },
+ /**
+ * 👇 To avoid linting issues, it is recommended to use a function with a capitalized name.
+ * If you are not concerned with linting, you may use an arrow function.
+ */
+ render: function Render(args) {
+ const [{ isChecked }, updateArgs] = useArgs();
+
+ function onChange() {
+ updateArgs({ isChecked: !isChecked });
+ }
+
+ return ;
+ },
+} satisfies Story;
+```
diff --git a/docs/snippets/react/page-story-args-within-story.ts.mdx b/docs/snippets/react/page-story-args-within-story.ts.mdx
new file mode 100644
index 000000000000..137e37cbf3d6
--- /dev/null
+++ b/docs/snippets/react/page-story-args-within-story.ts.mdx
@@ -0,0 +1,35 @@
+```ts
+// my-component/component.stories.ts|tsx
+
+import { StoryObj, Meta } from '@storybook/react';
+import { useArgs } from '@storybook/preview-api';
+import { Checkbox } from './checkbox';
+
+const meta: Meta = {
+ title: 'Inputs/Checkbox',
+ component: Checkbox,
+};
+export default meta;
+
+type Story = StoryObj;
+
+export const Example: Story = {
+ args: {
+ isChecked: false,
+ label: 'Try Me!',
+ },
+ /**
+ * 👇 To avoid linting issues, it is recommended to use a function with a capitalized name.
+ * If you are not concerned with linting, you may use an arrow function.
+ */
+ render: function Render(args) {
+ const [{ isChecked }, updateArgs] = useArgs();
+
+ function onChange() {
+ updateArgs({ isChecked: !isChecked });
+ }
+
+ return ;
+ },
+};
+```
diff --git a/docs/writing-stories/args.md b/docs/writing-stories/args.md
index 807797e5675f..26a61edfb322 100644
--- a/docs/writing-stories/args.md
+++ b/docs/writing-stories/args.md
@@ -213,6 +213,25 @@ Similarly, special formats are available for dates and colors. Date objects will
Args specified through the URL will extend and override any default values of args set on the story.
+
+
+## Setting args from within a story
+
+Interactive components often need to be controlled by their containing component or page to respond to events, modify their state and reflect those changes in the UI. For example, when a user toggles a switch component, the switch should be checked, and the arg shown in Storybook should reflect the change. To enable this, you can use the `useArgs` API exported by `@storybook/preview-api`:
+
+
+
+
+
+
+
+
+
## Mapping to complex arg values
Complex values such as JSX elements cannot be serialized to the manager (e.g., the Controls addon) or synced with the URL. Arg values can be "mapped" from a simple string to a complex type using the `mapping` property in `argTypes` to work around this limitation. It works in any arg but makes the most sense when used with the `select` control type.