diff --git a/Makefile b/Makefile
index cf9e3b12b1d..51aad416af4 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-.PHONY: clean test lint build
+.PHONY: clean test lint build sync-starter-css check-starter-css
SHELL := /bin/bash
PATH := ./node_modules/.bin:$(PATH)
@@ -121,13 +121,22 @@ website-production:
# $(MAKE) s2-docs-production
$(MAKE) starter-zip
$(MAKE) tailwind-starter
+ $(MAKE) hooks-starter
$(MAKE) s2-storybook-docs
mv starters/docs/storybook-static dist/production/docs/react-aria-starter
mv starters/docs/react-aria-starter.zip dist/production/docs/react-aria-starter.$$(git rev-parse --short HEAD).zip
mv starters/tailwind/storybook-static dist/production/docs/react-aria-tailwind-starter
mv starters/tailwind/react-aria-tailwind-starter.zip dist/production/docs/react-aria-tailwind-starter.$$(git rev-parse --short HEAD).zip
+ mv starters/hooks/storybook-static dist/production/docs/react-aria-hooks-starter
+ mv starters/hooks/react-aria-hooks-starter.zip dist/production/docs/react-aria-hooks-starter.$$(git rev-parse --short HEAD).zip
-check-examples:
+sync-starter-css:
+ yarn sync:starter-css
+
+check-starter-css:
+ yarn check:starter-css
+
+check-examples: check-starter-css
node scripts/extractExamplesS2.mjs
yarn tsgo --project dist/docs-examples/tsconfig.json
@@ -146,6 +155,12 @@ tailwind-starter:
cd starters/tailwind && zip -r react-aria-tailwind-starter.zip . -x .gitignore .DS_Store "node_modules/*" "storybook-static/*"
cd starters/tailwind && yarn build-storybook
+hooks-starter: sync-starter-css
+ cp LICENSE starters/hooks/.
+ cd starters/hooks && yarn --no-immutable && yarn up react-aria react-stately @internationalized/date && yarn tsc
+ cd starters/hooks && zip -r react-aria-hooks-starter.zip . -x .gitignore .DS_Store "node_modules/*" "storybook-static/*"
+ cd starters/hooks && yarn build-storybook
+
s2-storybook-docs:
yarn build:s2-storybook-docs -o dist/production/docs/s2
@@ -174,7 +189,7 @@ s2-docs-production:
cd starters/tailwind && yarn install --no-immutable && yarn up react-aria-components tailwindcss-react-aria-components
$(MAKE) build-starters
-build-s2-docs:
+build-s2-docs: check-starter-css
yarn workspace @react-spectrum/s2-docs generate:md
yarn workspace @react-spectrum/s2-docs generate:og
LIBRARY=react-aria node scripts/buildRegistry.mjs
diff --git a/package.json b/package.json
index eb5805ba0e3..3aa0a953fa7 100644
--- a/package.json
+++ b/package.json
@@ -25,6 +25,8 @@
"clean:all": "make clean_all",
"format": "oxfmt",
"format:check": "oxfmt --check",
+ "sync:starter-css": "node scripts/syncStarterCss.mjs",
+ "check:starter-css": "node scripts/syncStarterCss.mjs --check",
"install-16": "node scripts/react-16-install-prep.mjs && yarn add react@^16.8.0 react-dom@^16.8.0 @testing-library/react@^12 @testing-library/react-hooks@^8 @testing-library/dom@^8 react-test-renderer@^16.9.0 && node scripts/oldReactSupport.mjs",
"install-17": "node scripts/react-17-install-prep.mjs && yarn add react@^17 react-dom@^17 @testing-library/react@^12 @testing-library/react-hooks@^8 @testing-library/dom@^8 react-test-renderer@^16.9.0 && node scripts/oldReactSupport.mjs",
"install-18": "node scripts/react-18-install-prep.mjs && yarn add react@^18 react-dom@^18 react-test-renderer@^18.3.1 && node scripts/oldReactSupport.mjs",
diff --git a/packages/dev/s2-docs/package.json b/packages/dev/s2-docs/package.json
index 5470e7669d1..608ce5bd1df 100644
--- a/packages/dev/s2-docs/package.json
+++ b/packages/dev/s2-docs/package.json
@@ -59,7 +59,8 @@
},
"alias": {
"tailwind-starter": "../../../starters/tailwind/src",
- "vanilla-starter": "../../../starters/docs/src"
+ "vanilla-starter": "../../../starters/docs/src",
+ "hooks-starter": "../../../starters/hooks/src"
},
"targets": {
"react-static": {
diff --git a/packages/dev/s2-docs/pages/react-aria/Breadcrumbs.mdx b/packages/dev/s2-docs/pages/react-aria/Breadcrumbs.mdx
index 9a270196acc..fa40a76d886 100644
--- a/packages/dev/s2-docs/pages/react-aria/Breadcrumbs.mdx
+++ b/packages/dev/s2-docs/pages/react-aria/Breadcrumbs.mdx
@@ -7,7 +7,7 @@ import Anatomy from '/packages/react-aria/docs/breadcrumbs/anatomy.svg';
import {InlineAlert, Heading, Content} from '@react-spectrum/s2';
export const tags = ['navigation'];
-export const relatedPages = [{'title': 'useBreadcrumbs', 'url': 'Breadcrumbs/useBreadcrumbs.html'}];
+export const relatedPages = [{'title': 'useBreadcrumbs', 'url': './Breadcrumbs/useBreadcrumbs'}];
export const description = 'Displays a hierarchy of links to the current page or resource in an application.';
# Breadcrumbs
diff --git a/packages/dev/s2-docs/pages/react-aria/Breadcrumbs/useBreadcrumbs.mdx b/packages/dev/s2-docs/pages/react-aria/Breadcrumbs/useBreadcrumbs.mdx
new file mode 100644
index 00000000000..5c8c8ea796d
--- /dev/null
+++ b/packages/dev/s2-docs/pages/react-aria/Breadcrumbs/useBreadcrumbs.mdx
@@ -0,0 +1,69 @@
+{/* Copyright 2026 Adobe. All rights reserved.
+This file is licensed to you 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 REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '../../../src/Layout';
+export default Layout;
+import {FunctionAPIGroup} from '../../../src/FunctionAPI';
+import {InterfaceType} from '../../../src/types';
+import docs from 'docs:@react-aria/breadcrumbs';
+import Anatomy from '/packages/react-aria/docs/breadcrumbs/anatomy.svg';
+
+export const section = 'Hooks';
+export const description = 'Provides the behavior and accessibility implementation for a breadcrumbs component.';
+export const isSubpage = true;
+
+# useBreadcrumbs
+
+{docs.exports.useBreadcrumbs.description}
+
+```tsx render files={["starters/hooks/src/Breadcrumbs.tsx", "starters/hooks/src/Breadcrumbs.css", "starters/hooks/src/Link.css"]}
+"use client";
+import {Breadcrumbs, Breadcrumb} from 'hooks-starter/Breadcrumbs';
+
+
+ alert('Pressed Folder 1')}>Folder 1
+ alert('Pressed Folder 2')}>Folder 2
+ Folder 3
+
+```
+
+## API
+
+
+
+```tsx
+
+
+
+
+
+```
+
+
+
+### AriaBreadcrumbsProps
+
+
+
+### BreadcrumbsAria
+
+
+
+### AriaBreadcrumbItemProps
+
+
+
+### BreadcrumbItemAria
+
+
diff --git a/packages/dev/s2-docs/pages/react-aria/Button.mdx b/packages/dev/s2-docs/pages/react-aria/Button.mdx
index 22065cb4fb5..33478c4307c 100644
--- a/packages/dev/s2-docs/pages/react-aria/Button.mdx
+++ b/packages/dev/s2-docs/pages/react-aria/Button.mdx
@@ -12,7 +12,7 @@ import '../../tailwind/tailwind.css';
import typesDocs from 'docs:@react-types/shared/src/events.d.ts';
export const tags = ['btn'];
-export const relatedPages = [{'title': 'useButton', 'url': 'Button/useButton.html'}];
+export const relatedPages = [{'title': 'useButton', 'url': './Button/useButton'}];
export const description = 'Allows a user to perform an action, with mouse, touch, and keyboard interactions.';
# Button
diff --git a/packages/dev/s2-docs/pages/react-aria/Button/useButton.mdx b/packages/dev/s2-docs/pages/react-aria/Button/useButton.mdx
new file mode 100644
index 00000000000..300ed80ada3
--- /dev/null
+++ b/packages/dev/s2-docs/pages/react-aria/Button/useButton.mdx
@@ -0,0 +1,41 @@
+{/* Copyright 2026 Adobe. All rights reserved.
+This file is licensed to you 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 REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '../../../src/Layout';
+export default Layout;
+import {FunctionAPI} from '../../../src/FunctionAPI';
+import {InterfaceType} from '../../../src/types';
+import docs from 'docs:@react-aria/button';
+
+export const section = 'Hooks';
+export const description = 'Provides the behavior and accessibility implementation for a button.';
+export const isSubpage = true;
+
+# useButton
+
+{docs.exports.useButton.description}
+
+```tsx render files={["starters/hooks/src/Button.tsx", "starters/hooks/src/Button.css"]}
+"use client";
+import {Button} from 'hooks-starter/Button';
+
+
+```
+
+## API
+
+
+
+### AriaButtonProps
+
+
+
+### ButtonAria
+
+
diff --git a/packages/dev/s2-docs/pages/react-aria/Calendar.mdx b/packages/dev/s2-docs/pages/react-aria/Calendar.mdx
index 7a3ec7657ce..95f0cad2472 100644
--- a/packages/dev/s2-docs/pages/react-aria/Calendar.mdx
+++ b/packages/dev/s2-docs/pages/react-aria/Calendar.mdx
@@ -9,7 +9,7 @@ import '../../tailwind/tailwind.css';
import Anatomy from '/packages/react-aria/docs/calendar/calendar-anatomy.svg';
export const tags = ['date'];
-export const relatedPages = [{'title': 'useCalendar', 'url': 'Calendar/useCalendar.html'}];
+export const relatedPages = [{'title': 'useCalendar', 'url': './Calendar/useCalendar'}];
export const description = 'Displays one or more date grids and allows users to select a single date.';
# Calendar
diff --git a/packages/dev/s2-docs/pages/react-aria/Calendar/useCalendar.mdx b/packages/dev/s2-docs/pages/react-aria/Calendar/useCalendar.mdx
new file mode 100644
index 00000000000..29c3aa9bde8
--- /dev/null
+++ b/packages/dev/s2-docs/pages/react-aria/Calendar/useCalendar.mdx
@@ -0,0 +1,91 @@
+{/* Copyright 2026 Adobe. All rights reserved.
+This file is licensed to you 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 REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '../../../src/Layout';
+export default Layout;
+import {FunctionAPIGroup} from '../../../src/FunctionAPI';
+import {InterfaceType} from '../../../src/types';
+import docs from 'docs:@react-aria/calendar';
+import statelyDocs from 'docs:@react-stately/calendar';
+import Anatomy from '/packages/react-aria/docs/calendar/calendar-anatomy.svg';
+
+export const section = 'Hooks';
+export const description = 'Provides the behavior and accessibility implementation for a calendar component.';
+export const isSubpage = true;
+
+# useCalendar
+
+{docs.exports.useCalendar.description}
+
+```tsx render files={["starters/hooks/src/Calendar.tsx", "starters/hooks/src/Calendar.css", "starters/docs/src/Button.tsx", "starters/docs/src/Button.css"]}
+"use client";
+import {Calendar} from 'hooks-starter/Calendar';
+
+
+```
+
+## API
+
+
+
+```tsx
+
+
+
+
+
+
+
+
+ {day => }
+
+
+ {date => }
+
+
+
+
+```
+
+
+
+### CalendarState
+
+
+
+### AriaCalendarProps
+
+
+
+### CalendarAria
+
+
+
+### AriaCalendarGridProps
+
+
+
+### CalendarGridAria
+
+
+
+### AriaCalendarCellProps
+
+
+
+### CalendarCellAria
+
+
diff --git a/packages/dev/s2-docs/pages/react-aria/Checkbox.mdx b/packages/dev/s2-docs/pages/react-aria/Checkbox.mdx
index bd49f4fa4c1..db4bc876876 100644
--- a/packages/dev/s2-docs/pages/react-aria/Checkbox.mdx
+++ b/packages/dev/s2-docs/pages/react-aria/Checkbox.mdx
@@ -9,7 +9,7 @@ import '../../tailwind/tailwind.css';
import Anatomy from '/packages/react-aria/docs/checkbox/checkbox-anatomy.svg';
export const tags = ['input'];
-export const relatedPages = [{'title': 'useCheckbox', 'url': 'Checkbox/useCheckbox.html'}];
+export const relatedPages = [{'title': 'useCheckbox', 'url': './Checkbox/useCheckbox'}];
export const description = 'Allows a user to select multiple items from a list of individual items, or to mark one individual item as selected.';
# Checkbox
diff --git a/packages/dev/s2-docs/pages/react-aria/Checkbox/useCheckbox.mdx b/packages/dev/s2-docs/pages/react-aria/Checkbox/useCheckbox.mdx
new file mode 100644
index 00000000000..74a298eecd8
--- /dev/null
+++ b/packages/dev/s2-docs/pages/react-aria/Checkbox/useCheckbox.mdx
@@ -0,0 +1,62 @@
+{/* Copyright 2026 Adobe. All rights reserved.
+This file is licensed to you 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 REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '../../../src/Layout';
+export default Layout;
+import {FunctionAPIGroup} from '../../../src/FunctionAPI';
+import {InterfaceType} from '../../../src/types';
+import docs from 'docs:@react-aria/checkbox';
+import statelyDocs from 'docs:@react-stately/toggle';
+import Anatomy from '/packages/react-aria/docs/checkbox/checkbox-anatomy.svg';
+
+export const section = 'Hooks';
+export const description = 'Provides the behavior and accessibility implementation for a checkbox.';
+export const isSubpage = true;
+
+# useCheckbox
+
+{docs.exports.useCheckbox.description}
+
+```tsx render files={["starters/hooks/src/Checkbox.tsx", "starters/hooks/src/Checkbox.css"]}
+"use client";
+import {Checkbox} from 'hooks-starter/Checkbox';
+
+Unsubscribe
+```
+
+## API
+
+
+
+```tsx
+
+ Label
+
+
+
+```
+
+
+
+### ToggleState
+
+
+
+### AriaCheckboxProps
+
+
+
+### CheckboxAria
+
+
diff --git a/packages/dev/s2-docs/pages/react-aria/CheckboxGroup.mdx b/packages/dev/s2-docs/pages/react-aria/CheckboxGroup.mdx
index 480c5fd0337..edf194d79fb 100644
--- a/packages/dev/s2-docs/pages/react-aria/CheckboxGroup.mdx
+++ b/packages/dev/s2-docs/pages/react-aria/CheckboxGroup.mdx
@@ -9,7 +9,7 @@ import {InlineAlert, Heading, Content} from '@react-spectrum/s2'
export const tags = ['input'];
export const relatedPages = [
- {title: 'useCheckboxGroup', url: 'CheckboxGroup/useCheckboxGroup.html'},
+ {title: 'useCheckboxGroup', url: './CheckboxGroup/useCheckboxGroup'},
{title: 'Testing CheckboxGroup', url: './CheckboxGroup/testing'}
];
export const description = 'Allows a user to select multiple items from a list of options.';
diff --git a/packages/dev/s2-docs/pages/react-aria/CheckboxGroup/useCheckboxGroup.mdx b/packages/dev/s2-docs/pages/react-aria/CheckboxGroup/useCheckboxGroup.mdx
new file mode 100644
index 00000000000..704aa90efc5
--- /dev/null
+++ b/packages/dev/s2-docs/pages/react-aria/CheckboxGroup/useCheckboxGroup.mdx
@@ -0,0 +1,72 @@
+{/* Copyright 2026 Adobe. All rights reserved.
+This file is licensed to you 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 REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '../../../src/Layout';
+export default Layout;
+import {FunctionAPIGroup} from '../../../src/FunctionAPI';
+import {InterfaceType} from '../../../src/types';
+import docs from 'docs:@react-aria/checkbox';
+import statelyDocs from 'docs:@react-stately/checkbox';
+import Anatomy from '/packages/react-aria/docs/checkbox/checkboxgroup-anatomy.svg';
+
+export const section = 'Hooks';
+export const description = 'Provides the behavior and accessibility implementation for a checkbox group component.';
+export const isSubpage = true;
+
+# useCheckboxGroup
+
+{docs.exports.useCheckboxGroup.description}
+
+```tsx render files={["starters/hooks/src/CheckboxGroup.tsx", "starters/hooks/src/CheckboxGroup.css", "starters/hooks/src/Checkbox.css"]}
+"use client";
+import {CheckboxGroup, Checkbox} from 'hooks-starter/CheckboxGroup';
+
+
+ Soccer
+ Baseball
+ Basketball
+
+```
+
+## API
+
+
+
+```tsx
+
+
+
+
+
+
+```
+
+
+
+### CheckboxGroupState
+
+
+
+### AriaCheckboxGroupProps
+
+
+
+### CheckboxGroupAria
+
+
+
+### AriaCheckboxGroupItemProps
+
+
diff --git a/packages/dev/s2-docs/pages/react-aria/ColorArea.mdx b/packages/dev/s2-docs/pages/react-aria/ColorArea.mdx
index 83e333f1166..cd962371c4c 100644
--- a/packages/dev/s2-docs/pages/react-aria/ColorArea.mdx
+++ b/packages/dev/s2-docs/pages/react-aria/ColorArea.mdx
@@ -8,7 +8,7 @@ import '../../tailwind/tailwind.css';
import Anatomy from '/packages/react-aria/docs/color/ColorAreaAnatomy.svg';
export const tags = [];
-export const relatedPages = [{'title': 'useColorArea', 'url': 'ColorArea/useColorArea.html'}];
+export const relatedPages = [{'title': 'useColorArea', 'url': './ColorArea/useColorArea'}];
export const description = 'Allows users to adjust two channels of an RGB, HSL or HSB color value against a two-dimensional gradient background.';
# ColorArea
diff --git a/packages/dev/s2-docs/pages/react-aria/ColorArea/useColorArea.mdx b/packages/dev/s2-docs/pages/react-aria/ColorArea/useColorArea.mdx
new file mode 100644
index 00000000000..96947100ad0
--- /dev/null
+++ b/packages/dev/s2-docs/pages/react-aria/ColorArea/useColorArea.mdx
@@ -0,0 +1,60 @@
+{/* Copyright 2026 Adobe. All rights reserved.
+This file is licensed to you 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 REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '../../../src/Layout';
+export default Layout;
+import {FunctionAPIGroup} from '../../../src/FunctionAPI';
+import {InterfaceType} from '../../../src/types';
+import docs from 'docs:@react-aria/color';
+import statelyDocs from 'docs:@react-stately/color';
+import Anatomy from '/packages/react-aria/docs/color/ColorAreaAnatomy.svg';
+
+export const section = 'Hooks';
+export const description = 'Provides the behavior and accessibility implementation for a color area.';
+export const isSubpage = true;
+
+# useColorArea
+
+{docs.exports.useColorArea.description}
+
+```tsx render files={["starters/hooks/src/ColorArea.tsx", "starters/hooks/src/ColorArea.css", "starters/hooks/src/ColorThumb.css"]}
+"use client";
+import {ColorArea} from 'hooks-starter/ColorArea';
+
+
+```
+
+## API
+
+
+
+```tsx
+
+
+
+```
+
+
+
+### ColorAreaState
+
+
+
+### AriaColorAreaOptions
+
+
+
+### ColorAreaAria
+
+
diff --git a/packages/dev/s2-docs/pages/react-aria/ColorField.mdx b/packages/dev/s2-docs/pages/react-aria/ColorField.mdx
index 1596d84ea05..bff24a940a6 100644
--- a/packages/dev/s2-docs/pages/react-aria/ColorField.mdx
+++ b/packages/dev/s2-docs/pages/react-aria/ColorField.mdx
@@ -9,7 +9,7 @@ import docs from 'docs:react-aria-components';
import Anatomy from '/packages/react-aria/docs/color/ColorFieldAnatomy.svg';
export const tags = ['input'];
-export const relatedPages = [{'title': 'useColorField', 'url': 'ColorField/useColorField.html'}];
+export const relatedPages = [{'title': 'useColorField', 'url': './ColorField/useColorField'}];
export const description = 'Allows users to edit a hex color or individual color channel value.';
# ColorField
diff --git a/packages/dev/s2-docs/pages/react-aria/ColorField/useColorField.mdx b/packages/dev/s2-docs/pages/react-aria/ColorField/useColorField.mdx
new file mode 100644
index 00000000000..e185477c966
--- /dev/null
+++ b/packages/dev/s2-docs/pages/react-aria/ColorField/useColorField.mdx
@@ -0,0 +1,63 @@
+{/* Copyright 2026 Adobe. All rights reserved.
+This file is licensed to you 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 REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '../../../src/Layout';
+export default Layout;
+import {FunctionAPIGroup} from '../../../src/FunctionAPI';
+import {InterfaceType} from '../../../src/types';
+import docs from 'docs:@react-aria/color';
+import statelyDocs from 'docs:@react-stately/color';
+import Anatomy from '/packages/react-aria/docs/color/ColorFieldAnatomy.svg';
+
+export const section = 'Hooks';
+export const description = 'Provides the behavior and accessibility implementation for a color field.';
+export const isSubpage = true;
+
+# useColorField
+
+{docs.exports.useColorField.description}
+
+```tsx render files={["starters/hooks/src/ColorField.tsx", "starters/hooks/src/ColorField.css", "starters/hooks/src/TextField.css", "starters/hooks/src/Form.css"]}
+"use client";
+import {ColorField} from 'hooks-starter/ColorField';
+
+
+```
+
+## API
+
+
+
+```tsx
+
+
+
+
+
+
+```
+
+
+
+### ColorFieldState
+
+
+
+### AriaColorFieldProps
+
+
+
+### ColorFieldAria
+
+
diff --git a/packages/dev/s2-docs/pages/react-aria/ColorSlider.mdx b/packages/dev/s2-docs/pages/react-aria/ColorSlider.mdx
index 2ea8ccd7dfc..d32f25f9ea1 100644
--- a/packages/dev/s2-docs/pages/react-aria/ColorSlider.mdx
+++ b/packages/dev/s2-docs/pages/react-aria/ColorSlider.mdx
@@ -9,7 +9,7 @@ import '../../tailwind/tailwind.css';
import Anatomy from '/packages/react-aria/docs/color/ColorSliderAnatomy.svg';
export const tags = ['input'];
-export const relatedPages = [{'title': 'useColorSlider', 'url': 'ColorSlider/useColorSlider.html'}];
+export const relatedPages = [{'title': 'useColorSlider', 'url': './ColorSlider/useColorSlider'}];
export const description = 'Allows users to adjust an individual channel of a color value.';
# ColorSlider
diff --git a/packages/dev/s2-docs/pages/react-aria/ColorSlider/useColorSlider.mdx b/packages/dev/s2-docs/pages/react-aria/ColorSlider/useColorSlider.mdx
new file mode 100644
index 00000000000..035e9b378da
--- /dev/null
+++ b/packages/dev/s2-docs/pages/react-aria/ColorSlider/useColorSlider.mdx
@@ -0,0 +1,64 @@
+{/* Copyright 2026 Adobe. All rights reserved.
+This file is licensed to you 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 REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '../../../src/Layout';
+export default Layout;
+import {FunctionAPIGroup} from '../../../src/FunctionAPI';
+import {InterfaceType} from '../../../src/types';
+import docs from 'docs:@react-aria/color';
+import statelyDocs from 'docs:@react-stately/color';
+import Anatomy from '/packages/react-aria/docs/color/ColorSliderAnatomy.svg';
+
+export const section = 'Hooks';
+export const description = 'Provides the behavior and accessibility implementation for a color slider.';
+export const isSubpage = true;
+
+# useColorSlider
+
+{docs.exports.useColorSlider.description}
+
+```tsx render files={["starters/hooks/src/ColorSlider.tsx", "starters/hooks/src/ColorSlider.css", "starters/hooks/src/ColorThumb.css"]}
+"use client";
+import {ColorSlider} from 'hooks-starter/ColorSlider';
+
+
+```
+
+## API
+
+
+
+```tsx
+
+
+
+
+
+
+
+```
+
+
+
+### ColorSliderState
+
+
+
+### AriaColorSliderOptions
+
+
+
+### ColorSliderAria
+
+
diff --git a/packages/dev/s2-docs/pages/react-aria/ColorSwatch.mdx b/packages/dev/s2-docs/pages/react-aria/ColorSwatch.mdx
index 42e60ddde2d..f4435671cd4 100644
--- a/packages/dev/s2-docs/pages/react-aria/ColorSwatch.mdx
+++ b/packages/dev/s2-docs/pages/react-aria/ColorSwatch.mdx
@@ -8,7 +8,7 @@ import {ColorSwatch as TailwindColorSwatch} from 'tailwind-starter/ColorSwatch';
import '../../tailwind/tailwind.css';
export const tags = [];
-export const relatedPages = [{'title': 'useColorSwatch', 'url': 'ColorSwatch/useColorSwatch.html'}];
+export const relatedPages = [{'title': 'useColorSwatch', 'url': './ColorSwatch/useColorSwatch'}];
export const description = 'Displays a preview of a selected color.';
# ColorSwatch
diff --git a/packages/dev/s2-docs/pages/react-aria/ColorSwatch/useColorSwatch.mdx b/packages/dev/s2-docs/pages/react-aria/ColorSwatch/useColorSwatch.mdx
new file mode 100644
index 00000000000..994097cc6ec
--- /dev/null
+++ b/packages/dev/s2-docs/pages/react-aria/ColorSwatch/useColorSwatch.mdx
@@ -0,0 +1,41 @@
+{/* Copyright 2026 Adobe. All rights reserved.
+This file is licensed to you 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 REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '../../../src/Layout';
+export default Layout;
+import {FunctionAPI} from '../../../src/FunctionAPI';
+import {InterfaceType} from '../../../src/types';
+import docs from 'docs:@react-aria/color';
+
+export const section = 'Hooks';
+export const description = 'Provides the behavior and accessibility implementation for a color swatch.';
+export const isSubpage = true;
+
+# useColorSwatch
+
+{docs.exports.useColorSwatch.description}
+
+```tsx render files={["starters/hooks/src/ColorSwatch.tsx", "starters/hooks/src/ColorSwatch.css"]}
+"use client";
+import {ColorSwatch} from 'hooks-starter/ColorSwatch';
+
+
+```
+
+## API
+
+
+
+### AriaColorSwatchProps
+
+
+
+### ColorSwatchAria
+
+
diff --git a/packages/dev/s2-docs/pages/react-aria/ColorWheel.mdx b/packages/dev/s2-docs/pages/react-aria/ColorWheel.mdx
index 9f675ffbc3d..f29c9da1eae 100644
--- a/packages/dev/s2-docs/pages/react-aria/ColorWheel.mdx
+++ b/packages/dev/s2-docs/pages/react-aria/ColorWheel.mdx
@@ -8,7 +8,7 @@ import '../../tailwind/tailwind.css';
import Anatomy from '/packages/react-aria/docs/color/ColorWheelAnatomy.svg';
export const tags = ['input'];
-export const relatedPages = [{'title': 'useColorWheel', 'url': 'ColorWheel/useColorWheel.html'}];
+export const relatedPages = [{'title': 'useColorWheel', 'url': './ColorWheel/useColorWheel'}];
export const description = 'Allows users to adjust the hue of an HSL or HSB color value on a circular track.';
# ColorWheel
diff --git a/packages/dev/s2-docs/pages/react-aria/ColorWheel/useColorWheel.mdx b/packages/dev/s2-docs/pages/react-aria/ColorWheel/useColorWheel.mdx
new file mode 100644
index 00000000000..9e01653a817
--- /dev/null
+++ b/packages/dev/s2-docs/pages/react-aria/ColorWheel/useColorWheel.mdx
@@ -0,0 +1,61 @@
+{/* Copyright 2026 Adobe. All rights reserved.
+This file is licensed to you 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 REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '../../../src/Layout';
+export default Layout;
+import {FunctionAPIGroup} from '../../../src/FunctionAPI';
+import {InterfaceType} from '../../../src/types';
+import docs from 'docs:@react-aria/color';
+import statelyDocs from 'docs:@react-stately/color';
+import Anatomy from '/packages/react-aria/docs/color/ColorWheelAnatomy.svg';
+
+export const section = 'Hooks';
+export const description = 'Provides the behavior and accessibility implementation for a color wheel.';
+export const isSubpage = true;
+
+# useColorWheel
+
+{docs.exports.useColorWheel.description}
+
+```tsx render files={["starters/hooks/src/ColorWheel.tsx", "starters/hooks/src/ColorWheel.css", "starters/hooks/src/ColorThumb.css"]}
+"use client";
+import {ColorWheel} from 'hooks-starter/ColorWheel';
+
+
+```
+
+## API
+
+
+
+```tsx
+
+
+
+
+```
+
+
+
+### ColorWheelState
+
+
+
+### AriaColorWheelOptions
+
+
+
+### ColorWheelAria
+
+
diff --git a/packages/dev/s2-docs/pages/react-aria/ComboBox.mdx b/packages/dev/s2-docs/pages/react-aria/ComboBox.mdx
index dfbf7d391e5..765e1785af2 100644
--- a/packages/dev/s2-docs/pages/react-aria/ComboBox.mdx
+++ b/packages/dev/s2-docs/pages/react-aria/ComboBox.mdx
@@ -10,7 +10,7 @@ import {InlineAlert, Heading, Content} from '@react-spectrum/s2'
export const tags = ['autocomplete', 'search', 'typeahead', 'input'];
export const relatedPages = [
- {title: 'useComboBox', url: 'ComboBox/useComboBox.html'},
+ {title: 'useComboBox', url: './ComboBox/useComboBox'},
{title: 'Testing ComboBox', url: './ComboBox/testing'}
];
export const description = 'Combines a text input with a listbox, allowing users to filter a list of options to items matching a query.';
diff --git a/packages/dev/s2-docs/pages/react-aria/ComboBox/useComboBox.mdx b/packages/dev/s2-docs/pages/react-aria/ComboBox/useComboBox.mdx
new file mode 100644
index 00000000000..39eeb2329fa
--- /dev/null
+++ b/packages/dev/s2-docs/pages/react-aria/ComboBox/useComboBox.mdx
@@ -0,0 +1,77 @@
+{/* Copyright 2026 Adobe. All rights reserved.
+This file is licensed to you 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 REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '../../../src/Layout';
+export default Layout;
+import {FunctionAPIGroup} from '../../../src/FunctionAPI';
+import {InterfaceType} from '../../../src/types';
+import docs from 'docs:@react-aria/combobox';
+import statelyDocs from 'docs:@react-stately/combobox';
+import Anatomy from '../ComboBoxAnatomy.svg';
+
+export const section = 'Hooks';
+export const description = 'Provides the behavior and accessibility implementation for a combo box component.';
+export const isSubpage = true;
+
+# useComboBox
+
+{docs.exports.useComboBox.description}
+
+```tsx render files={["starters/hooks/src/ComboBox.tsx", "starters/hooks/src/DropdownListBox.tsx", "starters/hooks/src/ComboBox.css", "starters/hooks/src/Form.css", "starters/hooks/src/ListBox.css", "starters/hooks/src/Popover.css"]}
+"use client";
+import {ComboBox, ComboBoxItem} from 'hooks-starter/ComboBox';
+
+
+ Aardvark
+ Cat
+ Dog
+ Kangaroo
+ Panda
+ Snake
+
+```
+
+## API
+
+
+
+```tsx
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+
+
+### ComboBoxState
+
+
+
+### AriaComboBoxOptions
+
+
+
+### ComboBoxAria
+
+
diff --git a/packages/dev/s2-docs/pages/react-aria/DateField.mdx b/packages/dev/s2-docs/pages/react-aria/DateField.mdx
index 1ba68790041..de59f5a1513 100644
--- a/packages/dev/s2-docs/pages/react-aria/DateField.mdx
+++ b/packages/dev/s2-docs/pages/react-aria/DateField.mdx
@@ -9,7 +9,7 @@ import '../../tailwind/tailwind.css';
import Anatomy from '/packages/react-aria/docs/datepicker/datefield-anatomy.svg';
export const tags = ['calendar', 'input'];
-export const relatedPages = [{'title': 'useDateField', 'url': 'DateField/useDateField.html'}];
+export const relatedPages = [{'title': 'useDateField', 'url': './DateField/useDateField'}];
export const description = 'Allows users to enter and edit date and time values using a keyboard.';
# DateField
diff --git a/packages/dev/s2-docs/pages/react-aria/DateField/useDateField.mdx b/packages/dev/s2-docs/pages/react-aria/DateField/useDateField.mdx
new file mode 100644
index 00000000000..7d84e5c76f6
--- /dev/null
+++ b/packages/dev/s2-docs/pages/react-aria/DateField/useDateField.mdx
@@ -0,0 +1,66 @@
+{/* Copyright 2026 Adobe. All rights reserved.
+This file is licensed to you 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 REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '../../../src/Layout';
+export default Layout;
+import {FunctionAPIGroup} from '../../../src/FunctionAPI';
+import {InterfaceType} from '../../../src/types';
+import docs from 'docs:@react-aria/datepicker';
+import statelyDocs from 'docs:@react-stately/datepicker';
+import Anatomy from '/packages/react-aria/docs/datepicker/datefield-anatomy.svg';
+
+export const section = 'Hooks';
+export const description = 'Provides the behavior and accessibility implementation for a date field component.';
+export const isSubpage = true;
+
+# useDateField
+
+{docs.exports.useDateField.description}
+
+```tsx render files={["starters/hooks/src/DateField.tsx", "starters/hooks/src/DateField.css", "starters/hooks/src/Form.css"]}
+"use client";
+import {DateField} from 'hooks-starter/DateField';
+
+
+```
+
+## API
+
+
+
+```tsx
+
+
+
+ {segment => }
+
+
+
+
+```
+
+
+
+### DateFieldState
+
+
+
+### AriaDateFieldProps
+
+
+
+### DateFieldAria
+
+
diff --git a/packages/dev/s2-docs/pages/react-aria/DatePicker.mdx b/packages/dev/s2-docs/pages/react-aria/DatePicker.mdx
index 2e3b34f81fd..a097c9408f8 100644
--- a/packages/dev/s2-docs/pages/react-aria/DatePicker.mdx
+++ b/packages/dev/s2-docs/pages/react-aria/DatePicker.mdx
@@ -9,7 +9,7 @@ import '../../tailwind/tailwind.css';
import Anatomy from '/packages/react-aria/docs/datepicker/datepicker-anatomy.svg';
export const tags = ['calendar', 'input'];
-export const relatedPages = [{'title': 'useDatePicker', 'url': 'DatePicker/useDatePicker.html'}];
+export const relatedPages = [{'title': 'useDatePicker', 'url': './DatePicker/useDatePicker'}];
export const description = 'Combines a DateField and a Calendar popover to allow users to enter or select a date and time value.';
# DatePicker
diff --git a/packages/dev/s2-docs/pages/react-aria/DatePicker/useDatePicker.mdx b/packages/dev/s2-docs/pages/react-aria/DatePicker/useDatePicker.mdx
new file mode 100644
index 00000000000..b7859eb5e38
--- /dev/null
+++ b/packages/dev/s2-docs/pages/react-aria/DatePicker/useDatePicker.mdx
@@ -0,0 +1,138 @@
+{/* Copyright 2026 Adobe. All rights reserved.
+This file is licensed to you 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 REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '../../../src/Layout';
+export default Layout;
+import {FunctionAPIGroup} from '../../../src/FunctionAPI';
+import {InterfaceType} from '../../../src/types';
+import docs from 'docs:@react-aria/datepicker';
+import statelyDocs from 'docs:@react-stately/datepicker';
+import Anatomy from '/packages/react-aria/docs/datepicker/datepicker-anatomy.svg';
+
+export const section = 'Hooks';
+export const description = 'Provides the behavior and accessibility implementation for a date picker component.';
+export const isSubpage = true;
+
+# useDatePicker
+
+{docs.exports.useDatePicker.description}
+
+```tsx render files={["starters/hooks/src/DatePicker.tsx", "starters/hooks/src/DatePicker.css", "starters/hooks/src/DateField.css", "starters/hooks/src/Calendar.css", "starters/hooks/src/Button.css", "starters/hooks/src/Form.css", "starters/hooks/src/Popover.css"]}
+"use client";
+import {DatePicker} from 'hooks-starter/DatePicker';
+
+
+```
+
+
+View implementation
+
+```tsx
+"use client";
+import React from 'react';
+import {useDatePicker, type AriaDatePickerProps} from 'react-aria/useDatePicker';
+import {useDatePickerState} from 'react-stately/useDatePickerState';
+import type {DateValue} from '@internationalized/date';
+import {Provider} from 'react-aria-components/slots';
+import {Group, GroupContext} from 'react-aria-components/Group';
+import {DateFieldContext} from 'react-aria-components/DateField';
+import {ButtonContext} from 'react-aria-components/Button';
+import {LabelContext} from 'react-aria-components/Label';
+import {CalendarContext} from 'react-aria-components/Calendar';
+import {DialogContext, OverlayTriggerStateContext} from 'react-aria-components/Dialog';
+import {PopoverContext} from 'react-aria-components/Popover';
+import {DateInput, DateSegment} from 'vanilla-starter/DateField';
+import {Label, FieldButton} from 'vanilla-starter/Form';
+import {Calendar} from 'vanilla-starter/Calendar';
+import {Popover} from 'vanilla-starter/Popover';
+import {ChevronDown} from 'lucide-react';
+import 'vanilla-starter/DatePicker.css';
+
+function DatePicker(props: AriaDatePickerProps) {
+ // Create state based on the incoming props.
+ let state = useDatePickerState(props);
+
+ // Get props for the child elements from useDatePicker.
+ let groupRef = React.useRef(null);
+ let {groupProps, labelProps, fieldProps, buttonProps, dialogProps, calendarProps} =
+ useDatePicker(props, state, groupRef);
+
+ // Provide the values returned by the hook to the reused components via context.
+ return (
+
+
+
+
+ {/* The DateInput builds its own field state from fieldProps, provided via DateFieldContext. */}
+ {segment => }
+
+
+
+
+
+ {/* Rendered from calendarProps, provided via CalendarContext. */}
+
+
+
+
+ );
+}
+
+
+```
+
+
+
+## API
+
+
+
+```tsx links={{DateInput: '../DateField', DateSegment: '../DateField', Button: '../Button', Popover: '../Popover', Calendar: '../Calendar'}}
+
+
+
+
+ {segment => }
+
+
+
+
+
+
+
+```
+
+
+
+### DatePickerState
+
+
+
+### AriaDatePickerProps
+
+
+
+### DatePickerAria
+
+
diff --git a/packages/dev/s2-docs/pages/react-aria/DateRangePicker.mdx b/packages/dev/s2-docs/pages/react-aria/DateRangePicker.mdx
index 6019367080a..c47b5b8912d 100644
--- a/packages/dev/s2-docs/pages/react-aria/DateRangePicker.mdx
+++ b/packages/dev/s2-docs/pages/react-aria/DateRangePicker.mdx
@@ -9,7 +9,7 @@ import '../../tailwind/tailwind.css';
import Anatomy from '/packages/react-aria/docs/datepicker/daterangepicker-anatomy.svg';
export const tags = ['calendar', 'input'];
-export const relatedPages = [{'title': 'useDateRangePicker', 'url': 'DateRangePicker/useDateRangePicker.html'}];
+export const relatedPages = [{'title': 'useDateRangePicker', 'url': './DateRangePicker/useDateRangePicker'}];
export const description = 'Combines two DateFields and a RangeCalendar popover to allow users to enter or select a date range.';
# DateRangePicker
diff --git a/packages/dev/s2-docs/pages/react-aria/DateRangePicker/useDateRangePicker.mdx b/packages/dev/s2-docs/pages/react-aria/DateRangePicker/useDateRangePicker.mdx
new file mode 100644
index 00000000000..9ab33e7f417
--- /dev/null
+++ b/packages/dev/s2-docs/pages/react-aria/DateRangePicker/useDateRangePicker.mdx
@@ -0,0 +1,153 @@
+{/* Copyright 2026 Adobe. All rights reserved.
+This file is licensed to you 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 REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '../../../src/Layout';
+export default Layout;
+import {FunctionAPIGroup} from '../../../src/FunctionAPI';
+import {InterfaceType} from '../../../src/types';
+import docs from 'docs:@react-aria/datepicker';
+import statelyDocs from 'docs:@react-stately/datepicker';
+import Anatomy from '/packages/react-aria/docs/datepicker/daterangepicker-anatomy.svg';
+
+export const section = 'Hooks';
+export const description = 'Provides the behavior and accessibility implementation for a date range picker component.';
+export const isSubpage = true;
+
+# useDateRangePicker
+
+{docs.exports.useDateRangePicker.description}
+
+```tsx render files={["starters/hooks/src/DateRangePicker.tsx", "starters/hooks/src/DateRangePicker.css", "starters/hooks/src/DateField.css", "starters/hooks/src/RangeCalendar.css", "starters/hooks/src/Button.css", "starters/hooks/src/Form.css", "starters/hooks/src/Popover.css"]}
+"use client";
+import {DateRangePicker} from 'hooks-starter/DateRangePicker';
+
+
+```
+
+
+View implementation
+
+```tsx
+"use client";
+import React from 'react';
+import {useDateRangePicker, type AriaDateRangePickerProps} from 'react-aria/useDateRangePicker';
+import {useDateRangePickerState} from 'react-stately/useDateRangePickerState';
+import type {DateValue} from '@internationalized/date';
+import {Provider} from 'react-aria-components/slots';
+import {Group, GroupContext} from 'react-aria-components/Group';
+import {DateFieldContext} from 'react-aria-components/DateField';
+import {ButtonContext} from 'react-aria-components/Button';
+import {LabelContext} from 'react-aria-components/Label';
+import {RangeCalendarContext} from 'react-aria-components/RangeCalendar';
+import {DialogContext, OverlayTriggerStateContext} from 'react-aria-components/Dialog';
+import {PopoverContext} from 'react-aria-components/Popover';
+import {DateInput, DateSegment} from 'vanilla-starter/DateField';
+import {Label, FieldButton} from 'vanilla-starter/Form';
+import {RangeCalendar} from 'vanilla-starter/RangeCalendar';
+import {Popover} from 'vanilla-starter/Popover';
+import {ChevronDown} from 'lucide-react';
+import 'vanilla-starter/DateRangePicker.css';
+
+function DateRangePicker(props: AriaDateRangePickerProps) {
+ // Create state based on the incoming props.
+ let state = useDateRangePickerState(props);
+
+ // Get props for the child elements from useDateRangePicker.
+ let groupRef = React.useRef(null);
+ let {
+ groupProps,
+ labelProps,
+ startFieldProps,
+ endFieldProps,
+ buttonProps,
+ dialogProps,
+ calendarProps
+ } = useDateRangePicker(props, state, groupRef);
+
+ // Provide the values returned by the hook to the reused components via context.
+ return (
+
+
+
+
+
+ {segment => }
+ –
+ {segment => }
+
+
+
+
+
+
+ {/* Rendered from calendarProps, provided via RangeCalendarContext. */}
+
+
+
+
+ );
+}
+
+
+```
+
+
+
+## API
+
+
+
+```tsx links={{DateInput: '../DateField', DateSegment: '../DateField', Button: '../Button', Popover: '../Popover', RangeCalendar: '../RangeCalendar'}}
+
+
+
+
+ {segment => }
+
+ –
+
+ {segment => }
+
+
+
+
+
+
+
+```
+
+
+
+### DateRangePickerState
+
+
+
+### AriaDateRangePickerProps
+
+
+
+### DateRangePickerAria
+
+
diff --git a/packages/dev/s2-docs/pages/react-aria/Disclosure.mdx b/packages/dev/s2-docs/pages/react-aria/Disclosure.mdx
index b2fb4220ad5..1197d80e1df 100644
--- a/packages/dev/s2-docs/pages/react-aria/Disclosure.mdx
+++ b/packages/dev/s2-docs/pages/react-aria/Disclosure.mdx
@@ -7,7 +7,7 @@ import '../../tailwind/tailwind.css';
import Anatomy from './DisclosureAnatomy.svg';
export const tags = ['accordion', 'collapsible', 'expandable', 'details'];
-export const relatedPages = [{'title': 'useDisclosure', 'url': 'Disclosure/useDisclosure.html'}];
+export const relatedPages = [{'title': 'useDisclosure', 'url': './Disclosure/useDisclosure'}];
export const description = 'A collapsible section of content composed of a header with a heading and trigger button, and a panel that contains the content.';
# Disclosure
diff --git a/packages/dev/s2-docs/pages/react-aria/Disclosure/useDisclosure.mdx b/packages/dev/s2-docs/pages/react-aria/Disclosure/useDisclosure.mdx
new file mode 100644
index 00000000000..f2463b5c136
--- /dev/null
+++ b/packages/dev/s2-docs/pages/react-aria/Disclosure/useDisclosure.mdx
@@ -0,0 +1,65 @@
+{/* Copyright 2026 Adobe. All rights reserved.
+This file is licensed to you 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 REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '../../../src/Layout';
+export default Layout;
+import {FunctionAPIGroup} from '../../../src/FunctionAPI';
+import {InterfaceType} from '../../../src/types';
+import docs from 'docs:@react-aria/disclosure';
+import statelyDocs from 'docs:@react-stately/disclosure';
+import Anatomy from '../DisclosureAnatomy.svg';
+
+export const section = 'Hooks';
+export const description = 'Provides the behavior and accessibility implementation for a disclosure component.';
+export const isSubpage = true;
+
+# useDisclosure
+
+{docs.exports.useDisclosure.description}
+
+```tsx render files={["starters/hooks/src/Disclosure.tsx", "starters/hooks/src/Disclosure.css", "starters/hooks/src/Content.css"]}
+"use client";
+import {Disclosure} from 'hooks-starter/Disclosure';
+
+
+ Details about system requirements here.
+
+```
+
+## API
+
+
+
+```tsx
+
+
+
+
+
+
+```
+
+
+
+### DisclosureState
+
+
+
+### AriaDisclosureProps
+
+
+
+### DisclosureAria
+
+
diff --git a/packages/dev/s2-docs/pages/react-aria/FocusScope.mdx b/packages/dev/s2-docs/pages/react-aria/FocusScope.mdx
index 565b300757f..43dd934a68d 100644
--- a/packages/dev/s2-docs/pages/react-aria/FocusScope.mdx
+++ b/packages/dev/s2-docs/pages/react-aria/FocusScope.mdx
@@ -42,7 +42,7 @@ button mounts a FocusScope, which auto focuses the first input inside it. Once o
press the Tab key to move within the scope, but focus is contained inside. Clicking the "Close"
button unmounts the focus scope, which restores focus back to the button.
-For a full example of building a modal dialog, see [useDialog](Modal/useDialog.html).
+For a full example of building a modal dialog, see [useDialog](Modal/useModalOverlay.html#usedialog).
```tsx render
'use client';
diff --git a/packages/dev/s2-docs/pages/react-aria/GridList.mdx b/packages/dev/s2-docs/pages/react-aria/GridList.mdx
index 3907002c2cc..cd378e598ea 100644
--- a/packages/dev/s2-docs/pages/react-aria/GridList.mdx
+++ b/packages/dev/s2-docs/pages/react-aria/GridList.mdx
@@ -11,7 +11,7 @@ import {VersionBadge} from '../../src/VersionBadge';
export const tags = ['list view'];
export const relatedPages = [
- {title: 'useGridList', url: 'GridList/useGridList.html'},
+ {title: 'useGridList', url: './GridList/useGridList'},
{title: 'Testing GridList', url: './GridList/testing'}
];
export const description = 'Displays a list of interactive items, with support for keyboard navigation, selection, and actions.';
diff --git a/packages/dev/s2-docs/pages/react-aria/GridList/useGridList.mdx b/packages/dev/s2-docs/pages/react-aria/GridList/useGridList.mdx
new file mode 100644
index 00000000000..51500823d52
--- /dev/null
+++ b/packages/dev/s2-docs/pages/react-aria/GridList/useGridList.mdx
@@ -0,0 +1,124 @@
+{/* Copyright 2026 Adobe. All rights reserved.
+This file is licensed to you 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 REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '../../../src/Layout';
+export default Layout;
+import {FunctionAPIGroup} from '../../../src/FunctionAPI';
+import {InterfaceType} from '../../../src/types';
+import docs from 'docs:@react-aria/gridlist';
+import statelyDocs from 'docs:@react-stately/list';
+import Anatomy from '../GridListAnatomy.svg';
+
+export const section = 'Hooks';
+export const description = 'Provides the behavior and accessibility implementation for a list component with interactive children.';
+export const isSubpage = true;
+
+# useGridList
+
+{docs.exports.useGridList.description}
+
+```tsx render files={["starters/hooks/src/GridList.tsx", "starters/hooks/src/GridList.css", "starters/hooks/src/Checkbox.tsx", "starters/hooks/src/Checkbox.css"]}
+"use client";
+import {GridList, GridListItem, Text} from 'hooks-starter/GridList';
+
+
+
+
+ Desert Sunset
+ PNG • 2/3/2024
+
+
+
+ Hiking Trail
+ JPEG • 1/10/2022
+
+
+
+ Lion
+ JPEG • 8/28/2021
+
+
+
+ Mountain Sunrise
+ PNG • 3/15/2015
+
+
+
+ Giraffe tongue
+ PNG • 11/27/2019
+
+
+
+ Golden Hour
+ WEBP • 7/24/2024
+
+
+
+ Architecture
+ PNG • 12/24/2016
+
+
+
+ Peeking leopard
+ JPEG • 3/2/2016
+
+
+
+ Roofs
+ JPEG • 4/24/2025
+
+
+
+ Half Dome Deer
+ DNG • 8/28/2018
+
+
+```
+
+## API
+
+
+
+```tsx
+
+
+
+ or
+
+
+
+```
+
+
+
+### ListState
+
+
+
+### AriaGridListProps
+
+
+
+### GridListAria
+
+
+
+### AriaGridListItemOptions
+
+
+
+### GridListItemAria
+
+
diff --git a/packages/dev/s2-docs/pages/react-aria/Link.mdx b/packages/dev/s2-docs/pages/react-aria/Link.mdx
index 2388ff085e0..4b87b3f713e 100644
--- a/packages/dev/s2-docs/pages/react-aria/Link.mdx
+++ b/packages/dev/s2-docs/pages/react-aria/Link.mdx
@@ -8,7 +8,7 @@ import tailwindDocs from 'docs:tailwind-starter/Link';
import '../../tailwind/tailwind.css';
export const tags = ['anchor', 'hyperlink', 'href'];
-export const relatedPages = [{'title': 'useLink', 'url': 'Link/useLink.html'}];
+export const relatedPages = [{'title': 'useLink', 'url': './Link/useLink'}];
export const description = 'Allows a user to navigate to another page or resource within a web page or application.';
# Link
diff --git a/packages/dev/s2-docs/pages/react-aria/Link/useLink.mdx b/packages/dev/s2-docs/pages/react-aria/Link/useLink.mdx
new file mode 100644
index 00000000000..59f4ce16b2f
--- /dev/null
+++ b/packages/dev/s2-docs/pages/react-aria/Link/useLink.mdx
@@ -0,0 +1,41 @@
+{/* Copyright 2026 Adobe. All rights reserved.
+This file is licensed to you 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 REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '../../../src/Layout';
+export default Layout;
+import {FunctionAPI} from '../../../src/FunctionAPI';
+import {InterfaceType} from '../../../src/types';
+import docs from 'docs:@react-aria/link';
+
+export const section = 'Hooks';
+export const description = 'Provides the behavior and accessibility implementation for a link.';
+export const isSubpage = true;
+
+# useLink
+
+{docs.exports.useLink.description}
+
+```tsx render files={["starters/hooks/src/Link.tsx", "starters/hooks/src/Link.css"]}
+"use client";
+import {Link} from 'hooks-starter/Link';
+
+Adobe
+```
+
+## API
+
+
+
+### AriaLinkOptions
+
+
+
+### LinkAria
+
+
diff --git a/packages/dev/s2-docs/pages/react-aria/ListBox.mdx b/packages/dev/s2-docs/pages/react-aria/ListBox.mdx
index 2a63e524688..80efcbd5d92 100644
--- a/packages/dev/s2-docs/pages/react-aria/ListBox.mdx
+++ b/packages/dev/s2-docs/pages/react-aria/ListBox.mdx
@@ -10,7 +10,7 @@ import {InlineAlert, Heading, Content} from '@react-spectrum/s2'
export const tags = ['options'];
export const relatedPages = [
- {title: 'useListBox', url: 'ListBox/useListBox.html'},
+ {title: 'useListBox', url: './ListBox/useListBox'},
{title: 'Testing ListBox', url: './ListBox/testing'}
];
export const description = 'Displays a list of options and allows a user to select one or more of them.';
diff --git a/packages/dev/s2-docs/pages/react-aria/ListBox/useListBox.mdx b/packages/dev/s2-docs/pages/react-aria/ListBox/useListBox.mdx
new file mode 100644
index 00000000000..f3ac0a15c19
--- /dev/null
+++ b/packages/dev/s2-docs/pages/react-aria/ListBox/useListBox.mdx
@@ -0,0 +1,91 @@
+{/* Copyright 2026 Adobe. All rights reserved.
+This file is licensed to you 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 REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '../../../src/Layout';
+export default Layout;
+import {FunctionAPIGroup} from '../../../src/FunctionAPI';
+import {InterfaceType} from '../../../src/types';
+import docs from 'docs:@react-aria/listbox';
+import statelyDocs from 'docs:@react-stately/list';
+import Anatomy from '../ListBoxAnatomy.svg';
+
+export const section = 'Hooks';
+export const description = 'Provides the behavior and accessibility implementation for a listbox component.';
+export const isSubpage = true;
+
+# useListBox
+
+{docs.exports.useListBox.description}
+
+```tsx render files={["starters/hooks/src/ListBox.tsx", "starters/hooks/src/ListBox.css"]}
+"use client";
+import {ListBox, ListBoxItem} from 'hooks-starter/ListBox';
+
+
+ Left
+ Middle
+ Right
+
+```
+
+## API
+
+
+
+```tsx
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+
+
+### ListState
+
+
+
+### AriaListBoxOptions
+
+
+
+### ListBoxAria
+
+
+
+### AriaOptionProps
+
+
+
+### OptionAria
+
+
+
+### AriaListBoxSectionProps
+
+
+
+### ListBoxSectionAria
+
+
diff --git a/packages/dev/s2-docs/pages/react-aria/Menu.mdx b/packages/dev/s2-docs/pages/react-aria/Menu.mdx
index de1e143e07d..f90d86cfcee 100644
--- a/packages/dev/s2-docs/pages/react-aria/Menu.mdx
+++ b/packages/dev/s2-docs/pages/react-aria/Menu.mdx
@@ -8,7 +8,7 @@ import {InlineAlert, Heading, Content} from '@react-spectrum/s2'
export const tags = ['dropdown'];
export const relatedPages = [
- {title: 'useMenu', url: 'Menu/useMenu.html'},
+ {title: 'useMenu', url: './Menu/useMenu'},
{title: 'Testing Menu', url: './Menu/testing'}
];
export const description = 'Displays a list of actions or options that a user can choose.';
diff --git a/packages/dev/s2-docs/pages/react-aria/Menu/useMenu.mdx b/packages/dev/s2-docs/pages/react-aria/Menu/useMenu.mdx
new file mode 100644
index 00000000000..1055770becf
--- /dev/null
+++ b/packages/dev/s2-docs/pages/react-aria/Menu/useMenu.mdx
@@ -0,0 +1,118 @@
+{/* Copyright 2026 Adobe. All rights reserved.
+This file is licensed to you 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 REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '../../../src/Layout';
+export default Layout;
+import {FunctionAPIGroup} from '../../../src/FunctionAPI';
+import {InterfaceType} from '../../../src/types';
+import docs from 'docs:@react-aria/menu';
+import Anatomy from '../MenuAnatomy.svg';
+import menuStatelyDocs from 'docs:@react-stately/menu';
+import treeStatelyDocs from 'docs:@react-stately/tree';
+
+export const section = 'Hooks';
+export const description = 'Provides the behavior and accessibility implementation for a menu component.';
+export const isSubpage = true;
+
+# useMenu
+
+{docs.exports.useMenu.description}
+
+```tsx render files={["starters/hooks/src/Menu.tsx", "starters/hooks/src/Menu.css", "starters/hooks/src/Button.css", "starters/hooks/src/Popover.css"]}
+"use client";
+import {MenuButton, MenuItem} from 'hooks-starter/Menu';
+
+ alert(key)}>
+
+
+
+
+```
+
+## API
+
+
+
+```tsx
+
+
+
+
+
+
+```
+
+
+
+### MenuTriggerState
+
+
+
+### TreeState
+
+
+
+### AriaMenuTriggerProps
+
+
+
+### MenuTriggerAria
+
+
+
+### AriaMenuOptions
+
+
+
+### MenuAria
+
+
+
+### AriaMenuItemProps
+
+
+
+### MenuItemAria
+
+
+
+### AriaMenuSectionProps
+
+
+
+### MenuSectionAria
+
+
diff --git a/packages/dev/s2-docs/pages/react-aria/Meter.mdx b/packages/dev/s2-docs/pages/react-aria/Meter.mdx
index c924ced0d52..b8fdcab3e7c 100644
--- a/packages/dev/s2-docs/pages/react-aria/Meter.mdx
+++ b/packages/dev/s2-docs/pages/react-aria/Meter.mdx
@@ -9,7 +9,7 @@ import '../../tailwind/tailwind.css';
import Anatomy from '/packages/react-aria/docs/meter/anatomy.svg';
export const tags = ['gauge', 'progress', 'level'];
-export const relatedPages = [{'title': 'useMeter', 'url': 'Meter/useMeter.html'}];
+export const relatedPages = [{'title': 'useMeter', 'url': './Meter/useMeter'}];
export const description = 'Represents a quantity within a known range, or a fractional value.';
# Meter
diff --git a/packages/dev/s2-docs/pages/react-aria/Meter/useMeter.mdx b/packages/dev/s2-docs/pages/react-aria/Meter/useMeter.mdx
new file mode 100644
index 00000000000..b5fee0bcba8
--- /dev/null
+++ b/packages/dev/s2-docs/pages/react-aria/Meter/useMeter.mdx
@@ -0,0 +1,50 @@
+{/* Copyright 2026 Adobe. All rights reserved.
+This file is licensed to you 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 REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '../../../src/Layout';
+export default Layout;
+import {FunctionAPI} from '../../../src/FunctionAPI';
+import {InterfaceType} from '../../../src/types';
+import docs from 'docs:@react-aria/meter';
+import Anatomy from '/packages/react-aria/docs/meter/anatomy.svg';
+
+export const section = 'Hooks';
+export const description = 'Provides the accessibility implementation for a meter component.';
+export const isSubpage = true;
+
+# useMeter
+
+{docs.exports.useMeter.description}
+
+```tsx render files={["starters/hooks/src/Meter.tsx", "starters/hooks/src/Meter.css", "starters/hooks/src/Form.css"]}
+"use client";
+import {Meter} from 'hooks-starter/Meter';
+
+
+```
+
+## API
+
+
+
+```tsx
+
+
+
+```
+
+
+
+### AriaMeterProps
+
+
+
+### MeterAria
+
+
diff --git a/packages/dev/s2-docs/pages/react-aria/Modal.mdx b/packages/dev/s2-docs/pages/react-aria/Modal.mdx
index 3c613b338b6..0d8d2460696 100644
--- a/packages/dev/s2-docs/pages/react-aria/Modal.mdx
+++ b/packages/dev/s2-docs/pages/react-aria/Modal.mdx
@@ -8,7 +8,9 @@ import Anatomy from '/packages/react-aria/docs/overlays/modal-anatomy.svg';
import {InlineAlert, Heading, Content} from '@react-spectrum/s2'
export const tags = ['dialog', 'popup', 'overlay'];
-export const relatedPages = [{'title': 'useModalOverlay', 'url': 'Modal/useModalOverlay.html'}];
+export const relatedPages = [
+ {'title': 'useModalOverlay', 'url': './Modal/useModalOverlay'}
+];
export const description = 'An overlay element which blocks interaction with elements outside it.';
# Modal
diff --git a/packages/dev/s2-docs/pages/react-aria/Modal/useModalOverlay.mdx b/packages/dev/s2-docs/pages/react-aria/Modal/useModalOverlay.mdx
new file mode 100644
index 00000000000..82c3ab44dc9
--- /dev/null
+++ b/packages/dev/s2-docs/pages/react-aria/Modal/useModalOverlay.mdx
@@ -0,0 +1,110 @@
+{/* Copyright 2026 Adobe. All rights reserved.
+This file is licensed to you 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 REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '../../../src/Layout';
+export default Layout;
+import {FunctionAPIGroup} from '../../../src/FunctionAPI';
+import {InterfaceType} from '../../../src/types';
+import docs from 'docs:@react-aria/overlays';
+import dialogDocs from 'docs:@react-aria/dialog';
+import statelyDocs from 'docs:@react-stately/overlays';
+import Anatomy from '/packages/react-aria/docs/overlays/modal-anatomy.svg';
+import 'hooks-starter/theme.css';
+
+export const section = 'Hooks';
+export const description = 'Provides the behavior and accessibility implementation for a modal overlay and dialog.';
+export const isSubpage = true;
+
+# useModalOverlay
+
+{docs.exports.useModalOverlay.description}
+
+```tsx render files={["starters/hooks/src/Modal.tsx", "starters/hooks/src/Modal.css", "starters/hooks/src/Dialog.css", "starters/hooks/src/Button.css"]}
+"use client";
+import {Button} from 'react-aria-components/Button';
+import {Dialog, ModalTrigger} from 'hooks-starter/Modal';
+
+
+ {close =>
+ }
+
+```
+
+## useDialog
+
+`useDialog` is the dialog primitive itself, so the `Dialog` component is built from scratch. To render it interactively, this example reuses the [Modal](../Modal), [Button](../Button), and `DialogTrigger` components from React Aria Components to provide the overlay container and trigger. A dialog may also be placed within a [popover](../Popover/usePopover).
+
+```tsx render files={["starters/hooks/src/Modal.tsx", "starters/hooks/src/Modal.css", "starters/hooks/src/Dialog.css", "starters/hooks/src/Button.css"]}
+"use client";
+import {CloseButton, Dialog, ModalTrigger} from 'hooks-starter/Modal';
+
+
+ {() =>
+ }
+
+```
+
+A dialog consists of a container element and an optional title. `useDialog` handles exposing this to assistive technology using ARIA. It can be combined with `useModalOverlay` or [usePopover](../Popover/usePopover) to create modal dialogs, popovers, and other types of overlays.
+
+If a dialog does not have a visible title element, an `aria-label` or `aria-labelledby` prop must be passed instead to identify the element to assistive technology.
+
+Focus containment must be enabled from a component rendered _inside_ the [<Overlay>](../Popover) — `useDialog` does this automatically, which is why focus is contained in the examples above. If you render content that does not use `useDialog` (or another hook that enables containment), make sure `useModalOverlay` is called from a component rendered inside `` so that focus is properly contained.
+
+## API
+
+
+
+```tsx links={{DialogTrigger: '#dialogtrigger', Button: 'Button', ModalOverlay: '#modaloverlay', Modal: '#modal', Dialog: '#dialog'}}
+
+
+
+
+
+
+
+
+```
+
+
+
+### OverlayTriggerState
+
+
+
+### AriaModalOverlayProps
+
+
+
+### ModalOverlayAria
+
+
+
+### AriaDialogProps
+
+
+
+### DialogAria
+
+
diff --git a/packages/dev/s2-docs/pages/react-aria/NumberField.mdx b/packages/dev/s2-docs/pages/react-aria/NumberField.mdx
index 4979810805e..d69f7efd87c 100644
--- a/packages/dev/s2-docs/pages/react-aria/NumberField.mdx
+++ b/packages/dev/s2-docs/pages/react-aria/NumberField.mdx
@@ -9,7 +9,7 @@ import '../../tailwind/tailwind.css';
import Anatomy from '/packages/react-aria/docs/numberfield/anatomy.svg';
export const tags = ['input'];
-export const relatedPages = [{'title': 'useNumberField', 'url': 'NumberField/useNumberField.html'}];
+export const relatedPages = [{'title': 'useNumberField', 'url': './NumberField/useNumberField'}];
export const description = 'Allows a user to enter a number, and increment or decrement the value using stepper buttons.';
# NumberField
diff --git a/packages/dev/s2-docs/pages/react-aria/NumberField/useNumberField.mdx b/packages/dev/s2-docs/pages/react-aria/NumberField/useNumberField.mdx
new file mode 100644
index 00000000000..6491ad1f7bc
--- /dev/null
+++ b/packages/dev/s2-docs/pages/react-aria/NumberField/useNumberField.mdx
@@ -0,0 +1,67 @@
+{/* Copyright 2026 Adobe. All rights reserved.
+This file is licensed to you 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 REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '../../../src/Layout';
+export default Layout;
+import {FunctionAPIGroup} from '../../../src/FunctionAPI';
+import {InterfaceType} from '../../../src/types';
+import docs from 'docs:@react-aria/numberfield';
+import statelyDocs from 'docs:@react-stately/numberfield';
+import Anatomy from '/packages/react-aria/docs/numberfield/anatomy.svg';
+
+export const section = 'Hooks';
+export const description = 'Provides the behavior and accessibility implementation for a number field component.';
+export const isSubpage = true;
+
+# useNumberField
+
+{docs.exports.useNumberField.description}
+
+```tsx render files={["starters/hooks/src/NumberField.tsx", "starters/hooks/src/NumberField.css", "starters/hooks/src/Button.css", "starters/hooks/src/Form.css"]}
+"use client";
+import {NumberField} from 'hooks-starter/NumberField';
+
+
+```
+
+## API
+
+
+
+```tsx
+
+
+
+
+
+
+
+
+
+
+```
+
+
+
+### NumberFieldState
+
+
+
+### AriaNumberFieldProps
+
+
+
+### NumberFieldAria
+
+
diff --git a/packages/dev/s2-docs/pages/react-aria/Popover.mdx b/packages/dev/s2-docs/pages/react-aria/Popover.mdx
index df3cae64dff..7c57f16766f 100644
--- a/packages/dev/s2-docs/pages/react-aria/Popover.mdx
+++ b/packages/dev/s2-docs/pages/react-aria/Popover.mdx
@@ -8,7 +8,7 @@ import Anatomy from '/packages/react-aria/docs/overlays/popover-anatomy.svg';
import {InlineAlert, Heading, Content} from '@react-spectrum/s2'
export const tags = ['popup', 'overlay'];
-export const relatedPages = [{'title': 'usePopover', 'url': 'Popover/usePopover.html'}];
+export const relatedPages = [{'title': 'usePopover', 'url': './Popover/usePopover'}];
export const description = 'An overlay element positioned relative to a trigger.';
# Popover
diff --git a/packages/dev/s2-docs/pages/react-aria/Popover/usePopover.mdx b/packages/dev/s2-docs/pages/react-aria/Popover/usePopover.mdx
new file mode 100644
index 00000000000..833eba0202d
--- /dev/null
+++ b/packages/dev/s2-docs/pages/react-aria/Popover/usePopover.mdx
@@ -0,0 +1,71 @@
+{/* Copyright 2026 Adobe. All rights reserved.
+This file is licensed to you 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 REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '../../../src/Layout';
+export default Layout;
+import {FunctionAPIGroup} from '../../../src/FunctionAPI';
+import {InterfaceType} from '../../../src/types';
+import docs from 'docs:@react-aria/overlays';
+import statelyDocs from 'docs:@react-stately/overlays';
+import Anatomy from '/packages/react-aria/docs/overlays/popover-anatomy.svg';
+
+export const section = 'Hooks';
+export const description = 'Provides the behavior and accessibility implementation for a popover overlay.';
+export const isSubpage = true;
+
+# usePopover
+
+{docs.exports.usePopover.description}
+
+```tsx render files={["starters/hooks/src/Popover.tsx", "starters/hooks/src/Popover.css", "starters/hooks/src/Button.css", "starters/docs/src/Dialog.css"]}
+"use client";
+import {Dialog, Heading} from 'react-aria-components/Dialog';
+import {PopoverTrigger} from 'hooks-starter/Popover';
+
+
+
+
+```
+
+**Note**: `usePopover` only handles the overlay itself. It should be combined with [useDialog](../Modal/useModalOverlay#usedialog) to create fully accessible popovers. Other overlays such as menus may also be placed in a popover.
+
+## API
+
+
+
+```tsx
+
+
+
+
+
+
+```
+
+
+
+### OverlayTriggerState
+
+
+
+### AriaPopoverProps
+
+
+
+### PopoverAria
+
+
diff --git a/packages/dev/s2-docs/pages/react-aria/ProgressBar.mdx b/packages/dev/s2-docs/pages/react-aria/ProgressBar.mdx
index 8e6450fedd9..daadc6f354c 100644
--- a/packages/dev/s2-docs/pages/react-aria/ProgressBar.mdx
+++ b/packages/dev/s2-docs/pages/react-aria/ProgressBar.mdx
@@ -11,7 +11,7 @@ import '../../tailwind/tailwind.css';
import Anatomy from '/packages/react-aria/docs/progress/anatomy.svg';
export const tags = ['loading', 'progress'];
-export const relatedPages = [{'title': 'useProgressBar', 'url': 'ProgressBar/useProgressBar.html'}];
+export const relatedPages = [{'title': 'useProgressBar', 'url': './ProgressBar/useProgressBar'}];
export const description = 'Shows either determinate or indeterminate progress of an operation over time.';
# ProgressBar
diff --git a/packages/dev/s2-docs/pages/react-aria/ProgressBar/useProgressBar.mdx b/packages/dev/s2-docs/pages/react-aria/ProgressBar/useProgressBar.mdx
new file mode 100644
index 00000000000..08d118cfd84
--- /dev/null
+++ b/packages/dev/s2-docs/pages/react-aria/ProgressBar/useProgressBar.mdx
@@ -0,0 +1,50 @@
+{/* Copyright 2026 Adobe. All rights reserved.
+This file is licensed to you 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 REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '../../../src/Layout';
+export default Layout;
+import {FunctionAPI} from '../../../src/FunctionAPI';
+import {InterfaceType} from '../../../src/types';
+import docs from 'docs:@react-aria/progress';
+import Anatomy from '/packages/react-aria/docs/progress/anatomy.svg';
+
+export const section = 'Hooks';
+export const description = 'Provides the accessibility implementation for a progress bar component.';
+export const isSubpage = true;
+
+# useProgressBar
+
+{docs.exports.useProgressBar.description}
+
+```tsx render files={["starters/hooks/src/ProgressBar.tsx", "starters/hooks/src/ProgressBar.css", "starters/hooks/src/Form.css"]}
+"use client";
+import {ProgressBar} from 'hooks-starter/ProgressBar';
+
+
+```
+
+## API
+
+
+
+```tsx
+
+
+
+```
+
+
+
+### AriaProgressBarProps
+
+
+
+### ProgressBarAria
+
+
diff --git a/packages/dev/s2-docs/pages/react-aria/RadioGroup.mdx b/packages/dev/s2-docs/pages/react-aria/RadioGroup.mdx
index 34fe5fb478c..1b7613fa0aa 100644
--- a/packages/dev/s2-docs/pages/react-aria/RadioGroup.mdx
+++ b/packages/dev/s2-docs/pages/react-aria/RadioGroup.mdx
@@ -9,7 +9,7 @@ import {InlineAlert, Heading, Content} from '@react-spectrum/s2'
export const tags = ['input'];
export const relatedPages = [
- {title: 'useRadioGroup', url: 'RadioGroup/useRadioGroup.html'},
+ {title: 'useRadioGroup', url: './RadioGroup/useRadioGroup'},
{title: 'Testing RadioGroup', url: './RadioGroup/testing'}
];
export const description = 'Allows a user to select a single item from a list of mutually exclusive options.';
diff --git a/packages/dev/s2-docs/pages/react-aria/RadioGroup/useRadioGroup.mdx b/packages/dev/s2-docs/pages/react-aria/RadioGroup/useRadioGroup.mdx
new file mode 100644
index 00000000000..e09d27232f7
--- /dev/null
+++ b/packages/dev/s2-docs/pages/react-aria/RadioGroup/useRadioGroup.mdx
@@ -0,0 +1,80 @@
+{/* Copyright 2026 Adobe. All rights reserved.
+This file is licensed to you 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 REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '../../../src/Layout';
+export default Layout;
+import {FunctionAPIGroup} from '../../../src/FunctionAPI';
+import {InterfaceType} from '../../../src/types';
+import docs from 'docs:@react-aria/radio';
+import statelyDocs from 'docs:@react-stately/radio';
+import Anatomy from '/packages/react-aria/docs/radio/anatomy.svg';
+
+export const section = 'Hooks';
+export const description = 'Provides the behavior and accessibility implementation for a radio group component.';
+export const isSubpage = true;
+
+# useRadioGroup
+
+{docs.exports.useRadioGroup.description}
+
+```tsx render files={["starters/hooks/src/RadioGroup.tsx", "starters/hooks/src/RadioGroup.css"]}
+"use client";
+import {RadioGroup, Radio} from 'hooks-starter/RadioGroup';
+
+
+ Dogs
+ Cats
+
+```
+
+## API
+
+
+
+```tsx
+
+
+
+
+
+
+
+
+
+
+
+```
+
+
+
+### RadioGroupState
+
+
+
+### AriaRadioGroupProps
+
+
+
+### RadioGroupAria
+
+
+
+### AriaRadioProps
+
+
+
+### RadioAria
+
+
diff --git a/packages/dev/s2-docs/pages/react-aria/RangeCalendar.mdx b/packages/dev/s2-docs/pages/react-aria/RangeCalendar.mdx
index 603ae4efd8d..5cad7f60098 100644
--- a/packages/dev/s2-docs/pages/react-aria/RangeCalendar.mdx
+++ b/packages/dev/s2-docs/pages/react-aria/RangeCalendar.mdx
@@ -9,7 +9,7 @@ import '../../tailwind/tailwind.css';
import Anatomy from '/packages/react-aria/docs/calendar/rangecalendar-anatomy.svg';
export const tags = ['calendar'];
-export const relatedPages = [{'title': 'useRangeCalendar', 'url': 'RangeCalendar/useRangeCalendar.html'}];
+export const relatedPages = [{'title': 'useRangeCalendar', 'url': './RangeCalendar/useRangeCalendar'}];
export const description = 'Displays one or more date grids and allows users to select a contiguous range of dates.';
# RangeCalendar
diff --git a/packages/dev/s2-docs/pages/react-aria/RangeCalendar/useRangeCalendar.mdx b/packages/dev/s2-docs/pages/react-aria/RangeCalendar/useRangeCalendar.mdx
new file mode 100644
index 00000000000..7a166e4b512
--- /dev/null
+++ b/packages/dev/s2-docs/pages/react-aria/RangeCalendar/useRangeCalendar.mdx
@@ -0,0 +1,83 @@
+{/* Copyright 2026 Adobe. All rights reserved.
+This file is licensed to you 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 REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '../../../src/Layout';
+export default Layout;
+import {FunctionAPIGroup} from '../../../src/FunctionAPI';
+import {InterfaceType} from '../../../src/types';
+import docs from 'docs:@react-aria/calendar';
+import statelyDocs from 'docs:@react-stately/calendar';
+import Anatomy from '/packages/react-aria/docs/calendar/rangecalendar-anatomy.svg';
+
+export const section = 'Hooks';
+export const description = 'Provides the behavior and accessibility implementation for a range calendar component.';
+export const isSubpage = true;
+
+# useRangeCalendar
+
+{docs.exports.useRangeCalendar.description}
+
+```tsx render files={["starters/hooks/src/RangeCalendar.tsx", "starters/hooks/src/RangeCalendar.css", "starters/docs/src/Button.tsx", "starters/docs/src/Button.css"]}
+"use client";
+import {RangeCalendar} from 'hooks-starter/RangeCalendar';
+
+
+```
+
+## API
+
+
+
+```tsx
+
+
+
+
+
+
+
+
+ {day => }
+
+
+ {date => }
+
+
+
+
+```
+
+
+
+### RangeCalendarState
+
+
+
+### AriaRangeCalendarProps
+
+
+
+### CalendarAria
+
+
+
+### AriaCalendarGridProps
+
+
+
+### AriaCalendarCellProps
+
+
diff --git a/packages/dev/s2-docs/pages/react-aria/SearchField.mdx b/packages/dev/s2-docs/pages/react-aria/SearchField.mdx
index 27693e23d25..0e171695acf 100644
--- a/packages/dev/s2-docs/pages/react-aria/SearchField.mdx
+++ b/packages/dev/s2-docs/pages/react-aria/SearchField.mdx
@@ -9,7 +9,7 @@ import '../../tailwind/tailwind.css';
import Anatomy from '/packages/react-aria/docs/searchfield/anatomy.svg';
export const tags = ['input'];
-export const relatedPages = [{'title': 'useSearchField', 'url': 'SearchField/useSearchField.html'}];
+export const relatedPages = [{'title': 'useSearchField', 'url': './SearchField/useSearchField'}];
export const description = 'Allows a user to enter and clear a search query.';
# SearchField
diff --git a/packages/dev/s2-docs/pages/react-aria/SearchField/useSearchField.mdx b/packages/dev/s2-docs/pages/react-aria/SearchField/useSearchField.mdx
new file mode 100644
index 00000000000..13c159de867
--- /dev/null
+++ b/packages/dev/s2-docs/pages/react-aria/SearchField/useSearchField.mdx
@@ -0,0 +1,64 @@
+{/* Copyright 2026 Adobe. All rights reserved.
+This file is licensed to you 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 REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '../../../src/Layout';
+export default Layout;
+import {FunctionAPIGroup} from '../../../src/FunctionAPI';
+import {InterfaceType} from '../../../src/types';
+import docs from 'docs:@react-aria/searchfield';
+import statelyDocs from 'docs:@react-stately/searchfield';
+import Anatomy from '/packages/react-aria/docs/searchfield/anatomy.svg';
+
+export const section = 'Hooks';
+export const description = 'Provides the behavior and accessibility implementation for a search field.';
+export const isSubpage = true;
+
+# useSearchField
+
+{docs.exports.useSearchField.description}
+
+```tsx render files={["starters/hooks/src/SearchField.tsx", "starters/hooks/src/SearchField.css", "starters/hooks/src/TextField.css", "starters/hooks/src/Form.css"]}
+"use client";
+import {SearchField} from 'hooks-starter/SearchField';
+
+ alert(text)} />
+```
+
+## API
+
+
+
+```tsx
+
+
+
+
+
+
+
+```
+
+
+
+### SearchFieldState
+
+
+
+### AriaSearchFieldProps
+
+
+
+### SearchFieldAria
+
+
diff --git a/packages/dev/s2-docs/pages/react-aria/Select.mdx b/packages/dev/s2-docs/pages/react-aria/Select.mdx
index 4b1968a2591..9127c0d87cf 100644
--- a/packages/dev/s2-docs/pages/react-aria/Select.mdx
+++ b/packages/dev/s2-docs/pages/react-aria/Select.mdx
@@ -9,7 +9,7 @@ import {InlineAlert, Heading, Content} from '@react-spectrum/s2'
export const tags = ['picker', 'dropdown', 'menu', 'input'];
export const relatedPages = [
- {title: 'useSelect', url: 'Select/useSelect.html'},
+ {title: 'useSelect', url: './Select/useSelect'},
{title: 'Testing Select', url: './Select/testing'}
];
export const description = 'Displays a collapsible list of options and allows a user to select one of them.';
diff --git a/packages/dev/s2-docs/pages/react-aria/Select/useSelect.mdx b/packages/dev/s2-docs/pages/react-aria/Select/useSelect.mdx
new file mode 100644
index 00000000000..5a1eba87e6d
--- /dev/null
+++ b/packages/dev/s2-docs/pages/react-aria/Select/useSelect.mdx
@@ -0,0 +1,58 @@
+{/* Copyright 2026 Adobe. All rights reserved.
+This file is licensed to you 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 REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '../../../src/Layout';
+export default Layout;
+import {FunctionAPIGroup} from '../../../src/FunctionAPI';
+import {InterfaceType} from '../../../src/types';
+import docs from 'docs:@react-aria/select';
+import statelyDocs from 'docs:@react-stately/select';
+
+export const section = 'Hooks';
+export const description = 'Provides the behavior and accessibility implementation for a select component.';
+export const isSubpage = true;
+
+# useSelect
+
+{docs.exports.useSelect.description}
+
+```tsx render files={["starters/hooks/src/Select.tsx", "starters/hooks/src/DropdownListBox.tsx", "starters/hooks/src/Select.css", "starters/hooks/src/Button.css", "starters/hooks/src/Form.css", "starters/hooks/src/ListBox.css", "starters/hooks/src/Popover.css"]}
+"use client";
+import {Select, SelectItem} from 'hooks-starter/Select';
+
+
+```
+
+## API
+
+
+
+### SelectState
+
+
+
+### AriaSelectOptions
+
+
+
+### SelectAria
+
+
diff --git a/packages/dev/s2-docs/pages/react-aria/Separator.mdx b/packages/dev/s2-docs/pages/react-aria/Separator.mdx
index 307cdd108f0..b9a52a4cfad 100644
--- a/packages/dev/s2-docs/pages/react-aria/Separator.mdx
+++ b/packages/dev/s2-docs/pages/react-aria/Separator.mdx
@@ -8,7 +8,7 @@ import tailwindDocs from 'docs:tailwind-starter/Separator';
import vanillaDocs from 'docs:vanilla-starter/Separator';
import '../../tailwind/tailwind.css';
-export const relatedPages = [{'title': 'useSeparator', 'url': 'Separator/useSeparator.html'}];
+export const relatedPages = [{'title': 'useSeparator', 'url': './Separator/useSeparator'}];
export const description = 'A separator is a visual divider between two groups of content.';
# Separator
diff --git a/packages/dev/s2-docs/pages/react-aria/Separator/useSeparator.mdx b/packages/dev/s2-docs/pages/react-aria/Separator/useSeparator.mdx
new file mode 100644
index 00000000000..e7399138be0
--- /dev/null
+++ b/packages/dev/s2-docs/pages/react-aria/Separator/useSeparator.mdx
@@ -0,0 +1,52 @@
+{/* Copyright 2026 Adobe. All rights reserved.
+This file is licensed to you 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 REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '../../../src/Layout';
+export default Layout;
+import {FunctionAPI} from '../../../src/FunctionAPI';
+import {InterfaceType} from '../../../src/types';
+import docs from 'docs:@react-aria/separator';
+
+export const section = 'Hooks';
+export const description = 'Provides the accessibility implementation for a separator.';
+export const isSubpage = true;
+
+# useSeparator
+
+{docs.exports.useSeparator.description}
+
+```tsx render files={["starters/hooks/src/Separator.tsx", "starters/hooks/src/Separator.css"]}
+"use client";
+import {Separator} from 'hooks-starter/Separator';
+
+
+
+ Content above
+
+ Content below
+
+
+ Content left
+
+ Content right
+
+
+```
+
+## API
+
+
+
+### SeparatorProps
+
+
+
+### SeparatorAria
+
+
diff --git a/packages/dev/s2-docs/pages/react-aria/Slider.mdx b/packages/dev/s2-docs/pages/react-aria/Slider.mdx
index 93832940b74..58dc0f1028c 100644
--- a/packages/dev/s2-docs/pages/react-aria/Slider.mdx
+++ b/packages/dev/s2-docs/pages/react-aria/Slider.mdx
@@ -10,7 +10,7 @@ import '../../tailwind/tailwind.css';
import Anatomy from '/packages/react-aria/docs/slider/anatomy.svg';
export const tags = ['range input', 'track', 'scrubber'];
-export const relatedPages = [{'title': 'useSlider', 'url': 'Slider/useSlider.html'}];
+export const relatedPages = [{'title': 'useSlider', 'url': './Slider/useSlider'}];
export const description = 'Allows a user to select one or more values within a range.';
# Slider
diff --git a/packages/dev/s2-docs/pages/react-aria/Slider/useSlider.mdx b/packages/dev/s2-docs/pages/react-aria/Slider/useSlider.mdx
new file mode 100644
index 00000000000..81226828e88
--- /dev/null
+++ b/packages/dev/s2-docs/pages/react-aria/Slider/useSlider.mdx
@@ -0,0 +1,77 @@
+{/* Copyright 2026 Adobe. All rights reserved.
+This file is licensed to you 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 REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '../../../src/Layout';
+export default Layout;
+import {FunctionAPIGroup} from '../../../src/FunctionAPI';
+import {InterfaceType} from '../../../src/types';
+import docs from 'docs:@react-aria/slider';
+import statelyDocs from 'docs:@react-stately/slider';
+import Anatomy from '/packages/react-aria/docs/slider/anatomy.svg';
+
+export const section = 'Hooks';
+export const description = 'Provides the behavior and accessibility implementation for a slider component.';
+export const isSubpage = true;
+
+# useSlider
+
+{docs.exports.useSlider.description}
+
+```tsx render files={["starters/hooks/src/Slider.tsx", "starters/hooks/src/Slider.css", "starters/hooks/src/Form.css"]}
+"use client";
+import {Slider} from 'hooks-starter/Slider';
+
+
+```
+
+## API
+
+
+
+```tsx
+
+
+
+
+
+
+
+
+
+
+
+```
+
+
+
+### SliderState
+
+
+
+### AriaSliderProps
+
+
+
+### SliderAria
+
+
+
+### AriaSliderThumbOptions
+
+
+
+### SliderThumbAria
+
+
diff --git a/packages/dev/s2-docs/pages/react-aria/Switch.mdx b/packages/dev/s2-docs/pages/react-aria/Switch.mdx
index 4d479bc44d1..5582ec487f3 100644
--- a/packages/dev/s2-docs/pages/react-aria/Switch.mdx
+++ b/packages/dev/s2-docs/pages/react-aria/Switch.mdx
@@ -9,7 +9,7 @@ import '../../tailwind/tailwind.css';
import Anatomy from '/packages/react-aria/docs/switch/anatomy.svg';
export const tags = ['toggle', 'input'];
-export const relatedPages = [{'title': 'useSwitch', 'url': 'Switch/useSwitch.html'}];
+export const relatedPages = [{'title': 'useSwitch', 'url': './Switch/useSwitch'}];
export const description = 'Allows a user to turn a setting on or off.';
# Switch
diff --git a/packages/dev/s2-docs/pages/react-aria/Switch/useSwitch.mdx b/packages/dev/s2-docs/pages/react-aria/Switch/useSwitch.mdx
new file mode 100644
index 00000000000..1dec4eccced
--- /dev/null
+++ b/packages/dev/s2-docs/pages/react-aria/Switch/useSwitch.mdx
@@ -0,0 +1,62 @@
+{/* Copyright 2026 Adobe. All rights reserved.
+This file is licensed to you 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 REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '../../../src/Layout';
+export default Layout;
+import {FunctionAPIGroup} from '../../../src/FunctionAPI';
+import {InterfaceType} from '../../../src/types';
+import docs from 'docs:@react-aria/switch';
+import statelyDocs from 'docs:@react-stately/toggle';
+import Anatomy from '/packages/react-aria/docs/switch/anatomy.svg';
+
+export const section = 'Hooks';
+export const description = 'Provides the behavior and accessibility implementation for a switch.';
+export const isSubpage = true;
+
+# useSwitch
+
+{docs.exports.useSwitch.description}
+
+```tsx render files={["starters/hooks/src/Switch.tsx", "starters/hooks/src/Switch.css"]}
+"use client";
+import {Switch} from 'hooks-starter/Switch';
+
+Low power mode
+```
+
+## API
+
+
+
+```tsx
+
+ Label
+
+
+
+```
+
+
+
+### ToggleState
+
+
+
+### AriaSwitchProps
+
+
+
+### SwitchAria
+
+
diff --git a/packages/dev/s2-docs/pages/react-aria/Table.mdx b/packages/dev/s2-docs/pages/react-aria/Table.mdx
index f619228b40b..d60cfaebccc 100644
--- a/packages/dev/s2-docs/pages/react-aria/Table.mdx
+++ b/packages/dev/s2-docs/pages/react-aria/Table.mdx
@@ -10,7 +10,7 @@ import {InlineAlert, Heading, Content} from '@react-spectrum/s2';
export const tags = ['data', 'grid'];
export const relatedPages = [
- {title: 'useTable', url: 'Table/useTable.html'},
+ {title: 'useTable', url: './Table/useTable'},
{title: 'Testing Table', url: './Table/testing'}
];
export const description = 'Displays data in rows and columns and enables a user to navigate its contents via directional navigation keys.';
diff --git a/packages/dev/s2-docs/pages/react-aria/Table/useTable.mdx b/packages/dev/s2-docs/pages/react-aria/Table/useTable.mdx
new file mode 100644
index 00000000000..fd1985fbff9
--- /dev/null
+++ b/packages/dev/s2-docs/pages/react-aria/Table/useTable.mdx
@@ -0,0 +1,109 @@
+{/* Copyright 2026 Adobe. All rights reserved.
+This file is licensed to you 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 REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '../../../src/Layout';
+export default Layout;
+import {FunctionAPIGroup} from '../../../src/FunctionAPI';
+import {InterfaceType} from '../../../src/types';
+import docs from 'docs:@react-aria/table';
+import statelyDocs from 'docs:@react-stately/table';
+import Anatomy from '../TableAnatomy.svg';
+
+export const section = 'Hooks';
+export const description = 'Provides the behavior and accessibility implementation for a table component.';
+export const isSubpage = true;
+
+# useTable
+
+{docs.exports.useTable.description}
+
+```tsx render files={["starters/hooks/src/Table.tsx", "starters/hooks/src/Table.css"]}
+"use client";
+import {Table, TableHeader, TableBody, Column, Row, Cell} from 'hooks-starter/Table';
+
+
+
+```
+
+
+
+### TableState
+
+
+
+### AriaTableProps
+
+
+
+### AriaTableColumnHeaderProps
+
+
+
+### AriaTableCellProps
+
+
diff --git a/packages/dev/s2-docs/pages/react-aria/Tabs.mdx b/packages/dev/s2-docs/pages/react-aria/Tabs.mdx
index 8783fae31bc..7f172e634c1 100644
--- a/packages/dev/s2-docs/pages/react-aria/Tabs.mdx
+++ b/packages/dev/s2-docs/pages/react-aria/Tabs.mdx
@@ -10,7 +10,7 @@ import {InlineAlert, Heading, Content} from '@react-spectrum/s2'
export const tags = ['navigation'];
export const relatedPages = [
- {title: 'useTabs', url: 'Tabs/useTabList.html'},
+ {title: 'useTabList', url: './Tabs/useTabList'},
{title: 'Testing Tabs', url: './Tabs/testing'}
];
export const description = 'Organizes content into multiple sections and allows users to navigate between them.';
diff --git a/packages/dev/s2-docs/pages/react-aria/Tabs/useTabList.mdx b/packages/dev/s2-docs/pages/react-aria/Tabs/useTabList.mdx
new file mode 100644
index 00000000000..49d4c9b39c5
--- /dev/null
+++ b/packages/dev/s2-docs/pages/react-aria/Tabs/useTabList.mdx
@@ -0,0 +1,89 @@
+{/* Copyright 2026 Adobe. All rights reserved.
+This file is licensed to you 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 REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '../../../src/Layout';
+export default Layout;
+import {FunctionAPIGroup} from '../../../src/FunctionAPI';
+import {InterfaceType} from '../../../src/types';
+import docs from 'docs:@react-aria/tabs';
+import statelyDocs from 'docs:@react-stately/tabs';
+import Anatomy from '/packages/react-aria/docs/tabs/anatomy.svg';
+
+export const section = 'Hooks';
+export const description = 'Provides the behavior and accessibility implementation for a tabs component.';
+export const isSubpage = true;
+
+# useTabList
+
+{docs.exports.useTabList.description}
+
+```tsx render files={["starters/hooks/src/Tabs.tsx", "starters/hooks/src/Tabs.css"]}
+"use client";
+import {Tab, Tabs} from 'hooks-starter/Tabs';
+
+
+ Arma virumque cano, Troiae qui primus ab oris.
+ Senatus Populusque Romanus.
+ Alea jacta est.
+
+```
+
+## API
+
+
+
+```tsx
+
+
+
+
+
+
+
+
+
+
+```
+
+
+
+### TabListState
+
+
+
+### AriaTabListOptions
+
+
+
+### TabListAria
+
+
+
+### AriaTabProps
+
+
+
+### TabAria
+
+
+
+### AriaTabPanelProps
+
+
+
+### TabPanelAria
+
+
diff --git a/packages/dev/s2-docs/pages/react-aria/TagGroup.mdx b/packages/dev/s2-docs/pages/react-aria/TagGroup.mdx
index 972fefa34b5..cfbb8abbb12 100644
--- a/packages/dev/s2-docs/pages/react-aria/TagGroup.mdx
+++ b/packages/dev/s2-docs/pages/react-aria/TagGroup.mdx
@@ -9,7 +9,7 @@ import Anatomy from '/packages/react-aria/docs/tag/anatomy.svg';
import {InlineAlert, Heading, Content} from '@react-spectrum/s2';
export const tags = ['chips', 'pills'];
-export const relatedPages = [{'title': 'useTagGroup', 'url': 'TagGroup/useTagGroup.html'}];
+export const relatedPages = [{'title': 'useTagGroup', 'url': './TagGroup/useTagGroup'}];
export const description = 'A focusable list of labels, categories, keywords, filters, or other items.';
# TagGroup
diff --git a/packages/dev/s2-docs/pages/react-aria/TagGroup/useTagGroup.mdx b/packages/dev/s2-docs/pages/react-aria/TagGroup/useTagGroup.mdx
new file mode 100644
index 00000000000..ae8ecc9e8ab
--- /dev/null
+++ b/packages/dev/s2-docs/pages/react-aria/TagGroup/useTagGroup.mdx
@@ -0,0 +1,88 @@
+{/* Copyright 2026 Adobe. All rights reserved.
+This file is licensed to you 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 REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '../../../src/Layout';
+export default Layout;
+import {FunctionAPIGroup} from '../../../src/FunctionAPI';
+import {InterfaceType} from '../../../src/types';
+import docs from 'docs:@react-aria/tag';
+import statelyDocs from 'docs:@react-stately/list';
+import Anatomy from '/packages/react-aria/docs/tag/anatomy.svg';
+
+export const section = 'Hooks';
+export const description = 'Provides the behavior and accessibility implementation for a tag group component.';
+export const isSubpage = true;
+
+# useTagGroup
+
+{docs.exports.useTagGroup.description}
+
+```tsx render
+"use client";
+import {Tag, TagGroup} from 'hooks-starter/TagGroup';
+
+ alert(`Clicked ${key}`)}
+ ///- end highlight -///
+>
+ Rock
+ Jazz
+ Pop
+ Classical
+ EDM
+
+```
+
+## API
+
+
+
+```tsx
+
+
+
+
+
+
+
+
+
+
+
+```
+
+
+
+### ListState
+
+
+
+### AriaTagGroupProps
+
+
+
+### TagGroupAria
+
+
+
+### AriaTagProps
+
+
+
+### TagAria
+
+
diff --git a/packages/dev/s2-docs/pages/react-aria/TextField.mdx b/packages/dev/s2-docs/pages/react-aria/TextField.mdx
index 2a0b528612a..3cf9c3f4627 100644
--- a/packages/dev/s2-docs/pages/react-aria/TextField.mdx
+++ b/packages/dev/s2-docs/pages/react-aria/TextField.mdx
@@ -9,7 +9,7 @@ import '../../tailwind/tailwind.css';
import Anatomy from '/packages/react-aria/docs/textfield/anatomy.svg';
export const tags = ['input'];
-export const relatedPages = [{'title': 'useTextField', 'url': 'TextField/useTextField.html'}];
+export const relatedPages = [{'title': 'useTextField', 'url': './TextField/useTextField'}];
export const description = 'Allows a user to enter a plain text value with a keyboard.';
# TextField
diff --git a/packages/dev/s2-docs/pages/react-aria/TextField/useTextField.mdx b/packages/dev/s2-docs/pages/react-aria/TextField/useTextField.mdx
new file mode 100644
index 00000000000..e172145a92f
--- /dev/null
+++ b/packages/dev/s2-docs/pages/react-aria/TextField/useTextField.mdx
@@ -0,0 +1,53 @@
+{/* Copyright 2026 Adobe. All rights reserved.
+This file is licensed to you 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 REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '../../../src/Layout';
+export default Layout;
+import {FunctionAPI} from '../../../src/FunctionAPI';
+import {InterfaceType} from '../../../src/types';
+import docs from 'docs:@react-aria/textfield';
+import Anatomy from '/packages/react-aria/docs/textfield/anatomy.svg';
+
+export const section = 'Hooks';
+export const description = 'Provides the behavior and accessibility implementation for a text field.';
+export const isSubpage = true;
+
+# useTextField
+
+{docs.exports.useTextField.description}
+
+```tsx render files={["starters/hooks/src/TextField.tsx", "starters/hooks/src/TextField.css", "starters/hooks/src/Form.css"]}
+"use client";
+import {TextField} from 'hooks-starter/TextField';
+
+
+```
+
+## API
+
+
+
+```tsx
+
+
+ or
+
+
+
+```
+
+
+
+### AriaTextFieldProps
+
+
+
+### TextFieldAria
+
+
diff --git a/packages/dev/s2-docs/pages/react-aria/TimeField.mdx b/packages/dev/s2-docs/pages/react-aria/TimeField.mdx
index e325b0aa28a..142248ca43b 100644
--- a/packages/dev/s2-docs/pages/react-aria/TimeField.mdx
+++ b/packages/dev/s2-docs/pages/react-aria/TimeField.mdx
@@ -9,7 +9,7 @@ import '../../tailwind/tailwind.css';
import Anatomy from '/packages/react-aria/docs/datepicker/timefield-anatomy.svg';
export const tags = ['date', 'input'];
-export const relatedPages = [{'title': 'useTimeField', 'url': 'TimeField/useTimeField.html'}];
+export const relatedPages = [{'title': 'useTimeField', 'url': './TimeField/useTimeField'}];
export const description = 'Allows users to enter and edit time values using a keyboard.';
# TimeField
diff --git a/packages/dev/s2-docs/pages/react-aria/TimeField/useTimeField.mdx b/packages/dev/s2-docs/pages/react-aria/TimeField/useTimeField.mdx
new file mode 100644
index 00000000000..b4e1200653f
--- /dev/null
+++ b/packages/dev/s2-docs/pages/react-aria/TimeField/useTimeField.mdx
@@ -0,0 +1,61 @@
+{/* Copyright 2026 Adobe. All rights reserved.
+This file is licensed to you 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 REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '../../../src/Layout';
+export default Layout;
+import {FunctionAPIGroup} from '../../../src/FunctionAPI';
+import {InterfaceType} from '../../../src/types';
+import docs from 'docs:@react-aria/datepicker';
+import statelyDocs from 'docs:@react-stately/datepicker';
+import Anatomy from '/packages/react-aria/docs/datepicker/timefield-anatomy.svg';
+
+export const section = 'Hooks';
+export const description = 'Provides the behavior and accessibility implementation for a time field component.';
+export const isSubpage = true;
+
+# useTimeField
+
+{docs.exports.useTimeField.description}
+
+```tsx render files={["starters/hooks/src/TimeField.tsx", "starters/hooks/src/DateField.css", "starters/hooks/src/TimeField.css", "starters/hooks/src/Form.css"]}
+"use client";
+import {TimeField} from 'hooks-starter/TimeField';
+
+
+```
+
+## API
+
+
+
+```tsx
+
+
+
+ {segment => }
+
+
+
+
+```
+
+
+
+### TimeFieldState
+
+
+
+### AriaTimeFieldProps
+
+
diff --git a/packages/dev/s2-docs/pages/react-aria/Toast.mdx b/packages/dev/s2-docs/pages/react-aria/Toast.mdx
index 117fe6340b7..223de5ec2c3 100644
--- a/packages/dev/s2-docs/pages/react-aria/Toast.mdx
+++ b/packages/dev/s2-docs/pages/react-aria/Toast.mdx
@@ -9,7 +9,7 @@ import {InlineAlert, Heading, Content} from '@react-spectrum/s2';
export const tags = ['notifications'];
export const version = 'alpha';
-export const relatedPages = [{'title': 'useToast', 'url': 'Toast/useToast.html'}];
+export const relatedPages = [{'title': 'useToast', 'url': './Toast/useToast'}];
export const description = 'Displays brief, temporary notifications of actions, errors, or other events in an application.';
# Toast
diff --git a/packages/dev/s2-docs/pages/react-aria/Toast/useToast.mdx b/packages/dev/s2-docs/pages/react-aria/Toast/useToast.mdx
new file mode 100644
index 00000000000..e09dd6aa4e7
--- /dev/null
+++ b/packages/dev/s2-docs/pages/react-aria/Toast/useToast.mdx
@@ -0,0 +1,81 @@
+{/* Copyright 2026 Adobe. All rights reserved.
+This file is licensed to you 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 REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '../../../src/Layout';
+export default Layout;
+import {FunctionAPIGroup} from '../../../src/FunctionAPI';
+import {InterfaceType} from '../../../src/types';
+import docs from 'docs:@react-aria/toast';
+import statelyDocs from 'docs:@react-stately/toast';
+import Anatomy from '/packages/react-aria/docs/toast/toast-anatomy.svg';
+
+export const section = 'Hooks';
+export const description = 'Provides the behavior and accessibility implementation for a toast notification.';
+export const isSubpage = true;
+
+# useToast
+
+{docs.exports.useToast.description}
+
+```tsx render files={["starters/hooks/src/Toast.tsx", "starters/hooks/src/Toast.css", "starters/docs/src/Button.tsx", "starters/docs/src/Button.css"]}
+"use client";
+import {ToastProvider, Button} from 'hooks-starter/Toast';
+
+
+ {state => (
+
+ )}
+
+```
+
+## API
+
+
+
+```tsx
+
+ {({toast}) => (
+
+
+
+
+
+
+
+ )}
+
+```
+
+
+
+### ToastState
+
+
+
+### AriaToastRegionProps
+
+
+
+### ToastRegionAria
+
+
+
+### AriaToastProps
+
+
+
+### ToastAria
+
+
diff --git a/packages/dev/s2-docs/pages/react-aria/ToggleButton.mdx b/packages/dev/s2-docs/pages/react-aria/ToggleButton.mdx
index ad6b5cab8a2..cd6e97c03c9 100644
--- a/packages/dev/s2-docs/pages/react-aria/ToggleButton.mdx
+++ b/packages/dev/s2-docs/pages/react-aria/ToggleButton.mdx
@@ -8,7 +8,7 @@ import tailwindDocs from 'docs:tailwind-starter/ToggleButton';
import '../../tailwind/tailwind.css';
export const tags = ['button', 'btn'];
-export const relatedPages = [{'title': 'useToggleButton', 'url': 'ToggleButton/useToggleButton.html'}];
+export const relatedPages = [{'title': 'useToggleButton', 'url': './ToggleButton/useToggleButton'}];
export const description = 'Allows a user to toggle a selection on or off.';
# ToggleButton
diff --git a/packages/dev/s2-docs/pages/react-aria/ToggleButton/useToggleButton.mdx b/packages/dev/s2-docs/pages/react-aria/ToggleButton/useToggleButton.mdx
new file mode 100644
index 00000000000..3e4974f681a
--- /dev/null
+++ b/packages/dev/s2-docs/pages/react-aria/ToggleButton/useToggleButton.mdx
@@ -0,0 +1,47 @@
+{/* Copyright 2026 Adobe. All rights reserved.
+This file is licensed to you 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 REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '../../../src/Layout';
+export default Layout;
+import {FunctionAPIGroup} from '../../../src/FunctionAPI';
+import {InterfaceType} from '../../../src/types';
+import docs from 'docs:@react-aria/button';
+import statelyDocs from 'docs:@react-stately/toggle';
+
+export const section = 'Hooks';
+export const description = 'Provides the behavior and accessibility implementation for a toggle button.';
+export const isSubpage = true;
+
+# useToggleButton
+
+{docs.exports.useToggleButton.description}
+
+```tsx render files={["starters/hooks/src/ToggleButton.tsx", "starters/hooks/src/ToggleButton.css"]}
+"use client";
+import {ToggleButton} from 'hooks-starter/ToggleButton';
+
+Pin
+```
+
+## API
+
+
+
+### ToggleState
+
+
+
+### AriaToggleButtonProps
+
+
diff --git a/packages/dev/s2-docs/pages/react-aria/ToggleButtonGroup.mdx b/packages/dev/s2-docs/pages/react-aria/ToggleButtonGroup.mdx
index eba236a6ac9..e42eef96d1f 100644
--- a/packages/dev/s2-docs/pages/react-aria/ToggleButtonGroup.mdx
+++ b/packages/dev/s2-docs/pages/react-aria/ToggleButtonGroup.mdx
@@ -6,7 +6,7 @@ import '../../tailwind/tailwind.css';
import Anatomy from '/packages/react-aria/docs/button/ToggleButtonGroupAnatomy.svg';
export const tags = ['toggle', 'btn'];
-export const relatedPages = [{'title': 'useToggleButtonGroup', 'url': 'ToggleButtonGroup/useToggleButtonGroup.html'}];
+export const relatedPages = [{'title': 'useToggleButtonGroup', 'url': './ToggleButtonGroup/useToggleButtonGroup'}];
export const description = 'Allows a user to toggle multiple options, with single or multiple selection.';
# ToggleButtonGroup
diff --git a/packages/dev/s2-docs/pages/react-aria/ToggleButtonGroup/useToggleButtonGroup.mdx b/packages/dev/s2-docs/pages/react-aria/ToggleButtonGroup/useToggleButtonGroup.mdx
new file mode 100644
index 00000000000..8e4a2aa99d8
--- /dev/null
+++ b/packages/dev/s2-docs/pages/react-aria/ToggleButtonGroup/useToggleButtonGroup.mdx
@@ -0,0 +1,71 @@
+{/* Copyright 2026 Adobe. All rights reserved.
+This file is licensed to you 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 REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '../../../src/Layout';
+export default Layout;
+import {FunctionAPIGroup} from '../../../src/FunctionAPI';
+import {InterfaceType} from '../../../src/types';
+import docs from 'docs:@react-aria/button';
+import statelyDocs from 'docs:@react-stately/toggle';
+import Anatomy from '/packages/react-aria/docs/button/ToggleButtonGroupAnatomy.svg';
+
+export const section = 'Hooks';
+export const description = 'Provides the behavior and accessibility implementation for a group of toggle buttons.';
+export const isSubpage = true;
+
+# useToggleButtonGroup
+
+{docs.exports.useToggleButtonGroup.description}
+
+```tsx render files={["starters/hooks/src/ToggleButtonGroup.tsx", "starters/hooks/src/ToggleButtonGroup.css", "starters/hooks/src/ToggleButton.css"]}
+"use client";
+import {ToggleButtonGroup, ToggleButton} from 'hooks-starter/ToggleButtonGroup';
+
+
+ Left
+ Center
+ Right
+
+```
+
+## API
+
+
+
+```tsx
+
+
+
+
+
+```
+
+
+
+### ToggleGroupState
+
+
+
+### AriaToggleButtonGroupProps
+
+
+
+### ToggleButtonGroupAria
+
+
+
+### AriaToggleButtonGroupItemProps
+
+
diff --git a/packages/dev/s2-docs/pages/react-aria/Toolbar.mdx b/packages/dev/s2-docs/pages/react-aria/Toolbar.mdx
index 9813a2bd341..1ec9689020b 100644
--- a/packages/dev/s2-docs/pages/react-aria/Toolbar.mdx
+++ b/packages/dev/s2-docs/pages/react-aria/Toolbar.mdx
@@ -6,7 +6,7 @@ import '../../tailwind/tailwind.css';
import Anatomy from '/packages/react-aria/docs/toolbar/toolbar-anatomy.svg';
export const tags = ['group'];
-export const relatedPages = [{'title': 'useToolbar', 'url': 'Toolbar/useToolbar.html'}];
+export const relatedPages = [{'title': 'useToolbar', 'url': './Toolbar/useToolbar'}];
export const description = 'A container for a set of interactive controls, such as buttons, dropdown menus, or checkboxes.';
# Toolbar
diff --git a/packages/dev/s2-docs/pages/react-aria/Toolbar/useToolbar.mdx b/packages/dev/s2-docs/pages/react-aria/Toolbar/useToolbar.mdx
new file mode 100644
index 00000000000..18e56e6fd72
--- /dev/null
+++ b/packages/dev/s2-docs/pages/react-aria/Toolbar/useToolbar.mdx
@@ -0,0 +1,63 @@
+{/* Copyright 2026 Adobe. All rights reserved.
+This file is licensed to you 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 REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '../../../src/Layout';
+export default Layout;
+import {FunctionAPI} from '../../../src/FunctionAPI';
+import {InterfaceType} from '../../../src/types';
+import docs from 'docs:@react-aria/toolbar';
+import Anatomy from '/packages/react-aria/docs/toolbar/toolbar-anatomy.svg';
+
+export const section = 'Hooks';
+export const description = 'Provides the behavior and accessibility implementation for a toolbar component.';
+export const isSubpage = true;
+
+# useToolbar
+
+{docs.exports.useToolbar.description}
+
+```tsx render files={["starters/hooks/src/Toolbar.tsx", "starters/hooks/src/Toolbar.css", "starters/hooks/src/Button.tsx", "starters/hooks/src/Button.css"]}
+"use client";
+import {Toolbar} from 'hooks-starter/Toolbar';
+import {Button} from 'hooks-starter/Button';
+
+
+
+
+
+
+```
+
+## API
+
+
+
+```tsx
+
+
+
+
+
+
+
+
+
+
+
+```
+
+
+
+### AriaToolbarProps
+
+
+
+### ToolbarAria
+
+
diff --git a/packages/dev/s2-docs/pages/react-aria/Tooltip.mdx b/packages/dev/s2-docs/pages/react-aria/Tooltip.mdx
index 0164758d269..d02d85148eb 100644
--- a/packages/dev/s2-docs/pages/react-aria/Tooltip.mdx
+++ b/packages/dev/s2-docs/pages/react-aria/Tooltip.mdx
@@ -8,7 +8,7 @@ import Anatomy from '/packages/react-aria/docs/tooltip/anatomy.svg';
import {InlineAlert, Heading, Content} from '@react-spectrum/s2'
export const tags = ['hint', 'popup', 'info'];
-export const relatedPages = [{'title': 'useTooltipTrigger', 'url': 'Tooltip/useTooltipTrigger.html'}];
+export const relatedPages = [{'title': 'useTooltipTrigger', 'url': './Tooltip/useTooltipTrigger'}];
export const description = 'Displays a description of an element on hover or focus.';
# Tooltip
diff --git a/packages/dev/s2-docs/pages/react-aria/Tooltip/useTooltipTrigger.mdx b/packages/dev/s2-docs/pages/react-aria/Tooltip/useTooltipTrigger.mdx
new file mode 100644
index 00000000000..368364728dd
--- /dev/null
+++ b/packages/dev/s2-docs/pages/react-aria/Tooltip/useTooltipTrigger.mdx
@@ -0,0 +1,80 @@
+{/* Copyright 2026 Adobe. All rights reserved.
+This file is licensed to you 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 REPRESENTATIONS
+OF ANY KIND, either express or implied. See the License for the specific language
+governing permissions and limitations under the License. */}
+
+import {Layout} from '../../../src/Layout';
+export default Layout;
+import {FunctionAPIGroup} from '../../../src/FunctionAPI';
+import {InterfaceType} from '../../../src/types';
+import docs from 'docs:@react-aria/tooltip';
+import statelyDocs from 'docs:@react-stately/tooltip';
+import Anatomy from '/packages/react-aria/docs/tooltip/anatomy.svg';
+
+export const section = 'Hooks';
+export const description = 'Provides the behavior and accessibility implementation for a tooltip component.';
+export const isSubpage = true;
+
+# useTooltipTrigger
+
+{docs.exports.useTooltipTrigger.description}
+
+```tsx render files={["starters/hooks/src/Tooltip.tsx", "starters/hooks/src/Tooltip.css", "starters/hooks/src/Button.css"]}
+"use client";
+import {Button} from 'react-aria-components/Button';
+import {TooltipTrigger} from 'hooks-starter/Tooltip';
+
+
+
+
+
+
+
+
+
+```
+
+## API
+
+
+
+```tsx
+
+
+
+
+
+
+```
+
+
+
+### TooltipTriggerState
+
+
+
+### TooltipTriggerProps
+
+
+
+### TooltipTriggerAria
+
+
+
+### AriaTooltipProps
+
+
+
+### TooltipAria
+
+
diff --git a/packages/dev/s2-docs/pages/react-aria/customization.mdx b/packages/dev/s2-docs/pages/react-aria/customization.mdx
index b05223e8eee..49f436c252d 100644
--- a/packages/dev/s2-docs/pages/react-aria/customization.mdx
+++ b/packages/dev/s2-docs/pages/react-aria/customization.mdx
@@ -6,6 +6,7 @@ import {InlineAlert, Heading, Content} from '@react-spectrum/s2';
export const section = 'Guides';
export const description = 'How to build custom component patterns.';
+export const tags = ['motion', 'framer', 'render', 'composeRenderProps', 'Provider', 'useContextProps', 'slots', 'useSlottedContext', 'hooks'];
# Customization
@@ -44,6 +45,28 @@ The `render` prop is also useful for rendering link components from client-side
+## Extending render props
+
+The [styling guide](styling#render-props) describes how to use render props to style and render components based on their current state. When building a custom component that wraps a React Aria component, use to extend the `className`, `style`, or `children` while still allowing the user to pass their own value or function. It accepts the value provided by the user (which may itself be a value or a render props function), along with a function to wrap it. The result is a new render props function that receives the component's states.
+
+This example adds a default class name to a custom `Button`, while preserving any `className` the user passes (whether a string or a function):
+
+```tsx
+import {Button, ButtonProps, composeRenderProps} from 'react-aria-components';
+
+function MyButton(props: ButtonProps) {
+ return (
+