diff --git a/.chromatic/preview-head.html b/.chromatic/preview-head.html index 02e30d149e6..53c9a34cedb 100644 --- a/.chromatic/preview-head.html +++ b/.chromatic/preview-head.html @@ -138,8 +138,7 @@ - - + +`)}

Overriding the color scheme

-

By default, the page follows the user’s operating system color scheme setting, supporting both light and dark mode. The page background is set to the base Spectrum background layer by default. This can be configured by setting the data-color-scheme and data-background attributes on the {''} element. For example, to force the application to only render in light mode, set data-color-scheme="light".

+

By default, React Spectrum follows the operating system color scheme setting, supporting both light and dark mode. The colorScheme prop can be set on {''} to force the app to always render in a certain color scheme.

+
{highlight(`import {Provider} from '@react-spectrum/s2';
+
+
+  {/* your app */}
+`)}
+

When using page.css, set the data-color-scheme attribute on the {''} element.

{highlight(`
   
 `)}

Overriding the locale

-

By default, React Spectrum uses the browser/operating system language setting for localized strings, date and number formatting, and to determine the layout direction (left-to-right or right-to-left). This can be overridden by rendering a {''} component at the root of your app, and setting the locale prop.

+

By default, React Spectrum uses the browser/operating system language setting for localized strings, date and number formatting, and to determine the layout direction (left-to-right or right-to-left). This can be overridden by rendering setting the locale prop on the {''}.

{highlight(`import {Provider} from '@react-spectrum/s2';
 
 
   {/* your app */}
 `)}
-

Embedded sections

-

If you’re building an embedded section of a larger page using Spectrum 2, use the {''} component to set the background instead of importing page.css. The background prop should be set to the Spectrum background layer appropriate for your app, and the colorScheme can be overridden as well.

-
{highlight(`import {Provider} from '@react-spectrum/s2';
-
-
-  {/* your app */}
+        

Server-side rendering

+

When using SSR, the {''} component can be rendered as the root {''} element. The locale prop should always be specified to avoid hydration errors. page.css is not needed in this case.

+
{highlight(`
+  
+    {/* ... */}
+  
 `)}
+

Usage with older React Spectrum versions

+

See Adobe internal documentation.

Styling

React Spectrum v3 supported a limited set of style props for layout and positioning using Spectrum-defined values. In Spectrum 2, we’re improving on this by offering a much more flexible style macro. This offers additional Spectrum tokens, improves performance by generating CSS at build time rather than runtime, and works with any DOM element for use in custom components.

Macros are a new bundler feature that enable functions to run at build time. The React Spectrum style macro uses this to generate CSS that can be applied to any DOM element or component. Import the style macro using the with {`{type: 'macro'}`} import attribute, and pass the result to the styles prop of any React Spectrum component to provide it with styles.

@@ -191,7 +216,7 @@ import {ActionButton} from '@react-spectrum/s2'; See the full docs to learn about using the style macro to build custom components.

Supported CSS properties on Spectrum components

- +

ActionBar

+ +

ActionButton

No updates needed.

@@ -95,7 +106,6 @@ export function Migrating() {
  • Change variant="cta" to variant="accent"
  • Change variant="overBackground" to variant="primary" staticColor="white"
  • Change style to fillStyle
  • -
  • [PENDING] Comment out isPending (it has not been implemented yet)
  • Remove isQuiet (it is no longer supported in Spectrum 2)
  • If href is present, the Button should be converted to a LinkButton
  • Remove elementType (it is no longer supported in Spectrum 2)
  • @@ -142,11 +152,9 @@ export function Migrating() { @@ -268,9 +276,8 @@ export function Migrating() {
  • Remove isQuiet (it is no longer supported in Spectrum 2)
  • Change validationState="invalid" to isInvalid
  • Remove validationState="valid" (it is no longer supported in Spectrum 2)
  • -
  • [PENDING] Comment out isLoading (it has not been implemented yet)
  • -
  • [PENDING] Comment out onLoadMore (it has not been implemented yet)
  • Update Item to be a PickerItem
  • +
  • Change isLoading to loadingState and provide the appropriate loading state.
  • ProgressBar

    @@ -338,6 +345,18 @@ export function Migrating() {

    Switch

    No updates needed.

    +

    TableView

    + +

    Tabs

    +

    TreeView

    +

    If migrating from TreeView version 3.0.0-beta.3 or before, please do the following. Otherwise, no updates needed.

    + +

    View

    - + Important Note Only use {''} and {''} inside other Spectrum components with predefined styles, such as {''} and {''}. They do not include any styles by default, and should not be used standalone. Use HTML elements with the style macro directly instead. @@ -205,7 +205,7 @@ function MyComponent({variant}) { display: 'flex', alignItems: 'center', columnGap: 8 -}; +} as const; const styles = style({ ...horizontalStack, @@ -218,7 +218,7 @@ export function horizontalStack(gap: number) { display: 'flex', alignItems: 'center', columnGap: gap - }; + } as const; }`)}

    Then, import your macro and use it in a component.

    {highlight(`// component.tsx
    diff --git a/.storybook-s2/main.ts b/.storybook-s2/main.ts
    index 6c0d906a774..949e310ac7f 100644
    --- a/.storybook-s2/main.ts
    +++ b/.storybook-s2/main.ts
    @@ -31,6 +31,9 @@ const config: StorybookConfig = {
       framework: {
         name: "storybook-react-parcel",
         options: {},
    +  },
    +  core: {
    +    disableWhatsNewNotifications: true
       }
       // typescript: {
       //   reactDocgen: 'react-docgen-typescript',
    diff --git a/.storybook-s2/manager.js b/.storybook-s2/manager.js
    new file mode 100644
    index 00000000000..c2c66056a45
    --- /dev/null
    +++ b/.storybook-s2/manager.js
    @@ -0,0 +1,5 @@
    +import {addons} from '@storybook/manager-api';
    +
    +addons.setConfig({
    +  enableShortcuts: false
    +});
    diff --git a/.storybook-s2/preview-head.html b/.storybook-s2/preview-head.html
    index 050321f834d..e69de29bb2d 100644
    --- a/.storybook-s2/preview-head.html
    +++ b/.storybook-s2/preview-head.html
    @@ -1,24 +0,0 @@
    -
    -
    -
    diff --git a/.storybook-s2/preview.tsx b/.storybook-s2/preview.tsx
    index db3f879bc02..ced19394cb9 100644
    --- a/.storybook-s2/preview.tsx
    +++ b/.storybook-s2/preview.tsx
    @@ -1,4 +1,4 @@
    -import '@react-spectrum/s2/src/page';
    +import '@react-spectrum/s2/page.css';
     import { themes } from '@storybook/theming';
     import { DARK_MODE_EVENT_NAME } from 'storybook-dark-mode';
     import { store } from 'storybook-dark-mode/dist/esm/Tool';
    @@ -6,6 +6,7 @@ import { addons } from '@storybook/preview-api';
     import { DocsContainer } from '@storybook/addon-docs';
     import React, { useEffect, useState } from 'react';
     import {withProviderSwitcher} from './custom-addons/provider';
    +import {Controls, Description, Primary, Stories, Subtitle, Title} from '@storybook/blocks';
     import './global.css';
     
     const channel = addons.getChannel();
    @@ -42,7 +43,17 @@ const preview = {
               }
               return code;
             }
    -      }
    +      },
    +      page: () => (
    +        <>
    +          
    +          <Subtitle />
    +          <Description />
    +          <Primary />
    +          <Controls />
    +          <Stories includePrimary={false} />
    +        </>
    +      )
         },
         darkMode: {
           light: {
    diff --git a/.storybook/custom-addons/descriptions/register.js b/.storybook/custom-addons/descriptions/register.js
    index 9878e6714b4..2ece754638d 100644
    --- a/.storybook/custom-addons/descriptions/register.js
    +++ b/.storybook/custom-addons/descriptions/register.js
    @@ -1,8 +1,6 @@
    -
    -import {addons, types} from '@storybook/manager-api';
    +import {addons, types, useParameter} from '@storybook/manager-api';
     import { AddonPanel } from '@storybook/components';
     import React from 'react';
    -import { useParameter } from '@storybook/api';
     
     const ADDON_ID = 'descriptionAddon';
     const PANEL_ID = `${ADDON_ID}/panel`;
    @@ -19,10 +17,10 @@ addons.register(ADDON_ID, (api) => {
       addons.add(PANEL_ID, {
         type: types.PANEL,
         title: 'Description',
    -    render: ({ active }) => (
    +    render: ({active}) => (
           <AddonPanel active={active}>
             <MyPanel />
           </AddonPanel>
    -    ),
    +    )
       });
     });
    diff --git a/.storybook/custom-addons/provider/index.js b/.storybook/custom-addons/provider/index.js
    index 9415413196f..3f202880b07 100644
    --- a/.storybook/custom-addons/provider/index.js
    +++ b/.storybook/custom-addons/provider/index.js
    @@ -1,24 +1,21 @@
     import React, {useEffect, useState} from 'react';
     import {addons} from '@storybook/preview-api';
     import {makeDecorator} from '@storybook/preview-api';
    -import {getQueryParams} from '@storybook/preview-api';
     import {Provider} from '@react-spectrum/provider';
     import {expressThemes, themes, defaultTheme} from '../../constants';
     
     document.body.style.margin = '0';
     
    -const providerValuesFromUrl = Object.entries(getQueryParams()).reduce((acc, [k, v]) => {
    -  if (k.includes('providerSwitcher-')) {
    -    return { ...acc, [k.replace('providerSwitcher-', '')]: v };
    -  }
    -  return acc;
    -}, {});
    -
     function ProviderUpdater(props) {
    -  let [localeValue, setLocale] = useState(providerValuesFromUrl.locale || undefined);
    -  let [themeValue, setTheme] = useState(providerValuesFromUrl.theme || undefined);
    -  let [scaleValue, setScale] = useState(providerValuesFromUrl.scale || undefined);
    -  let [expressValue, setExpress] = useState(providerValuesFromUrl.express === 'true');
    +  let params = new URLSearchParams(document.location.search);
    +  let localeParam = params.get("providerSwitcher-locale") || undefined;
    +  let [localeValue, setLocale] = useState(localeParam);
    +  let themeParam = params.get("providerSwitcher-theme") || undefined;
    +  let [themeValue, setTheme] = useState(themeParam);
    +  let scaleParam = params.get("providerSwitcher-scale") || undefined;
    +  let [scaleValue, setScale] = useState(scaleParam);
    +  let expressParam = params.get("providerSwitcher-express") || undefined;
    +  let [expressValue, setExpress] = useState(expressParam === 'true');
       let [storyReady, setStoryReady] = useState(window.parent === window || window.parent !== window.top); // reduce content flash because it takes a moment to get the provider details
       // Typically themes are provided with both light + dark, and both scales.
       // To build our selector to see all themes, we need to hack it a bit.
    diff --git a/.storybook/custom-addons/provider/register.js b/.storybook/custom-addons/provider/register.js
    index e8d2d923ed9..28c23fb691f 100644
    --- a/.storybook/custom-addons/provider/register.js
    +++ b/.storybook/custom-addons/provider/register.js
    @@ -1,15 +1,7 @@
    -
     import {addons, types} from '@storybook/manager-api';
    -import {getQueryParams} from '@storybook/preview-api';
     import {locales} from '../../constants';
     import React, {useEffect, useState} from 'react';
     
    -const providerValuesFromUrl = Object.entries(getQueryParams()).reduce((acc, [k, v]) => {
    -  if (k.includes('providerSwitcher-')) {
    -    return { ...acc, [k.replace('providerSwitcher-', '')]: v };
    -  }
    -  return acc;
    -}, {});
     
     let THEMES = [
       {label: 'Auto', value: ''},
    @@ -37,7 +29,17 @@ let TOAST_POSITIONS = [
     ];
     
     function ProviderFieldSetter({api}) {
    -  let [values, setValues] = useState({locale: providerValuesFromUrl.locale || undefined, theme: providerValuesFromUrl.theme || undefined, scale: providerValuesFromUrl.scale || undefined, express: providerValuesFromUrl.express === 'true'});
    +  let localeParam = api.getQueryParam('providerSwitcher-locale') || undefined;
    +  let themeParam = api.getQueryParam('providerSwitcher-theme') || undefined;
    +  let scaleParam = api.getQueryParam('providerSwitcher-scale') || undefined;
    +  let expressParam = api.getQueryParam('providerSwitcher-express') || undefined;
    +
    +  let [values, setValues] = useState({
    +    locale: localeParam,
    +    theme: themeParam,
    +    scale: scaleParam,
    +    express: expressParam === 'true'
    +  });
       let channel = addons.getChannel();
       let onLocaleChange = (e) => {
         let newValue = e.target.value || undefined;
    diff --git a/.storybook/custom-addons/scrolling/index.js b/.storybook/custom-addons/scrolling/index.js
    index 6e016d9ed43..8806ef97da6 100644
    --- a/.storybook/custom-addons/scrolling/index.js
    +++ b/.storybook/custom-addons/scrolling/index.js
    @@ -1,11 +1,12 @@
     import {addons} from '@storybook/preview-api';
     import clsx from 'clsx';
    -import {getQueryParams} from '@storybook/preview-api';
     import React, {useEffect, useState} from 'react';
     
     function ScrollingDecorator(props) {
       let {children} = props;
    -  let [isScrolling, setScrolling] = useState(getQueryParams()?.scrolling === 'true' || false);
    +  let params = new URLSearchParams(document.location.search);
    +  let scrolling = params.get('scrolling') || undefined;
    +  let [isScrolling, setScrolling] = useState(scrolling === 'true' || false);
     
       useEffect(() => {
         let channel = addons.getChannel();
    diff --git a/.storybook/custom-addons/scrolling/register.js b/.storybook/custom-addons/scrolling/register.js
    index b25f1be3087..97517f0b68b 100644
    --- a/.storybook/custom-addons/scrolling/register.js
    +++ b/.storybook/custom-addons/scrolling/register.js
    @@ -1,10 +1,10 @@
     import {addons, types} from '@storybook/manager-api';
    -import {getQueryParams} from '@storybook/preview-api';
     import React, {useEffect, useState} from 'react';
     
     const ScrollingToolbar = ({api}) => {
       let channel = addons.getChannel();
    -  let [isScrolling, setScrolling] = useState(getQueryParams()?.scrolling === 'true' || false);
    +  let scrolling = api.getQueryParam('scrolling');
    +  let [isScrolling, setScrolling] = useState(scrolling === 'true' || false);
       let onChange = () => {
         setScrolling((old) => {
           channel.emit('scrolling/updated', !old);
    diff --git a/.storybook/custom-addons/strictmode/index.js b/.storybook/custom-addons/strictmode/index.js
    index 61ae2a95651..34df03f1940 100644
    --- a/.storybook/custom-addons/strictmode/index.js
    +++ b/.storybook/custom-addons/strictmode/index.js
    @@ -1,10 +1,11 @@
     import {addons, makeDecorator} from '@storybook/preview-api';
    -import {getQueryParams} from '@storybook/preview-api';
     import React, {StrictMode, useEffect, useState} from 'react';
     
     function StrictModeDecorator(props) {
       let {children} = props;
    -  let [isStrict, setStrict] = useState(getQueryParams()?.strict !== 'false');
    +  let params = new URLSearchParams(document.location.search);
    +  let strictParam = params.get("strict") || undefined;
    +  let [isStrict, setStrict] = useState(strictParam !== 'false');
     
       useEffect(() => {
         let channel = addons.getChannel();
    diff --git a/.storybook/custom-addons/strictmode/register.js b/.storybook/custom-addons/strictmode/register.js
    index c4d1b2b9068..d94cd2fcafc 100644
    --- a/.storybook/custom-addons/strictmode/register.js
    +++ b/.storybook/custom-addons/strictmode/register.js
    @@ -1,15 +1,15 @@
     import {addons, types} from '@storybook/manager-api';
    -import {getQueryParams} from '@storybook/preview-api';
     import React, {useEffect, useState} from 'react';
     
     const StrictModeToolBar = ({api}) => {
       let channel = addons.getChannel();
    -  let [isStrict, setStrict] = useState(getQueryParams()?.strict !== 'false');
    +  let strictParam = api.getQueryParam('strict');
    +  let [isStrict, setStrict] = useState(strictParam !== 'false');
       let onChange = () => {
         setStrict((old) => {
           channel.emit('strict/updated', !old);
           return !old;
    -    })
    +    });
       };
     
       useEffect(() => {
    diff --git a/.storybook/main.js b/.storybook/main.js
    index 95b64e2cdbb..e9986a2e7a6 100644
    --- a/.storybook/main.js
    +++ b/.storybook/main.js
    @@ -11,11 +11,11 @@ module.exports = {
         "@storybook/addon-a11y",
         "@storybook/addon-controls",
         "storybook-dark-mode",
    -    './custom-addons/provider/register',
    -    './custom-addons/descriptions/register',
    -    './custom-addons/theme/register',
    -    './custom-addons/strictmode/register',
    -    './custom-addons/scrolling/register'
    +    './custom-addons/provider/register.js',
    +    './custom-addons/descriptions/register.js',
    +    './custom-addons/theme/register.js',
    +    './custom-addons/strictmode/register.js',
    +    './custom-addons/scrolling/register.js'
       ],
     
       typescript: {
    @@ -26,5 +26,9 @@ module.exports = {
       framework: {
         name: "storybook-react-parcel",
         options: {},
    +  },
    +
    +  core: {
    +    disableWhatsNewNotifications: true
       }
     };
    diff --git a/.yarn/patches/@storybook-addon-a11y-npm-7.6.19-04b470eae0.patch b/.yarn/patches/@storybook-addon-a11y-npm-7.6.19-04b470eae0.patch
    deleted file mode 100644
    index 1ceade64513..00000000000
    --- a/.yarn/patches/@storybook-addon-a11y-npm-7.6.19-04b470eae0.patch
    +++ /dev/null
    @@ -1,10 +0,0 @@
    -diff --git a/dist/preview.js b/dist/preview.js
    -index 6bfbc6db3e10443aa4e5aedd8b98a95840f28dc3..69dfac701b32a763bdf6469bdd667638b258b104 100644
    ---- a/dist/preview.js
    -+++ b/dist/preview.js
    -@@ -1,4 +1,4 @@
    - import { global } from '@storybook/global';
    - import { addons } from '@storybook/preview-api';
    - 
    --var ADDON_ID="storybook/a11y";var RESULT=`${ADDON_ID}/result`,REQUEST=`${ADDON_ID}/request`,RUNNING=`${ADDON_ID}/running`,ERROR=`${ADDON_ID}/error`,MANUAL=`${ADDON_ID}/manual`,EVENTS={RESULT,REQUEST,RUNNING,ERROR,MANUAL};var{document,window:globalWindow}=global,channel=addons.getChannel(),active=!1,activeStoryId,handleRequest=async storyId=>{let{manual}=await getParams(storyId);manual||await run(storyId);},run=async storyId=>{activeStoryId=storyId;try{let input=await getParams(storyId);if(!active){active=!0,channel.emit(EVENTS.RUNNING);let axe=(await import('axe-core')).default,{element="#storybook-root",config,options={}}=input,htmlElement=document.querySelector(element);if(!htmlElement)return;axe.reset(),config&&axe.configure(config);let result=await axe.run(htmlElement,options),resultJson=JSON.parse(JSON.stringify(result));activeStoryId===storyId?channel.emit(EVENTS.RESULT,resultJson):(active=!1,run(activeStoryId));}}catch(error){channel.emit(EVENTS.ERROR,error);}finally{active=!1;}},getParams=async storyId=>{let{parameters}=await globalWindow.__STORYBOOK_STORY_STORE__.loadStory({storyId})||{};return parameters.a11y||{config:{},options:{}}};channel.on(EVENTS.REQUEST,handleRequest);channel.on(EVENTS.MANUAL,run);
    -+var ADDON_ID="storybook/a11y";var RESULT=`${ADDON_ID}/result`,REQUEST=`${ADDON_ID}/request`,RUNNING=`${ADDON_ID}/running`,ERROR=`${ADDON_ID}/error`,MANUAL=`${ADDON_ID}/manual`,EVENTS={RESULT,REQUEST,RUNNING,ERROR,MANUAL};var{document,window:globalWindow}=global,channel=addons.getChannel(),active=!1,activeStoryId,handleRequest=async storyId=>{let{manual}=await getParams(storyId);manual||await run(storyId);},run=async storyId=>{activeStoryId=storyId;try{let input=await getParams(storyId);if(!active){active=!0,channel.emit(EVENTS.RUNNING);let axe=(await import('axe-core')).default || (await import('axe-core')),{element="#storybook-root",config,options={}}=input,htmlElement=document.querySelector(element);if(!htmlElement)return;axe.reset(),config&&axe.configure(config);let result=await axe.run(htmlElement,options),resultJson=JSON.parse(JSON.stringify(result));activeStoryId===storyId?channel.emit(EVENTS.RESULT,resultJson):(active=!1,run(activeStoryId));}}catch(error){channel.emit(EVENTS.ERROR,error);}finally{active=!1;}},getParams=async storyId=>{let{parameters}=await globalWindow.__STORYBOOK_STORY_STORE__.loadStory({storyId})||{};return parameters.a11y||{config:{},options:{}}};channel.on(EVENTS.REQUEST,handleRequest);channel.on(EVENTS.MANUAL,run);
    diff --git a/.yarn/patches/@storybook-addon-a11y-npm-8.6.14-2119c57a0f.patch b/.yarn/patches/@storybook-addon-a11y-npm-8.6.14-2119c57a0f.patch
    new file mode 100644
    index 00000000000..af07f0a5f7b
    --- /dev/null
    +++ b/.yarn/patches/@storybook-addon-a11y-npm-8.6.14-2119c57a0f.patch
    @@ -0,0 +1,12 @@
    +diff --git a/dist/preview.mjs b/dist/preview.mjs
    +index 18cee31b7f18549923cca6dbe0fc3a90a3cbb88a..b512062bbe219a2bcd9fe3e4da0a355f19ade7e6 100644
    +--- a/dist/preview.mjs
    ++++ b/dist/preview.mjs
    +@@ -2,6 +2,6 @@ import { expect } from '@storybook/test';
    + import { addons } from 'storybook/internal/preview-api';
    + import { global } from '@storybook/global';
    + 
    +-var ADDON_ID="storybook/a11y";var RESULT=`${ADDON_ID}/result`,REQUEST=`${ADDON_ID}/request`,RUNNING=`${ADDON_ID}/running`,ERROR=`${ADDON_ID}/error`,MANUAL=`${ADDON_ID}/manual`;var EVENTS={RESULT,REQUEST,RUNNING,ERROR,MANUAL};var{document}=global,channel=addons.getChannel(),defaultParameters={config:{},options:{}},disabledRules=["region"],queue=[],isRunning=!1,runNext=async()=>{if(queue.length===0){isRunning=!1;return}isRunning=!0;let next=queue.shift();next&&await next(),runNext();},run=async(input=defaultParameters)=>{let{default:axe}=await import('axe-core'),{element="body",config={},options={}}=input,htmlElement=document.querySelector(element)??document.body;if(!htmlElement)return;axe.reset();let configWithDefault={...config,rules:[...disabledRules.map(id=>({id,enabled:!1})),...config?.rules??[]]};return axe.configure(configWithDefault),new Promise((resolve,reject)=>{let task=async()=>{try{let result=await axe.run(htmlElement,options);resolve(result);}catch(error){reject(error);}};queue.push(task),isRunning||runNext();})};channel.on(EVENTS.MANUAL,async(storyId,input=defaultParameters)=>{try{let result=await run(input),resultJson=JSON.parse(JSON.stringify(result));channel.emit(EVENTS.RESULT,resultJson,storyId);}catch(error){channel.emit(EVENTS.ERROR,error);}});function getIsVitestStandaloneRun(){try{return import.meta.env.VITEST_STORYBOOK==="false"}catch{return !1}}var vitestMatchersExtended=!1,experimental_afterEach=async({reporting,parameters:parameters2,globals})=>{let a11yParameter=parameters2.a11y,a11yGlobals=globals.a11y,shouldRunEnvironmentIndependent=a11yParameter?.manual!==!0&&a11yParameter?.disable!==!0&&a11yParameter?.test!=="off"&&a11yGlobals?.manual!==!0,getMode=()=>{switch(a11yParameter?.test){case"todo":return "warning";case"error":default:return "failed"}};if(shouldRunEnvironmentIndependent)try{let result=await run(a11yParameter);if(result){let hasViolations=(result?.violations.length??0)>0;if(reporting.addReport({type:"a11y",version:1,result,status:hasViolations?getMode():"passed"}),getIsVitestStandaloneRun()&&hasViolations&&getMode()==="failed"){if(!vitestMatchersExtended){let{toHaveNoViolations}=await import('./matchers-7Z3WT2CE.mjs');expect.extend({toHaveNoViolations}),vitestMatchersExtended=!0;}expect(result).toHaveNoViolations();}}}catch(e){if(reporting.addReport({type:"a11y",version:1,result:{error:e},status:"failed"}),getIsVitestStandaloneRun())throw e}},initialGlobals={a11y:{manual:!1}},parameters={a11y:{test:"todo"}};
    ++var ADDON_ID="storybook/a11y";var RESULT=`${ADDON_ID}/result`,REQUEST=`${ADDON_ID}/request`,RUNNING=`${ADDON_ID}/running`,ERROR=`${ADDON_ID}/error`,MANUAL=`${ADDON_ID}/manual`;var EVENTS={RESULT,REQUEST,RUNNING,ERROR,MANUAL};var{document}=global,channel=addons.getChannel(),defaultParameters={config:{},options:{}},disabledRules=["region"],queue=[],isRunning=!1,runNext=async()=>{if(queue.length===0){isRunning=!1;return}isRunning=!0;let next=queue.shift();next&&await next(),runNext();},run=async(input=defaultParameters)=>{let axe=await import('axe-core'),{element="body",config={},options={}}=input,htmlElement=document.querySelector(element)??document.body;if(!htmlElement)return;axe.reset();let configWithDefault={...config,rules:[...disabledRules.map(id=>({id,enabled:!1})),...config?.rules??[]]};return axe.configure(configWithDefault),new Promise((resolve,reject)=>{let task=async()=>{try{let result=await axe.run(htmlElement,options);resolve(result);}catch(error){reject(error);}};queue.push(task),isRunning||runNext();})};channel.on(EVENTS.MANUAL,async(storyId,input=defaultParameters)=>{try{let result=await run(input),resultJson=JSON.parse(JSON.stringify(result));channel.emit(EVENTS.RESULT,resultJson,storyId);}catch(error){channel.emit(EVENTS.ERROR,error);}});function getIsVitestStandaloneRun(){try{return import.meta.env.VITEST_STORYBOOK==="false"}catch{return !1}}var vitestMatchersExtended=!1,experimental_afterEach=async({reporting,parameters:parameters2,globals})=>{let a11yParameter=parameters2.a11y,a11yGlobals=globals.a11y,shouldRunEnvironmentIndependent=a11yParameter?.manual!==!0&&a11yParameter?.disable!==!0&&a11yParameter?.test!=="off"&&a11yGlobals?.manual!==!0,getMode=()=>{switch(a11yParameter?.test){case"todo":return "warning";case"error":default:return "failed"}};if(shouldRunEnvironmentIndependent)try{let result=await run(a11yParameter);if(result){let hasViolations=(result?.violations.length??0)>0;if(reporting.addReport({type:"a11y",version:1,result,status:hasViolations?getMode():"passed"}),getIsVitestStandaloneRun()&&hasViolations&&getMode()==="failed"){if(!vitestMatchersExtended){let{toHaveNoViolations}=await import('./matchers-7Z3WT2CE.mjs');expect.extend({toHaveNoViolations}),vitestMatchersExtended=!0;}expect(result).toHaveNoViolations();}}}catch(e){if(reporting.addReport({type:"a11y",version:1,result:{error:e},status:"failed"}),getIsVitestStandaloneRun())throw e}},initialGlobals={a11y:{manual:!1}},parameters={a11y:{test:"todo"}};
    + 
    + export { experimental_afterEach, initialGlobals, parameters };
    diff --git a/.yarn/patches/@storybook-addon-docs-npm-8.6.14-12ab3f55f8.patch b/.yarn/patches/@storybook-addon-docs-npm-8.6.14-12ab3f55f8.patch
    new file mode 100644
    index 00000000000..78f0d96d473
    --- /dev/null
    +++ b/.yarn/patches/@storybook-addon-docs-npm-8.6.14-12ab3f55f8.patch
    @@ -0,0 +1,12 @@
    +diff --git a/dist/index.d.ts b/dist/index.d.ts
    +index 73034b75e2303b40fee8898b973e28e216c90043..9aa139b8a225219f7f957cacc087c3185480f1c5 100644
    +--- a/dist/index.d.ts
    ++++ b/dist/index.d.ts
    +@@ -1,6 +1,7 @@
    + import * as core_dist_types from 'storybook/internal/types';
    + export * from '@storybook/blocks';
    + import { Renderer, DocsRenderFunction, ModuleExports, ModuleExport } from 'storybook/internal/types';
    ++import { JSX } from 'react';
    +
    + declare class DocsRenderer<TRenderer extends Renderer> {
    +     render: DocsRenderFunction<TRenderer>;
    \ No newline at end of file
    diff --git a/.yarn/patches/@storybook-react-npm-8.6.14-bc3fc2208a.patch b/.yarn/patches/@storybook-react-npm-8.6.14-bc3fc2208a.patch
    new file mode 100644
    index 00000000000..6eb923e627c
    --- /dev/null
    +++ b/.yarn/patches/@storybook-react-npm-8.6.14-bc3fc2208a.patch
    @@ -0,0 +1,45 @@
    +diff --git a/dist/chunk-TENYCC3B.mjs b/dist/chunk-TENYCC3B.mjs
    +index 8f2855a4fff2c97d271bc187ce78d48cd144e404..a0d2c17e3e578bacbf7d9defd046c6dc5e3becd8 100644
    +--- a/dist/chunk-TENYCC3B.mjs
    ++++ b/dist/chunk-TENYCC3B.mjs
    +@@ -3,6 +3,6 @@ import * as React3 from 'react';
    + import React3__default, { StrictMode, Fragment, Component } from 'react';
    + import { global } from '@storybook/global';
    + 
    +-var require_constants=__commonJS({"../../node_modules/semver/internal/constants.js"(exports,module){var SEMVER_SPEC_VERSION="2.0.0",MAX_SAFE_INTEGER=Number.MAX_SAFE_INTEGER||9007199254740991,MAX_SAFE_COMPONENT_LENGTH=16,MAX_SAFE_BUILD_LENGTH=250,RELEASE_TYPES=["major","premajor","minor","preminor","patch","prepatch","prerelease"];module.exports={MAX_LENGTH:256,MAX_SAFE_COMPONENT_LENGTH,MAX_SAFE_BUILD_LENGTH,MAX_SAFE_INTEGER,RELEASE_TYPES,SEMVER_SPEC_VERSION,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2};}});var require_debug=__commonJS({"../../node_modules/semver/internal/debug.js"(exports,module){var debug=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...args)=>console.error("SEMVER",...args):()=>{};module.exports=debug;}});var require_re=__commonJS({"../../node_modules/semver/internal/re.js"(exports,module){var{MAX_SAFE_COMPONENT_LENGTH,MAX_SAFE_BUILD_LENGTH,MAX_LENGTH}=require_constants(),debug=require_debug();exports=module.exports={};var re=exports.re=[],safeRe=exports.safeRe=[],src=exports.src=[],safeSrc=exports.safeSrc=[],t=exports.t={},R=0,LETTERDASHNUMBER="[a-zA-Z0-9-]",safeRegexReplacements=[["\\s",1],["\\d",MAX_LENGTH],[LETTERDASHNUMBER,MAX_SAFE_BUILD_LENGTH]],makeSafeRegex=value=>{for(let[token,max]of safeRegexReplacements)value=value.split(`${token}*`).join(`${token}{0,${max}}`).split(`${token}+`).join(`${token}{1,${max}}`);return value},createToken=(name,value,isGlobal)=>{let safe=makeSafeRegex(value),index=R++;debug(name,index,value),t[name]=index,src[index]=value,safeSrc[index]=safe,re[index]=new RegExp(value,isGlobal?"g":void 0),safeRe[index]=new RegExp(safe,isGlobal?"g":void 0);};createToken("NUMERICIDENTIFIER","0|[1-9]\\d*");createToken("NUMERICIDENTIFIERLOOSE","\\d+");createToken("NONNUMERICIDENTIFIER",`\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`);createToken("MAINVERSION",`(${src[t.NUMERICIDENTIFIER]})\\.(${src[t.NUMERICIDENTIFIER]})\\.(${src[t.NUMERICIDENTIFIER]})`);createToken("MAINVERSIONLOOSE",`(${src[t.NUMERICIDENTIFIERLOOSE]})\\.(${src[t.NUMERICIDENTIFIERLOOSE]})\\.(${src[t.NUMERICIDENTIFIERLOOSE]})`);createToken("PRERELEASEIDENTIFIER",`(?:${src[t.NUMERICIDENTIFIER]}|${src[t.NONNUMERICIDENTIFIER]})`);createToken("PRERELEASEIDENTIFIERLOOSE",`(?:${src[t.NUMERICIDENTIFIERLOOSE]}|${src[t.NONNUMERICIDENTIFIER]})`);createToken("PRERELEASE",`(?:-(${src[t.PRERELEASEIDENTIFIER]}(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`);createToken("PRERELEASELOOSE",`(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`);createToken("BUILDIDENTIFIER",`${LETTERDASHNUMBER}+`);createToken("BUILD",`(?:\\+(${src[t.BUILDIDENTIFIER]}(?:\\.${src[t.BUILDIDENTIFIER]})*))`);createToken("FULLPLAIN",`v?${src[t.MAINVERSION]}${src[t.PRERELEASE]}?${src[t.BUILD]}?`);createToken("FULL",`^${src[t.FULLPLAIN]}$`);createToken("LOOSEPLAIN",`[v=\\s]*${src[t.MAINVERSIONLOOSE]}${src[t.PRERELEASELOOSE]}?${src[t.BUILD]}?`);createToken("LOOSE",`^${src[t.LOOSEPLAIN]}$`);createToken("GTLT","((?:<|>)?=?)");createToken("XRANGEIDENTIFIERLOOSE",`${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);createToken("XRANGEIDENTIFIER",`${src[t.NUMERICIDENTIFIER]}|x|X|\\*`);createToken("XRANGEPLAIN",`[v=\\s]*(${src[t.XRANGEIDENTIFIER]})(?:\\.(${src[t.XRANGEIDENTIFIER]})(?:\\.(${src[t.XRANGEIDENTIFIER]})(?:${src[t.PRERELEASE]})?${src[t.BUILD]}?)?)?`);createToken("XRANGEPLAINLOOSE",`[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})(?:${src[t.PRERELEASELOOSE]})?${src[t.BUILD]}?)?)?`);createToken("XRANGE",`^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`);createToken("XRANGELOOSE",`^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`);createToken("COERCEPLAIN",`(^|[^\\d])(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}})(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`);createToken("COERCE",`${src[t.COERCEPLAIN]}(?:$|[^\\d])`);createToken("COERCEFULL",src[t.COERCEPLAIN]+`(?:${src[t.PRERELEASE]})?(?:${src[t.BUILD]})?(?:$|[^\\d])`);createToken("COERCERTL",src[t.COERCE],!0);createToken("COERCERTLFULL",src[t.COERCEFULL],!0);createToken("LONETILDE","(?:~>?)");createToken("TILDETRIM",`(\\s*)${src[t.LONETILDE]}\\s+`,!0);exports.tildeTrimReplace="$1~";createToken("TILDE",`^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`);createToken("TILDELOOSE",`^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`);createToken("LONECARET","(?:\\^)");createToken("CARETTRIM",`(\\s*)${src[t.LONECARET]}\\s+`,!0);exports.caretTrimReplace="$1^";createToken("CARET",`^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`);createToken("CARETLOOSE",`^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`);createToken("COMPARATORLOOSE",`^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`);createToken("COMPARATOR",`^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`);createToken("COMPARATORTRIM",`(\\s*)${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`,!0);exports.comparatorTrimReplace="$1$2$3";createToken("HYPHENRANGE",`^\\s*(${src[t.XRANGEPLAIN]})\\s+-\\s+(${src[t.XRANGEPLAIN]})\\s*$`);createToken("HYPHENRANGELOOSE",`^\\s*(${src[t.XRANGEPLAINLOOSE]})\\s+-\\s+(${src[t.XRANGEPLAINLOOSE]})\\s*$`);createToken("STAR","(<|>)?=?\\s*\\*");createToken("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$");createToken("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$");}});var require_parse_options=__commonJS({"../../node_modules/semver/internal/parse-options.js"(exports,module){var looseOption=Object.freeze({loose:!0}),emptyOpts=Object.freeze({}),parseOptions=options=>options?typeof options!="object"?looseOption:options:emptyOpts;module.exports=parseOptions;}});var require_identifiers=__commonJS({"../../node_modules/semver/internal/identifiers.js"(exports,module){var numeric=/^[0-9]+$/,compareIdentifiers=(a,b)=>{let anum=numeric.test(a),bnum=numeric.test(b);return anum&&bnum&&(a=+a,b=+b),a===b?0:anum&&!bnum?-1:bnum&&!anum?1:a<b?-1:1},rcompareIdentifiers=(a,b)=>compareIdentifiers(b,a);module.exports={compareIdentifiers,rcompareIdentifiers};}});var require_semver=__commonJS({"../../node_modules/semver/classes/semver.js"(exports,module){var debug=require_debug(),{MAX_LENGTH,MAX_SAFE_INTEGER}=require_constants(),{safeRe:re,safeSrc:src,t}=require_re(),parseOptions=require_parse_options(),{compareIdentifiers}=require_identifiers(),SemVer=class _SemVer{constructor(version2,options){if(options=parseOptions(options),version2 instanceof _SemVer){if(version2.loose===!!options.loose&&version2.includePrerelease===!!options.includePrerelease)return version2;version2=version2.version;}else if(typeof version2!="string")throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version2}".`);if(version2.length>MAX_LENGTH)throw new TypeError(`version is longer than ${MAX_LENGTH} characters`);debug("SemVer",version2,options),this.options=options,this.loose=!!options.loose,this.includePrerelease=!!options.includePrerelease;let m=version2.trim().match(options.loose?re[t.LOOSE]:re[t.FULL]);if(!m)throw new TypeError(`Invalid Version: ${version2}`);if(this.raw=version2,this.major=+m[1],this.minor=+m[2],this.patch=+m[3],this.major>MAX_SAFE_INTEGER||this.major<0)throw new TypeError("Invalid major version");if(this.minor>MAX_SAFE_INTEGER||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>MAX_SAFE_INTEGER||this.patch<0)throw new TypeError("Invalid patch version");m[4]?this.prerelease=m[4].split(".").map(id=>{if(/^[0-9]+$/.test(id)){let num=+id;if(num>=0&&num<MAX_SAFE_INTEGER)return num}return id}):this.prerelease=[],this.build=m[5]?m[5].split("."):[],this.format();}format(){return this.version=`${this.major}.${this.minor}.${this.patch}`,this.prerelease.length&&(this.version+=`-${this.prerelease.join(".")}`),this.version}toString(){return this.version}compare(other){if(debug("SemVer.compare",this.version,this.options,other),!(other instanceof _SemVer)){if(typeof other=="string"&&other===this.version)return 0;other=new _SemVer(other,this.options);}return other.version===this.version?0:this.compareMain(other)||this.comparePre(other)}compareMain(other){return other instanceof _SemVer||(other=new _SemVer(other,this.options)),compareIdentifiers(this.major,other.major)||compareIdentifiers(this.minor,other.minor)||compareIdentifiers(this.patch,other.patch)}comparePre(other){if(other instanceof _SemVer||(other=new _SemVer(other,this.options)),this.prerelease.length&&!other.prerelease.length)return -1;if(!this.prerelease.length&&other.prerelease.length)return 1;if(!this.prerelease.length&&!other.prerelease.length)return 0;let i=0;do{let a=this.prerelease[i],b=other.prerelease[i];if(debug("prerelease compare",i,a,b),a===void 0&&b===void 0)return 0;if(b===void 0)return 1;if(a===void 0)return -1;if(a===b)continue;return compareIdentifiers(a,b)}while(++i)}compareBuild(other){other instanceof _SemVer||(other=new _SemVer(other,this.options));let i=0;do{let a=this.build[i],b=other.build[i];if(debug("build compare",i,a,b),a===void 0&&b===void 0)return 0;if(b===void 0)return 1;if(a===void 0)return -1;if(a===b)continue;return compareIdentifiers(a,b)}while(++i)}inc(release,identifier,identifierBase){if(release.startsWith("pre")){if(!identifier&&identifierBase===!1)throw new Error("invalid increment argument: identifier is empty");if(identifier){let r=new RegExp(`^${this.options.loose?src[t.PRERELEASELOOSE]:src[t.PRERELEASE]}$`),match=`-${identifier}`.match(r);if(!match||match[1]!==identifier)throw new Error(`invalid identifier: ${identifier}`)}}switch(release){case"premajor":this.prerelease.length=0,this.patch=0,this.minor=0,this.major++,this.inc("pre",identifier,identifierBase);break;case"preminor":this.prerelease.length=0,this.patch=0,this.minor++,this.inc("pre",identifier,identifierBase);break;case"prepatch":this.prerelease.length=0,this.inc("patch",identifier,identifierBase),this.inc("pre",identifier,identifierBase);break;case"prerelease":this.prerelease.length===0&&this.inc("patch",identifier,identifierBase),this.inc("pre",identifier,identifierBase);break;case"release":if(this.prerelease.length===0)throw new Error(`version ${this.raw} is not a prerelease`);this.prerelease.length=0;break;case"major":(this.minor!==0||this.patch!==0||this.prerelease.length===0)&&this.major++,this.minor=0,this.patch=0,this.prerelease=[];break;case"minor":(this.patch!==0||this.prerelease.length===0)&&this.minor++,this.patch=0,this.prerelease=[];break;case"patch":this.prerelease.length===0&&this.patch++,this.prerelease=[];break;case"pre":{let base=Number(identifierBase)?1:0;if(this.prerelease.length===0)this.prerelease=[base];else {let i=this.prerelease.length;for(;--i>=0;)typeof this.prerelease[i]=="number"&&(this.prerelease[i]++,i=-2);if(i===-1){if(identifier===this.prerelease.join(".")&&identifierBase===!1)throw new Error("invalid increment argument: identifier already exists");this.prerelease.push(base);}}if(identifier){let prerelease=[identifier,base];identifierBase===!1&&(prerelease=[identifier]),compareIdentifiers(this.prerelease[0],identifier)===0?isNaN(this.prerelease[1])&&(this.prerelease=prerelease):this.prerelease=prerelease;}break}default:throw new Error(`invalid increment argument: ${release}`)}return this.raw=this.format(),this.build.length&&(this.raw+=`+${this.build.join(".")}`),this}};module.exports=SemVer;}});var require_parse=__commonJS({"../../node_modules/semver/functions/parse.js"(exports,module){var SemVer=require_semver(),parse=(version2,options,throwErrors=!1)=>{if(version2 instanceof SemVer)return version2;try{return new SemVer(version2,options)}catch(er){if(!throwErrors)return null;throw er}};module.exports=parse;}});var require_valid=__commonJS({"../../node_modules/semver/functions/valid.js"(exports,module){var parse=require_parse(),valid=(version2,options)=>{let v=parse(version2,options);return v?v.version:null};module.exports=valid;}});var require_clean=__commonJS({"../../node_modules/semver/functions/clean.js"(exports,module){var parse=require_parse(),clean=(version2,options)=>{let s=parse(version2.trim().replace(/^[=v]+/,""),options);return s?s.version:null};module.exports=clean;}});var require_inc=__commonJS({"../../node_modules/semver/functions/inc.js"(exports,module){var SemVer=require_semver(),inc=(version2,release,options,identifier,identifierBase)=>{typeof options=="string"&&(identifierBase=identifier,identifier=options,options=void 0);try{return new SemVer(version2 instanceof SemVer?version2.version:version2,options).inc(release,identifier,identifierBase).version}catch{return null}};module.exports=inc;}});var require_diff=__commonJS({"../../node_modules/semver/functions/diff.js"(exports,module){var parse=require_parse(),diff=(version1,version2)=>{let v1=parse(version1,null,!0),v2=parse(version2,null,!0),comparison=v1.compare(v2);if(comparison===0)return null;let v1Higher=comparison>0,highVersion=v1Higher?v1:v2,lowVersion=v1Higher?v2:v1,highHasPre=!!highVersion.prerelease.length;if(!!lowVersion.prerelease.length&&!highHasPre){if(!lowVersion.patch&&!lowVersion.minor)return "major";if(lowVersion.compareMain(highVersion)===0)return lowVersion.minor&&!lowVersion.patch?"minor":"patch"}let prefix=highHasPre?"pre":"";return v1.major!==v2.major?prefix+"major":v1.minor!==v2.minor?prefix+"minor":v1.patch!==v2.patch?prefix+"patch":"prerelease"};module.exports=diff;}});var require_major=__commonJS({"../../node_modules/semver/functions/major.js"(exports,module){var SemVer=require_semver(),major=(a,loose)=>new SemVer(a,loose).major;module.exports=major;}});var require_minor=__commonJS({"../../node_modules/semver/functions/minor.js"(exports,module){var SemVer=require_semver(),minor=(a,loose)=>new SemVer(a,loose).minor;module.exports=minor;}});var require_patch=__commonJS({"../../node_modules/semver/functions/patch.js"(exports,module){var SemVer=require_semver(),patch=(a,loose)=>new SemVer(a,loose).patch;module.exports=patch;}});var require_prerelease=__commonJS({"../../node_modules/semver/functions/prerelease.js"(exports,module){var parse=require_parse(),prerelease=(version2,options)=>{let parsed=parse(version2,options);return parsed&&parsed.prerelease.length?parsed.prerelease:null};module.exports=prerelease;}});var require_compare=__commonJS({"../../node_modules/semver/functions/compare.js"(exports,module){var SemVer=require_semver(),compare=(a,b,loose)=>new SemVer(a,loose).compare(new SemVer(b,loose));module.exports=compare;}});var require_rcompare=__commonJS({"../../node_modules/semver/functions/rcompare.js"(exports,module){var compare=require_compare(),rcompare=(a,b,loose)=>compare(b,a,loose);module.exports=rcompare;}});var require_compare_loose=__commonJS({"../../node_modules/semver/functions/compare-loose.js"(exports,module){var compare=require_compare(),compareLoose=(a,b)=>compare(a,b,!0);module.exports=compareLoose;}});var require_compare_build=__commonJS({"../../node_modules/semver/functions/compare-build.js"(exports,module){var SemVer=require_semver(),compareBuild=(a,b,loose)=>{let versionA=new SemVer(a,loose),versionB=new SemVer(b,loose);return versionA.compare(versionB)||versionA.compareBuild(versionB)};module.exports=compareBuild;}});var require_sort=__commonJS({"../../node_modules/semver/functions/sort.js"(exports,module){var compareBuild=require_compare_build(),sort=(list,loose)=>list.sort((a,b)=>compareBuild(a,b,loose));module.exports=sort;}});var require_rsort=__commonJS({"../../node_modules/semver/functions/rsort.js"(exports,module){var compareBuild=require_compare_build(),rsort=(list,loose)=>list.sort((a,b)=>compareBuild(b,a,loose));module.exports=rsort;}});var require_gt=__commonJS({"../../node_modules/semver/functions/gt.js"(exports,module){var compare=require_compare(),gt=(a,b,loose)=>compare(a,b,loose)>0;module.exports=gt;}});var require_lt=__commonJS({"../../node_modules/semver/functions/lt.js"(exports,module){var compare=require_compare(),lt=(a,b,loose)=>compare(a,b,loose)<0;module.exports=lt;}});var require_eq=__commonJS({"../../node_modules/semver/functions/eq.js"(exports,module){var compare=require_compare(),eq=(a,b,loose)=>compare(a,b,loose)===0;module.exports=eq;}});var require_neq=__commonJS({"../../node_modules/semver/functions/neq.js"(exports,module){var compare=require_compare(),neq=(a,b,loose)=>compare(a,b,loose)!==0;module.exports=neq;}});var require_gte=__commonJS({"../../node_modules/semver/functions/gte.js"(exports,module){var compare=require_compare(),gte=(a,b,loose)=>compare(a,b,loose)>=0;module.exports=gte;}});var require_lte=__commonJS({"../../node_modules/semver/functions/lte.js"(exports,module){var compare=require_compare(),lte=(a,b,loose)=>compare(a,b,loose)<=0;module.exports=lte;}});var require_cmp=__commonJS({"../../node_modules/semver/functions/cmp.js"(exports,module){var eq=require_eq(),neq=require_neq(),gt=require_gt(),gte=require_gte(),lt=require_lt(),lte=require_lte(),cmp=(a,op,b,loose)=>{switch(op){case"===":return typeof a=="object"&&(a=a.version),typeof b=="object"&&(b=b.version),a===b;case"!==":return typeof a=="object"&&(a=a.version),typeof b=="object"&&(b=b.version),a!==b;case"":case"=":case"==":return eq(a,b,loose);case"!=":return neq(a,b,loose);case">":return gt(a,b,loose);case">=":return gte(a,b,loose);case"<":return lt(a,b,loose);case"<=":return lte(a,b,loose);default:throw new TypeError(`Invalid operator: ${op}`)}};module.exports=cmp;}});var require_coerce=__commonJS({"../../node_modules/semver/functions/coerce.js"(exports,module){var SemVer=require_semver(),parse=require_parse(),{safeRe:re,t}=require_re(),coerce=(version2,options)=>{if(version2 instanceof SemVer)return version2;if(typeof version2=="number"&&(version2=String(version2)),typeof version2!="string")return null;options=options||{};let match=null;if(!options.rtl)match=version2.match(options.includePrerelease?re[t.COERCEFULL]:re[t.COERCE]);else {let coerceRtlRegex=options.includePrerelease?re[t.COERCERTLFULL]:re[t.COERCERTL],next;for(;(next=coerceRtlRegex.exec(version2))&&(!match||match.index+match[0].length!==version2.length);)(!match||next.index+next[0].length!==match.index+match[0].length)&&(match=next),coerceRtlRegex.lastIndex=next.index+next[1].length+next[2].length;coerceRtlRegex.lastIndex=-1;}if(match===null)return null;let major=match[2],minor=match[3]||"0",patch=match[4]||"0",prerelease=options.includePrerelease&&match[5]?`-${match[5]}`:"",build=options.includePrerelease&&match[6]?`+${match[6]}`:"";return parse(`${major}.${minor}.${patch}${prerelease}${build}`,options)};module.exports=coerce;}});var require_lrucache=__commonJS({"../../node_modules/semver/internal/lrucache.js"(exports,module){var LRUCache=class{constructor(){this.max=1e3,this.map=new Map;}get(key){let value=this.map.get(key);if(value!==void 0)return this.map.delete(key),this.map.set(key,value),value}delete(key){return this.map.delete(key)}set(key,value){if(!this.delete(key)&&value!==void 0){if(this.map.size>=this.max){let firstKey=this.map.keys().next().value;this.delete(firstKey);}this.map.set(key,value);}return this}};module.exports=LRUCache;}});var require_range=__commonJS({"../../node_modules/semver/classes/range.js"(exports,module){var SPACE_CHARACTERS=/\s+/g,Range=class _Range{constructor(range,options){if(options=parseOptions(options),range instanceof _Range)return range.loose===!!options.loose&&range.includePrerelease===!!options.includePrerelease?range:new _Range(range.raw,options);if(range instanceof Comparator)return this.raw=range.value,this.set=[[range]],this.formatted=void 0,this;if(this.options=options,this.loose=!!options.loose,this.includePrerelease=!!options.includePrerelease,this.raw=range.trim().replace(SPACE_CHARACTERS," "),this.set=this.raw.split("||").map(r=>this.parseRange(r.trim())).filter(c=>c.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${this.raw}`);if(this.set.length>1){let first=this.set[0];if(this.set=this.set.filter(c=>!isNullSet(c[0])),this.set.length===0)this.set=[first];else if(this.set.length>1){for(let c of this.set)if(c.length===1&&isAny(c[0])){this.set=[c];break}}}this.formatted=void 0;}get range(){if(this.formatted===void 0){this.formatted="";for(let i=0;i<this.set.length;i++){i>0&&(this.formatted+="||");let comps=this.set[i];for(let k=0;k<comps.length;k++)k>0&&(this.formatted+=" "),this.formatted+=comps[k].toString().trim();}}return this.formatted}format(){return this.range}toString(){return this.range}parseRange(range){let memoKey=((this.options.includePrerelease&&FLAG_INCLUDE_PRERELEASE)|(this.options.loose&&FLAG_LOOSE))+":"+range,cached=cache.get(memoKey);if(cached)return cached;let loose=this.options.loose,hr=loose?re[t.HYPHENRANGELOOSE]:re[t.HYPHENRANGE];range=range.replace(hr,hyphenReplace(this.options.includePrerelease)),debug("hyphen replace",range),range=range.replace(re[t.COMPARATORTRIM],comparatorTrimReplace),debug("comparator trim",range),range=range.replace(re[t.TILDETRIM],tildeTrimReplace),debug("tilde trim",range),range=range.replace(re[t.CARETTRIM],caretTrimReplace),debug("caret trim",range);let rangeList=range.split(" ").map(comp=>parseComparator(comp,this.options)).join(" ").split(/\s+/).map(comp=>replaceGTE0(comp,this.options));loose&&(rangeList=rangeList.filter(comp=>(debug("loose invalid filter",comp,this.options),!!comp.match(re[t.COMPARATORLOOSE])))),debug("range list",rangeList);let rangeMap=new Map,comparators=rangeList.map(comp=>new Comparator(comp,this.options));for(let comp of comparators){if(isNullSet(comp))return [comp];rangeMap.set(comp.value,comp);}rangeMap.size>1&&rangeMap.has("")&&rangeMap.delete("");let result=[...rangeMap.values()];return cache.set(memoKey,result),result}intersects(range,options){if(!(range instanceof _Range))throw new TypeError("a Range is required");return this.set.some(thisComparators=>isSatisfiable(thisComparators,options)&&range.set.some(rangeComparators=>isSatisfiable(rangeComparators,options)&&thisComparators.every(thisComparator=>rangeComparators.every(rangeComparator=>thisComparator.intersects(rangeComparator,options)))))}test(version2){if(!version2)return !1;if(typeof version2=="string")try{version2=new SemVer(version2,this.options);}catch{return !1}for(let i=0;i<this.set.length;i++)if(testSet(this.set[i],version2,this.options))return !0;return !1}};module.exports=Range;var LRU=require_lrucache(),cache=new LRU,parseOptions=require_parse_options(),Comparator=require_comparator(),debug=require_debug(),SemVer=require_semver(),{safeRe:re,t,comparatorTrimReplace,tildeTrimReplace,caretTrimReplace}=require_re(),{FLAG_INCLUDE_PRERELEASE,FLAG_LOOSE}=require_constants(),isNullSet=c=>c.value==="<0.0.0-0",isAny=c=>c.value==="",isSatisfiable=(comparators,options)=>{let result=!0,remainingComparators=comparators.slice(),testComparator=remainingComparators.pop();for(;result&&remainingComparators.length;)result=remainingComparators.every(otherComparator=>testComparator.intersects(otherComparator,options)),testComparator=remainingComparators.pop();return result},parseComparator=(comp,options)=>(debug("comp",comp,options),comp=replaceCarets(comp,options),debug("caret",comp),comp=replaceTildes(comp,options),debug("tildes",comp),comp=replaceXRanges(comp,options),debug("xrange",comp),comp=replaceStars(comp,options),debug("stars",comp),comp),isX=id=>!id||id.toLowerCase()==="x"||id==="*",replaceTildes=(comp,options)=>comp.trim().split(/\s+/).map(c=>replaceTilde(c,options)).join(" "),replaceTilde=(comp,options)=>{let r=options.loose?re[t.TILDELOOSE]:re[t.TILDE];return comp.replace(r,(_,M,m,p,pr)=>{debug("tilde",comp,_,M,m,p,pr);let ret;return isX(M)?ret="":isX(m)?ret=`>=${M}.0.0 <${+M+1}.0.0-0`:isX(p)?ret=`>=${M}.${m}.0 <${M}.${+m+1}.0-0`:pr?(debug("replaceTilde pr",pr),ret=`>=${M}.${m}.${p}-${pr} <${M}.${+m+1}.0-0`):ret=`>=${M}.${m}.${p} <${M}.${+m+1}.0-0`,debug("tilde return",ret),ret})},replaceCarets=(comp,options)=>comp.trim().split(/\s+/).map(c=>replaceCaret(c,options)).join(" "),replaceCaret=(comp,options)=>{debug("caret",comp,options);let r=options.loose?re[t.CARETLOOSE]:re[t.CARET],z=options.includePrerelease?"-0":"";return comp.replace(r,(_,M,m,p,pr)=>{debug("caret",comp,_,M,m,p,pr);let ret;return isX(M)?ret="":isX(m)?ret=`>=${M}.0.0${z} <${+M+1}.0.0-0`:isX(p)?M==="0"?ret=`>=${M}.${m}.0${z} <${M}.${+m+1}.0-0`:ret=`>=${M}.${m}.0${z} <${+M+1}.0.0-0`:pr?(debug("replaceCaret pr",pr),M==="0"?m==="0"?ret=`>=${M}.${m}.${p}-${pr} <${M}.${m}.${+p+1}-0`:ret=`>=${M}.${m}.${p}-${pr} <${M}.${+m+1}.0-0`:ret=`>=${M}.${m}.${p}-${pr} <${+M+1}.0.0-0`):(debug("no pr"),M==="0"?m==="0"?ret=`>=${M}.${m}.${p}${z} <${M}.${m}.${+p+1}-0`:ret=`>=${M}.${m}.${p}${z} <${M}.${+m+1}.0-0`:ret=`>=${M}.${m}.${p} <${+M+1}.0.0-0`),debug("caret return",ret),ret})},replaceXRanges=(comp,options)=>(debug("replaceXRanges",comp,options),comp.split(/\s+/).map(c=>replaceXRange(c,options)).join(" ")),replaceXRange=(comp,options)=>{comp=comp.trim();let r=options.loose?re[t.XRANGELOOSE]:re[t.XRANGE];return comp.replace(r,(ret,gtlt,M,m,p,pr)=>{debug("xRange",comp,ret,gtlt,M,m,p,pr);let xM=isX(M),xm=xM||isX(m),xp=xm||isX(p),anyX=xp;return gtlt==="="&&anyX&&(gtlt=""),pr=options.includePrerelease?"-0":"",xM?gtlt===">"||gtlt==="<"?ret="<0.0.0-0":ret="*":gtlt&&anyX?(xm&&(m=0),p=0,gtlt===">"?(gtlt=">=",xm?(M=+M+1,m=0,p=0):(m=+m+1,p=0)):gtlt==="<="&&(gtlt="<",xm?M=+M+1:m=+m+1),gtlt==="<"&&(pr="-0"),ret=`${gtlt+M}.${m}.${p}${pr}`):xm?ret=`>=${M}.0.0${pr} <${+M+1}.0.0-0`:xp&&(ret=`>=${M}.${m}.0${pr} <${M}.${+m+1}.0-0`),debug("xRange return",ret),ret})},replaceStars=(comp,options)=>(debug("replaceStars",comp,options),comp.trim().replace(re[t.STAR],"")),replaceGTE0=(comp,options)=>(debug("replaceGTE0",comp,options),comp.trim().replace(re[options.includePrerelease?t.GTE0PRE:t.GTE0],"")),hyphenReplace=incPr=>($0,from,fM,fm,fp,fpr,fb,to,tM,tm,tp,tpr)=>(isX(fM)?from="":isX(fm)?from=`>=${fM}.0.0${incPr?"-0":""}`:isX(fp)?from=`>=${fM}.${fm}.0${incPr?"-0":""}`:fpr?from=`>=${from}`:from=`>=${from}${incPr?"-0":""}`,isX(tM)?to="":isX(tm)?to=`<${+tM+1}.0.0-0`:isX(tp)?to=`<${tM}.${+tm+1}.0-0`:tpr?to=`<=${tM}.${tm}.${tp}-${tpr}`:incPr?to=`<${tM}.${tm}.${+tp+1}-0`:to=`<=${to}`,`${from} ${to}`.trim()),testSet=(set,version2,options)=>{for(let i=0;i<set.length;i++)if(!set[i].test(version2))return !1;if(version2.prerelease.length&&!options.includePrerelease){for(let i=0;i<set.length;i++)if(debug(set[i].semver),set[i].semver!==Comparator.ANY&&set[i].semver.prerelease.length>0){let allowed=set[i].semver;if(allowed.major===version2.major&&allowed.minor===version2.minor&&allowed.patch===version2.patch)return !0}return !1}return !0};}});var require_comparator=__commonJS({"../../node_modules/semver/classes/comparator.js"(exports,module){var ANY=Symbol("SemVer ANY"),Comparator=class _Comparator{static get ANY(){return ANY}constructor(comp,options){if(options=parseOptions(options),comp instanceof _Comparator){if(comp.loose===!!options.loose)return comp;comp=comp.value;}comp=comp.trim().split(/\s+/).join(" "),debug("comparator",comp,options),this.options=options,this.loose=!!options.loose,this.parse(comp),this.semver===ANY?this.value="":this.value=this.operator+this.semver.version,debug("comp",this);}parse(comp){let r=this.options.loose?re[t.COMPARATORLOOSE]:re[t.COMPARATOR],m=comp.match(r);if(!m)throw new TypeError(`Invalid comparator: ${comp}`);this.operator=m[1]!==void 0?m[1]:"",this.operator==="="&&(this.operator=""),m[2]?this.semver=new SemVer(m[2],this.options.loose):this.semver=ANY;}toString(){return this.value}test(version2){if(debug("Comparator.test",version2,this.options.loose),this.semver===ANY||version2===ANY)return !0;if(typeof version2=="string")try{version2=new SemVer(version2,this.options);}catch{return !1}return cmp(version2,this.operator,this.semver,this.options)}intersects(comp,options){if(!(comp instanceof _Comparator))throw new TypeError("a Comparator is required");return this.operator===""?this.value===""?!0:new Range(comp.value,options).test(this.value):comp.operator===""?comp.value===""?!0:new Range(this.value,options).test(comp.semver):(options=parseOptions(options),options.includePrerelease&&(this.value==="<0.0.0-0"||comp.value==="<0.0.0-0")||!options.includePrerelease&&(this.value.startsWith("<0.0.0")||comp.value.startsWith("<0.0.0"))?!1:!!(this.operator.startsWith(">")&&comp.operator.startsWith(">")||this.operator.startsWith("<")&&comp.operator.startsWith("<")||this.semver.version===comp.semver.version&&this.operator.includes("=")&&comp.operator.includes("=")||cmp(this.semver,"<",comp.semver,options)&&this.operator.startsWith(">")&&comp.operator.startsWith("<")||cmp(this.semver,">",comp.semver,options)&&this.operator.startsWith("<")&&comp.operator.startsWith(">")))}};module.exports=Comparator;var parseOptions=require_parse_options(),{safeRe:re,t}=require_re(),cmp=require_cmp(),debug=require_debug(),SemVer=require_semver(),Range=require_range();}});var require_satisfies=__commonJS({"../../node_modules/semver/functions/satisfies.js"(exports,module){var Range=require_range(),satisfies=(version2,range,options)=>{try{range=new Range(range,options);}catch{return !1}return range.test(version2)};module.exports=satisfies;}});var require_to_comparators=__commonJS({"../../node_modules/semver/ranges/to-comparators.js"(exports,module){var Range=require_range(),toComparators=(range,options)=>new Range(range,options).set.map(comp=>comp.map(c=>c.value).join(" ").trim().split(" "));module.exports=toComparators;}});var require_max_satisfying=__commonJS({"../../node_modules/semver/ranges/max-satisfying.js"(exports,module){var SemVer=require_semver(),Range=require_range(),maxSatisfying=(versions,range,options)=>{let max=null,maxSV=null,rangeObj=null;try{rangeObj=new Range(range,options);}catch{return null}return versions.forEach(v=>{rangeObj.test(v)&&(!max||maxSV.compare(v)===-1)&&(max=v,maxSV=new SemVer(max,options));}),max};module.exports=maxSatisfying;}});var require_min_satisfying=__commonJS({"../../node_modules/semver/ranges/min-satisfying.js"(exports,module){var SemVer=require_semver(),Range=require_range(),minSatisfying=(versions,range,options)=>{let min=null,minSV=null,rangeObj=null;try{rangeObj=new Range(range,options);}catch{return null}return versions.forEach(v=>{rangeObj.test(v)&&(!min||minSV.compare(v)===1)&&(min=v,minSV=new SemVer(min,options));}),min};module.exports=minSatisfying;}});var require_min_version=__commonJS({"../../node_modules/semver/ranges/min-version.js"(exports,module){var SemVer=require_semver(),Range=require_range(),gt=require_gt(),minVersion=(range,loose)=>{range=new Range(range,loose);let minver=new SemVer("0.0.0");if(range.test(minver)||(minver=new SemVer("0.0.0-0"),range.test(minver)))return minver;minver=null;for(let i=0;i<range.set.length;++i){let comparators=range.set[i],setMin=null;comparators.forEach(comparator=>{let compver=new SemVer(comparator.semver.version);switch(comparator.operator){case">":compver.prerelease.length===0?compver.patch++:compver.prerelease.push(0),compver.raw=compver.format();case"":case">=":(!setMin||gt(compver,setMin))&&(setMin=compver);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${comparator.operator}`)}}),setMin&&(!minver||gt(minver,setMin))&&(minver=setMin);}return minver&&range.test(minver)?minver:null};module.exports=minVersion;}});var require_valid2=__commonJS({"../../node_modules/semver/ranges/valid.js"(exports,module){var Range=require_range(),validRange=(range,options)=>{try{return new Range(range,options).range||"*"}catch{return null}};module.exports=validRange;}});var require_outside=__commonJS({"../../node_modules/semver/ranges/outside.js"(exports,module){var SemVer=require_semver(),Comparator=require_comparator(),{ANY}=Comparator,Range=require_range(),satisfies=require_satisfies(),gt=require_gt(),lt=require_lt(),lte=require_lte(),gte=require_gte(),outside=(version2,range,hilo,options)=>{version2=new SemVer(version2,options),range=new Range(range,options);let gtfn,ltefn,ltfn,comp,ecomp;switch(hilo){case">":gtfn=gt,ltefn=lte,ltfn=lt,comp=">",ecomp=">=";break;case"<":gtfn=lt,ltefn=gte,ltfn=gt,comp="<",ecomp="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(satisfies(version2,range,options))return !1;for(let i=0;i<range.set.length;++i){let comparators=range.set[i],high=null,low=null;if(comparators.forEach(comparator=>{comparator.semver===ANY&&(comparator=new Comparator(">=0.0.0")),high=high||comparator,low=low||comparator,gtfn(comparator.semver,high.semver,options)?high=comparator:ltfn(comparator.semver,low.semver,options)&&(low=comparator);}),high.operator===comp||high.operator===ecomp||(!low.operator||low.operator===comp)&<efn(version2,low.semver))return !1;if(low.operator===ecomp&<fn(version2,low.semver))return !1}return !0};module.exports=outside;}});var require_gtr=__commonJS({"../../node_modules/semver/ranges/gtr.js"(exports,module){var outside=require_outside(),gtr=(version2,range,options)=>outside(version2,range,">",options);module.exports=gtr;}});var require_ltr=__commonJS({"../../node_modules/semver/ranges/ltr.js"(exports,module){var outside=require_outside(),ltr=(version2,range,options)=>outside(version2,range,"<",options);module.exports=ltr;}});var require_intersects=__commonJS({"../../node_modules/semver/ranges/intersects.js"(exports,module){var Range=require_range(),intersects=(r1,r2,options)=>(r1=new Range(r1,options),r2=new Range(r2,options),r1.intersects(r2,options));module.exports=intersects;}});var require_simplify=__commonJS({"../../node_modules/semver/ranges/simplify.js"(exports,module){var satisfies=require_satisfies(),compare=require_compare();module.exports=(versions,range,options)=>{let set=[],first=null,prev=null,v=versions.sort((a,b)=>compare(a,b,options));for(let version2 of v)satisfies(version2,range,options)?(prev=version2,first||(first=version2)):(prev&&set.push([first,prev]),prev=null,first=null);first&&set.push([first,null]);let ranges=[];for(let[min,max]of set)min===max?ranges.push(min):!max&&min===v[0]?ranges.push("*"):max?min===v[0]?ranges.push(`<=${max}`):ranges.push(`${min} - ${max}`):ranges.push(`>=${min}`);let simplified=ranges.join(" || "),original=typeof range.raw=="string"?range.raw:String(range);return simplified.length<original.length?simplified:range};}});var require_subset=__commonJS({"../../node_modules/semver/ranges/subset.js"(exports,module){var Range=require_range(),Comparator=require_comparator(),{ANY}=Comparator,satisfies=require_satisfies(),compare=require_compare(),subset=(sub,dom,options={})=>{if(sub===dom)return !0;sub=new Range(sub,options),dom=new Range(dom,options);let sawNonNull=!1;OUTER:for(let simpleSub of sub.set){for(let simpleDom of dom.set){let isSub=simpleSubset(simpleSub,simpleDom,options);if(sawNonNull=sawNonNull||isSub!==null,isSub)continue OUTER}if(sawNonNull)return !1}return !0},minimumVersionWithPreRelease=[new Comparator(">=0.0.0-0")],minimumVersion=[new Comparator(">=0.0.0")],simpleSubset=(sub,dom,options)=>{if(sub===dom)return !0;if(sub.length===1&&sub[0].semver===ANY){if(dom.length===1&&dom[0].semver===ANY)return !0;options.includePrerelease?sub=minimumVersionWithPreRelease:sub=minimumVersion;}if(dom.length===1&&dom[0].semver===ANY){if(options.includePrerelease)return !0;dom=minimumVersion;}let eqSet=new Set,gt,lt;for(let c of sub)c.operator===">"||c.operator===">="?gt=higherGT(gt,c,options):c.operator==="<"||c.operator==="<="?lt=lowerLT(lt,c,options):eqSet.add(c.semver);if(eqSet.size>1)return null;let gtltComp;if(gt&<){if(gtltComp=compare(gt.semver,lt.semver,options),gtltComp>0)return null;if(gtltComp===0&&(gt.operator!==">="||lt.operator!=="<="))return null}for(let eq of eqSet){if(gt&&!satisfies(eq,String(gt),options)||lt&&!satisfies(eq,String(lt),options))return null;for(let c of dom)if(!satisfies(eq,String(c),options))return !1;return !0}let higher,lower,hasDomLT,hasDomGT,needDomLTPre=lt&&!options.includePrerelease&<.semver.prerelease.length?lt.semver:!1,needDomGTPre=gt&&!options.includePrerelease&>.semver.prerelease.length?gt.semver:!1;needDomLTPre&&needDomLTPre.prerelease.length===1&<.operator==="<"&&needDomLTPre.prerelease[0]===0&&(needDomLTPre=!1);for(let c of dom){if(hasDomGT=hasDomGT||c.operator===">"||c.operator===">=",hasDomLT=hasDomLT||c.operator==="<"||c.operator==="<=",gt){if(needDomGTPre&&c.semver.prerelease&&c.semver.prerelease.length&&c.semver.major===needDomGTPre.major&&c.semver.minor===needDomGTPre.minor&&c.semver.patch===needDomGTPre.patch&&(needDomGTPre=!1),c.operator===">"||c.operator===">="){if(higher=higherGT(gt,c,options),higher===c&&higher!==gt)return !1}else if(gt.operator===">="&&!satisfies(gt.semver,String(c),options))return !1}if(lt){if(needDomLTPre&&c.semver.prerelease&&c.semver.prerelease.length&&c.semver.major===needDomLTPre.major&&c.semver.minor===needDomLTPre.minor&&c.semver.patch===needDomLTPre.patch&&(needDomLTPre=!1),c.operator==="<"||c.operator==="<="){if(lower=lowerLT(lt,c,options),lower===c&&lower!==lt)return !1}else if(lt.operator==="<="&&!satisfies(lt.semver,String(c),options))return !1}if(!c.operator&&(lt||gt)&>ltComp!==0)return !1}return !(gt&&hasDomLT&&!lt&>ltComp!==0||lt&&hasDomGT&&!gt&>ltComp!==0||needDomGTPre||needDomLTPre)},higherGT=(a,b,options)=>{if(!a)return b;let comp=compare(a.semver,b.semver,options);return comp>0?a:comp<0||b.operator===">"&&a.operator===">="?b:a},lowerLT=(a,b,options)=>{if(!a)return b;let comp=compare(a.semver,b.semver,options);return comp<0?a:comp>0||b.operator==="<"&&a.operator==="<="?b:a};module.exports=subset;}});var require_semver2=__commonJS({"../../node_modules/semver/index.js"(exports,module){var internalRe=require_re(),constants=require_constants(),SemVer=require_semver(),identifiers=require_identifiers(),parse=require_parse(),valid=require_valid(),clean=require_clean(),inc=require_inc(),diff=require_diff(),major=require_major(),minor=require_minor(),patch=require_patch(),prerelease=require_prerelease(),compare=require_compare(),rcompare=require_rcompare(),compareLoose=require_compare_loose(),compareBuild=require_compare_build(),sort=require_sort(),rsort=require_rsort(),gt=require_gt(),lt=require_lt(),eq=require_eq(),neq=require_neq(),gte=require_gte(),lte=require_lte(),cmp=require_cmp(),coerce=require_coerce(),Comparator=require_comparator(),Range=require_range(),satisfies=require_satisfies(),toComparators=require_to_comparators(),maxSatisfying=require_max_satisfying(),minSatisfying=require_min_satisfying(),minVersion=require_min_version(),validRange=require_valid2(),outside=require_outside(),gtr=require_gtr(),ltr=require_ltr(),intersects=require_intersects(),simplifyRange=require_simplify(),subset=require_subset();module.exports={parse,valid,clean,inc,diff,major,minor,patch,prerelease,compare,rcompare,compareLoose,compareBuild,sort,rsort,gt,lt,eq,neq,gte,lte,cmp,coerce,Comparator,Range,satisfies,toComparators,maxSatisfying,minSatisfying,minVersion,validRange,outside,gtr,ltr,intersects,simplifyRange,subset,SemVer,re:internalRe.re,src:internalRe.src,tokens:internalRe.t,SEMVER_SPEC_VERSION:constants.SEMVER_SPEC_VERSION,RELEASE_TYPES:constants.RELEASE_TYPES,compareIdentifiers:identifiers.compareIdentifiers,rcompareIdentifiers:identifiers.rcompareIdentifiers};}});var entry_preview_exports={};__export(entry_preview_exports,{beforeAll:()=>beforeAll,decorators:()=>decorators,mount:()=>mount,parameters:()=>parameters,render:()=>render,renderToCanvas:()=>renderToCanvas});var import_semver=__toESM(require_semver2());var clonedReact={...React3};function setReactActEnvironment(isReactActEnvironment){globalThis.IS_REACT_ACT_ENVIRONMENT=isReactActEnvironment;}function getReactActEnvironment(){return globalThis.IS_REACT_ACT_ENVIRONMENT}function withGlobalActEnvironment(actImplementation){return callback=>{let previousActEnvironment=getReactActEnvironment();setReactActEnvironment(!0);try{let callbackNeedsToBeAwaited=!1,actResult=actImplementation(()=>{let result=callback();return result!==null&&typeof result=="object"&&typeof result.then=="function"&&(callbackNeedsToBeAwaited=!0),result});if(callbackNeedsToBeAwaited){let thenable=actResult;return {then:(resolve,reject)=>{thenable.then(returnValue=>{setReactActEnvironment(previousActEnvironment),resolve(returnValue);},error=>{setReactActEnvironment(previousActEnvironment),reject(error);});}}}else return setReactActEnvironment(previousActEnvironment),actResult}catch(error){throw setReactActEnvironment(previousActEnvironment),error}}}var getAct=async()=>{let reactAct;if(typeof clonedReact.act=="function")reactAct=clonedReact.act;else {let deprecatedTestUtils=await import('react-dom/test-utils');reactAct=deprecatedTestUtils?.default?.act??deprecatedTestUtils.act;}return process.env.NODE_ENV==="production"?cb=>cb():withGlobalActEnvironment(reactAct)};var render=(args,context)=>{let{id,component:Component}=context;if(!Component)throw new Error(`Unable to render story ${id} as the component annotation is missing from the default export`);return React3__default.createElement(Component,{...args})};var{FRAMEWORK_OPTIONS}=global,ErrorBoundary=class extends Component{constructor(){super(...arguments);this.state={hasError:!1};}static getDerivedStateFromError(){return {hasError:!0}}componentDidMount(){let{hasError}=this.state,{showMain}=this.props;hasError||showMain();}componentDidCatch(err){let{showException}=this.props;showException(err);}render(){let{hasError}=this.state,{children}=this.props;return hasError?null:children}},Wrapper=FRAMEWORK_OPTIONS?.strictMode?StrictMode:Fragment,actQueue=[],isActing=!1,processActQueue=async()=>{if(isActing||actQueue.length===0)return;isActing=!0;let actTask=actQueue.shift();actTask&&await actTask(),isActing=!1,processActQueue();};async function renderToCanvas({storyContext,unboundStoryFn,showMain,showException,forceRemount},canvasElement){let{renderElement,unmountElement}=await import('@storybook/react-dom-shim'),Story=unboundStoryFn,content=storyContext.parameters.__isPortableStory?React3__default.createElement(Story,{...storyContext}):React3__default.createElement(ErrorBoundary,{showMain,showException},React3__default.createElement(Story,{...storyContext})),element=Wrapper?React3__default.createElement(Wrapper,null,content):content;forceRemount&&unmountElement(canvasElement);let act=await getAct();return await new Promise(async(resolve,reject)=>{actQueue.push(async()=>{try{await act(async()=>{await renderElement(element,canvasElement,storyContext?.parameters?.react?.rootOptions);}),resolve();}catch(e){reject(e);}}),processActQueue();}),async()=>{await act(()=>{unmountElement(canvasElement);});}}var mount=context=>async ui=>(ui!=null&&(context.originalStoryFn=()=>ui),await context.renderToCanvas(),context.canvas);var parameters={renderer:"react"},decorators=[(story,context)=>{if(!context.parameters?.react?.rsc)return story();let major=import_semver.default.major(React3.version),minor=import_semver.default.minor(React3.version);if(major<18||major===18&&minor<3)throw new Error("React Server Components require React >= 18.3");return React3.createElement(React3.Suspense,null,story())}],beforeAll=async()=>{try{let{configure}=await import('@storybook/test'),act=await getAct();configure({unstable_advanceTimersWrapper:cb=>act(cb),asyncWrapper:async cb=>{let previousActEnvironment=getReactActEnvironment();setReactActEnvironment(!1);try{let result=await cb();return await new Promise(resolve=>{setTimeout(()=>{resolve();},0),jestFakeTimersAreEnabled()&&jest.advanceTimersByTime(0);}),result}finally{setReactActEnvironment(previousActEnvironment);}},eventWrapper:cb=>{let result;return act(()=>(result=cb(),result)),result}});}catch{}};function jestFakeTimersAreEnabled(){return typeof jest<"u"&&jest!==null?setTimeout._isMockFunction===!0||Object.prototype.hasOwnProperty.call(setTimeout,"clock"):!1}
    ++var require_constants=__commonJS({"../../node_modules/semver/internal/constants.js"(exports,module){var SEMVER_SPEC_VERSION="2.0.0",MAX_SAFE_INTEGER=Number.MAX_SAFE_INTEGER||9007199254740991,MAX_SAFE_COMPONENT_LENGTH=16,MAX_SAFE_BUILD_LENGTH=250,RELEASE_TYPES=["major","premajor","minor","preminor","patch","prepatch","prerelease"];module.exports={MAX_LENGTH:256,MAX_SAFE_COMPONENT_LENGTH,MAX_SAFE_BUILD_LENGTH,MAX_SAFE_INTEGER,RELEASE_TYPES,SEMVER_SPEC_VERSION,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2};}});var require_debug=__commonJS({"../../node_modules/semver/internal/debug.js"(exports,module){var debug=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...args)=>console.error("SEMVER",...args):()=>{};module.exports=debug;}});var require_re=__commonJS({"../../node_modules/semver/internal/re.js"(exports,module){var{MAX_SAFE_COMPONENT_LENGTH,MAX_SAFE_BUILD_LENGTH,MAX_LENGTH}=require_constants(),debug=require_debug();exports=module.exports={};var re=exports.re=[],safeRe=exports.safeRe=[],src=exports.src=[],safeSrc=exports.safeSrc=[],t=exports.t={},R=0,LETTERDASHNUMBER="[a-zA-Z0-9-]",safeRegexReplacements=[["\\s",1],["\\d",MAX_LENGTH],[LETTERDASHNUMBER,MAX_SAFE_BUILD_LENGTH]],makeSafeRegex=value=>{for(let[token,max]of safeRegexReplacements)value=value.split(`${token}*`).join(`${token}{0,${max}}`).split(`${token}+`).join(`${token}{1,${max}}`);return value},createToken=(name,value,isGlobal)=>{let safe=makeSafeRegex(value),index=R++;debug(name,index,value),t[name]=index,src[index]=value,safeSrc[index]=safe,re[index]=new RegExp(value,isGlobal?"g":void 0),safeRe[index]=new RegExp(safe,isGlobal?"g":void 0);};createToken("NUMERICIDENTIFIER","0|[1-9]\\d*");createToken("NUMERICIDENTIFIERLOOSE","\\d+");createToken("NONNUMERICIDENTIFIER",`\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`);createToken("MAINVERSION",`(${src[t.NUMERICIDENTIFIER]})\\.(${src[t.NUMERICIDENTIFIER]})\\.(${src[t.NUMERICIDENTIFIER]})`);createToken("MAINVERSIONLOOSE",`(${src[t.NUMERICIDENTIFIERLOOSE]})\\.(${src[t.NUMERICIDENTIFIERLOOSE]})\\.(${src[t.NUMERICIDENTIFIERLOOSE]})`);createToken("PRERELEASEIDENTIFIER",`(?:${src[t.NUMERICIDENTIFIER]}|${src[t.NONNUMERICIDENTIFIER]})`);createToken("PRERELEASEIDENTIFIERLOOSE",`(?:${src[t.NUMERICIDENTIFIERLOOSE]}|${src[t.NONNUMERICIDENTIFIER]})`);createToken("PRERELEASE",`(?:-(${src[t.PRERELEASEIDENTIFIER]}(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`);createToken("PRERELEASELOOSE",`(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`);createToken("BUILDIDENTIFIER",`${LETTERDASHNUMBER}+`);createToken("BUILD",`(?:\\+(${src[t.BUILDIDENTIFIER]}(?:\\.${src[t.BUILDIDENTIFIER]})*))`);createToken("FULLPLAIN",`v?${src[t.MAINVERSION]}${src[t.PRERELEASE]}?${src[t.BUILD]}?`);createToken("FULL",`^${src[t.FULLPLAIN]}$`);createToken("LOOSEPLAIN",`[v=\\s]*${src[t.MAINVERSIONLOOSE]}${src[t.PRERELEASELOOSE]}?${src[t.BUILD]}?`);createToken("LOOSE",`^${src[t.LOOSEPLAIN]}$`);createToken("GTLT","((?:<|>)?=?)");createToken("XRANGEIDENTIFIERLOOSE",`${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);createToken("XRANGEIDENTIFIER",`${src[t.NUMERICIDENTIFIER]}|x|X|\\*`);createToken("XRANGEPLAIN",`[v=\\s]*(${src[t.XRANGEIDENTIFIER]})(?:\\.(${src[t.XRANGEIDENTIFIER]})(?:\\.(${src[t.XRANGEIDENTIFIER]})(?:${src[t.PRERELEASE]})?${src[t.BUILD]}?)?)?`);createToken("XRANGEPLAINLOOSE",`[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})(?:${src[t.PRERELEASELOOSE]})?${src[t.BUILD]}?)?)?`);createToken("XRANGE",`^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`);createToken("XRANGELOOSE",`^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`);createToken("COERCEPLAIN",`(^|[^\\d])(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}})(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`);createToken("COERCE",`${src[t.COERCEPLAIN]}(?:$|[^\\d])`);createToken("COERCEFULL",src[t.COERCEPLAIN]+`(?:${src[t.PRERELEASE]})?(?:${src[t.BUILD]})?(?:$|[^\\d])`);createToken("COERCERTL",src[t.COERCE],!0);createToken("COERCERTLFULL",src[t.COERCEFULL],!0);createToken("LONETILDE","(?:~>?)");createToken("TILDETRIM",`(\\s*)${src[t.LONETILDE]}\\s+`,!0);exports.tildeTrimReplace="$1~";createToken("TILDE",`^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`);createToken("TILDELOOSE",`^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`);createToken("LONECARET","(?:\\^)");createToken("CARETTRIM",`(\\s*)${src[t.LONECARET]}\\s+`,!0);exports.caretTrimReplace="$1^";createToken("CARET",`^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`);createToken("CARETLOOSE",`^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`);createToken("COMPARATORLOOSE",`^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`);createToken("COMPARATOR",`^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`);createToken("COMPARATORTRIM",`(\\s*)${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`,!0);exports.comparatorTrimReplace="$1$2$3";createToken("HYPHENRANGE",`^\\s*(${src[t.XRANGEPLAIN]})\\s+-\\s+(${src[t.XRANGEPLAIN]})\\s*$`);createToken("HYPHENRANGELOOSE",`^\\s*(${src[t.XRANGEPLAINLOOSE]})\\s+-\\s+(${src[t.XRANGEPLAINLOOSE]})\\s*$`);createToken("STAR","(<|>)?=?\\s*\\*");createToken("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$");createToken("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$");}});var require_parse_options=__commonJS({"../../node_modules/semver/internal/parse-options.js"(exports,module){var looseOption=Object.freeze({loose:!0}),emptyOpts=Object.freeze({}),parseOptions=options=>options?typeof options!="object"?looseOption:options:emptyOpts;module.exports=parseOptions;}});var require_identifiers=__commonJS({"../../node_modules/semver/internal/identifiers.js"(exports,module){var numeric=/^[0-9]+$/,compareIdentifiers=(a,b)=>{let anum=numeric.test(a),bnum=numeric.test(b);return anum&&bnum&&(a=+a,b=+b),a===b?0:anum&&!bnum?-1:bnum&&!anum?1:a<b?-1:1},rcompareIdentifiers=(a,b)=>compareIdentifiers(b,a);module.exports={compareIdentifiers,rcompareIdentifiers};}});var require_semver=__commonJS({"../../node_modules/semver/classes/semver.js"(exports,module){var debug=require_debug(),{MAX_LENGTH,MAX_SAFE_INTEGER}=require_constants(),{safeRe:re,safeSrc:src,t}=require_re(),parseOptions=require_parse_options(),{compareIdentifiers}=require_identifiers(),SemVer=class _SemVer{constructor(version2,options){if(options=parseOptions(options),version2 instanceof _SemVer){if(version2.loose===!!options.loose&&version2.includePrerelease===!!options.includePrerelease)return version2;version2=version2.version;}else if(typeof version2!="string")throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version2}".`);if(version2.length>MAX_LENGTH)throw new TypeError(`version is longer than ${MAX_LENGTH} characters`);debug("SemVer",version2,options),this.options=options,this.loose=!!options.loose,this.includePrerelease=!!options.includePrerelease;let m=version2.trim().match(options.loose?re[t.LOOSE]:re[t.FULL]);if(!m)throw new TypeError(`Invalid Version: ${version2}`);if(this.raw=version2,this.major=+m[1],this.minor=+m[2],this.patch=+m[3],this.major>MAX_SAFE_INTEGER||this.major<0)throw new TypeError("Invalid major version");if(this.minor>MAX_SAFE_INTEGER||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>MAX_SAFE_INTEGER||this.patch<0)throw new TypeError("Invalid patch version");m[4]?this.prerelease=m[4].split(".").map(id=>{if(/^[0-9]+$/.test(id)){let num=+id;if(num>=0&&num<MAX_SAFE_INTEGER)return num}return id}):this.prerelease=[],this.build=m[5]?m[5].split("."):[],this.format();}format(){return this.version=`${this.major}.${this.minor}.${this.patch}`,this.prerelease.length&&(this.version+=`-${this.prerelease.join(".")}`),this.version}toString(){return this.version}compare(other){if(debug("SemVer.compare",this.version,this.options,other),!(other instanceof _SemVer)){if(typeof other=="string"&&other===this.version)return 0;other=new _SemVer(other,this.options);}return other.version===this.version?0:this.compareMain(other)||this.comparePre(other)}compareMain(other){return other instanceof _SemVer||(other=new _SemVer(other,this.options)),compareIdentifiers(this.major,other.major)||compareIdentifiers(this.minor,other.minor)||compareIdentifiers(this.patch,other.patch)}comparePre(other){if(other instanceof _SemVer||(other=new _SemVer(other,this.options)),this.prerelease.length&&!other.prerelease.length)return -1;if(!this.prerelease.length&&other.prerelease.length)return 1;if(!this.prerelease.length&&!other.prerelease.length)return 0;let i=0;do{let a=this.prerelease[i],b=other.prerelease[i];if(debug("prerelease compare",i,a,b),a===void 0&&b===void 0)return 0;if(b===void 0)return 1;if(a===void 0)return -1;if(a===b)continue;return compareIdentifiers(a,b)}while(++i)}compareBuild(other){other instanceof _SemVer||(other=new _SemVer(other,this.options));let i=0;do{let a=this.build[i],b=other.build[i];if(debug("build compare",i,a,b),a===void 0&&b===void 0)return 0;if(b===void 0)return 1;if(a===void 0)return -1;if(a===b)continue;return compareIdentifiers(a,b)}while(++i)}inc(release,identifier,identifierBase){if(release.startsWith("pre")){if(!identifier&&identifierBase===!1)throw new Error("invalid increment argument: identifier is empty");if(identifier){let r=new RegExp(`^${this.options.loose?src[t.PRERELEASELOOSE]:src[t.PRERELEASE]}$`),match=`-${identifier}`.match(r);if(!match||match[1]!==identifier)throw new Error(`invalid identifier: ${identifier}`)}}switch(release){case"premajor":this.prerelease.length=0,this.patch=0,this.minor=0,this.major++,this.inc("pre",identifier,identifierBase);break;case"preminor":this.prerelease.length=0,this.patch=0,this.minor++,this.inc("pre",identifier,identifierBase);break;case"prepatch":this.prerelease.length=0,this.inc("patch",identifier,identifierBase),this.inc("pre",identifier,identifierBase);break;case"prerelease":this.prerelease.length===0&&this.inc("patch",identifier,identifierBase),this.inc("pre",identifier,identifierBase);break;case"release":if(this.prerelease.length===0)throw new Error(`version ${this.raw} is not a prerelease`);this.prerelease.length=0;break;case"major":(this.minor!==0||this.patch!==0||this.prerelease.length===0)&&this.major++,this.minor=0,this.patch=0,this.prerelease=[];break;case"minor":(this.patch!==0||this.prerelease.length===0)&&this.minor++,this.patch=0,this.prerelease=[];break;case"patch":this.prerelease.length===0&&this.patch++,this.prerelease=[];break;case"pre":{let base=Number(identifierBase)?1:0;if(this.prerelease.length===0)this.prerelease=[base];else {let i=this.prerelease.length;for(;--i>=0;)typeof this.prerelease[i]=="number"&&(this.prerelease[i]++,i=-2);if(i===-1){if(identifier===this.prerelease.join(".")&&identifierBase===!1)throw new Error("invalid increment argument: identifier already exists");this.prerelease.push(base);}}if(identifier){let prerelease=[identifier,base];identifierBase===!1&&(prerelease=[identifier]),compareIdentifiers(this.prerelease[0],identifier)===0?isNaN(this.prerelease[1])&&(this.prerelease=prerelease):this.prerelease=prerelease;}break}default:throw new Error(`invalid increment argument: ${release}`)}return this.raw=this.format(),this.build.length&&(this.raw+=`+${this.build.join(".")}`),this}};module.exports=SemVer;}});var require_parse=__commonJS({"../../node_modules/semver/functions/parse.js"(exports,module){var SemVer=require_semver(),parse=(version2,options,throwErrors=!1)=>{if(version2 instanceof SemVer)return version2;try{return new SemVer(version2,options)}catch(er){if(!throwErrors)return null;throw er}};module.exports=parse;}});var require_valid=__commonJS({"../../node_modules/semver/functions/valid.js"(exports,module){var parse=require_parse(),valid=(version2,options)=>{let v=parse(version2,options);return v?v.version:null};module.exports=valid;}});var require_clean=__commonJS({"../../node_modules/semver/functions/clean.js"(exports,module){var parse=require_parse(),clean=(version2,options)=>{let s=parse(version2.trim().replace(/^[=v]+/,""),options);return s?s.version:null};module.exports=clean;}});var require_inc=__commonJS({"../../node_modules/semver/functions/inc.js"(exports,module){var SemVer=require_semver(),inc=(version2,release,options,identifier,identifierBase)=>{typeof options=="string"&&(identifierBase=identifier,identifier=options,options=void 0);try{return new SemVer(version2 instanceof SemVer?version2.version:version2,options).inc(release,identifier,identifierBase).version}catch{return null}};module.exports=inc;}});var require_diff=__commonJS({"../../node_modules/semver/functions/diff.js"(exports,module){var parse=require_parse(),diff=(version1,version2)=>{let v1=parse(version1,null,!0),v2=parse(version2,null,!0),comparison=v1.compare(v2);if(comparison===0)return null;let v1Higher=comparison>0,highVersion=v1Higher?v1:v2,lowVersion=v1Higher?v2:v1,highHasPre=!!highVersion.prerelease.length;if(!!lowVersion.prerelease.length&&!highHasPre){if(!lowVersion.patch&&!lowVersion.minor)return "major";if(lowVersion.compareMain(highVersion)===0)return lowVersion.minor&&!lowVersion.patch?"minor":"patch"}let prefix=highHasPre?"pre":"";return v1.major!==v2.major?prefix+"major":v1.minor!==v2.minor?prefix+"minor":v1.patch!==v2.patch?prefix+"patch":"prerelease"};module.exports=diff;}});var require_major=__commonJS({"../../node_modules/semver/functions/major.js"(exports,module){var SemVer=require_semver(),major=(a,loose)=>new SemVer(a,loose).major;module.exports=major;}});var require_minor=__commonJS({"../../node_modules/semver/functions/minor.js"(exports,module){var SemVer=require_semver(),minor=(a,loose)=>new SemVer(a,loose).minor;module.exports=minor;}});var require_patch=__commonJS({"../../node_modules/semver/functions/patch.js"(exports,module){var SemVer=require_semver(),patch=(a,loose)=>new SemVer(a,loose).patch;module.exports=patch;}});var require_prerelease=__commonJS({"../../node_modules/semver/functions/prerelease.js"(exports,module){var parse=require_parse(),prerelease=(version2,options)=>{let parsed=parse(version2,options);return parsed&&parsed.prerelease.length?parsed.prerelease:null};module.exports=prerelease;}});var require_compare=__commonJS({"../../node_modules/semver/functions/compare.js"(exports,module){var SemVer=require_semver(),compare=(a,b,loose)=>new SemVer(a,loose).compare(new SemVer(b,loose));module.exports=compare;}});var require_rcompare=__commonJS({"../../node_modules/semver/functions/rcompare.js"(exports,module){var compare=require_compare(),rcompare=(a,b,loose)=>compare(b,a,loose);module.exports=rcompare;}});var require_compare_loose=__commonJS({"../../node_modules/semver/functions/compare-loose.js"(exports,module){var compare=require_compare(),compareLoose=(a,b)=>compare(a,b,!0);module.exports=compareLoose;}});var require_compare_build=__commonJS({"../../node_modules/semver/functions/compare-build.js"(exports,module){var SemVer=require_semver(),compareBuild=(a,b,loose)=>{let versionA=new SemVer(a,loose),versionB=new SemVer(b,loose);return versionA.compare(versionB)||versionA.compareBuild(versionB)};module.exports=compareBuild;}});var require_sort=__commonJS({"../../node_modules/semver/functions/sort.js"(exports,module){var compareBuild=require_compare_build(),sort=(list,loose)=>list.sort((a,b)=>compareBuild(a,b,loose));module.exports=sort;}});var require_rsort=__commonJS({"../../node_modules/semver/functions/rsort.js"(exports,module){var compareBuild=require_compare_build(),rsort=(list,loose)=>list.sort((a,b)=>compareBuild(b,a,loose));module.exports=rsort;}});var require_gt=__commonJS({"../../node_modules/semver/functions/gt.js"(exports,module){var compare=require_compare(),gt=(a,b,loose)=>compare(a,b,loose)>0;module.exports=gt;}});var require_lt=__commonJS({"../../node_modules/semver/functions/lt.js"(exports,module){var compare=require_compare(),lt=(a,b,loose)=>compare(a,b,loose)<0;module.exports=lt;}});var require_eq=__commonJS({"../../node_modules/semver/functions/eq.js"(exports,module){var compare=require_compare(),eq=(a,b,loose)=>compare(a,b,loose)===0;module.exports=eq;}});var require_neq=__commonJS({"../../node_modules/semver/functions/neq.js"(exports,module){var compare=require_compare(),neq=(a,b,loose)=>compare(a,b,loose)!==0;module.exports=neq;}});var require_gte=__commonJS({"../../node_modules/semver/functions/gte.js"(exports,module){var compare=require_compare(),gte=(a,b,loose)=>compare(a,b,loose)>=0;module.exports=gte;}});var require_lte=__commonJS({"../../node_modules/semver/functions/lte.js"(exports,module){var compare=require_compare(),lte=(a,b,loose)=>compare(a,b,loose)<=0;module.exports=lte;}});var require_cmp=__commonJS({"../../node_modules/semver/functions/cmp.js"(exports,module){var eq=require_eq(),neq=require_neq(),gt=require_gt(),gte=require_gte(),lt=require_lt(),lte=require_lte(),cmp=(a,op,b,loose)=>{switch(op){case"===":return typeof a=="object"&&(a=a.version),typeof b=="object"&&(b=b.version),a===b;case"!==":return typeof a=="object"&&(a=a.version),typeof b=="object"&&(b=b.version),a!==b;case"":case"=":case"==":return eq(a,b,loose);case"!=":return neq(a,b,loose);case">":return gt(a,b,loose);case">=":return gte(a,b,loose);case"<":return lt(a,b,loose);case"<=":return lte(a,b,loose);default:throw new TypeError(`Invalid operator: ${op}`)}};module.exports=cmp;}});var require_coerce=__commonJS({"../../node_modules/semver/functions/coerce.js"(exports,module){var SemVer=require_semver(),parse=require_parse(),{safeRe:re,t}=require_re(),coerce=(version2,options)=>{if(version2 instanceof SemVer)return version2;if(typeof version2=="number"&&(version2=String(version2)),typeof version2!="string")return null;options=options||{};let match=null;if(!options.rtl)match=version2.match(options.includePrerelease?re[t.COERCEFULL]:re[t.COERCE]);else {let coerceRtlRegex=options.includePrerelease?re[t.COERCERTLFULL]:re[t.COERCERTL],next;for(;(next=coerceRtlRegex.exec(version2))&&(!match||match.index+match[0].length!==version2.length);)(!match||next.index+next[0].length!==match.index+match[0].length)&&(match=next),coerceRtlRegex.lastIndex=next.index+next[1].length+next[2].length;coerceRtlRegex.lastIndex=-1;}if(match===null)return null;let major=match[2],minor=match[3]||"0",patch=match[4]||"0",prerelease=options.includePrerelease&&match[5]?`-${match[5]}`:"",build=options.includePrerelease&&match[6]?`+${match[6]}`:"";return parse(`${major}.${minor}.${patch}${prerelease}${build}`,options)};module.exports=coerce;}});var require_lrucache=__commonJS({"../../node_modules/semver/internal/lrucache.js"(exports,module){var LRUCache=class{constructor(){this.max=1e3,this.map=new Map;}get(key){let value=this.map.get(key);if(value!==void 0)return this.map.delete(key),this.map.set(key,value),value}delete(key){return this.map.delete(key)}set(key,value){if(!this.delete(key)&&value!==void 0){if(this.map.size>=this.max){let firstKey=this.map.keys().next().value;this.delete(firstKey);}this.map.set(key,value);}return this}};module.exports=LRUCache;}});var require_range=__commonJS({"../../node_modules/semver/classes/range.js"(exports,module){var SPACE_CHARACTERS=/\s+/g,Range=class _Range{constructor(range,options){if(options=parseOptions(options),range instanceof _Range)return range.loose===!!options.loose&&range.includePrerelease===!!options.includePrerelease?range:new _Range(range.raw,options);if(range instanceof Comparator)return this.raw=range.value,this.set=[[range]],this.formatted=void 0,this;if(this.options=options,this.loose=!!options.loose,this.includePrerelease=!!options.includePrerelease,this.raw=range.trim().replace(SPACE_CHARACTERS," "),this.set=this.raw.split("||").map(r=>this.parseRange(r.trim())).filter(c=>c.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${this.raw}`);if(this.set.length>1){let first=this.set[0];if(this.set=this.set.filter(c=>!isNullSet(c[0])),this.set.length===0)this.set=[first];else if(this.set.length>1){for(let c of this.set)if(c.length===1&&isAny(c[0])){this.set=[c];break}}}this.formatted=void 0;}get range(){if(this.formatted===void 0){this.formatted="";for(let i=0;i<this.set.length;i++){i>0&&(this.formatted+="||");let comps=this.set[i];for(let k=0;k<comps.length;k++)k>0&&(this.formatted+=" "),this.formatted+=comps[k].toString().trim();}}return this.formatted}format(){return this.range}toString(){return this.range}parseRange(range){let memoKey=((this.options.includePrerelease&&FLAG_INCLUDE_PRERELEASE)|(this.options.loose&&FLAG_LOOSE))+":"+range,cached=cache.get(memoKey);if(cached)return cached;let loose=this.options.loose,hr=loose?re[t.HYPHENRANGELOOSE]:re[t.HYPHENRANGE];range=range.replace(hr,hyphenReplace(this.options.includePrerelease)),debug("hyphen replace",range),range=range.replace(re[t.COMPARATORTRIM],comparatorTrimReplace),debug("comparator trim",range),range=range.replace(re[t.TILDETRIM],tildeTrimReplace),debug("tilde trim",range),range=range.replace(re[t.CARETTRIM],caretTrimReplace),debug("caret trim",range);let rangeList=range.split(" ").map(comp=>parseComparator(comp,this.options)).join(" ").split(/\s+/).map(comp=>replaceGTE0(comp,this.options));loose&&(rangeList=rangeList.filter(comp=>(debug("loose invalid filter",comp,this.options),!!comp.match(re[t.COMPARATORLOOSE])))),debug("range list",rangeList);let rangeMap=new Map,comparators=rangeList.map(comp=>new Comparator(comp,this.options));for(let comp of comparators){if(isNullSet(comp))return [comp];rangeMap.set(comp.value,comp);}rangeMap.size>1&&rangeMap.has("")&&rangeMap.delete("");let result=[...rangeMap.values()];return cache.set(memoKey,result),result}intersects(range,options){if(!(range instanceof _Range))throw new TypeError("a Range is required");return this.set.some(thisComparators=>isSatisfiable(thisComparators,options)&&range.set.some(rangeComparators=>isSatisfiable(rangeComparators,options)&&thisComparators.every(thisComparator=>rangeComparators.every(rangeComparator=>thisComparator.intersects(rangeComparator,options)))))}test(version2){if(!version2)return !1;if(typeof version2=="string")try{version2=new SemVer(version2,this.options);}catch{return !1}for(let i=0;i<this.set.length;i++)if(testSet(this.set[i],version2,this.options))return !0;return !1}};module.exports=Range;var LRU=require_lrucache(),cache=new LRU,parseOptions=require_parse_options(),Comparator=require_comparator(),debug=require_debug(),SemVer=require_semver(),{safeRe:re,t,comparatorTrimReplace,tildeTrimReplace,caretTrimReplace}=require_re(),{FLAG_INCLUDE_PRERELEASE,FLAG_LOOSE}=require_constants(),isNullSet=c=>c.value==="<0.0.0-0",isAny=c=>c.value==="",isSatisfiable=(comparators,options)=>{let result=!0,remainingComparators=comparators.slice(),testComparator=remainingComparators.pop();for(;result&&remainingComparators.length;)result=remainingComparators.every(otherComparator=>testComparator.intersects(otherComparator,options)),testComparator=remainingComparators.pop();return result},parseComparator=(comp,options)=>(debug("comp",comp,options),comp=replaceCarets(comp,options),debug("caret",comp),comp=replaceTildes(comp,options),debug("tildes",comp),comp=replaceXRanges(comp,options),debug("xrange",comp),comp=replaceStars(comp,options),debug("stars",comp),comp),isX=id=>!id||id.toLowerCase()==="x"||id==="*",replaceTildes=(comp,options)=>comp.trim().split(/\s+/).map(c=>replaceTilde(c,options)).join(" "),replaceTilde=(comp,options)=>{let r=options.loose?re[t.TILDELOOSE]:re[t.TILDE];return comp.replace(r,(_,M,m,p,pr)=>{debug("tilde",comp,_,M,m,p,pr);let ret;return isX(M)?ret="":isX(m)?ret=`>=${M}.0.0 <${+M+1}.0.0-0`:isX(p)?ret=`>=${M}.${m}.0 <${M}.${+m+1}.0-0`:pr?(debug("replaceTilde pr",pr),ret=`>=${M}.${m}.${p}-${pr} <${M}.${+m+1}.0-0`):ret=`>=${M}.${m}.${p} <${M}.${+m+1}.0-0`,debug("tilde return",ret),ret})},replaceCarets=(comp,options)=>comp.trim().split(/\s+/).map(c=>replaceCaret(c,options)).join(" "),replaceCaret=(comp,options)=>{debug("caret",comp,options);let r=options.loose?re[t.CARETLOOSE]:re[t.CARET],z=options.includePrerelease?"-0":"";return comp.replace(r,(_,M,m,p,pr)=>{debug("caret",comp,_,M,m,p,pr);let ret;return isX(M)?ret="":isX(m)?ret=`>=${M}.0.0${z} <${+M+1}.0.0-0`:isX(p)?M==="0"?ret=`>=${M}.${m}.0${z} <${M}.${+m+1}.0-0`:ret=`>=${M}.${m}.0${z} <${+M+1}.0.0-0`:pr?(debug("replaceCaret pr",pr),M==="0"?m==="0"?ret=`>=${M}.${m}.${p}-${pr} <${M}.${m}.${+p+1}-0`:ret=`>=${M}.${m}.${p}-${pr} <${M}.${+m+1}.0-0`:ret=`>=${M}.${m}.${p}-${pr} <${+M+1}.0.0-0`):(debug("no pr"),M==="0"?m==="0"?ret=`>=${M}.${m}.${p}${z} <${M}.${m}.${+p+1}-0`:ret=`>=${M}.${m}.${p}${z} <${M}.${+m+1}.0-0`:ret=`>=${M}.${m}.${p} <${+M+1}.0.0-0`),debug("caret return",ret),ret})},replaceXRanges=(comp,options)=>(debug("replaceXRanges",comp,options),comp.split(/\s+/).map(c=>replaceXRange(c,options)).join(" ")),replaceXRange=(comp,options)=>{comp=comp.trim();let r=options.loose?re[t.XRANGELOOSE]:re[t.XRANGE];return comp.replace(r,(ret,gtlt,M,m,p,pr)=>{debug("xRange",comp,ret,gtlt,M,m,p,pr);let xM=isX(M),xm=xM||isX(m),xp=xm||isX(p),anyX=xp;return gtlt==="="&&anyX&&(gtlt=""),pr=options.includePrerelease?"-0":"",xM?gtlt===">"||gtlt==="<"?ret="<0.0.0-0":ret="*":gtlt&&anyX?(xm&&(m=0),p=0,gtlt===">"?(gtlt=">=",xm?(M=+M+1,m=0,p=0):(m=+m+1,p=0)):gtlt==="<="&&(gtlt="<",xm?M=+M+1:m=+m+1),gtlt==="<"&&(pr="-0"),ret=`${gtlt+M}.${m}.${p}${pr}`):xm?ret=`>=${M}.0.0${pr} <${+M+1}.0.0-0`:xp&&(ret=`>=${M}.${m}.0${pr} <${M}.${+m+1}.0-0`),debug("xRange return",ret),ret})},replaceStars=(comp,options)=>(debug("replaceStars",comp,options),comp.trim().replace(re[t.STAR],"")),replaceGTE0=(comp,options)=>(debug("replaceGTE0",comp,options),comp.trim().replace(re[options.includePrerelease?t.GTE0PRE:t.GTE0],"")),hyphenReplace=incPr=>($0,from,fM,fm,fp,fpr,fb,to,tM,tm,tp,tpr)=>(isX(fM)?from="":isX(fm)?from=`>=${fM}.0.0${incPr?"-0":""}`:isX(fp)?from=`>=${fM}.${fm}.0${incPr?"-0":""}`:fpr?from=`>=${from}`:from=`>=${from}${incPr?"-0":""}`,isX(tM)?to="":isX(tm)?to=`<${+tM+1}.0.0-0`:isX(tp)?to=`<${tM}.${+tm+1}.0-0`:tpr?to=`<=${tM}.${tm}.${tp}-${tpr}`:incPr?to=`<${tM}.${tm}.${+tp+1}-0`:to=`<=${to}`,`${from} ${to}`.trim()),testSet=(set,version2,options)=>{for(let i=0;i<set.length;i++)if(!set[i].test(version2))return !1;if(version2.prerelease.length&&!options.includePrerelease){for(let i=0;i<set.length;i++)if(debug(set[i].semver),set[i].semver!==Comparator.ANY&&set[i].semver.prerelease.length>0){let allowed=set[i].semver;if(allowed.major===version2.major&&allowed.minor===version2.minor&&allowed.patch===version2.patch)return !0}return !1}return !0};}});var require_comparator=__commonJS({"../../node_modules/semver/classes/comparator.js"(exports,module){var ANY=Symbol("SemVer ANY"),Comparator=class _Comparator{static get ANY(){return ANY}constructor(comp,options){if(options=parseOptions(options),comp instanceof _Comparator){if(comp.loose===!!options.loose)return comp;comp=comp.value;}comp=comp.trim().split(/\s+/).join(" "),debug("comparator",comp,options),this.options=options,this.loose=!!options.loose,this.parse(comp),this.semver===ANY?this.value="":this.value=this.operator+this.semver.version,debug("comp",this);}parse(comp){let r=this.options.loose?re[t.COMPARATORLOOSE]:re[t.COMPARATOR],m=comp.match(r);if(!m)throw new TypeError(`Invalid comparator: ${comp}`);this.operator=m[1]!==void 0?m[1]:"",this.operator==="="&&(this.operator=""),m[2]?this.semver=new SemVer(m[2],this.options.loose):this.semver=ANY;}toString(){return this.value}test(version2){if(debug("Comparator.test",version2,this.options.loose),this.semver===ANY||version2===ANY)return !0;if(typeof version2=="string")try{version2=new SemVer(version2,this.options);}catch{return !1}return cmp(version2,this.operator,this.semver,this.options)}intersects(comp,options){if(!(comp instanceof _Comparator))throw new TypeError("a Comparator is required");return this.operator===""?this.value===""?!0:new Range(comp.value,options).test(this.value):comp.operator===""?comp.value===""?!0:new Range(this.value,options).test(comp.semver):(options=parseOptions(options),options.includePrerelease&&(this.value==="<0.0.0-0"||comp.value==="<0.0.0-0")||!options.includePrerelease&&(this.value.startsWith("<0.0.0")||comp.value.startsWith("<0.0.0"))?!1:!!(this.operator.startsWith(">")&&comp.operator.startsWith(">")||this.operator.startsWith("<")&&comp.operator.startsWith("<")||this.semver.version===comp.semver.version&&this.operator.includes("=")&&comp.operator.includes("=")||cmp(this.semver,"<",comp.semver,options)&&this.operator.startsWith(">")&&comp.operator.startsWith("<")||cmp(this.semver,">",comp.semver,options)&&this.operator.startsWith("<")&&comp.operator.startsWith(">")))}};module.exports=Comparator;var parseOptions=require_parse_options(),{safeRe:re,t}=require_re(),cmp=require_cmp(),debug=require_debug(),SemVer=require_semver(),Range=require_range();}});var require_satisfies=__commonJS({"../../node_modules/semver/functions/satisfies.js"(exports,module){var Range=require_range(),satisfies=(version2,range,options)=>{try{range=new Range(range,options);}catch{return !1}return range.test(version2)};module.exports=satisfies;}});var require_to_comparators=__commonJS({"../../node_modules/semver/ranges/to-comparators.js"(exports,module){var Range=require_range(),toComparators=(range,options)=>new Range(range,options).set.map(comp=>comp.map(c=>c.value).join(" ").trim().split(" "));module.exports=toComparators;}});var require_max_satisfying=__commonJS({"../../node_modules/semver/ranges/max-satisfying.js"(exports,module){var SemVer=require_semver(),Range=require_range(),maxSatisfying=(versions,range,options)=>{let max=null,maxSV=null,rangeObj=null;try{rangeObj=new Range(range,options);}catch{return null}return versions.forEach(v=>{rangeObj.test(v)&&(!max||maxSV.compare(v)===-1)&&(max=v,maxSV=new SemVer(max,options));}),max};module.exports=maxSatisfying;}});var require_min_satisfying=__commonJS({"../../node_modules/semver/ranges/min-satisfying.js"(exports,module){var SemVer=require_semver(),Range=require_range(),minSatisfying=(versions,range,options)=>{let min=null,minSV=null,rangeObj=null;try{rangeObj=new Range(range,options);}catch{return null}return versions.forEach(v=>{rangeObj.test(v)&&(!min||minSV.compare(v)===1)&&(min=v,minSV=new SemVer(min,options));}),min};module.exports=minSatisfying;}});var require_min_version=__commonJS({"../../node_modules/semver/ranges/min-version.js"(exports,module){var SemVer=require_semver(),Range=require_range(),gt=require_gt(),minVersion=(range,loose)=>{range=new Range(range,loose);let minver=new SemVer("0.0.0");if(range.test(minver)||(minver=new SemVer("0.0.0-0"),range.test(minver)))return minver;minver=null;for(let i=0;i<range.set.length;++i){let comparators=range.set[i],setMin=null;comparators.forEach(comparator=>{let compver=new SemVer(comparator.semver.version);switch(comparator.operator){case">":compver.prerelease.length===0?compver.patch++:compver.prerelease.push(0),compver.raw=compver.format();case"":case">=":(!setMin||gt(compver,setMin))&&(setMin=compver);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${comparator.operator}`)}}),setMin&&(!minver||gt(minver,setMin))&&(minver=setMin);}return minver&&range.test(minver)?minver:null};module.exports=minVersion;}});var require_valid2=__commonJS({"../../node_modules/semver/ranges/valid.js"(exports,module){var Range=require_range(),validRange=(range,options)=>{try{return new Range(range,options).range||"*"}catch{return null}};module.exports=validRange;}});var require_outside=__commonJS({"../../node_modules/semver/ranges/outside.js"(exports,module){var SemVer=require_semver(),Comparator=require_comparator(),{ANY}=Comparator,Range=require_range(),satisfies=require_satisfies(),gt=require_gt(),lt=require_lt(),lte=require_lte(),gte=require_gte(),outside=(version2,range,hilo,options)=>{version2=new SemVer(version2,options),range=new Range(range,options);let gtfn,ltefn,ltfn,comp,ecomp;switch(hilo){case">":gtfn=gt,ltefn=lte,ltfn=lt,comp=">",ecomp=">=";break;case"<":gtfn=lt,ltefn=gte,ltfn=gt,comp="<",ecomp="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(satisfies(version2,range,options))return !1;for(let i=0;i<range.set.length;++i){let comparators=range.set[i],high=null,low=null;if(comparators.forEach(comparator=>{comparator.semver===ANY&&(comparator=new Comparator(">=0.0.0")),high=high||comparator,low=low||comparator,gtfn(comparator.semver,high.semver,options)?high=comparator:ltfn(comparator.semver,low.semver,options)&&(low=comparator);}),high.operator===comp||high.operator===ecomp||(!low.operator||low.operator===comp)&<efn(version2,low.semver))return !1;if(low.operator===ecomp&<fn(version2,low.semver))return !1}return !0};module.exports=outside;}});var require_gtr=__commonJS({"../../node_modules/semver/ranges/gtr.js"(exports,module){var outside=require_outside(),gtr=(version2,range,options)=>outside(version2,range,">",options);module.exports=gtr;}});var require_ltr=__commonJS({"../../node_modules/semver/ranges/ltr.js"(exports,module){var outside=require_outside(),ltr=(version2,range,options)=>outside(version2,range,"<",options);module.exports=ltr;}});var require_intersects=__commonJS({"../../node_modules/semver/ranges/intersects.js"(exports,module){var Range=require_range(),intersects=(r1,r2,options)=>(r1=new Range(r1,options),r2=new Range(r2,options),r1.intersects(r2,options));module.exports=intersects;}});var require_simplify=__commonJS({"../../node_modules/semver/ranges/simplify.js"(exports,module){var satisfies=require_satisfies(),compare=require_compare();module.exports=(versions,range,options)=>{let set=[],first=null,prev=null,v=versions.sort((a,b)=>compare(a,b,options));for(let version2 of v)satisfies(version2,range,options)?(prev=version2,first||(first=version2)):(prev&&set.push([first,prev]),prev=null,first=null);first&&set.push([first,null]);let ranges=[];for(let[min,max]of set)min===max?ranges.push(min):!max&&min===v[0]?ranges.push("*"):max?min===v[0]?ranges.push(`<=${max}`):ranges.push(`${min} - ${max}`):ranges.push(`>=${min}`);let simplified=ranges.join(" || "),original=typeof range.raw=="string"?range.raw:String(range);return simplified.length<original.length?simplified:range};}});var require_subset=__commonJS({"../../node_modules/semver/ranges/subset.js"(exports,module){var Range=require_range(),Comparator=require_comparator(),{ANY}=Comparator,satisfies=require_satisfies(),compare=require_compare(),subset=(sub,dom,options={})=>{if(sub===dom)return !0;sub=new Range(sub,options),dom=new Range(dom,options);let sawNonNull=!1;OUTER:for(let simpleSub of sub.set){for(let simpleDom of dom.set){let isSub=simpleSubset(simpleSub,simpleDom,options);if(sawNonNull=sawNonNull||isSub!==null,isSub)continue OUTER}if(sawNonNull)return !1}return !0},minimumVersionWithPreRelease=[new Comparator(">=0.0.0-0")],minimumVersion=[new Comparator(">=0.0.0")],simpleSubset=(sub,dom,options)=>{if(sub===dom)return !0;if(sub.length===1&&sub[0].semver===ANY){if(dom.length===1&&dom[0].semver===ANY)return !0;options.includePrerelease?sub=minimumVersionWithPreRelease:sub=minimumVersion;}if(dom.length===1&&dom[0].semver===ANY){if(options.includePrerelease)return !0;dom=minimumVersion;}let eqSet=new Set,gt,lt;for(let c of sub)c.operator===">"||c.operator===">="?gt=higherGT(gt,c,options):c.operator==="<"||c.operator==="<="?lt=lowerLT(lt,c,options):eqSet.add(c.semver);if(eqSet.size>1)return null;let gtltComp;if(gt&<){if(gtltComp=compare(gt.semver,lt.semver,options),gtltComp>0)return null;if(gtltComp===0&&(gt.operator!==">="||lt.operator!=="<="))return null}for(let eq of eqSet){if(gt&&!satisfies(eq,String(gt),options)||lt&&!satisfies(eq,String(lt),options))return null;for(let c of dom)if(!satisfies(eq,String(c),options))return !1;return !0}let higher,lower,hasDomLT,hasDomGT,needDomLTPre=lt&&!options.includePrerelease&<.semver.prerelease.length?lt.semver:!1,needDomGTPre=gt&&!options.includePrerelease&>.semver.prerelease.length?gt.semver:!1;needDomLTPre&&needDomLTPre.prerelease.length===1&<.operator==="<"&&needDomLTPre.prerelease[0]===0&&(needDomLTPre=!1);for(let c of dom){if(hasDomGT=hasDomGT||c.operator===">"||c.operator===">=",hasDomLT=hasDomLT||c.operator==="<"||c.operator==="<=",gt){if(needDomGTPre&&c.semver.prerelease&&c.semver.prerelease.length&&c.semver.major===needDomGTPre.major&&c.semver.minor===needDomGTPre.minor&&c.semver.patch===needDomGTPre.patch&&(needDomGTPre=!1),c.operator===">"||c.operator===">="){if(higher=higherGT(gt,c,options),higher===c&&higher!==gt)return !1}else if(gt.operator===">="&&!satisfies(gt.semver,String(c),options))return !1}if(lt){if(needDomLTPre&&c.semver.prerelease&&c.semver.prerelease.length&&c.semver.major===needDomLTPre.major&&c.semver.minor===needDomLTPre.minor&&c.semver.patch===needDomLTPre.patch&&(needDomLTPre=!1),c.operator==="<"||c.operator==="<="){if(lower=lowerLT(lt,c,options),lower===c&&lower!==lt)return !1}else if(lt.operator==="<="&&!satisfies(lt.semver,String(c),options))return !1}if(!c.operator&&(lt||gt)&>ltComp!==0)return !1}return !(gt&&hasDomLT&&!lt&>ltComp!==0||lt&&hasDomGT&&!gt&>ltComp!==0||needDomGTPre||needDomLTPre)},higherGT=(a,b,options)=>{if(!a)return b;let comp=compare(a.semver,b.semver,options);return comp>0?a:comp<0||b.operator===">"&&a.operator===">="?b:a},lowerLT=(a,b,options)=>{if(!a)return b;let comp=compare(a.semver,b.semver,options);return comp<0?a:comp>0||b.operator==="<"&&a.operator==="<="?b:a};module.exports=subset;}});var require_semver2=__commonJS({"../../node_modules/semver/index.js"(exports,module){var internalRe=require_re(),constants=require_constants(),SemVer=require_semver(),identifiers=require_identifiers(),parse=require_parse(),valid=require_valid(),clean=require_clean(),inc=require_inc(),diff=require_diff(),major=require_major(),minor=require_minor(),patch=require_patch(),prerelease=require_prerelease(),compare=require_compare(),rcompare=require_rcompare(),compareLoose=require_compare_loose(),compareBuild=require_compare_build(),sort=require_sort(),rsort=require_rsort(),gt=require_gt(),lt=require_lt(),eq=require_eq(),neq=require_neq(),gte=require_gte(),lte=require_lte(),cmp=require_cmp(),coerce=require_coerce(),Comparator=require_comparator(),Range=require_range(),satisfies=require_satisfies(),toComparators=require_to_comparators(),maxSatisfying=require_max_satisfying(),minSatisfying=require_min_satisfying(),minVersion=require_min_version(),validRange=require_valid2(),outside=require_outside(),gtr=require_gtr(),ltr=require_ltr(),intersects=require_intersects(),simplifyRange=require_simplify(),subset=require_subset();module.exports={parse,valid,clean,inc,diff,major,minor,patch,prerelease,compare,rcompare,compareLoose,compareBuild,sort,rsort,gt,lt,eq,neq,gte,lte,cmp,coerce,Comparator,Range,satisfies,toComparators,maxSatisfying,minSatisfying,minVersion,validRange,outside,gtr,ltr,intersects,simplifyRange,subset,SemVer,re:internalRe.re,src:internalRe.src,tokens:internalRe.t,SEMVER_SPEC_VERSION:constants.SEMVER_SPEC_VERSION,RELEASE_TYPES:constants.RELEASE_TYPES,compareIdentifiers:identifiers.compareIdentifiers,rcompareIdentifiers:identifiers.rcompareIdentifiers};}});var entry_preview_exports={};__export(entry_preview_exports,{beforeAll:()=>beforeAll,decorators:()=>decorators,mount:()=>mount,parameters:()=>parameters,render:()=>render,renderToCanvas:()=>renderToCanvas});var import_semver=__toESM(require_semver2());var clonedReact={...React3};function setReactActEnvironment(isReactActEnvironment){globalThis.IS_REACT_ACT_ENVIRONMENT=isReactActEnvironment;}function getReactActEnvironment(){return globalThis.IS_REACT_ACT_ENVIRONMENT}function withGlobalActEnvironment(actImplementation){return callback=>{let previousActEnvironment=getReactActEnvironment();setReactActEnvironment(!0);try{let callbackNeedsToBeAwaited=!1,actResult=actImplementation(()=>{let result=callback();return result!==null&&typeof result=="object"&&typeof result.then=="function"&&(callbackNeedsToBeAwaited=!0),result});if(callbackNeedsToBeAwaited){let thenable=actResult;return {then:(resolve,reject)=>{thenable.then(returnValue=>{setReactActEnvironment(previousActEnvironment),resolve(returnValue);},error=>{setReactActEnvironment(previousActEnvironment),reject(error);});}}}else return setReactActEnvironment(previousActEnvironment),actResult}catch(error){throw setReactActEnvironment(previousActEnvironment),error}}}var getAct=async({ disableAct = false } = {})=>{if(disableAct){return cb => cb();}let reactAct;if(typeof clonedReact.act=="function")reactAct=clonedReact.act;else {let deprecatedTestUtils=await import('react-dom/test-utils');reactAct=deprecatedTestUtils?.default?.act??deprecatedTestUtils.act;}return process.env.NODE_ENV==="production"?cb=>cb():withGlobalActEnvironment(reactAct)};var render=(args,context)=>{let{id,component:Component}=context;if(!Component)throw new Error(`Unable to render story ${id} as the component annotation is missing from the default export`);return React3__default.createElement(Component,{...args})};var{FRAMEWORK_OPTIONS}=global,ErrorBoundary=class extends Component{constructor(){super(...arguments);this.state={hasError:!1};}static getDerivedStateFromError(){return {hasError:!0}}componentDidMount(){let{hasError}=this.state,{showMain}=this.props;hasError||showMain();}componentDidCatch(err){let{showException}=this.props;showException(err);}render(){let{hasError}=this.state,{children}=this.props;return hasError?null:children}},Wrapper=FRAMEWORK_OPTIONS?.strictMode?StrictMode:Fragment,actQueue=[],isActing=!1,processActQueue=async()=>{if(isActing||actQueue.length===0)return;isActing=!0;let actTask=actQueue.shift();actTask&&await actTask(),isActing=!1,processActQueue();};async function renderToCanvas({storyContext,unboundStoryFn,showMain,showException,forceRemount},canvasElement){let{renderElement,unmountElement}=await import('@storybook/react-dom-shim'),Story=unboundStoryFn,content=storyContext.parameters.__isPortableStory?React3__default.createElement(Story,{...storyContext}):React3__default.createElement(ErrorBoundary,{showMain,showException},React3__default.createElement(Story,{...storyContext})),element=Wrapper?React3__default.createElement(Wrapper,null,content):content;forceRemount&&unmountElement(canvasElement);let act=await getAct({ disableAct: storyContext.viewMode === 'docs' });return await new Promise(async(resolve,reject)=>{actQueue.push(async()=>{try{await act(async()=>{await renderElement(element,canvasElement,storyContext?.parameters?.react?.rootOptions);}),resolve();}catch(e){reject(e);}}),processActQueue();}),async()=>{await act(()=>{unmountElement(canvasElement);});}}var mount=context=>async ui=>(ui!=null&&(context.originalStoryFn=()=>ui),await context.renderToCanvas(),context.canvas);var parameters={renderer:"react"},decorators=[(story,context)=>{if(!context.parameters?.react?.rsc)return story();let major=import_semver.default.major(React3.version),minor=import_semver.default.minor(React3.version);if(major<18||major===18&&minor<3)throw new Error("React Server Components require React >= 18.3");return React3.createElement(React3.Suspense,null,story())}],beforeAll=async()=>{try{let{configure}=await import('@storybook/test'),act=await getAct();configure({unstable_advanceTimersWrapper:cb=>act(cb),asyncWrapper:async cb=>{let previousActEnvironment=getReactActEnvironment();setReactActEnvironment(!1);try{let result=await cb();return await new Promise(resolve=>{setTimeout(()=>{resolve();},0),jestFakeTimersAreEnabled()&&jest.advanceTimersByTime(0);}),result}finally{setReactActEnvironment(previousActEnvironment);}},eventWrapper:cb=>{let result;return act(()=>(result=cb(),result)),result}});}catch{}};function jestFakeTimersAreEnabled(){return typeof jest<"u"&&jest!==null?setTimeout._isMockFunction===!0||Object.prototype.hasOwnProperty.call(setTimeout,"clock"):!1}
    + 
    + export { beforeAll, decorators, entry_preview_exports, mount, parameters, render, renderToCanvas };
    +diff --git a/dist/entry-preview.js b/dist/entry-preview.js
    +index c4c56dd5bbecc4b5b5a91c2cfb442a0cd31f03c8..b192a11fe3c46056beaa29cab6b79eb3ba37f8b9 100644
    +--- a/dist/entry-preview.js
    ++++ b/dist/entry-preview.js
    +@@ -1 +1 @@
    +-"use strict";var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty;var __commonJS=(cb,mod)=>function(){return mod||(0,cb[__getOwnPropNames(cb)[0]])((mod={exports:{}}).exports,mod),mod.exports};var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&typeof from=="object"||typeof from=="function")for(let key of __getOwnPropNames(from))!__hasOwnProp.call(to,key)&&key!==except&&__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to};var __toESM=(mod,isNodeMode,target)=>(target=mod!=null?__create(__getProtoOf(mod)):{},__copyProps(isNodeMode||!mod||!mod.__esModule?__defProp(target,"default",{value:mod,enumerable:!0}):target,mod)),__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod);var require_constants=__commonJS({"../../node_modules/semver/internal/constants.js"(exports2,module2){"use strict";var SEMVER_SPEC_VERSION="2.0.0",MAX_SAFE_INTEGER=Number.MAX_SAFE_INTEGER||9007199254740991,MAX_SAFE_COMPONENT_LENGTH=16,MAX_SAFE_BUILD_LENGTH=250,RELEASE_TYPES=["major","premajor","minor","preminor","patch","prepatch","prerelease"];module2.exports={MAX_LENGTH:256,MAX_SAFE_COMPONENT_LENGTH,MAX_SAFE_BUILD_LENGTH,MAX_SAFE_INTEGER,RELEASE_TYPES,SEMVER_SPEC_VERSION,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2}}});var require_debug=__commonJS({"../../node_modules/semver/internal/debug.js"(exports2,module2){"use strict";var debug=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...args)=>console.error("SEMVER",...args):()=>{};module2.exports=debug}});var require_re=__commonJS({"../../node_modules/semver/internal/re.js"(exports2,module2){"use strict";var{MAX_SAFE_COMPONENT_LENGTH,MAX_SAFE_BUILD_LENGTH,MAX_LENGTH}=require_constants(),debug=require_debug();exports2=module2.exports={};var re=exports2.re=[],safeRe=exports2.safeRe=[],src=exports2.src=[],safeSrc=exports2.safeSrc=[],t=exports2.t={},R=0,LETTERDASHNUMBER="[a-zA-Z0-9-]",safeRegexReplacements=[["\\s",1],["\\d",MAX_LENGTH],[LETTERDASHNUMBER,MAX_SAFE_BUILD_LENGTH]],makeSafeRegex=value=>{for(let[token,max]of safeRegexReplacements)value=value.split(`${token}*`).join(`${token}{0,${max}}`).split(`${token}+`).join(`${token}{1,${max}}`);return value},createToken=(name,value,isGlobal)=>{let safe=makeSafeRegex(value),index=R++;debug(name,index,value),t[name]=index,src[index]=value,safeSrc[index]=safe,re[index]=new RegExp(value,isGlobal?"g":void 0),safeRe[index]=new RegExp(safe,isGlobal?"g":void 0)};createToken("NUMERICIDENTIFIER","0|[1-9]\\d*");createToken("NUMERICIDENTIFIERLOOSE","\\d+");createToken("NONNUMERICIDENTIFIER",`\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`);createToken("MAINVERSION",`(${src[t.NUMERICIDENTIFIER]})\\.(${src[t.NUMERICIDENTIFIER]})\\.(${src[t.NUMERICIDENTIFIER]})`);createToken("MAINVERSIONLOOSE",`(${src[t.NUMERICIDENTIFIERLOOSE]})\\.(${src[t.NUMERICIDENTIFIERLOOSE]})\\.(${src[t.NUMERICIDENTIFIERLOOSE]})`);createToken("PRERELEASEIDENTIFIER",`(?:${src[t.NUMERICIDENTIFIER]}|${src[t.NONNUMERICIDENTIFIER]})`);createToken("PRERELEASEIDENTIFIERLOOSE",`(?:${src[t.NUMERICIDENTIFIERLOOSE]}|${src[t.NONNUMERICIDENTIFIER]})`);createToken("PRERELEASE",`(?:-(${src[t.PRERELEASEIDENTIFIER]}(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`);createToken("PRERELEASELOOSE",`(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`);createToken("BUILDIDENTIFIER",`${LETTERDASHNUMBER}+`);createToken("BUILD",`(?:\\+(${src[t.BUILDIDENTIFIER]}(?:\\.${src[t.BUILDIDENTIFIER]})*))`);createToken("FULLPLAIN",`v?${src[t.MAINVERSION]}${src[t.PRERELEASE]}?${src[t.BUILD]}?`);createToken("FULL",`^${src[t.FULLPLAIN]}$`);createToken("LOOSEPLAIN",`[v=\\s]*${src[t.MAINVERSIONLOOSE]}${src[t.PRERELEASELOOSE]}?${src[t.BUILD]}?`);createToken("LOOSE",`^${src[t.LOOSEPLAIN]}$`);createToken("GTLT","((?:<|>)?=?)");createToken("XRANGEIDENTIFIERLOOSE",`${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);createToken("XRANGEIDENTIFIER",`${src[t.NUMERICIDENTIFIER]}|x|X|\\*`);createToken("XRANGEPLAIN",`[v=\\s]*(${src[t.XRANGEIDENTIFIER]})(?:\\.(${src[t.XRANGEIDENTIFIER]})(?:\\.(${src[t.XRANGEIDENTIFIER]})(?:${src[t.PRERELEASE]})?${src[t.BUILD]}?)?)?`);createToken("XRANGEPLAINLOOSE",`[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})(?:${src[t.PRERELEASELOOSE]})?${src[t.BUILD]}?)?)?`);createToken("XRANGE",`^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`);createToken("XRANGELOOSE",`^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`);createToken("COERCEPLAIN",`(^|[^\\d])(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}})(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`);createToken("COERCE",`${src[t.COERCEPLAIN]}(?:$|[^\\d])`);createToken("COERCEFULL",src[t.COERCEPLAIN]+`(?:${src[t.PRERELEASE]})?(?:${src[t.BUILD]})?(?:$|[^\\d])`);createToken("COERCERTL",src[t.COERCE],!0);createToken("COERCERTLFULL",src[t.COERCEFULL],!0);createToken("LONETILDE","(?:~>?)");createToken("TILDETRIM",`(\\s*)${src[t.LONETILDE]}\\s+`,!0);exports2.tildeTrimReplace="$1~";createToken("TILDE",`^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`);createToken("TILDELOOSE",`^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`);createToken("LONECARET","(?:\\^)");createToken("CARETTRIM",`(\\s*)${src[t.LONECARET]}\\s+`,!0);exports2.caretTrimReplace="$1^";createToken("CARET",`^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`);createToken("CARETLOOSE",`^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`);createToken("COMPARATORLOOSE",`^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`);createToken("COMPARATOR",`^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`);createToken("COMPARATORTRIM",`(\\s*)${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`,!0);exports2.comparatorTrimReplace="$1$2$3";createToken("HYPHENRANGE",`^\\s*(${src[t.XRANGEPLAIN]})\\s+-\\s+(${src[t.XRANGEPLAIN]})\\s*$`);createToken("HYPHENRANGELOOSE",`^\\s*(${src[t.XRANGEPLAINLOOSE]})\\s+-\\s+(${src[t.XRANGEPLAINLOOSE]})\\s*$`);createToken("STAR","(<|>)?=?\\s*\\*");createToken("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$");createToken("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$")}});var require_parse_options=__commonJS({"../../node_modules/semver/internal/parse-options.js"(exports2,module2){"use strict";var looseOption=Object.freeze({loose:!0}),emptyOpts=Object.freeze({}),parseOptions=options=>options?typeof options!="object"?looseOption:options:emptyOpts;module2.exports=parseOptions}});var require_identifiers=__commonJS({"../../node_modules/semver/internal/identifiers.js"(exports2,module2){"use strict";var numeric=/^[0-9]+$/,compareIdentifiers=(a,b)=>{let anum=numeric.test(a),bnum=numeric.test(b);return anum&&bnum&&(a=+a,b=+b),a===b?0:anum&&!bnum?-1:bnum&&!anum?1:a<b?-1:1},rcompareIdentifiers=(a,b)=>compareIdentifiers(b,a);module2.exports={compareIdentifiers,rcompareIdentifiers}}});var require_semver=__commonJS({"../../node_modules/semver/classes/semver.js"(exports2,module2){"use strict";var debug=require_debug(),{MAX_LENGTH,MAX_SAFE_INTEGER}=require_constants(),{safeRe:re,safeSrc:src,t}=require_re(),parseOptions=require_parse_options(),{compareIdentifiers}=require_identifiers(),SemVer=class _SemVer{constructor(version2,options){if(options=parseOptions(options),version2 instanceof _SemVer){if(version2.loose===!!options.loose&&version2.includePrerelease===!!options.includePrerelease)return version2;version2=version2.version}else if(typeof version2!="string")throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version2}".`);if(version2.length>MAX_LENGTH)throw new TypeError(`version is longer than ${MAX_LENGTH} characters`);debug("SemVer",version2,options),this.options=options,this.loose=!!options.loose,this.includePrerelease=!!options.includePrerelease;let m=version2.trim().match(options.loose?re[t.LOOSE]:re[t.FULL]);if(!m)throw new TypeError(`Invalid Version: ${version2}`);if(this.raw=version2,this.major=+m[1],this.minor=+m[2],this.patch=+m[3],this.major>MAX_SAFE_INTEGER||this.major<0)throw new TypeError("Invalid major version");if(this.minor>MAX_SAFE_INTEGER||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>MAX_SAFE_INTEGER||this.patch<0)throw new TypeError("Invalid patch version");m[4]?this.prerelease=m[4].split(".").map(id=>{if(/^[0-9]+$/.test(id)){let num=+id;if(num>=0&&num<MAX_SAFE_INTEGER)return num}return id}):this.prerelease=[],this.build=m[5]?m[5].split("."):[],this.format()}format(){return this.version=`${this.major}.${this.minor}.${this.patch}`,this.prerelease.length&&(this.version+=`-${this.prerelease.join(".")}`),this.version}toString(){return this.version}compare(other){if(debug("SemVer.compare",this.version,this.options,other),!(other instanceof _SemVer)){if(typeof other=="string"&&other===this.version)return 0;other=new _SemVer(other,this.options)}return other.version===this.version?0:this.compareMain(other)||this.comparePre(other)}compareMain(other){return other instanceof _SemVer||(other=new _SemVer(other,this.options)),compareIdentifiers(this.major,other.major)||compareIdentifiers(this.minor,other.minor)||compareIdentifiers(this.patch,other.patch)}comparePre(other){if(other instanceof _SemVer||(other=new _SemVer(other,this.options)),this.prerelease.length&&!other.prerelease.length)return-1;if(!this.prerelease.length&&other.prerelease.length)return 1;if(!this.prerelease.length&&!other.prerelease.length)return 0;let i=0;do{let a=this.prerelease[i],b=other.prerelease[i];if(debug("prerelease compare",i,a,b),a===void 0&&b===void 0)return 0;if(b===void 0)return 1;if(a===void 0)return-1;if(a===b)continue;return compareIdentifiers(a,b)}while(++i)}compareBuild(other){other instanceof _SemVer||(other=new _SemVer(other,this.options));let i=0;do{let a=this.build[i],b=other.build[i];if(debug("build compare",i,a,b),a===void 0&&b===void 0)return 0;if(b===void 0)return 1;if(a===void 0)return-1;if(a===b)continue;return compareIdentifiers(a,b)}while(++i)}inc(release,identifier,identifierBase){if(release.startsWith("pre")){if(!identifier&&identifierBase===!1)throw new Error("invalid increment argument: identifier is empty");if(identifier){let r=new RegExp(`^${this.options.loose?src[t.PRERELEASELOOSE]:src[t.PRERELEASE]}$`),match=`-${identifier}`.match(r);if(!match||match[1]!==identifier)throw new Error(`invalid identifier: ${identifier}`)}}switch(release){case"premajor":this.prerelease.length=0,this.patch=0,this.minor=0,this.major++,this.inc("pre",identifier,identifierBase);break;case"preminor":this.prerelease.length=0,this.patch=0,this.minor++,this.inc("pre",identifier,identifierBase);break;case"prepatch":this.prerelease.length=0,this.inc("patch",identifier,identifierBase),this.inc("pre",identifier,identifierBase);break;case"prerelease":this.prerelease.length===0&&this.inc("patch",identifier,identifierBase),this.inc("pre",identifier,identifierBase);break;case"release":if(this.prerelease.length===0)throw new Error(`version ${this.raw} is not a prerelease`);this.prerelease.length=0;break;case"major":(this.minor!==0||this.patch!==0||this.prerelease.length===0)&&this.major++,this.minor=0,this.patch=0,this.prerelease=[];break;case"minor":(this.patch!==0||this.prerelease.length===0)&&this.minor++,this.patch=0,this.prerelease=[];break;case"patch":this.prerelease.length===0&&this.patch++,this.prerelease=[];break;case"pre":{let base=Number(identifierBase)?1:0;if(this.prerelease.length===0)this.prerelease=[base];else{let i=this.prerelease.length;for(;--i>=0;)typeof this.prerelease[i]=="number"&&(this.prerelease[i]++,i=-2);if(i===-1){if(identifier===this.prerelease.join(".")&&identifierBase===!1)throw new Error("invalid increment argument: identifier already exists");this.prerelease.push(base)}}if(identifier){let prerelease=[identifier,base];identifierBase===!1&&(prerelease=[identifier]),compareIdentifiers(this.prerelease[0],identifier)===0?isNaN(this.prerelease[1])&&(this.prerelease=prerelease):this.prerelease=prerelease}break}default:throw new Error(`invalid increment argument: ${release}`)}return this.raw=this.format(),this.build.length&&(this.raw+=`+${this.build.join(".")}`),this}};module2.exports=SemVer}});var require_parse=__commonJS({"../../node_modules/semver/functions/parse.js"(exports2,module2){"use strict";var SemVer=require_semver(),parse=(version2,options,throwErrors=!1)=>{if(version2 instanceof SemVer)return version2;try{return new SemVer(version2,options)}catch(er){if(!throwErrors)return null;throw er}};module2.exports=parse}});var require_valid=__commonJS({"../../node_modules/semver/functions/valid.js"(exports2,module2){"use strict";var parse=require_parse(),valid=(version2,options)=>{let v=parse(version2,options);return v?v.version:null};module2.exports=valid}});var require_clean=__commonJS({"../../node_modules/semver/functions/clean.js"(exports2,module2){"use strict";var parse=require_parse(),clean=(version2,options)=>{let s=parse(version2.trim().replace(/^[=v]+/,""),options);return s?s.version:null};module2.exports=clean}});var require_inc=__commonJS({"../../node_modules/semver/functions/inc.js"(exports2,module2){"use strict";var SemVer=require_semver(),inc=(version2,release,options,identifier,identifierBase)=>{typeof options=="string"&&(identifierBase=identifier,identifier=options,options=void 0);try{return new SemVer(version2 instanceof SemVer?version2.version:version2,options).inc(release,identifier,identifierBase).version}catch{return null}};module2.exports=inc}});var require_diff=__commonJS({"../../node_modules/semver/functions/diff.js"(exports2,module2){"use strict";var parse=require_parse(),diff=(version1,version2)=>{let v1=parse(version1,null,!0),v2=parse(version2,null,!0),comparison=v1.compare(v2);if(comparison===0)return null;let v1Higher=comparison>0,highVersion=v1Higher?v1:v2,lowVersion=v1Higher?v2:v1,highHasPre=!!highVersion.prerelease.length;if(!!lowVersion.prerelease.length&&!highHasPre){if(!lowVersion.patch&&!lowVersion.minor)return"major";if(lowVersion.compareMain(highVersion)===0)return lowVersion.minor&&!lowVersion.patch?"minor":"patch"}let prefix=highHasPre?"pre":"";return v1.major!==v2.major?prefix+"major":v1.minor!==v2.minor?prefix+"minor":v1.patch!==v2.patch?prefix+"patch":"prerelease"};module2.exports=diff}});var require_major=__commonJS({"../../node_modules/semver/functions/major.js"(exports2,module2){"use strict";var SemVer=require_semver(),major=(a,loose)=>new SemVer(a,loose).major;module2.exports=major}});var require_minor=__commonJS({"../../node_modules/semver/functions/minor.js"(exports2,module2){"use strict";var SemVer=require_semver(),minor=(a,loose)=>new SemVer(a,loose).minor;module2.exports=minor}});var require_patch=__commonJS({"../../node_modules/semver/functions/patch.js"(exports2,module2){"use strict";var SemVer=require_semver(),patch=(a,loose)=>new SemVer(a,loose).patch;module2.exports=patch}});var require_prerelease=__commonJS({"../../node_modules/semver/functions/prerelease.js"(exports2,module2){"use strict";var parse=require_parse(),prerelease=(version2,options)=>{let parsed=parse(version2,options);return parsed&&parsed.prerelease.length?parsed.prerelease:null};module2.exports=prerelease}});var require_compare=__commonJS({"../../node_modules/semver/functions/compare.js"(exports2,module2){"use strict";var SemVer=require_semver(),compare=(a,b,loose)=>new SemVer(a,loose).compare(new SemVer(b,loose));module2.exports=compare}});var require_rcompare=__commonJS({"../../node_modules/semver/functions/rcompare.js"(exports2,module2){"use strict";var compare=require_compare(),rcompare=(a,b,loose)=>compare(b,a,loose);module2.exports=rcompare}});var require_compare_loose=__commonJS({"../../node_modules/semver/functions/compare-loose.js"(exports2,module2){"use strict";var compare=require_compare(),compareLoose=(a,b)=>compare(a,b,!0);module2.exports=compareLoose}});var require_compare_build=__commonJS({"../../node_modules/semver/functions/compare-build.js"(exports2,module2){"use strict";var SemVer=require_semver(),compareBuild=(a,b,loose)=>{let versionA=new SemVer(a,loose),versionB=new SemVer(b,loose);return versionA.compare(versionB)||versionA.compareBuild(versionB)};module2.exports=compareBuild}});var require_sort=__commonJS({"../../node_modules/semver/functions/sort.js"(exports2,module2){"use strict";var compareBuild=require_compare_build(),sort=(list,loose)=>list.sort((a,b)=>compareBuild(a,b,loose));module2.exports=sort}});var require_rsort=__commonJS({"../../node_modules/semver/functions/rsort.js"(exports2,module2){"use strict";var compareBuild=require_compare_build(),rsort=(list,loose)=>list.sort((a,b)=>compareBuild(b,a,loose));module2.exports=rsort}});var require_gt=__commonJS({"../../node_modules/semver/functions/gt.js"(exports2,module2){"use strict";var compare=require_compare(),gt=(a,b,loose)=>compare(a,b,loose)>0;module2.exports=gt}});var require_lt=__commonJS({"../../node_modules/semver/functions/lt.js"(exports2,module2){"use strict";var compare=require_compare(),lt=(a,b,loose)=>compare(a,b,loose)<0;module2.exports=lt}});var require_eq=__commonJS({"../../node_modules/semver/functions/eq.js"(exports2,module2){"use strict";var compare=require_compare(),eq=(a,b,loose)=>compare(a,b,loose)===0;module2.exports=eq}});var require_neq=__commonJS({"../../node_modules/semver/functions/neq.js"(exports2,module2){"use strict";var compare=require_compare(),neq=(a,b,loose)=>compare(a,b,loose)!==0;module2.exports=neq}});var require_gte=__commonJS({"../../node_modules/semver/functions/gte.js"(exports2,module2){"use strict";var compare=require_compare(),gte=(a,b,loose)=>compare(a,b,loose)>=0;module2.exports=gte}});var require_lte=__commonJS({"../../node_modules/semver/functions/lte.js"(exports2,module2){"use strict";var compare=require_compare(),lte=(a,b,loose)=>compare(a,b,loose)<=0;module2.exports=lte}});var require_cmp=__commonJS({"../../node_modules/semver/functions/cmp.js"(exports2,module2){"use strict";var eq=require_eq(),neq=require_neq(),gt=require_gt(),gte=require_gte(),lt=require_lt(),lte=require_lte(),cmp=(a,op,b,loose)=>{switch(op){case"===":return typeof a=="object"&&(a=a.version),typeof b=="object"&&(b=b.version),a===b;case"!==":return typeof a=="object"&&(a=a.version),typeof b=="object"&&(b=b.version),a!==b;case"":case"=":case"==":return eq(a,b,loose);case"!=":return neq(a,b,loose);case">":return gt(a,b,loose);case">=":return gte(a,b,loose);case"<":return lt(a,b,loose);case"<=":return lte(a,b,loose);default:throw new TypeError(`Invalid operator: ${op}`)}};module2.exports=cmp}});var require_coerce=__commonJS({"../../node_modules/semver/functions/coerce.js"(exports2,module2){"use strict";var SemVer=require_semver(),parse=require_parse(),{safeRe:re,t}=require_re(),coerce=(version2,options)=>{if(version2 instanceof SemVer)return version2;if(typeof version2=="number"&&(version2=String(version2)),typeof version2!="string")return null;options=options||{};let match=null;if(!options.rtl)match=version2.match(options.includePrerelease?re[t.COERCEFULL]:re[t.COERCE]);else{let coerceRtlRegex=options.includePrerelease?re[t.COERCERTLFULL]:re[t.COERCERTL],next;for(;(next=coerceRtlRegex.exec(version2))&&(!match||match.index+match[0].length!==version2.length);)(!match||next.index+next[0].length!==match.index+match[0].length)&&(match=next),coerceRtlRegex.lastIndex=next.index+next[1].length+next[2].length;coerceRtlRegex.lastIndex=-1}if(match===null)return null;let major=match[2],minor=match[3]||"0",patch=match[4]||"0",prerelease=options.includePrerelease&&match[5]?`-${match[5]}`:"",build=options.includePrerelease&&match[6]?`+${match[6]}`:"";return parse(`${major}.${minor}.${patch}${prerelease}${build}`,options)};module2.exports=coerce}});var require_lrucache=__commonJS({"../../node_modules/semver/internal/lrucache.js"(exports2,module2){"use strict";var LRUCache=class{constructor(){this.max=1e3,this.map=new Map}get(key){let value=this.map.get(key);if(value!==void 0)return this.map.delete(key),this.map.set(key,value),value}delete(key){return this.map.delete(key)}set(key,value){if(!this.delete(key)&&value!==void 0){if(this.map.size>=this.max){let firstKey=this.map.keys().next().value;this.delete(firstKey)}this.map.set(key,value)}return this}};module2.exports=LRUCache}});var require_range=__commonJS({"../../node_modules/semver/classes/range.js"(exports2,module2){"use strict";var SPACE_CHARACTERS=/\s+/g,Range=class _Range{constructor(range,options){if(options=parseOptions(options),range instanceof _Range)return range.loose===!!options.loose&&range.includePrerelease===!!options.includePrerelease?range:new _Range(range.raw,options);if(range instanceof Comparator)return this.raw=range.value,this.set=[[range]],this.formatted=void 0,this;if(this.options=options,this.loose=!!options.loose,this.includePrerelease=!!options.includePrerelease,this.raw=range.trim().replace(SPACE_CHARACTERS," "),this.set=this.raw.split("||").map(r=>this.parseRange(r.trim())).filter(c=>c.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${this.raw}`);if(this.set.length>1){let first=this.set[0];if(this.set=this.set.filter(c=>!isNullSet(c[0])),this.set.length===0)this.set=[first];else if(this.set.length>1){for(let c of this.set)if(c.length===1&&isAny(c[0])){this.set=[c];break}}}this.formatted=void 0}get range(){if(this.formatted===void 0){this.formatted="";for(let i=0;i<this.set.length;i++){i>0&&(this.formatted+="||");let comps=this.set[i];for(let k=0;k<comps.length;k++)k>0&&(this.formatted+=" "),this.formatted+=comps[k].toString().trim()}}return this.formatted}format(){return this.range}toString(){return this.range}parseRange(range){let memoKey=((this.options.includePrerelease&&FLAG_INCLUDE_PRERELEASE)|(this.options.loose&&FLAG_LOOSE))+":"+range,cached=cache.get(memoKey);if(cached)return cached;let loose=this.options.loose,hr=loose?re[t.HYPHENRANGELOOSE]:re[t.HYPHENRANGE];range=range.replace(hr,hyphenReplace(this.options.includePrerelease)),debug("hyphen replace",range),range=range.replace(re[t.COMPARATORTRIM],comparatorTrimReplace),debug("comparator trim",range),range=range.replace(re[t.TILDETRIM],tildeTrimReplace),debug("tilde trim",range),range=range.replace(re[t.CARETTRIM],caretTrimReplace),debug("caret trim",range);let rangeList=range.split(" ").map(comp=>parseComparator(comp,this.options)).join(" ").split(/\s+/).map(comp=>replaceGTE0(comp,this.options));loose&&(rangeList=rangeList.filter(comp=>(debug("loose invalid filter",comp,this.options),!!comp.match(re[t.COMPARATORLOOSE])))),debug("range list",rangeList);let rangeMap=new Map,comparators=rangeList.map(comp=>new Comparator(comp,this.options));for(let comp of comparators){if(isNullSet(comp))return[comp];rangeMap.set(comp.value,comp)}rangeMap.size>1&&rangeMap.has("")&&rangeMap.delete("");let result=[...rangeMap.values()];return cache.set(memoKey,result),result}intersects(range,options){if(!(range instanceof _Range))throw new TypeError("a Range is required");return this.set.some(thisComparators=>isSatisfiable(thisComparators,options)&&range.set.some(rangeComparators=>isSatisfiable(rangeComparators,options)&&thisComparators.every(thisComparator=>rangeComparators.every(rangeComparator=>thisComparator.intersects(rangeComparator,options)))))}test(version2){if(!version2)return!1;if(typeof version2=="string")try{version2=new SemVer(version2,this.options)}catch{return!1}for(let i=0;i<this.set.length;i++)if(testSet(this.set[i],version2,this.options))return!0;return!1}};module2.exports=Range;var LRU=require_lrucache(),cache=new LRU,parseOptions=require_parse_options(),Comparator=require_comparator(),debug=require_debug(),SemVer=require_semver(),{safeRe:re,t,comparatorTrimReplace,tildeTrimReplace,caretTrimReplace}=require_re(),{FLAG_INCLUDE_PRERELEASE,FLAG_LOOSE}=require_constants(),isNullSet=c=>c.value==="<0.0.0-0",isAny=c=>c.value==="",isSatisfiable=(comparators,options)=>{let result=!0,remainingComparators=comparators.slice(),testComparator=remainingComparators.pop();for(;result&&remainingComparators.length;)result=remainingComparators.every(otherComparator=>testComparator.intersects(otherComparator,options)),testComparator=remainingComparators.pop();return result},parseComparator=(comp,options)=>(debug("comp",comp,options),comp=replaceCarets(comp,options),debug("caret",comp),comp=replaceTildes(comp,options),debug("tildes",comp),comp=replaceXRanges(comp,options),debug("xrange",comp),comp=replaceStars(comp,options),debug("stars",comp),comp),isX=id=>!id||id.toLowerCase()==="x"||id==="*",replaceTildes=(comp,options)=>comp.trim().split(/\s+/).map(c=>replaceTilde(c,options)).join(" "),replaceTilde=(comp,options)=>{let r=options.loose?re[t.TILDELOOSE]:re[t.TILDE];return comp.replace(r,(_,M,m,p,pr)=>{debug("tilde",comp,_,M,m,p,pr);let ret;return isX(M)?ret="":isX(m)?ret=`>=${M}.0.0 <${+M+1}.0.0-0`:isX(p)?ret=`>=${M}.${m}.0 <${M}.${+m+1}.0-0`:pr?(debug("replaceTilde pr",pr),ret=`>=${M}.${m}.${p}-${pr} <${M}.${+m+1}.0-0`):ret=`>=${M}.${m}.${p} <${M}.${+m+1}.0-0`,debug("tilde return",ret),ret})},replaceCarets=(comp,options)=>comp.trim().split(/\s+/).map(c=>replaceCaret(c,options)).join(" "),replaceCaret=(comp,options)=>{debug("caret",comp,options);let r=options.loose?re[t.CARETLOOSE]:re[t.CARET],z=options.includePrerelease?"-0":"";return comp.replace(r,(_,M,m,p,pr)=>{debug("caret",comp,_,M,m,p,pr);let ret;return isX(M)?ret="":isX(m)?ret=`>=${M}.0.0${z} <${+M+1}.0.0-0`:isX(p)?M==="0"?ret=`>=${M}.${m}.0${z} <${M}.${+m+1}.0-0`:ret=`>=${M}.${m}.0${z} <${+M+1}.0.0-0`:pr?(debug("replaceCaret pr",pr),M==="0"?m==="0"?ret=`>=${M}.${m}.${p}-${pr} <${M}.${m}.${+p+1}-0`:ret=`>=${M}.${m}.${p}-${pr} <${M}.${+m+1}.0-0`:ret=`>=${M}.${m}.${p}-${pr} <${+M+1}.0.0-0`):(debug("no pr"),M==="0"?m==="0"?ret=`>=${M}.${m}.${p}${z} <${M}.${m}.${+p+1}-0`:ret=`>=${M}.${m}.${p}${z} <${M}.${+m+1}.0-0`:ret=`>=${M}.${m}.${p} <${+M+1}.0.0-0`),debug("caret return",ret),ret})},replaceXRanges=(comp,options)=>(debug("replaceXRanges",comp,options),comp.split(/\s+/).map(c=>replaceXRange(c,options)).join(" ")),replaceXRange=(comp,options)=>{comp=comp.trim();let r=options.loose?re[t.XRANGELOOSE]:re[t.XRANGE];return comp.replace(r,(ret,gtlt,M,m,p,pr)=>{debug("xRange",comp,ret,gtlt,M,m,p,pr);let xM=isX(M),xm=xM||isX(m),xp=xm||isX(p),anyX=xp;return gtlt==="="&&anyX&&(gtlt=""),pr=options.includePrerelease?"-0":"",xM?gtlt===">"||gtlt==="<"?ret="<0.0.0-0":ret="*":gtlt&&anyX?(xm&&(m=0),p=0,gtlt===">"?(gtlt=">=",xm?(M=+M+1,m=0,p=0):(m=+m+1,p=0)):gtlt==="<="&&(gtlt="<",xm?M=+M+1:m=+m+1),gtlt==="<"&&(pr="-0"),ret=`${gtlt+M}.${m}.${p}${pr}`):xm?ret=`>=${M}.0.0${pr} <${+M+1}.0.0-0`:xp&&(ret=`>=${M}.${m}.0${pr} <${M}.${+m+1}.0-0`),debug("xRange return",ret),ret})},replaceStars=(comp,options)=>(debug("replaceStars",comp,options),comp.trim().replace(re[t.STAR],"")),replaceGTE0=(comp,options)=>(debug("replaceGTE0",comp,options),comp.trim().replace(re[options.includePrerelease?t.GTE0PRE:t.GTE0],"")),hyphenReplace=incPr=>($0,from,fM,fm,fp,fpr,fb,to,tM,tm,tp,tpr)=>(isX(fM)?from="":isX(fm)?from=`>=${fM}.0.0${incPr?"-0":""}`:isX(fp)?from=`>=${fM}.${fm}.0${incPr?"-0":""}`:fpr?from=`>=${from}`:from=`>=${from}${incPr?"-0":""}`,isX(tM)?to="":isX(tm)?to=`<${+tM+1}.0.0-0`:isX(tp)?to=`<${tM}.${+tm+1}.0-0`:tpr?to=`<=${tM}.${tm}.${tp}-${tpr}`:incPr?to=`<${tM}.${tm}.${+tp+1}-0`:to=`<=${to}`,`${from} ${to}`.trim()),testSet=(set,version2,options)=>{for(let i=0;i<set.length;i++)if(!set[i].test(version2))return!1;if(version2.prerelease.length&&!options.includePrerelease){for(let i=0;i<set.length;i++)if(debug(set[i].semver),set[i].semver!==Comparator.ANY&&set[i].semver.prerelease.length>0){let allowed=set[i].semver;if(allowed.major===version2.major&&allowed.minor===version2.minor&&allowed.patch===version2.patch)return!0}return!1}return!0}}});var require_comparator=__commonJS({"../../node_modules/semver/classes/comparator.js"(exports2,module2){"use strict";var ANY=Symbol("SemVer ANY"),Comparator=class _Comparator{static get ANY(){return ANY}constructor(comp,options){if(options=parseOptions(options),comp instanceof _Comparator){if(comp.loose===!!options.loose)return comp;comp=comp.value}comp=comp.trim().split(/\s+/).join(" "),debug("comparator",comp,options),this.options=options,this.loose=!!options.loose,this.parse(comp),this.semver===ANY?this.value="":this.value=this.operator+this.semver.version,debug("comp",this)}parse(comp){let r=this.options.loose?re[t.COMPARATORLOOSE]:re[t.COMPARATOR],m=comp.match(r);if(!m)throw new TypeError(`Invalid comparator: ${comp}`);this.operator=m[1]!==void 0?m[1]:"",this.operator==="="&&(this.operator=""),m[2]?this.semver=new SemVer(m[2],this.options.loose):this.semver=ANY}toString(){return this.value}test(version2){if(debug("Comparator.test",version2,this.options.loose),this.semver===ANY||version2===ANY)return!0;if(typeof version2=="string")try{version2=new SemVer(version2,this.options)}catch{return!1}return cmp(version2,this.operator,this.semver,this.options)}intersects(comp,options){if(!(comp instanceof _Comparator))throw new TypeError("a Comparator is required");return this.operator===""?this.value===""?!0:new Range(comp.value,options).test(this.value):comp.operator===""?comp.value===""?!0:new Range(this.value,options).test(comp.semver):(options=parseOptions(options),options.includePrerelease&&(this.value==="<0.0.0-0"||comp.value==="<0.0.0-0")||!options.includePrerelease&&(this.value.startsWith("<0.0.0")||comp.value.startsWith("<0.0.0"))?!1:!!(this.operator.startsWith(">")&&comp.operator.startsWith(">")||this.operator.startsWith("<")&&comp.operator.startsWith("<")||this.semver.version===comp.semver.version&&this.operator.includes("=")&&comp.operator.includes("=")||cmp(this.semver,"<",comp.semver,options)&&this.operator.startsWith(">")&&comp.operator.startsWith("<")||cmp(this.semver,">",comp.semver,options)&&this.operator.startsWith("<")&&comp.operator.startsWith(">")))}};module2.exports=Comparator;var parseOptions=require_parse_options(),{safeRe:re,t}=require_re(),cmp=require_cmp(),debug=require_debug(),SemVer=require_semver(),Range=require_range()}});var require_satisfies=__commonJS({"../../node_modules/semver/functions/satisfies.js"(exports2,module2){"use strict";var Range=require_range(),satisfies=(version2,range,options)=>{try{range=new Range(range,options)}catch{return!1}return range.test(version2)};module2.exports=satisfies}});var require_to_comparators=__commonJS({"../../node_modules/semver/ranges/to-comparators.js"(exports2,module2){"use strict";var Range=require_range(),toComparators=(range,options)=>new Range(range,options).set.map(comp=>comp.map(c=>c.value).join(" ").trim().split(" "));module2.exports=toComparators}});var require_max_satisfying=__commonJS({"../../node_modules/semver/ranges/max-satisfying.js"(exports2,module2){"use strict";var SemVer=require_semver(),Range=require_range(),maxSatisfying=(versions,range,options)=>{let max=null,maxSV=null,rangeObj=null;try{rangeObj=new Range(range,options)}catch{return null}return versions.forEach(v=>{rangeObj.test(v)&&(!max||maxSV.compare(v)===-1)&&(max=v,maxSV=new SemVer(max,options))}),max};module2.exports=maxSatisfying}});var require_min_satisfying=__commonJS({"../../node_modules/semver/ranges/min-satisfying.js"(exports2,module2){"use strict";var SemVer=require_semver(),Range=require_range(),minSatisfying=(versions,range,options)=>{let min=null,minSV=null,rangeObj=null;try{rangeObj=new Range(range,options)}catch{return null}return versions.forEach(v=>{rangeObj.test(v)&&(!min||minSV.compare(v)===1)&&(min=v,minSV=new SemVer(min,options))}),min};module2.exports=minSatisfying}});var require_min_version=__commonJS({"../../node_modules/semver/ranges/min-version.js"(exports2,module2){"use strict";var SemVer=require_semver(),Range=require_range(),gt=require_gt(),minVersion=(range,loose)=>{range=new Range(range,loose);let minver=new SemVer("0.0.0");if(range.test(minver)||(minver=new SemVer("0.0.0-0"),range.test(minver)))return minver;minver=null;for(let i=0;i<range.set.length;++i){let comparators=range.set[i],setMin=null;comparators.forEach(comparator=>{let compver=new SemVer(comparator.semver.version);switch(comparator.operator){case">":compver.prerelease.length===0?compver.patch++:compver.prerelease.push(0),compver.raw=compver.format();case"":case">=":(!setMin||gt(compver,setMin))&&(setMin=compver);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${comparator.operator}`)}}),setMin&&(!minver||gt(minver,setMin))&&(minver=setMin)}return minver&&range.test(minver)?minver:null};module2.exports=minVersion}});var require_valid2=__commonJS({"../../node_modules/semver/ranges/valid.js"(exports2,module2){"use strict";var Range=require_range(),validRange=(range,options)=>{try{return new Range(range,options).range||"*"}catch{return null}};module2.exports=validRange}});var require_outside=__commonJS({"../../node_modules/semver/ranges/outside.js"(exports2,module2){"use strict";var SemVer=require_semver(),Comparator=require_comparator(),{ANY}=Comparator,Range=require_range(),satisfies=require_satisfies(),gt=require_gt(),lt=require_lt(),lte=require_lte(),gte=require_gte(),outside=(version2,range,hilo,options)=>{version2=new SemVer(version2,options),range=new Range(range,options);let gtfn,ltefn,ltfn,comp,ecomp;switch(hilo){case">":gtfn=gt,ltefn=lte,ltfn=lt,comp=">",ecomp=">=";break;case"<":gtfn=lt,ltefn=gte,ltfn=gt,comp="<",ecomp="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(satisfies(version2,range,options))return!1;for(let i=0;i<range.set.length;++i){let comparators=range.set[i],high=null,low=null;if(comparators.forEach(comparator=>{comparator.semver===ANY&&(comparator=new Comparator(">=0.0.0")),high=high||comparator,low=low||comparator,gtfn(comparator.semver,high.semver,options)?high=comparator:ltfn(comparator.semver,low.semver,options)&&(low=comparator)}),high.operator===comp||high.operator===ecomp||(!low.operator||low.operator===comp)&<efn(version2,low.semver))return!1;if(low.operator===ecomp&<fn(version2,low.semver))return!1}return!0};module2.exports=outside}});var require_gtr=__commonJS({"../../node_modules/semver/ranges/gtr.js"(exports2,module2){"use strict";var outside=require_outside(),gtr=(version2,range,options)=>outside(version2,range,">",options);module2.exports=gtr}});var require_ltr=__commonJS({"../../node_modules/semver/ranges/ltr.js"(exports2,module2){"use strict";var outside=require_outside(),ltr=(version2,range,options)=>outside(version2,range,"<",options);module2.exports=ltr}});var require_intersects=__commonJS({"../../node_modules/semver/ranges/intersects.js"(exports2,module2){"use strict";var Range=require_range(),intersects=(r1,r2,options)=>(r1=new Range(r1,options),r2=new Range(r2,options),r1.intersects(r2,options));module2.exports=intersects}});var require_simplify=__commonJS({"../../node_modules/semver/ranges/simplify.js"(exports2,module2){"use strict";var satisfies=require_satisfies(),compare=require_compare();module2.exports=(versions,range,options)=>{let set=[],first=null,prev=null,v=versions.sort((a,b)=>compare(a,b,options));for(let version2 of v)satisfies(version2,range,options)?(prev=version2,first||(first=version2)):(prev&&set.push([first,prev]),prev=null,first=null);first&&set.push([first,null]);let ranges=[];for(let[min,max]of set)min===max?ranges.push(min):!max&&min===v[0]?ranges.push("*"):max?min===v[0]?ranges.push(`<=${max}`):ranges.push(`${min} - ${max}`):ranges.push(`>=${min}`);let simplified=ranges.join(" || "),original=typeof range.raw=="string"?range.raw:String(range);return simplified.length<original.length?simplified:range}}});var require_subset=__commonJS({"../../node_modules/semver/ranges/subset.js"(exports2,module2){"use strict";var Range=require_range(),Comparator=require_comparator(),{ANY}=Comparator,satisfies=require_satisfies(),compare=require_compare(),subset=(sub,dom,options={})=>{if(sub===dom)return!0;sub=new Range(sub,options),dom=new Range(dom,options);let sawNonNull=!1;OUTER:for(let simpleSub of sub.set){for(let simpleDom of dom.set){let isSub=simpleSubset(simpleSub,simpleDom,options);if(sawNonNull=sawNonNull||isSub!==null,isSub)continue OUTER}if(sawNonNull)return!1}return!0},minimumVersionWithPreRelease=[new Comparator(">=0.0.0-0")],minimumVersion=[new Comparator(">=0.0.0")],simpleSubset=(sub,dom,options)=>{if(sub===dom)return!0;if(sub.length===1&&sub[0].semver===ANY){if(dom.length===1&&dom[0].semver===ANY)return!0;options.includePrerelease?sub=minimumVersionWithPreRelease:sub=minimumVersion}if(dom.length===1&&dom[0].semver===ANY){if(options.includePrerelease)return!0;dom=minimumVersion}let eqSet=new Set,gt,lt;for(let c of sub)c.operator===">"||c.operator===">="?gt=higherGT(gt,c,options):c.operator==="<"||c.operator==="<="?lt=lowerLT(lt,c,options):eqSet.add(c.semver);if(eqSet.size>1)return null;let gtltComp;if(gt&<){if(gtltComp=compare(gt.semver,lt.semver,options),gtltComp>0)return null;if(gtltComp===0&&(gt.operator!==">="||lt.operator!=="<="))return null}for(let eq of eqSet){if(gt&&!satisfies(eq,String(gt),options)||lt&&!satisfies(eq,String(lt),options))return null;for(let c of dom)if(!satisfies(eq,String(c),options))return!1;return!0}let higher,lower,hasDomLT,hasDomGT,needDomLTPre=lt&&!options.includePrerelease&<.semver.prerelease.length?lt.semver:!1,needDomGTPre=gt&&!options.includePrerelease&>.semver.prerelease.length?gt.semver:!1;needDomLTPre&&needDomLTPre.prerelease.length===1&<.operator==="<"&&needDomLTPre.prerelease[0]===0&&(needDomLTPre=!1);for(let c of dom){if(hasDomGT=hasDomGT||c.operator===">"||c.operator===">=",hasDomLT=hasDomLT||c.operator==="<"||c.operator==="<=",gt){if(needDomGTPre&&c.semver.prerelease&&c.semver.prerelease.length&&c.semver.major===needDomGTPre.major&&c.semver.minor===needDomGTPre.minor&&c.semver.patch===needDomGTPre.patch&&(needDomGTPre=!1),c.operator===">"||c.operator===">="){if(higher=higherGT(gt,c,options),higher===c&&higher!==gt)return!1}else if(gt.operator===">="&&!satisfies(gt.semver,String(c),options))return!1}if(lt){if(needDomLTPre&&c.semver.prerelease&&c.semver.prerelease.length&&c.semver.major===needDomLTPre.major&&c.semver.minor===needDomLTPre.minor&&c.semver.patch===needDomLTPre.patch&&(needDomLTPre=!1),c.operator==="<"||c.operator==="<="){if(lower=lowerLT(lt,c,options),lower===c&&lower!==lt)return!1}else if(lt.operator==="<="&&!satisfies(lt.semver,String(c),options))return!1}if(!c.operator&&(lt||gt)&>ltComp!==0)return!1}return!(gt&&hasDomLT&&!lt&>ltComp!==0||lt&&hasDomGT&&!gt&>ltComp!==0||needDomGTPre||needDomLTPre)},higherGT=(a,b,options)=>{if(!a)return b;let comp=compare(a.semver,b.semver,options);return comp>0?a:comp<0||b.operator===">"&&a.operator===">="?b:a},lowerLT=(a,b,options)=>{if(!a)return b;let comp=compare(a.semver,b.semver,options);return comp<0?a:comp>0||b.operator==="<"&&a.operator==="<="?b:a};module2.exports=subset}});var require_semver2=__commonJS({"../../node_modules/semver/index.js"(exports2,module2){"use strict";var internalRe=require_re(),constants=require_constants(),SemVer=require_semver(),identifiers=require_identifiers(),parse=require_parse(),valid=require_valid(),clean=require_clean(),inc=require_inc(),diff=require_diff(),major=require_major(),minor=require_minor(),patch=require_patch(),prerelease=require_prerelease(),compare=require_compare(),rcompare=require_rcompare(),compareLoose=require_compare_loose(),compareBuild=require_compare_build(),sort=require_sort(),rsort=require_rsort(),gt=require_gt(),lt=require_lt(),eq=require_eq(),neq=require_neq(),gte=require_gte(),lte=require_lte(),cmp=require_cmp(),coerce=require_coerce(),Comparator=require_comparator(),Range=require_range(),satisfies=require_satisfies(),toComparators=require_to_comparators(),maxSatisfying=require_max_satisfying(),minSatisfying=require_min_satisfying(),minVersion=require_min_version(),validRange=require_valid2(),outside=require_outside(),gtr=require_gtr(),ltr=require_ltr(),intersects=require_intersects(),simplifyRange=require_simplify(),subset=require_subset();module2.exports={parse,valid,clean,inc,diff,major,minor,patch,prerelease,compare,rcompare,compareLoose,compareBuild,sort,rsort,gt,lt,eq,neq,gte,lte,cmp,coerce,Comparator,Range,satisfies,toComparators,maxSatisfying,minSatisfying,minVersion,validRange,outside,gtr,ltr,intersects,simplifyRange,subset,SemVer,re:internalRe.re,src:internalRe.src,tokens:internalRe.t,SEMVER_SPEC_VERSION:constants.SEMVER_SPEC_VERSION,RELEASE_TYPES:constants.RELEASE_TYPES,compareIdentifiers:identifiers.compareIdentifiers,rcompareIdentifiers:identifiers.rcompareIdentifiers}}});var entry_preview_exports={};__export(entry_preview_exports,{beforeAll:()=>beforeAll,decorators:()=>decorators,mount:()=>mount,parameters:()=>parameters,render:()=>render,renderToCanvas:()=>renderToCanvas});module.exports=__toCommonJS(entry_preview_exports);var React4=__toESM(require("react")),import_semver=__toESM(require_semver2());var React=__toESM(require("react")),clonedReact={...React};function setReactActEnvironment(isReactActEnvironment){globalThis.IS_REACT_ACT_ENVIRONMENT=isReactActEnvironment}function getReactActEnvironment(){return globalThis.IS_REACT_ACT_ENVIRONMENT}function withGlobalActEnvironment(actImplementation){return callback=>{let previousActEnvironment=getReactActEnvironment();setReactActEnvironment(!0);try{let callbackNeedsToBeAwaited=!1,actResult=actImplementation(()=>{let result=callback();return result!==null&&typeof result=="object"&&typeof result.then=="function"&&(callbackNeedsToBeAwaited=!0),result});if(callbackNeedsToBeAwaited){let thenable=actResult;return{then:(resolve,reject)=>{thenable.then(returnValue=>{setReactActEnvironment(previousActEnvironment),resolve(returnValue)},error=>{setReactActEnvironment(previousActEnvironment),reject(error)})}}}else return setReactActEnvironment(previousActEnvironment),actResult}catch(error){throw setReactActEnvironment(previousActEnvironment),error}}}var getAct=async()=>{let reactAct;if(typeof clonedReact.act=="function")reactAct=clonedReact.act;else{let deprecatedTestUtils=await import("react-dom/test-utils");reactAct=deprecatedTestUtils?.default?.act??deprecatedTestUtils.act}return process.env.NODE_ENV==="production"?cb=>cb():withGlobalActEnvironment(reactAct)};var import_react=__toESM(require("react")),render=(args,context)=>{let{id,component:Component}=context;if(!Component)throw new Error(`Unable to render story ${id} as the component annotation is missing from the default export`);return import_react.default.createElement(Component,{...args})};var import_react2=__toESM(require("react")),import_global=require("@storybook/global");var{FRAMEWORK_OPTIONS}=import_global.global,ErrorBoundary=class extends import_react2.Component{constructor(){super(...arguments);this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidMount(){let{hasError}=this.state,{showMain}=this.props;hasError||showMain()}componentDidCatch(err){let{showException}=this.props;showException(err)}render(){let{hasError}=this.state,{children}=this.props;return hasError?null:children}},Wrapper=FRAMEWORK_OPTIONS?.strictMode?import_react2.StrictMode:import_react2.Fragment,actQueue=[],isActing=!1,processActQueue=async()=>{if(isActing||actQueue.length===0)return;isActing=!0;let actTask=actQueue.shift();actTask&&await actTask(),isActing=!1,processActQueue()};async function renderToCanvas({storyContext,unboundStoryFn,showMain,showException,forceRemount},canvasElement){let{renderElement,unmountElement}=await import("@storybook/react-dom-shim"),Story=unboundStoryFn,content=storyContext.parameters.__isPortableStory?import_react2.default.createElement(Story,{...storyContext}):import_react2.default.createElement(ErrorBoundary,{showMain,showException},import_react2.default.createElement(Story,{...storyContext})),element=Wrapper?import_react2.default.createElement(Wrapper,null,content):content;forceRemount&&unmountElement(canvasElement);let act=await getAct();return await new Promise(async(resolve,reject)=>{actQueue.push(async()=>{try{await act(async()=>{await renderElement(element,canvasElement,storyContext?.parameters?.react?.rootOptions)}),resolve()}catch(e){reject(e)}}),processActQueue()}),async()=>{await act(()=>{unmountElement(canvasElement)})}}var mount=context=>async ui=>(ui!=null&&(context.originalStoryFn=()=>ui),await context.renderToCanvas(),context.canvas);var parameters={renderer:"react"},decorators=[(story,context)=>{if(!context.parameters?.react?.rsc)return story();let major=import_semver.default.major(React4.version),minor=import_semver.default.minor(React4.version);if(major<18||major===18&&minor<3)throw new Error("React Server Components require React >= 18.3");return React4.createElement(React4.Suspense,null,story())}],beforeAll=async()=>{try{let{configure}=await import("@storybook/test"),act=await getAct();configure({unstable_advanceTimersWrapper:cb=>act(cb),asyncWrapper:async cb=>{let previousActEnvironment=getReactActEnvironment();setReactActEnvironment(!1);try{let result=await cb();return await new Promise(resolve=>{setTimeout(()=>{resolve()},0),jestFakeTimersAreEnabled()&&jest.advanceTimersByTime(0)}),result}finally{setReactActEnvironment(previousActEnvironment)}},eventWrapper:cb=>{let result;return act(()=>(result=cb(),result)),result}})}catch{}};function jestFakeTimersAreEnabled(){return typeof jest<"u"&&jest!==null?setTimeout._isMockFunction===!0||Object.prototype.hasOwnProperty.call(setTimeout,"clock"):!1}0&&(module.exports={beforeAll,decorators,mount,parameters,render,renderToCanvas});
    ++"use strict";var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty;var __commonJS=(cb,mod)=>function(){return mod||(0,cb[__getOwnPropNames(cb)[0]])((mod={exports:{}}).exports,mod),mod.exports};var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&typeof from=="object"||typeof from=="function")for(let key of __getOwnPropNames(from))!__hasOwnProp.call(to,key)&&key!==except&&__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to};var __toESM=(mod,isNodeMode,target)=>(target=mod!=null?__create(__getProtoOf(mod)):{},__copyProps(isNodeMode||!mod||!mod.__esModule?__defProp(target,"default",{value:mod,enumerable:!0}):target,mod)),__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod);var require_constants=__commonJS({"../../node_modules/semver/internal/constants.js"(exports2,module2){"use strict";var SEMVER_SPEC_VERSION="2.0.0",MAX_SAFE_INTEGER=Number.MAX_SAFE_INTEGER||9007199254740991,MAX_SAFE_COMPONENT_LENGTH=16,MAX_SAFE_BUILD_LENGTH=250,RELEASE_TYPES=["major","premajor","minor","preminor","patch","prepatch","prerelease"];module2.exports={MAX_LENGTH:256,MAX_SAFE_COMPONENT_LENGTH,MAX_SAFE_BUILD_LENGTH,MAX_SAFE_INTEGER,RELEASE_TYPES,SEMVER_SPEC_VERSION,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2}}});var require_debug=__commonJS({"../../node_modules/semver/internal/debug.js"(exports2,module2){"use strict";var debug=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...args)=>console.error("SEMVER",...args):()=>{};module2.exports=debug}});var require_re=__commonJS({"../../node_modules/semver/internal/re.js"(exports2,module2){"use strict";var{MAX_SAFE_COMPONENT_LENGTH,MAX_SAFE_BUILD_LENGTH,MAX_LENGTH}=require_constants(),debug=require_debug();exports2=module2.exports={};var re=exports2.re=[],safeRe=exports2.safeRe=[],src=exports2.src=[],safeSrc=exports2.safeSrc=[],t=exports2.t={},R=0,LETTERDASHNUMBER="[a-zA-Z0-9-]",safeRegexReplacements=[["\\s",1],["\\d",MAX_LENGTH],[LETTERDASHNUMBER,MAX_SAFE_BUILD_LENGTH]],makeSafeRegex=value=>{for(let[token,max]of safeRegexReplacements)value=value.split(`${token}*`).join(`${token}{0,${max}}`).split(`${token}+`).join(`${token}{1,${max}}`);return value},createToken=(name,value,isGlobal)=>{let safe=makeSafeRegex(value),index=R++;debug(name,index,value),t[name]=index,src[index]=value,safeSrc[index]=safe,re[index]=new RegExp(value,isGlobal?"g":void 0),safeRe[index]=new RegExp(safe,isGlobal?"g":void 0)};createToken("NUMERICIDENTIFIER","0|[1-9]\\d*");createToken("NUMERICIDENTIFIERLOOSE","\\d+");createToken("NONNUMERICIDENTIFIER",`\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`);createToken("MAINVERSION",`(${src[t.NUMERICIDENTIFIER]})\\.(${src[t.NUMERICIDENTIFIER]})\\.(${src[t.NUMERICIDENTIFIER]})`);createToken("MAINVERSIONLOOSE",`(${src[t.NUMERICIDENTIFIERLOOSE]})\\.(${src[t.NUMERICIDENTIFIERLOOSE]})\\.(${src[t.NUMERICIDENTIFIERLOOSE]})`);createToken("PRERELEASEIDENTIFIER",`(?:${src[t.NUMERICIDENTIFIER]}|${src[t.NONNUMERICIDENTIFIER]})`);createToken("PRERELEASEIDENTIFIERLOOSE",`(?:${src[t.NUMERICIDENTIFIERLOOSE]}|${src[t.NONNUMERICIDENTIFIER]})`);createToken("PRERELEASE",`(?:-(${src[t.PRERELEASEIDENTIFIER]}(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`);createToken("PRERELEASELOOSE",`(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`);createToken("BUILDIDENTIFIER",`${LETTERDASHNUMBER}+`);createToken("BUILD",`(?:\\+(${src[t.BUILDIDENTIFIER]}(?:\\.${src[t.BUILDIDENTIFIER]})*))`);createToken("FULLPLAIN",`v?${src[t.MAINVERSION]}${src[t.PRERELEASE]}?${src[t.BUILD]}?`);createToken("FULL",`^${src[t.FULLPLAIN]}$`);createToken("LOOSEPLAIN",`[v=\\s]*${src[t.MAINVERSIONLOOSE]}${src[t.PRERELEASELOOSE]}?${src[t.BUILD]}?`);createToken("LOOSE",`^${src[t.LOOSEPLAIN]}$`);createToken("GTLT","((?:<|>)?=?)");createToken("XRANGEIDENTIFIERLOOSE",`${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);createToken("XRANGEIDENTIFIER",`${src[t.NUMERICIDENTIFIER]}|x|X|\\*`);createToken("XRANGEPLAIN",`[v=\\s]*(${src[t.XRANGEIDENTIFIER]})(?:\\.(${src[t.XRANGEIDENTIFIER]})(?:\\.(${src[t.XRANGEIDENTIFIER]})(?:${src[t.PRERELEASE]})?${src[t.BUILD]}?)?)?`);createToken("XRANGEPLAINLOOSE",`[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})(?:${src[t.PRERELEASELOOSE]})?${src[t.BUILD]}?)?)?`);createToken("XRANGE",`^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`);createToken("XRANGELOOSE",`^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`);createToken("COERCEPLAIN",`(^|[^\\d])(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}})(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`);createToken("COERCE",`${src[t.COERCEPLAIN]}(?:$|[^\\d])`);createToken("COERCEFULL",src[t.COERCEPLAIN]+`(?:${src[t.PRERELEASE]})?(?:${src[t.BUILD]})?(?:$|[^\\d])`);createToken("COERCERTL",src[t.COERCE],!0);createToken("COERCERTLFULL",src[t.COERCEFULL],!0);createToken("LONETILDE","(?:~>?)");createToken("TILDETRIM",`(\\s*)${src[t.LONETILDE]}\\s+`,!0);exports2.tildeTrimReplace="$1~";createToken("TILDE",`^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`);createToken("TILDELOOSE",`^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`);createToken("LONECARET","(?:\\^)");createToken("CARETTRIM",`(\\s*)${src[t.LONECARET]}\\s+`,!0);exports2.caretTrimReplace="$1^";createToken("CARET",`^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`);createToken("CARETLOOSE",`^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`);createToken("COMPARATORLOOSE",`^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`);createToken("COMPARATOR",`^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`);createToken("COMPARATORTRIM",`(\\s*)${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`,!0);exports2.comparatorTrimReplace="$1$2$3";createToken("HYPHENRANGE",`^\\s*(${src[t.XRANGEPLAIN]})\\s+-\\s+(${src[t.XRANGEPLAIN]})\\s*$`);createToken("HYPHENRANGELOOSE",`^\\s*(${src[t.XRANGEPLAINLOOSE]})\\s+-\\s+(${src[t.XRANGEPLAINLOOSE]})\\s*$`);createToken("STAR","(<|>)?=?\\s*\\*");createToken("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$");createToken("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$")}});var require_parse_options=__commonJS({"../../node_modules/semver/internal/parse-options.js"(exports2,module2){"use strict";var looseOption=Object.freeze({loose:!0}),emptyOpts=Object.freeze({}),parseOptions=options=>options?typeof options!="object"?looseOption:options:emptyOpts;module2.exports=parseOptions}});var require_identifiers=__commonJS({"../../node_modules/semver/internal/identifiers.js"(exports2,module2){"use strict";var numeric=/^[0-9]+$/,compareIdentifiers=(a,b)=>{let anum=numeric.test(a),bnum=numeric.test(b);return anum&&bnum&&(a=+a,b=+b),a===b?0:anum&&!bnum?-1:bnum&&!anum?1:a<b?-1:1},rcompareIdentifiers=(a,b)=>compareIdentifiers(b,a);module2.exports={compareIdentifiers,rcompareIdentifiers}}});var require_semver=__commonJS({"../../node_modules/semver/classes/semver.js"(exports2,module2){"use strict";var debug=require_debug(),{MAX_LENGTH,MAX_SAFE_INTEGER}=require_constants(),{safeRe:re,safeSrc:src,t}=require_re(),parseOptions=require_parse_options(),{compareIdentifiers}=require_identifiers(),SemVer=class _SemVer{constructor(version2,options){if(options=parseOptions(options),version2 instanceof _SemVer){if(version2.loose===!!options.loose&&version2.includePrerelease===!!options.includePrerelease)return version2;version2=version2.version}else if(typeof version2!="string")throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version2}".`);if(version2.length>MAX_LENGTH)throw new TypeError(`version is longer than ${MAX_LENGTH} characters`);debug("SemVer",version2,options),this.options=options,this.loose=!!options.loose,this.includePrerelease=!!options.includePrerelease;let m=version2.trim().match(options.loose?re[t.LOOSE]:re[t.FULL]);if(!m)throw new TypeError(`Invalid Version: ${version2}`);if(this.raw=version2,this.major=+m[1],this.minor=+m[2],this.patch=+m[3],this.major>MAX_SAFE_INTEGER||this.major<0)throw new TypeError("Invalid major version");if(this.minor>MAX_SAFE_INTEGER||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>MAX_SAFE_INTEGER||this.patch<0)throw new TypeError("Invalid patch version");m[4]?this.prerelease=m[4].split(".").map(id=>{if(/^[0-9]+$/.test(id)){let num=+id;if(num>=0&&num<MAX_SAFE_INTEGER)return num}return id}):this.prerelease=[],this.build=m[5]?m[5].split("."):[],this.format()}format(){return this.version=`${this.major}.${this.minor}.${this.patch}`,this.prerelease.length&&(this.version+=`-${this.prerelease.join(".")}`),this.version}toString(){return this.version}compare(other){if(debug("SemVer.compare",this.version,this.options,other),!(other instanceof _SemVer)){if(typeof other=="string"&&other===this.version)return 0;other=new _SemVer(other,this.options)}return other.version===this.version?0:this.compareMain(other)||this.comparePre(other)}compareMain(other){return other instanceof _SemVer||(other=new _SemVer(other,this.options)),compareIdentifiers(this.major,other.major)||compareIdentifiers(this.minor,other.minor)||compareIdentifiers(this.patch,other.patch)}comparePre(other){if(other instanceof _SemVer||(other=new _SemVer(other,this.options)),this.prerelease.length&&!other.prerelease.length)return-1;if(!this.prerelease.length&&other.prerelease.length)return 1;if(!this.prerelease.length&&!other.prerelease.length)return 0;let i=0;do{let a=this.prerelease[i],b=other.prerelease[i];if(debug("prerelease compare",i,a,b),a===void 0&&b===void 0)return 0;if(b===void 0)return 1;if(a===void 0)return-1;if(a===b)continue;return compareIdentifiers(a,b)}while(++i)}compareBuild(other){other instanceof _SemVer||(other=new _SemVer(other,this.options));let i=0;do{let a=this.build[i],b=other.build[i];if(debug("build compare",i,a,b),a===void 0&&b===void 0)return 0;if(b===void 0)return 1;if(a===void 0)return-1;if(a===b)continue;return compareIdentifiers(a,b)}while(++i)}inc(release,identifier,identifierBase){if(release.startsWith("pre")){if(!identifier&&identifierBase===!1)throw new Error("invalid increment argument: identifier is empty");if(identifier){let r=new RegExp(`^${this.options.loose?src[t.PRERELEASELOOSE]:src[t.PRERELEASE]}$`),match=`-${identifier}`.match(r);if(!match||match[1]!==identifier)throw new Error(`invalid identifier: ${identifier}`)}}switch(release){case"premajor":this.prerelease.length=0,this.patch=0,this.minor=0,this.major++,this.inc("pre",identifier,identifierBase);break;case"preminor":this.prerelease.length=0,this.patch=0,this.minor++,this.inc("pre",identifier,identifierBase);break;case"prepatch":this.prerelease.length=0,this.inc("patch",identifier,identifierBase),this.inc("pre",identifier,identifierBase);break;case"prerelease":this.prerelease.length===0&&this.inc("patch",identifier,identifierBase),this.inc("pre",identifier,identifierBase);break;case"release":if(this.prerelease.length===0)throw new Error(`version ${this.raw} is not a prerelease`);this.prerelease.length=0;break;case"major":(this.minor!==0||this.patch!==0||this.prerelease.length===0)&&this.major++,this.minor=0,this.patch=0,this.prerelease=[];break;case"minor":(this.patch!==0||this.prerelease.length===0)&&this.minor++,this.patch=0,this.prerelease=[];break;case"patch":this.prerelease.length===0&&this.patch++,this.prerelease=[];break;case"pre":{let base=Number(identifierBase)?1:0;if(this.prerelease.length===0)this.prerelease=[base];else{let i=this.prerelease.length;for(;--i>=0;)typeof this.prerelease[i]=="number"&&(this.prerelease[i]++,i=-2);if(i===-1){if(identifier===this.prerelease.join(".")&&identifierBase===!1)throw new Error("invalid increment argument: identifier already exists");this.prerelease.push(base)}}if(identifier){let prerelease=[identifier,base];identifierBase===!1&&(prerelease=[identifier]),compareIdentifiers(this.prerelease[0],identifier)===0?isNaN(this.prerelease[1])&&(this.prerelease=prerelease):this.prerelease=prerelease}break}default:throw new Error(`invalid increment argument: ${release}`)}return this.raw=this.format(),this.build.length&&(this.raw+=`+${this.build.join(".")}`),this}};module2.exports=SemVer}});var require_parse=__commonJS({"../../node_modules/semver/functions/parse.js"(exports2,module2){"use strict";var SemVer=require_semver(),parse=(version2,options,throwErrors=!1)=>{if(version2 instanceof SemVer)return version2;try{return new SemVer(version2,options)}catch(er){if(!throwErrors)return null;throw er}};module2.exports=parse}});var require_valid=__commonJS({"../../node_modules/semver/functions/valid.js"(exports2,module2){"use strict";var parse=require_parse(),valid=(version2,options)=>{let v=parse(version2,options);return v?v.version:null};module2.exports=valid}});var require_clean=__commonJS({"../../node_modules/semver/functions/clean.js"(exports2,module2){"use strict";var parse=require_parse(),clean=(version2,options)=>{let s=parse(version2.trim().replace(/^[=v]+/,""),options);return s?s.version:null};module2.exports=clean}});var require_inc=__commonJS({"../../node_modules/semver/functions/inc.js"(exports2,module2){"use strict";var SemVer=require_semver(),inc=(version2,release,options,identifier,identifierBase)=>{typeof options=="string"&&(identifierBase=identifier,identifier=options,options=void 0);try{return new SemVer(version2 instanceof SemVer?version2.version:version2,options).inc(release,identifier,identifierBase).version}catch{return null}};module2.exports=inc}});var require_diff=__commonJS({"../../node_modules/semver/functions/diff.js"(exports2,module2){"use strict";var parse=require_parse(),diff=(version1,version2)=>{let v1=parse(version1,null,!0),v2=parse(version2,null,!0),comparison=v1.compare(v2);if(comparison===0)return null;let v1Higher=comparison>0,highVersion=v1Higher?v1:v2,lowVersion=v1Higher?v2:v1,highHasPre=!!highVersion.prerelease.length;if(!!lowVersion.prerelease.length&&!highHasPre){if(!lowVersion.patch&&!lowVersion.minor)return"major";if(lowVersion.compareMain(highVersion)===0)return lowVersion.minor&&!lowVersion.patch?"minor":"patch"}let prefix=highHasPre?"pre":"";return v1.major!==v2.major?prefix+"major":v1.minor!==v2.minor?prefix+"minor":v1.patch!==v2.patch?prefix+"patch":"prerelease"};module2.exports=diff}});var require_major=__commonJS({"../../node_modules/semver/functions/major.js"(exports2,module2){"use strict";var SemVer=require_semver(),major=(a,loose)=>new SemVer(a,loose).major;module2.exports=major}});var require_minor=__commonJS({"../../node_modules/semver/functions/minor.js"(exports2,module2){"use strict";var SemVer=require_semver(),minor=(a,loose)=>new SemVer(a,loose).minor;module2.exports=minor}});var require_patch=__commonJS({"../../node_modules/semver/functions/patch.js"(exports2,module2){"use strict";var SemVer=require_semver(),patch=(a,loose)=>new SemVer(a,loose).patch;module2.exports=patch}});var require_prerelease=__commonJS({"../../node_modules/semver/functions/prerelease.js"(exports2,module2){"use strict";var parse=require_parse(),prerelease=(version2,options)=>{let parsed=parse(version2,options);return parsed&&parsed.prerelease.length?parsed.prerelease:null};module2.exports=prerelease}});var require_compare=__commonJS({"../../node_modules/semver/functions/compare.js"(exports2,module2){"use strict";var SemVer=require_semver(),compare=(a,b,loose)=>new SemVer(a,loose).compare(new SemVer(b,loose));module2.exports=compare}});var require_rcompare=__commonJS({"../../node_modules/semver/functions/rcompare.js"(exports2,module2){"use strict";var compare=require_compare(),rcompare=(a,b,loose)=>compare(b,a,loose);module2.exports=rcompare}});var require_compare_loose=__commonJS({"../../node_modules/semver/functions/compare-loose.js"(exports2,module2){"use strict";var compare=require_compare(),compareLoose=(a,b)=>compare(a,b,!0);module2.exports=compareLoose}});var require_compare_build=__commonJS({"../../node_modules/semver/functions/compare-build.js"(exports2,module2){"use strict";var SemVer=require_semver(),compareBuild=(a,b,loose)=>{let versionA=new SemVer(a,loose),versionB=new SemVer(b,loose);return versionA.compare(versionB)||versionA.compareBuild(versionB)};module2.exports=compareBuild}});var require_sort=__commonJS({"../../node_modules/semver/functions/sort.js"(exports2,module2){"use strict";var compareBuild=require_compare_build(),sort=(list,loose)=>list.sort((a,b)=>compareBuild(a,b,loose));module2.exports=sort}});var require_rsort=__commonJS({"../../node_modules/semver/functions/rsort.js"(exports2,module2){"use strict";var compareBuild=require_compare_build(),rsort=(list,loose)=>list.sort((a,b)=>compareBuild(b,a,loose));module2.exports=rsort}});var require_gt=__commonJS({"../../node_modules/semver/functions/gt.js"(exports2,module2){"use strict";var compare=require_compare(),gt=(a,b,loose)=>compare(a,b,loose)>0;module2.exports=gt}});var require_lt=__commonJS({"../../node_modules/semver/functions/lt.js"(exports2,module2){"use strict";var compare=require_compare(),lt=(a,b,loose)=>compare(a,b,loose)<0;module2.exports=lt}});var require_eq=__commonJS({"../../node_modules/semver/functions/eq.js"(exports2,module2){"use strict";var compare=require_compare(),eq=(a,b,loose)=>compare(a,b,loose)===0;module2.exports=eq}});var require_neq=__commonJS({"../../node_modules/semver/functions/neq.js"(exports2,module2){"use strict";var compare=require_compare(),neq=(a,b,loose)=>compare(a,b,loose)!==0;module2.exports=neq}});var require_gte=__commonJS({"../../node_modules/semver/functions/gte.js"(exports2,module2){"use strict";var compare=require_compare(),gte=(a,b,loose)=>compare(a,b,loose)>=0;module2.exports=gte}});var require_lte=__commonJS({"../../node_modules/semver/functions/lte.js"(exports2,module2){"use strict";var compare=require_compare(),lte=(a,b,loose)=>compare(a,b,loose)<=0;module2.exports=lte}});var require_cmp=__commonJS({"../../node_modules/semver/functions/cmp.js"(exports2,module2){"use strict";var eq=require_eq(),neq=require_neq(),gt=require_gt(),gte=require_gte(),lt=require_lt(),lte=require_lte(),cmp=(a,op,b,loose)=>{switch(op){case"===":return typeof a=="object"&&(a=a.version),typeof b=="object"&&(b=b.version),a===b;case"!==":return typeof a=="object"&&(a=a.version),typeof b=="object"&&(b=b.version),a!==b;case"":case"=":case"==":return eq(a,b,loose);case"!=":return neq(a,b,loose);case">":return gt(a,b,loose);case">=":return gte(a,b,loose);case"<":return lt(a,b,loose);case"<=":return lte(a,b,loose);default:throw new TypeError(`Invalid operator: ${op}`)}};module2.exports=cmp}});var require_coerce=__commonJS({"../../node_modules/semver/functions/coerce.js"(exports2,module2){"use strict";var SemVer=require_semver(),parse=require_parse(),{safeRe:re,t}=require_re(),coerce=(version2,options)=>{if(version2 instanceof SemVer)return version2;if(typeof version2=="number"&&(version2=String(version2)),typeof version2!="string")return null;options=options||{};let match=null;if(!options.rtl)match=version2.match(options.includePrerelease?re[t.COERCEFULL]:re[t.COERCE]);else{let coerceRtlRegex=options.includePrerelease?re[t.COERCERTLFULL]:re[t.COERCERTL],next;for(;(next=coerceRtlRegex.exec(version2))&&(!match||match.index+match[0].length!==version2.length);)(!match||next.index+next[0].length!==match.index+match[0].length)&&(match=next),coerceRtlRegex.lastIndex=next.index+next[1].length+next[2].length;coerceRtlRegex.lastIndex=-1}if(match===null)return null;let major=match[2],minor=match[3]||"0",patch=match[4]||"0",prerelease=options.includePrerelease&&match[5]?`-${match[5]}`:"",build=options.includePrerelease&&match[6]?`+${match[6]}`:"";return parse(`${major}.${minor}.${patch}${prerelease}${build}`,options)};module2.exports=coerce}});var require_lrucache=__commonJS({"../../node_modules/semver/internal/lrucache.js"(exports2,module2){"use strict";var LRUCache=class{constructor(){this.max=1e3,this.map=new Map}get(key){let value=this.map.get(key);if(value!==void 0)return this.map.delete(key),this.map.set(key,value),value}delete(key){return this.map.delete(key)}set(key,value){if(!this.delete(key)&&value!==void 0){if(this.map.size>=this.max){let firstKey=this.map.keys().next().value;this.delete(firstKey)}this.map.set(key,value)}return this}};module2.exports=LRUCache}});var require_range=__commonJS({"../../node_modules/semver/classes/range.js"(exports2,module2){"use strict";var SPACE_CHARACTERS=/\s+/g,Range=class _Range{constructor(range,options){if(options=parseOptions(options),range instanceof _Range)return range.loose===!!options.loose&&range.includePrerelease===!!options.includePrerelease?range:new _Range(range.raw,options);if(range instanceof Comparator)return this.raw=range.value,this.set=[[range]],this.formatted=void 0,this;if(this.options=options,this.loose=!!options.loose,this.includePrerelease=!!options.includePrerelease,this.raw=range.trim().replace(SPACE_CHARACTERS," "),this.set=this.raw.split("||").map(r=>this.parseRange(r.trim())).filter(c=>c.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${this.raw}`);if(this.set.length>1){let first=this.set[0];if(this.set=this.set.filter(c=>!isNullSet(c[0])),this.set.length===0)this.set=[first];else if(this.set.length>1){for(let c of this.set)if(c.length===1&&isAny(c[0])){this.set=[c];break}}}this.formatted=void 0}get range(){if(this.formatted===void 0){this.formatted="";for(let i=0;i<this.set.length;i++){i>0&&(this.formatted+="||");let comps=this.set[i];for(let k=0;k<comps.length;k++)k>0&&(this.formatted+=" "),this.formatted+=comps[k].toString().trim()}}return this.formatted}format(){return this.range}toString(){return this.range}parseRange(range){let memoKey=((this.options.includePrerelease&&FLAG_INCLUDE_PRERELEASE)|(this.options.loose&&FLAG_LOOSE))+":"+range,cached=cache.get(memoKey);if(cached)return cached;let loose=this.options.loose,hr=loose?re[t.HYPHENRANGELOOSE]:re[t.HYPHENRANGE];range=range.replace(hr,hyphenReplace(this.options.includePrerelease)),debug("hyphen replace",range),range=range.replace(re[t.COMPARATORTRIM],comparatorTrimReplace),debug("comparator trim",range),range=range.replace(re[t.TILDETRIM],tildeTrimReplace),debug("tilde trim",range),range=range.replace(re[t.CARETTRIM],caretTrimReplace),debug("caret trim",range);let rangeList=range.split(" ").map(comp=>parseComparator(comp,this.options)).join(" ").split(/\s+/).map(comp=>replaceGTE0(comp,this.options));loose&&(rangeList=rangeList.filter(comp=>(debug("loose invalid filter",comp,this.options),!!comp.match(re[t.COMPARATORLOOSE])))),debug("range list",rangeList);let rangeMap=new Map,comparators=rangeList.map(comp=>new Comparator(comp,this.options));for(let comp of comparators){if(isNullSet(comp))return[comp];rangeMap.set(comp.value,comp)}rangeMap.size>1&&rangeMap.has("")&&rangeMap.delete("");let result=[...rangeMap.values()];return cache.set(memoKey,result),result}intersects(range,options){if(!(range instanceof _Range))throw new TypeError("a Range is required");return this.set.some(thisComparators=>isSatisfiable(thisComparators,options)&&range.set.some(rangeComparators=>isSatisfiable(rangeComparators,options)&&thisComparators.every(thisComparator=>rangeComparators.every(rangeComparator=>thisComparator.intersects(rangeComparator,options)))))}test(version2){if(!version2)return!1;if(typeof version2=="string")try{version2=new SemVer(version2,this.options)}catch{return!1}for(let i=0;i<this.set.length;i++)if(testSet(this.set[i],version2,this.options))return!0;return!1}};module2.exports=Range;var LRU=require_lrucache(),cache=new LRU,parseOptions=require_parse_options(),Comparator=require_comparator(),debug=require_debug(),SemVer=require_semver(),{safeRe:re,t,comparatorTrimReplace,tildeTrimReplace,caretTrimReplace}=require_re(),{FLAG_INCLUDE_PRERELEASE,FLAG_LOOSE}=require_constants(),isNullSet=c=>c.value==="<0.0.0-0",isAny=c=>c.value==="",isSatisfiable=(comparators,options)=>{let result=!0,remainingComparators=comparators.slice(),testComparator=remainingComparators.pop();for(;result&&remainingComparators.length;)result=remainingComparators.every(otherComparator=>testComparator.intersects(otherComparator,options)),testComparator=remainingComparators.pop();return result},parseComparator=(comp,options)=>(debug("comp",comp,options),comp=replaceCarets(comp,options),debug("caret",comp),comp=replaceTildes(comp,options),debug("tildes",comp),comp=replaceXRanges(comp,options),debug("xrange",comp),comp=replaceStars(comp,options),debug("stars",comp),comp),isX=id=>!id||id.toLowerCase()==="x"||id==="*",replaceTildes=(comp,options)=>comp.trim().split(/\s+/).map(c=>replaceTilde(c,options)).join(" "),replaceTilde=(comp,options)=>{let r=options.loose?re[t.TILDELOOSE]:re[t.TILDE];return comp.replace(r,(_,M,m,p,pr)=>{debug("tilde",comp,_,M,m,p,pr);let ret;return isX(M)?ret="":isX(m)?ret=`>=${M}.0.0 <${+M+1}.0.0-0`:isX(p)?ret=`>=${M}.${m}.0 <${M}.${+m+1}.0-0`:pr?(debug("replaceTilde pr",pr),ret=`>=${M}.${m}.${p}-${pr} <${M}.${+m+1}.0-0`):ret=`>=${M}.${m}.${p} <${M}.${+m+1}.0-0`,debug("tilde return",ret),ret})},replaceCarets=(comp,options)=>comp.trim().split(/\s+/).map(c=>replaceCaret(c,options)).join(" "),replaceCaret=(comp,options)=>{debug("caret",comp,options);let r=options.loose?re[t.CARETLOOSE]:re[t.CARET],z=options.includePrerelease?"-0":"";return comp.replace(r,(_,M,m,p,pr)=>{debug("caret",comp,_,M,m,p,pr);let ret;return isX(M)?ret="":isX(m)?ret=`>=${M}.0.0${z} <${+M+1}.0.0-0`:isX(p)?M==="0"?ret=`>=${M}.${m}.0${z} <${M}.${+m+1}.0-0`:ret=`>=${M}.${m}.0${z} <${+M+1}.0.0-0`:pr?(debug("replaceCaret pr",pr),M==="0"?m==="0"?ret=`>=${M}.${m}.${p}-${pr} <${M}.${m}.${+p+1}-0`:ret=`>=${M}.${m}.${p}-${pr} <${M}.${+m+1}.0-0`:ret=`>=${M}.${m}.${p}-${pr} <${+M+1}.0.0-0`):(debug("no pr"),M==="0"?m==="0"?ret=`>=${M}.${m}.${p}${z} <${M}.${m}.${+p+1}-0`:ret=`>=${M}.${m}.${p}${z} <${M}.${+m+1}.0-0`:ret=`>=${M}.${m}.${p} <${+M+1}.0.0-0`),debug("caret return",ret),ret})},replaceXRanges=(comp,options)=>(debug("replaceXRanges",comp,options),comp.split(/\s+/).map(c=>replaceXRange(c,options)).join(" ")),replaceXRange=(comp,options)=>{comp=comp.trim();let r=options.loose?re[t.XRANGELOOSE]:re[t.XRANGE];return comp.replace(r,(ret,gtlt,M,m,p,pr)=>{debug("xRange",comp,ret,gtlt,M,m,p,pr);let xM=isX(M),xm=xM||isX(m),xp=xm||isX(p),anyX=xp;return gtlt==="="&&anyX&&(gtlt=""),pr=options.includePrerelease?"-0":"",xM?gtlt===">"||gtlt==="<"?ret="<0.0.0-0":ret="*":gtlt&&anyX?(xm&&(m=0),p=0,gtlt===">"?(gtlt=">=",xm?(M=+M+1,m=0,p=0):(m=+m+1,p=0)):gtlt==="<="&&(gtlt="<",xm?M=+M+1:m=+m+1),gtlt==="<"&&(pr="-0"),ret=`${gtlt+M}.${m}.${p}${pr}`):xm?ret=`>=${M}.0.0${pr} <${+M+1}.0.0-0`:xp&&(ret=`>=${M}.${m}.0${pr} <${M}.${+m+1}.0-0`),debug("xRange return",ret),ret})},replaceStars=(comp,options)=>(debug("replaceStars",comp,options),comp.trim().replace(re[t.STAR],"")),replaceGTE0=(comp,options)=>(debug("replaceGTE0",comp,options),comp.trim().replace(re[options.includePrerelease?t.GTE0PRE:t.GTE0],"")),hyphenReplace=incPr=>($0,from,fM,fm,fp,fpr,fb,to,tM,tm,tp,tpr)=>(isX(fM)?from="":isX(fm)?from=`>=${fM}.0.0${incPr?"-0":""}`:isX(fp)?from=`>=${fM}.${fm}.0${incPr?"-0":""}`:fpr?from=`>=${from}`:from=`>=${from}${incPr?"-0":""}`,isX(tM)?to="":isX(tm)?to=`<${+tM+1}.0.0-0`:isX(tp)?to=`<${tM}.${+tm+1}.0-0`:tpr?to=`<=${tM}.${tm}.${tp}-${tpr}`:incPr?to=`<${tM}.${tm}.${+tp+1}-0`:to=`<=${to}`,`${from} ${to}`.trim()),testSet=(set,version2,options)=>{for(let i=0;i<set.length;i++)if(!set[i].test(version2))return!1;if(version2.prerelease.length&&!options.includePrerelease){for(let i=0;i<set.length;i++)if(debug(set[i].semver),set[i].semver!==Comparator.ANY&&set[i].semver.prerelease.length>0){let allowed=set[i].semver;if(allowed.major===version2.major&&allowed.minor===version2.minor&&allowed.patch===version2.patch)return!0}return!1}return!0}}});var require_comparator=__commonJS({"../../node_modules/semver/classes/comparator.js"(exports2,module2){"use strict";var ANY=Symbol("SemVer ANY"),Comparator=class _Comparator{static get ANY(){return ANY}constructor(comp,options){if(options=parseOptions(options),comp instanceof _Comparator){if(comp.loose===!!options.loose)return comp;comp=comp.value}comp=comp.trim().split(/\s+/).join(" "),debug("comparator",comp,options),this.options=options,this.loose=!!options.loose,this.parse(comp),this.semver===ANY?this.value="":this.value=this.operator+this.semver.version,debug("comp",this)}parse(comp){let r=this.options.loose?re[t.COMPARATORLOOSE]:re[t.COMPARATOR],m=comp.match(r);if(!m)throw new TypeError(`Invalid comparator: ${comp}`);this.operator=m[1]!==void 0?m[1]:"",this.operator==="="&&(this.operator=""),m[2]?this.semver=new SemVer(m[2],this.options.loose):this.semver=ANY}toString(){return this.value}test(version2){if(debug("Comparator.test",version2,this.options.loose),this.semver===ANY||version2===ANY)return!0;if(typeof version2=="string")try{version2=new SemVer(version2,this.options)}catch{return!1}return cmp(version2,this.operator,this.semver,this.options)}intersects(comp,options){if(!(comp instanceof _Comparator))throw new TypeError("a Comparator is required");return this.operator===""?this.value===""?!0:new Range(comp.value,options).test(this.value):comp.operator===""?comp.value===""?!0:new Range(this.value,options).test(comp.semver):(options=parseOptions(options),options.includePrerelease&&(this.value==="<0.0.0-0"||comp.value==="<0.0.0-0")||!options.includePrerelease&&(this.value.startsWith("<0.0.0")||comp.value.startsWith("<0.0.0"))?!1:!!(this.operator.startsWith(">")&&comp.operator.startsWith(">")||this.operator.startsWith("<")&&comp.operator.startsWith("<")||this.semver.version===comp.semver.version&&this.operator.includes("=")&&comp.operator.includes("=")||cmp(this.semver,"<",comp.semver,options)&&this.operator.startsWith(">")&&comp.operator.startsWith("<")||cmp(this.semver,">",comp.semver,options)&&this.operator.startsWith("<")&&comp.operator.startsWith(">")))}};module2.exports=Comparator;var parseOptions=require_parse_options(),{safeRe:re,t}=require_re(),cmp=require_cmp(),debug=require_debug(),SemVer=require_semver(),Range=require_range()}});var require_satisfies=__commonJS({"../../node_modules/semver/functions/satisfies.js"(exports2,module2){"use strict";var Range=require_range(),satisfies=(version2,range,options)=>{try{range=new Range(range,options)}catch{return!1}return range.test(version2)};module2.exports=satisfies}});var require_to_comparators=__commonJS({"../../node_modules/semver/ranges/to-comparators.js"(exports2,module2){"use strict";var Range=require_range(),toComparators=(range,options)=>new Range(range,options).set.map(comp=>comp.map(c=>c.value).join(" ").trim().split(" "));module2.exports=toComparators}});var require_max_satisfying=__commonJS({"../../node_modules/semver/ranges/max-satisfying.js"(exports2,module2){"use strict";var SemVer=require_semver(),Range=require_range(),maxSatisfying=(versions,range,options)=>{let max=null,maxSV=null,rangeObj=null;try{rangeObj=new Range(range,options)}catch{return null}return versions.forEach(v=>{rangeObj.test(v)&&(!max||maxSV.compare(v)===-1)&&(max=v,maxSV=new SemVer(max,options))}),max};module2.exports=maxSatisfying}});var require_min_satisfying=__commonJS({"../../node_modules/semver/ranges/min-satisfying.js"(exports2,module2){"use strict";var SemVer=require_semver(),Range=require_range(),minSatisfying=(versions,range,options)=>{let min=null,minSV=null,rangeObj=null;try{rangeObj=new Range(range,options)}catch{return null}return versions.forEach(v=>{rangeObj.test(v)&&(!min||minSV.compare(v)===1)&&(min=v,minSV=new SemVer(min,options))}),min};module2.exports=minSatisfying}});var require_min_version=__commonJS({"../../node_modules/semver/ranges/min-version.js"(exports2,module2){"use strict";var SemVer=require_semver(),Range=require_range(),gt=require_gt(),minVersion=(range,loose)=>{range=new Range(range,loose);let minver=new SemVer("0.0.0");if(range.test(minver)||(minver=new SemVer("0.0.0-0"),range.test(minver)))return minver;minver=null;for(let i=0;i<range.set.length;++i){let comparators=range.set[i],setMin=null;comparators.forEach(comparator=>{let compver=new SemVer(comparator.semver.version);switch(comparator.operator){case">":compver.prerelease.length===0?compver.patch++:compver.prerelease.push(0),compver.raw=compver.format();case"":case">=":(!setMin||gt(compver,setMin))&&(setMin=compver);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${comparator.operator}`)}}),setMin&&(!minver||gt(minver,setMin))&&(minver=setMin)}return minver&&range.test(minver)?minver:null};module2.exports=minVersion}});var require_valid2=__commonJS({"../../node_modules/semver/ranges/valid.js"(exports2,module2){"use strict";var Range=require_range(),validRange=(range,options)=>{try{return new Range(range,options).range||"*"}catch{return null}};module2.exports=validRange}});var require_outside=__commonJS({"../../node_modules/semver/ranges/outside.js"(exports2,module2){"use strict";var SemVer=require_semver(),Comparator=require_comparator(),{ANY}=Comparator,Range=require_range(),satisfies=require_satisfies(),gt=require_gt(),lt=require_lt(),lte=require_lte(),gte=require_gte(),outside=(version2,range,hilo,options)=>{version2=new SemVer(version2,options),range=new Range(range,options);let gtfn,ltefn,ltfn,comp,ecomp;switch(hilo){case">":gtfn=gt,ltefn=lte,ltfn=lt,comp=">",ecomp=">=";break;case"<":gtfn=lt,ltefn=gte,ltfn=gt,comp="<",ecomp="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(satisfies(version2,range,options))return!1;for(let i=0;i<range.set.length;++i){let comparators=range.set[i],high=null,low=null;if(comparators.forEach(comparator=>{comparator.semver===ANY&&(comparator=new Comparator(">=0.0.0")),high=high||comparator,low=low||comparator,gtfn(comparator.semver,high.semver,options)?high=comparator:ltfn(comparator.semver,low.semver,options)&&(low=comparator)}),high.operator===comp||high.operator===ecomp||(!low.operator||low.operator===comp)&<efn(version2,low.semver))return!1;if(low.operator===ecomp&<fn(version2,low.semver))return!1}return!0};module2.exports=outside}});var require_gtr=__commonJS({"../../node_modules/semver/ranges/gtr.js"(exports2,module2){"use strict";var outside=require_outside(),gtr=(version2,range,options)=>outside(version2,range,">",options);module2.exports=gtr}});var require_ltr=__commonJS({"../../node_modules/semver/ranges/ltr.js"(exports2,module2){"use strict";var outside=require_outside(),ltr=(version2,range,options)=>outside(version2,range,"<",options);module2.exports=ltr}});var require_intersects=__commonJS({"../../node_modules/semver/ranges/intersects.js"(exports2,module2){"use strict";var Range=require_range(),intersects=(r1,r2,options)=>(r1=new Range(r1,options),r2=new Range(r2,options),r1.intersects(r2,options));module2.exports=intersects}});var require_simplify=__commonJS({"../../node_modules/semver/ranges/simplify.js"(exports2,module2){"use strict";var satisfies=require_satisfies(),compare=require_compare();module2.exports=(versions,range,options)=>{let set=[],first=null,prev=null,v=versions.sort((a,b)=>compare(a,b,options));for(let version2 of v)satisfies(version2,range,options)?(prev=version2,first||(first=version2)):(prev&&set.push([first,prev]),prev=null,first=null);first&&set.push([first,null]);let ranges=[];for(let[min,max]of set)min===max?ranges.push(min):!max&&min===v[0]?ranges.push("*"):max?min===v[0]?ranges.push(`<=${max}`):ranges.push(`${min} - ${max}`):ranges.push(`>=${min}`);let simplified=ranges.join(" || "),original=typeof range.raw=="string"?range.raw:String(range);return simplified.length<original.length?simplified:range}}});var require_subset=__commonJS({"../../node_modules/semver/ranges/subset.js"(exports2,module2){"use strict";var Range=require_range(),Comparator=require_comparator(),{ANY}=Comparator,satisfies=require_satisfies(),compare=require_compare(),subset=(sub,dom,options={})=>{if(sub===dom)return!0;sub=new Range(sub,options),dom=new Range(dom,options);let sawNonNull=!1;OUTER:for(let simpleSub of sub.set){for(let simpleDom of dom.set){let isSub=simpleSubset(simpleSub,simpleDom,options);if(sawNonNull=sawNonNull||isSub!==null,isSub)continue OUTER}if(sawNonNull)return!1}return!0},minimumVersionWithPreRelease=[new Comparator(">=0.0.0-0")],minimumVersion=[new Comparator(">=0.0.0")],simpleSubset=(sub,dom,options)=>{if(sub===dom)return!0;if(sub.length===1&&sub[0].semver===ANY){if(dom.length===1&&dom[0].semver===ANY)return!0;options.includePrerelease?sub=minimumVersionWithPreRelease:sub=minimumVersion}if(dom.length===1&&dom[0].semver===ANY){if(options.includePrerelease)return!0;dom=minimumVersion}let eqSet=new Set,gt,lt;for(let c of sub)c.operator===">"||c.operator===">="?gt=higherGT(gt,c,options):c.operator==="<"||c.operator==="<="?lt=lowerLT(lt,c,options):eqSet.add(c.semver);if(eqSet.size>1)return null;let gtltComp;if(gt&<){if(gtltComp=compare(gt.semver,lt.semver,options),gtltComp>0)return null;if(gtltComp===0&&(gt.operator!==">="||lt.operator!=="<="))return null}for(let eq of eqSet){if(gt&&!satisfies(eq,String(gt),options)||lt&&!satisfies(eq,String(lt),options))return null;for(let c of dom)if(!satisfies(eq,String(c),options))return!1;return!0}let higher,lower,hasDomLT,hasDomGT,needDomLTPre=lt&&!options.includePrerelease&<.semver.prerelease.length?lt.semver:!1,needDomGTPre=gt&&!options.includePrerelease&>.semver.prerelease.length?gt.semver:!1;needDomLTPre&&needDomLTPre.prerelease.length===1&<.operator==="<"&&needDomLTPre.prerelease[0]===0&&(needDomLTPre=!1);for(let c of dom){if(hasDomGT=hasDomGT||c.operator===">"||c.operator===">=",hasDomLT=hasDomLT||c.operator==="<"||c.operator==="<=",gt){if(needDomGTPre&&c.semver.prerelease&&c.semver.prerelease.length&&c.semver.major===needDomGTPre.major&&c.semver.minor===needDomGTPre.minor&&c.semver.patch===needDomGTPre.patch&&(needDomGTPre=!1),c.operator===">"||c.operator===">="){if(higher=higherGT(gt,c,options),higher===c&&higher!==gt)return!1}else if(gt.operator===">="&&!satisfies(gt.semver,String(c),options))return!1}if(lt){if(needDomLTPre&&c.semver.prerelease&&c.semver.prerelease.length&&c.semver.major===needDomLTPre.major&&c.semver.minor===needDomLTPre.minor&&c.semver.patch===needDomLTPre.patch&&(needDomLTPre=!1),c.operator==="<"||c.operator==="<="){if(lower=lowerLT(lt,c,options),lower===c&&lower!==lt)return!1}else if(lt.operator==="<="&&!satisfies(lt.semver,String(c),options))return!1}if(!c.operator&&(lt||gt)&>ltComp!==0)return!1}return!(gt&&hasDomLT&&!lt&>ltComp!==0||lt&&hasDomGT&&!gt&>ltComp!==0||needDomGTPre||needDomLTPre)},higherGT=(a,b,options)=>{if(!a)return b;let comp=compare(a.semver,b.semver,options);return comp>0?a:comp<0||b.operator===">"&&a.operator===">="?b:a},lowerLT=(a,b,options)=>{if(!a)return b;let comp=compare(a.semver,b.semver,options);return comp<0?a:comp>0||b.operator==="<"&&a.operator==="<="?b:a};module2.exports=subset}});var require_semver2=__commonJS({"../../node_modules/semver/index.js"(exports2,module2){"use strict";var internalRe=require_re(),constants=require_constants(),SemVer=require_semver(),identifiers=require_identifiers(),parse=require_parse(),valid=require_valid(),clean=require_clean(),inc=require_inc(),diff=require_diff(),major=require_major(),minor=require_minor(),patch=require_patch(),prerelease=require_prerelease(),compare=require_compare(),rcompare=require_rcompare(),compareLoose=require_compare_loose(),compareBuild=require_compare_build(),sort=require_sort(),rsort=require_rsort(),gt=require_gt(),lt=require_lt(),eq=require_eq(),neq=require_neq(),gte=require_gte(),lte=require_lte(),cmp=require_cmp(),coerce=require_coerce(),Comparator=require_comparator(),Range=require_range(),satisfies=require_satisfies(),toComparators=require_to_comparators(),maxSatisfying=require_max_satisfying(),minSatisfying=require_min_satisfying(),minVersion=require_min_version(),validRange=require_valid2(),outside=require_outside(),gtr=require_gtr(),ltr=require_ltr(),intersects=require_intersects(),simplifyRange=require_simplify(),subset=require_subset();module2.exports={parse,valid,clean,inc,diff,major,minor,patch,prerelease,compare,rcompare,compareLoose,compareBuild,sort,rsort,gt,lt,eq,neq,gte,lte,cmp,coerce,Comparator,Range,satisfies,toComparators,maxSatisfying,minSatisfying,minVersion,validRange,outside,gtr,ltr,intersects,simplifyRange,subset,SemVer,re:internalRe.re,src:internalRe.src,tokens:internalRe.t,SEMVER_SPEC_VERSION:constants.SEMVER_SPEC_VERSION,RELEASE_TYPES:constants.RELEASE_TYPES,compareIdentifiers:identifiers.compareIdentifiers,rcompareIdentifiers:identifiers.rcompareIdentifiers}}});var entry_preview_exports={};__export(entry_preview_exports,{beforeAll:()=>beforeAll,decorators:()=>decorators,mount:()=>mount,parameters:()=>parameters,render:()=>render,renderToCanvas:()=>renderToCanvas});module.exports=__toCommonJS(entry_preview_exports);var React4=__toESM(require("react")),import_semver=__toESM(require_semver2());var React=__toESM(require("react")),clonedReact={...React};function setReactActEnvironment(isReactActEnvironment){globalThis.IS_REACT_ACT_ENVIRONMENT=isReactActEnvironment}function getReactActEnvironment(){return globalThis.IS_REACT_ACT_ENVIRONMENT}function withGlobalActEnvironment(actImplementation){return callback=>{let previousActEnvironment=getReactActEnvironment();setReactActEnvironment(!0);try{let callbackNeedsToBeAwaited=!1,actResult=actImplementation(()=>{let result=callback();return result!==null&&typeof result=="object"&&typeof result.then=="function"&&(callbackNeedsToBeAwaited=!0),result});if(callbackNeedsToBeAwaited){let thenable=actResult;return{then:(resolve,reject)=>{thenable.then(returnValue=>{setReactActEnvironment(previousActEnvironment),resolve(returnValue)},error=>{setReactActEnvironment(previousActEnvironment),reject(error)})}}}else return setReactActEnvironment(previousActEnvironment),actResult}catch(error){throw setReactActEnvironment(previousActEnvironment),error}}}var getAct=async({ disableAct = false } = {})=>{if(disableAct){return cb => cb();}let reactAct;if(typeof clonedReact.act=="function")reactAct=clonedReact.act;else{let deprecatedTestUtils=await import("react-dom/test-utils");reactAct=deprecatedTestUtils?.default?.act??deprecatedTestUtils.act}return process.env.NODE_ENV==="production"?cb=>cb():withGlobalActEnvironment(reactAct)};var import_react=__toESM(require("react")),render=(args,context)=>{let{id,component:Component}=context;if(!Component)throw new Error(`Unable to render story ${id} as the component annotation is missing from the default export`);return import_react.default.createElement(Component,{...args})};var import_react2=__toESM(require("react")),import_global=require("@storybook/global");var{FRAMEWORK_OPTIONS}=import_global.global,ErrorBoundary=class extends import_react2.Component{constructor(){super(...arguments);this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidMount(){let{hasError}=this.state,{showMain}=this.props;hasError||showMain()}componentDidCatch(err){let{showException}=this.props;showException(err)}render(){let{hasError}=this.state,{children}=this.props;return hasError?null:children}},Wrapper=FRAMEWORK_OPTIONS?.strictMode?import_react2.StrictMode:import_react2.Fragment,actQueue=[],isActing=!1,processActQueue=async()=>{if(isActing||actQueue.length===0)return;isActing=!0;let actTask=actQueue.shift();actTask&&await actTask(),isActing=!1,processActQueue()};async function renderToCanvas({storyContext,unboundStoryFn,showMain,showException,forceRemount},canvasElement){let{renderElement,unmountElement}=await import("@storybook/react-dom-shim"),Story=unboundStoryFn,content=storyContext.parameters.__isPortableStory?import_react2.default.createElement(Story,{...storyContext}):import_react2.default.createElement(ErrorBoundary,{showMain,showException},import_react2.default.createElement(Story,{...storyContext})),element=Wrapper?import_react2.default.createElement(Wrapper,null,content):content;forceRemount&&unmountElement(canvasElement);let act=await getAct({ disableAct: storyContext.viewMode === 'docs' });return await new Promise(async(resolve,reject)=>{actQueue.push(async()=>{try{await act(async()=>{await renderElement(element,canvasElement,storyContext?.parameters?.react?.rootOptions)}),resolve()}catch(e){reject(e)}}),processActQueue()}),async()=>{await act(()=>{unmountElement(canvasElement)})}}var mount=context=>async ui=>(ui!=null&&(context.originalStoryFn=()=>ui),await context.renderToCanvas(),context.canvas);var parameters={renderer:"react"},decorators=[(story,context)=>{if(!context.parameters?.react?.rsc)return story();let major=import_semver.default.major(React4.version),minor=import_semver.default.minor(React4.version);if(major<18||major===18&&minor<3)throw new Error("React Server Components require React >= 18.3");return React4.createElement(React4.Suspense,null,story())}],beforeAll=async()=>{try{let{configure}=await import("@storybook/test"),act=await getAct();configure({unstable_advanceTimersWrapper:cb=>act(cb),asyncWrapper:async cb=>{let previousActEnvironment=getReactActEnvironment();setReactActEnvironment(!1);try{let result=await cb();return await new Promise(resolve=>{setTimeout(()=>{resolve()},0),jestFakeTimersAreEnabled()&&jest.advanceTimersByTime(0)}),result}finally{setReactActEnvironment(previousActEnvironment)}},eventWrapper:cb=>{let result;return act(()=>(result=cb(),result)),result}})}catch{}};function jestFakeTimersAreEnabled(){return typeof jest<"u"&&jest!==null?setTimeout._isMockFunction===!0||Object.prototype.hasOwnProperty.call(setTimeout,"clock"):!1}0&&(module.exports={beforeAll,decorators,mount,parameters,render,renderToCanvas});
    +diff --git a/dist/index.js b/dist/index.js
    +index a5f7adb33a7dee1a2ebe0cf7212abc9295876aeb..e4072173e291221d6e1c6ba206d4f5b438fd502f 100644
    +--- a/dist/index.js
    ++++ b/dist/index.js
    +@@ -26,7 +26,7 @@ Valid keys: `+JSON.stringify(Object.keys(shapeTypes),null,"  "));var error=check
    + `,newLineOrSpace:`
    + `,pad,indent:pad+combinedOptions.indent}:tokens={newLine:"@@__PRETTY_PRINT_NEW_LINE__@@",newLineOrSpace:"@@__PRETTY_PRINT_NEW_LINE_OR_SPACE__@@",pad:"@@__PRETTY_PRINT_PAD__@@",indent:"@@__PRETTY_PRINT_INDENT__@@"};var expandWhiteSpace=function(string){if(combinedOptions.inlineCharacterLimit===void 0)return string;var oneLined=string.replace(new RegExp(tokens.newLine,"g"),"").replace(new RegExp(tokens.newLineOrSpace,"g")," ").replace(new RegExp(tokens.pad+"|"+tokens.indent,"g"),"");return oneLined.length<=combinedOptions.inlineCharacterLimit?oneLined:string.replace(new RegExp(tokens.newLine+"|"+tokens.newLineOrSpace,"g"),`
    + `).replace(new RegExp(tokens.pad,"g"),pad).replace(new RegExp(tokens.indent,"g"),pad+combinedOptions.indent)};if(seen.indexOf(input)!==-1)return'"[Circular]"';if(input==null||typeof input=="number"||typeof input=="boolean"||typeof input=="function"||typeof input=="symbol"||isRegexp(input))return String(input);if(input instanceof Date)return"new Date('"+input.toISOString()+"')";if(Array.isArray(input)){if(input.length===0)return"[]";seen.push(input);var ret="["+tokens.newLine+input.map(function(el,i){var eol=input.length-1===i?tokens.newLine:","+tokens.newLineOrSpace,value=prettyPrint2(el,combinedOptions,pad+combinedOptions.indent);return combinedOptions.transform&&(value=combinedOptions.transform(input,i,value)),tokens.indent+value+eol}).join("")+tokens.pad+"]";return seen.pop(),expandWhiteSpace(ret)}if(isObj(input)){var objKeys_1=__spreadArrays(Object.keys(input),getOwnEnumPropSymbols(input));if(combinedOptions.filter&&(objKeys_1=objKeys_1.filter(function(el){return combinedOptions.filter&&combinedOptions.filter(input,el)})),objKeys_1.length===0)return"{}";seen.push(input);var ret="{"+tokens.newLine+objKeys_1.map(function(el,i){var eol=objKeys_1.length-1===i?tokens.newLine:","+tokens.newLineOrSpace,isSymbol=typeof el=="symbol",isClassic=!isSymbol&&/^[a-z$_][a-z$_0-9]*$/i.test(el.toString()),key=isSymbol||isClassic?el:prettyPrint2(el,combinedOptions),value=prettyPrint2(input[el],combinedOptions,pad+combinedOptions.indent);return combinedOptions.transform&&(value=combinedOptions.transform(input,el,value)),tokens.indent+String(key)+": "+value+eol}).join("")+tokens.pad+"}";return seen.pop(),expandWhiteSpace(ret)}return input=String(input).replace(/[\r\n]/g,function(x){return x===`
    +-`?"\\n":"\\r"}),combinedOptions.singleQuotes?(input=input.replace(/\\?'/g,"\\'"),"'"+input+"'"):(input=input.replace(/"/g,'\\"'),'"'+input+'"')}exports2.prettyPrint=prettyPrint2}});var require_react_is_production_min2=__commonJS({"../../node_modules/react-element-to-jsx-string/node_modules/react-is/cjs/react-is.production.min.js"(exports2){"use strict";var b=Symbol.for("react.element"),c=Symbol.for("react.portal"),d=Symbol.for("react.fragment"),e=Symbol.for("react.strict_mode"),f=Symbol.for("react.profiler"),g=Symbol.for("react.provider"),h=Symbol.for("react.context"),k=Symbol.for("react.server_context"),l=Symbol.for("react.forward_ref"),m=Symbol.for("react.suspense"),n=Symbol.for("react.suspense_list"),p=Symbol.for("react.memo"),q=Symbol.for("react.lazy"),t=Symbol.for("react.offscreen"),u;u=Symbol.for("react.module.reference");function v(a){if(typeof a=="object"&&a!==null){var r=a.$$typeof;switch(r){case b:switch(a=a.type,a){case d:case f:case e:case m:case n:return a;default:switch(a=a&&a.$$typeof,a){case k:case h:case l:case q:case p:case g:return a;default:return r}}case c:return r}}}exports2.ContextConsumer=h;exports2.ContextProvider=g;exports2.Element=b;exports2.ForwardRef=l;exports2.Fragment=d;exports2.Lazy=q;exports2.Memo=p;exports2.Portal=c;exports2.Profiler=f;exports2.StrictMode=e;exports2.Suspense=m;exports2.SuspenseList=n;exports2.isAsyncMode=function(){return!1};exports2.isConcurrentMode=function(){return!1};exports2.isContextConsumer=function(a){return v(a)===h};exports2.isContextProvider=function(a){return v(a)===g};exports2.isElement=function(a){return typeof a=="object"&&a!==null&&a.$$typeof===b};exports2.isForwardRef=function(a){return v(a)===l};exports2.isFragment=function(a){return v(a)===d};exports2.isLazy=function(a){return v(a)===q};exports2.isMemo=function(a){return v(a)===p};exports2.isPortal=function(a){return v(a)===c};exports2.isProfiler=function(a){return v(a)===f};exports2.isStrictMode=function(a){return v(a)===e};exports2.isSuspense=function(a){return v(a)===m};exports2.isSuspenseList=function(a){return v(a)===n};exports2.isValidElementType=function(a){return typeof a=="string"||typeof a=="function"||a===d||a===f||a===e||a===m||a===n||a===t||typeof a=="object"&&a!==null&&(a.$$typeof===q||a.$$typeof===p||a.$$typeof===g||a.$$typeof===h||a.$$typeof===l||a.$$typeof===u||a.getModuleId!==void 0)};exports2.typeOf=v}});var require_react_is_development2=__commonJS({"../../node_modules/react-element-to-jsx-string/node_modules/react-is/cjs/react-is.development.js"(exports2){"use strict";process.env.NODE_ENV!=="production"&&function(){"use strict";var enableScopeAPI=!1,enableCacheElement=!1,enableTransitionTracing=!1,enableLegacyHidden=!1,enableDebugTracing=!1,REACT_ELEMENT_TYPE=Symbol.for("react.element"),REACT_PORTAL_TYPE=Symbol.for("react.portal"),REACT_FRAGMENT_TYPE=Symbol.for("react.fragment"),REACT_STRICT_MODE_TYPE=Symbol.for("react.strict_mode"),REACT_PROFILER_TYPE=Symbol.for("react.profiler"),REACT_PROVIDER_TYPE=Symbol.for("react.provider"),REACT_CONTEXT_TYPE=Symbol.for("react.context"),REACT_SERVER_CONTEXT_TYPE=Symbol.for("react.server_context"),REACT_FORWARD_REF_TYPE=Symbol.for("react.forward_ref"),REACT_SUSPENSE_TYPE=Symbol.for("react.suspense"),REACT_SUSPENSE_LIST_TYPE=Symbol.for("react.suspense_list"),REACT_MEMO_TYPE=Symbol.for("react.memo"),REACT_LAZY_TYPE=Symbol.for("react.lazy"),REACT_OFFSCREEN_TYPE=Symbol.for("react.offscreen"),REACT_MODULE_REFERENCE;REACT_MODULE_REFERENCE=Symbol.for("react.module.reference");function isValidElementType(type){return!!(typeof type=="string"||typeof type=="function"||type===REACT_FRAGMENT_TYPE||type===REACT_PROFILER_TYPE||enableDebugTracing||type===REACT_STRICT_MODE_TYPE||type===REACT_SUSPENSE_TYPE||type===REACT_SUSPENSE_LIST_TYPE||enableLegacyHidden||type===REACT_OFFSCREEN_TYPE||enableScopeAPI||enableCacheElement||enableTransitionTracing||typeof type=="object"&&type!==null&&(type.$$typeof===REACT_LAZY_TYPE||type.$$typeof===REACT_MEMO_TYPE||type.$$typeof===REACT_PROVIDER_TYPE||type.$$typeof===REACT_CONTEXT_TYPE||type.$$typeof===REACT_FORWARD_REF_TYPE||type.$$typeof===REACT_MODULE_REFERENCE||type.getModuleId!==void 0))}function typeOf(object){if(typeof object=="object"&&object!==null){var $$typeof=object.$$typeof;switch($$typeof){case REACT_ELEMENT_TYPE:var type=object.type;switch(type){case REACT_FRAGMENT_TYPE:case REACT_PROFILER_TYPE:case REACT_STRICT_MODE_TYPE:case REACT_SUSPENSE_TYPE:case REACT_SUSPENSE_LIST_TYPE:return type;default:var $$typeofType=type&&type.$$typeof;switch($$typeofType){case REACT_SERVER_CONTEXT_TYPE:case REACT_CONTEXT_TYPE:case REACT_FORWARD_REF_TYPE:case REACT_LAZY_TYPE:case REACT_MEMO_TYPE:case REACT_PROVIDER_TYPE:return $$typeofType;default:return $$typeof}}case REACT_PORTAL_TYPE:return $$typeof}}}var ContextConsumer=REACT_CONTEXT_TYPE,ContextProvider=REACT_PROVIDER_TYPE,Element=REACT_ELEMENT_TYPE,ForwardRef2=REACT_FORWARD_REF_TYPE,Fragment3=REACT_FRAGMENT_TYPE,Lazy=REACT_LAZY_TYPE,Memo2=REACT_MEMO_TYPE,Portal=REACT_PORTAL_TYPE,Profiler=REACT_PROFILER_TYPE,StrictMode2=REACT_STRICT_MODE_TYPE,Suspense2=REACT_SUSPENSE_TYPE,SuspenseList=REACT_SUSPENSE_LIST_TYPE,hasWarnedAboutDeprecatedIsAsyncMode=!1,hasWarnedAboutDeprecatedIsConcurrentMode=!1;function isAsyncMode(object){return hasWarnedAboutDeprecatedIsAsyncMode||(hasWarnedAboutDeprecatedIsAsyncMode=!0,console.warn("The ReactIs.isAsyncMode() alias has been deprecated, and will be removed in React 18+.")),!1}function isConcurrentMode(object){return hasWarnedAboutDeprecatedIsConcurrentMode||(hasWarnedAboutDeprecatedIsConcurrentMode=!0,console.warn("The ReactIs.isConcurrentMode() alias has been deprecated, and will be removed in React 18+.")),!1}function isContextConsumer2(object){return typeOf(object)===REACT_CONTEXT_TYPE}function isContextProvider2(object){return typeOf(object)===REACT_PROVIDER_TYPE}function isElement(object){return typeof object=="object"&&object!==null&&object.$$typeof===REACT_ELEMENT_TYPE}function isForwardRef3(object){return typeOf(object)===REACT_FORWARD_REF_TYPE}function isFragment(object){return typeOf(object)===REACT_FRAGMENT_TYPE}function isLazy2(object){return typeOf(object)===REACT_LAZY_TYPE}function isMemo3(object){return typeOf(object)===REACT_MEMO_TYPE}function isPortal(object){return typeOf(object)===REACT_PORTAL_TYPE}function isProfiler2(object){return typeOf(object)===REACT_PROFILER_TYPE}function isStrictMode2(object){return typeOf(object)===REACT_STRICT_MODE_TYPE}function isSuspense2(object){return typeOf(object)===REACT_SUSPENSE_TYPE}function isSuspenseList(object){return typeOf(object)===REACT_SUSPENSE_LIST_TYPE}exports2.ContextConsumer=ContextConsumer,exports2.ContextProvider=ContextProvider,exports2.Element=Element,exports2.ForwardRef=ForwardRef2,exports2.Fragment=Fragment3,exports2.Lazy=Lazy,exports2.Memo=Memo2,exports2.Portal=Portal,exports2.Profiler=Profiler,exports2.StrictMode=StrictMode2,exports2.Suspense=Suspense2,exports2.SuspenseList=SuspenseList,exports2.isAsyncMode=isAsyncMode,exports2.isConcurrentMode=isConcurrentMode,exports2.isContextConsumer=isContextConsumer2,exports2.isContextProvider=isContextProvider2,exports2.isElement=isElement,exports2.isForwardRef=isForwardRef3,exports2.isFragment=isFragment,exports2.isLazy=isLazy2,exports2.isMemo=isMemo3,exports2.isPortal=isPortal,exports2.isProfiler=isProfiler2,exports2.isStrictMode=isStrictMode2,exports2.isSuspense=isSuspense2,exports2.isSuspenseList=isSuspenseList,exports2.isValidElementType=isValidElementType,exports2.typeOf=typeOf}()}});var require_react_is2=__commonJS({"../../node_modules/react-element-to-jsx-string/node_modules/react-is/index.js"(exports2,module2){"use strict";process.env.NODE_ENV==="production"?module2.exports=require_react_is_production_min2():module2.exports=require_react_is_development2()}});var index_exports={};__export(index_exports,{INTERNAL_DEFAULT_PROJECT_ANNOTATIONS:()=>INTERNAL_DEFAULT_PROJECT_ANNOTATIONS,__definePreview:()=>__definePreview,composeStories:()=>composeStories,composeStory:()=>composeStory,setProjectAnnotations:()=>setProjectAnnotations});module.exports=__toCommonJS(index_exports);var import_global=require("@storybook/global"),{window:globalWindow}=import_global.global;globalWindow&&(globalWindow.STORYBOOK_ENV="react");var React5=__toESM(require("react")),import_preview_api=require("storybook/internal/preview-api");var entry_preview_exports={};__export(entry_preview_exports,{beforeAll:()=>beforeAll,decorators:()=>decorators,mount:()=>mount,parameters:()=>parameters,render:()=>render,renderToCanvas:()=>renderToCanvas});var React4=__toESM(require("react")),import_semver=__toESM(require_semver2());var React=__toESM(require("react")),clonedReact={...React};function setReactActEnvironment(isReactActEnvironment){globalThis.IS_REACT_ACT_ENVIRONMENT=isReactActEnvironment}function getReactActEnvironment(){return globalThis.IS_REACT_ACT_ENVIRONMENT}function withGlobalActEnvironment(actImplementation){return callback=>{let previousActEnvironment=getReactActEnvironment();setReactActEnvironment(!0);try{let callbackNeedsToBeAwaited=!1,actResult=actImplementation(()=>{let result=callback();return result!==null&&typeof result=="object"&&typeof result.then=="function"&&(callbackNeedsToBeAwaited=!0),result});if(callbackNeedsToBeAwaited){let thenable=actResult;return{then:(resolve,reject)=>{thenable.then(returnValue=>{setReactActEnvironment(previousActEnvironment),resolve(returnValue)},error=>{setReactActEnvironment(previousActEnvironment),reject(error)})}}}else return setReactActEnvironment(previousActEnvironment),actResult}catch(error){throw setReactActEnvironment(previousActEnvironment),error}}}var getAct=async()=>{let reactAct;if(typeof clonedReact.act=="function")reactAct=clonedReact.act;else{let deprecatedTestUtils=await import("react-dom/test-utils");reactAct=deprecatedTestUtils?.default?.act??deprecatedTestUtils.act}return process.env.NODE_ENV==="production"?cb=>cb():withGlobalActEnvironment(reactAct)};var import_react=__toESM(require("react")),render=(args,context)=>{let{id,component:Component}=context;if(!Component)throw new Error(`Unable to render story ${id} as the component annotation is missing from the default export`);return import_react.default.createElement(Component,{...args})};var import_react2=__toESM(require("react")),import_global2=require("@storybook/global");var{FRAMEWORK_OPTIONS}=import_global2.global,ErrorBoundary=class extends import_react2.Component{constructor(){super(...arguments);this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidMount(){let{hasError}=this.state,{showMain}=this.props;hasError||showMain()}componentDidCatch(err){let{showException}=this.props;showException(err)}render(){let{hasError}=this.state,{children}=this.props;return hasError?null:children}},Wrapper=FRAMEWORK_OPTIONS?.strictMode?import_react2.StrictMode:import_react2.Fragment,actQueue=[],isActing=!1,processActQueue=async()=>{if(isActing||actQueue.length===0)return;isActing=!0;let actTask=actQueue.shift();actTask&&await actTask(),isActing=!1,processActQueue()};async function renderToCanvas({storyContext,unboundStoryFn,showMain,showException,forceRemount},canvasElement){let{renderElement,unmountElement}=await import("@storybook/react-dom-shim"),Story=unboundStoryFn,content=storyContext.parameters.__isPortableStory?import_react2.default.createElement(Story,{...storyContext}):import_react2.default.createElement(ErrorBoundary,{showMain,showException},import_react2.default.createElement(Story,{...storyContext})),element=Wrapper?import_react2.default.createElement(Wrapper,null,content):content;forceRemount&&unmountElement(canvasElement);let act=await getAct();return await new Promise(async(resolve,reject)=>{actQueue.push(async()=>{try{await act(async()=>{await renderElement(element,canvasElement,storyContext?.parameters?.react?.rootOptions)}),resolve()}catch(e){reject(e)}}),processActQueue()}),async()=>{await act(()=>{unmountElement(canvasElement)})}}var mount=context=>async ui=>(ui!=null&&(context.originalStoryFn=()=>ui),await context.renderToCanvas(),context.canvas);var parameters={renderer:"react"},decorators=[(story,context)=>{if(!context.parameters?.react?.rsc)return story();let major=import_semver.default.major(React4.version),minor=import_semver.default.minor(React4.version);if(major<18||major===18&&minor<3)throw new Error("React Server Components require React >= 18.3");return React4.createElement(React4.Suspense,null,story())}],beforeAll=async()=>{try{let{configure}=await import("@storybook/test"),act=await getAct();configure({unstable_advanceTimersWrapper:cb=>act(cb),asyncWrapper:async cb=>{let previousActEnvironment=getReactActEnvironment();setReactActEnvironment(!1);try{let result=await cb();return await new Promise(resolve=>{setTimeout(()=>{resolve()},0),jestFakeTimersAreEnabled()&&jest.advanceTimersByTime(0)}),result}finally{setReactActEnvironment(previousActEnvironment)}},eventWrapper:cb=>{let result;return act(()=>(result=cb(),result)),result}})}catch{}};function jestFakeTimersAreEnabled(){return typeof jest<"u"&&jest!==null?setTimeout._isMockFunction===!0||Object.prototype.hasOwnProperty.call(setTimeout,"clock"):!1}function setProjectAnnotations(projectAnnotations){return(0,import_preview_api.setDefaultProjectAnnotations)(INTERNAL_DEFAULT_PROJECT_ANNOTATIONS),(0,import_preview_api.setProjectAnnotations)(projectAnnotations)}var INTERNAL_DEFAULT_PROJECT_ANNOTATIONS={...entry_preview_exports,renderToCanvas:async(renderContext,canvasElement)=>{if(renderContext.storyContext.testingLibraryRender==null)return renderToCanvas(renderContext,canvasElement);let{storyContext:{context,unboundStoryFn:Story,testingLibraryRender:render2}}=renderContext,{unmount}=render2(React5.createElement(Story,{...context}),{container:context.canvasElement});return unmount}};function composeStory(story,componentAnnotations,projectAnnotations,exportsName){return(0,import_preview_api.composeStory)(story,componentAnnotations,projectAnnotations,globalThis.globalProjectAnnotations??INTERNAL_DEFAULT_PROJECT_ANNOTATIONS,exportsName)}function composeStories(csfExports,projectAnnotations){return(0,import_preview_api.composeStories)(csfExports,projectAnnotations,composeStory)}var import_csf=require("storybook/internal/csf");var entry_preview_docs_exports={};__export(entry_preview_docs_exports,{applyDecorators:()=>applyDecorators,argTypesEnhancers:()=>argTypesEnhancers,decorators:()=>decorators2,parameters:()=>parameters2});var import_docs_tools9=require("storybook/internal/docs-tools");var import_docs_tools7=require("storybook/internal/docs-tools"),import_prop_types=__toESM(require_prop_types());var CUSTOM_CAPTION="custom",OBJECT_CAPTION="object",ARRAY_CAPTION="array",CLASS_CAPTION="class",FUNCTION_CAPTION="func",ELEMENT_CAPTION="element";var import_html_tags=__toESM(require_html_tags2());function isHtmlTag(tagName){return import_html_tags.default.includes(tagName.toLowerCase())}var import_escodegen=__toESM(require_escodegen());function dedent(templ){for(var values=[],_i=1;_i<arguments.length;_i++)values[_i-1]=arguments[_i];var strings=Array.from(typeof templ=="string"?[templ]:templ);strings[strings.length-1]=strings[strings.length-1].replace(/\r?\n([\t ]*)$/,"");var indentLengths=strings.reduce(function(arr,str){var matches=str.match(/\n([\t ]+|(?!\s).)/g);return matches?arr.concat(matches.map(function(match){var _a,_b;return(_b=(_a=match.match(/[\t ]/g))===null||_a===void 0?void 0:_a.length)!==null&&_b!==void 0?_b:0})):arr},[]);if(indentLengths.length){var pattern_1=new RegExp(`
    ++`?"\\n":"\\r"}),combinedOptions.singleQuotes?(input=input.replace(/\\?'/g,"\\'"),"'"+input+"'"):(input=input.replace(/"/g,'\\"'),'"'+input+'"')}exports2.prettyPrint=prettyPrint2}});var require_react_is_production_min2=__commonJS({"../../node_modules/react-element-to-jsx-string/node_modules/react-is/cjs/react-is.production.min.js"(exports2){"use strict";var b=Symbol.for("react.element"),c=Symbol.for("react.portal"),d=Symbol.for("react.fragment"),e=Symbol.for("react.strict_mode"),f=Symbol.for("react.profiler"),g=Symbol.for("react.provider"),h=Symbol.for("react.context"),k=Symbol.for("react.server_context"),l=Symbol.for("react.forward_ref"),m=Symbol.for("react.suspense"),n=Symbol.for("react.suspense_list"),p=Symbol.for("react.memo"),q=Symbol.for("react.lazy"),t=Symbol.for("react.offscreen"),u;u=Symbol.for("react.module.reference");function v(a){if(typeof a=="object"&&a!==null){var r=a.$$typeof;switch(r){case b:switch(a=a.type,a){case d:case f:case e:case m:case n:return a;default:switch(a=a&&a.$$typeof,a){case k:case h:case l:case q:case p:case g:return a;default:return r}}case c:return r}}}exports2.ContextConsumer=h;exports2.ContextProvider=g;exports2.Element=b;exports2.ForwardRef=l;exports2.Fragment=d;exports2.Lazy=q;exports2.Memo=p;exports2.Portal=c;exports2.Profiler=f;exports2.StrictMode=e;exports2.Suspense=m;exports2.SuspenseList=n;exports2.isAsyncMode=function(){return!1};exports2.isConcurrentMode=function(){return!1};exports2.isContextConsumer=function(a){return v(a)===h};exports2.isContextProvider=function(a){return v(a)===g};exports2.isElement=function(a){return typeof a=="object"&&a!==null&&a.$$typeof===b};exports2.isForwardRef=function(a){return v(a)===l};exports2.isFragment=function(a){return v(a)===d};exports2.isLazy=function(a){return v(a)===q};exports2.isMemo=function(a){return v(a)===p};exports2.isPortal=function(a){return v(a)===c};exports2.isProfiler=function(a){return v(a)===f};exports2.isStrictMode=function(a){return v(a)===e};exports2.isSuspense=function(a){return v(a)===m};exports2.isSuspenseList=function(a){return v(a)===n};exports2.isValidElementType=function(a){return typeof a=="string"||typeof a=="function"||a===d||a===f||a===e||a===m||a===n||a===t||typeof a=="object"&&a!==null&&(a.$$typeof===q||a.$$typeof===p||a.$$typeof===g||a.$$typeof===h||a.$$typeof===l||a.$$typeof===u||a.getModuleId!==void 0)};exports2.typeOf=v}});var require_react_is_development2=__commonJS({"../../node_modules/react-element-to-jsx-string/node_modules/react-is/cjs/react-is.development.js"(exports2){"use strict";process.env.NODE_ENV!=="production"&&function(){"use strict";var enableScopeAPI=!1,enableCacheElement=!1,enableTransitionTracing=!1,enableLegacyHidden=!1,enableDebugTracing=!1,REACT_ELEMENT_TYPE=Symbol.for("react.element"),REACT_PORTAL_TYPE=Symbol.for("react.portal"),REACT_FRAGMENT_TYPE=Symbol.for("react.fragment"),REACT_STRICT_MODE_TYPE=Symbol.for("react.strict_mode"),REACT_PROFILER_TYPE=Symbol.for("react.profiler"),REACT_PROVIDER_TYPE=Symbol.for("react.provider"),REACT_CONTEXT_TYPE=Symbol.for("react.context"),REACT_SERVER_CONTEXT_TYPE=Symbol.for("react.server_context"),REACT_FORWARD_REF_TYPE=Symbol.for("react.forward_ref"),REACT_SUSPENSE_TYPE=Symbol.for("react.suspense"),REACT_SUSPENSE_LIST_TYPE=Symbol.for("react.suspense_list"),REACT_MEMO_TYPE=Symbol.for("react.memo"),REACT_LAZY_TYPE=Symbol.for("react.lazy"),REACT_OFFSCREEN_TYPE=Symbol.for("react.offscreen"),REACT_MODULE_REFERENCE;REACT_MODULE_REFERENCE=Symbol.for("react.module.reference");function isValidElementType(type){return!!(typeof type=="string"||typeof type=="function"||type===REACT_FRAGMENT_TYPE||type===REACT_PROFILER_TYPE||enableDebugTracing||type===REACT_STRICT_MODE_TYPE||type===REACT_SUSPENSE_TYPE||type===REACT_SUSPENSE_LIST_TYPE||enableLegacyHidden||type===REACT_OFFSCREEN_TYPE||enableScopeAPI||enableCacheElement||enableTransitionTracing||typeof type=="object"&&type!==null&&(type.$$typeof===REACT_LAZY_TYPE||type.$$typeof===REACT_MEMO_TYPE||type.$$typeof===REACT_PROVIDER_TYPE||type.$$typeof===REACT_CONTEXT_TYPE||type.$$typeof===REACT_FORWARD_REF_TYPE||type.$$typeof===REACT_MODULE_REFERENCE||type.getModuleId!==void 0))}function typeOf(object){if(typeof object=="object"&&object!==null){var $$typeof=object.$$typeof;switch($$typeof){case REACT_ELEMENT_TYPE:var type=object.type;switch(type){case REACT_FRAGMENT_TYPE:case REACT_PROFILER_TYPE:case REACT_STRICT_MODE_TYPE:case REACT_SUSPENSE_TYPE:case REACT_SUSPENSE_LIST_TYPE:return type;default:var $$typeofType=type&&type.$$typeof;switch($$typeofType){case REACT_SERVER_CONTEXT_TYPE:case REACT_CONTEXT_TYPE:case REACT_FORWARD_REF_TYPE:case REACT_LAZY_TYPE:case REACT_MEMO_TYPE:case REACT_PROVIDER_TYPE:return $$typeofType;default:return $$typeof}}case REACT_PORTAL_TYPE:return $$typeof}}}var ContextConsumer=REACT_CONTEXT_TYPE,ContextProvider=REACT_PROVIDER_TYPE,Element=REACT_ELEMENT_TYPE,ForwardRef2=REACT_FORWARD_REF_TYPE,Fragment3=REACT_FRAGMENT_TYPE,Lazy=REACT_LAZY_TYPE,Memo2=REACT_MEMO_TYPE,Portal=REACT_PORTAL_TYPE,Profiler=REACT_PROFILER_TYPE,StrictMode2=REACT_STRICT_MODE_TYPE,Suspense2=REACT_SUSPENSE_TYPE,SuspenseList=REACT_SUSPENSE_LIST_TYPE,hasWarnedAboutDeprecatedIsAsyncMode=!1,hasWarnedAboutDeprecatedIsConcurrentMode=!1;function isAsyncMode(object){return hasWarnedAboutDeprecatedIsAsyncMode||(hasWarnedAboutDeprecatedIsAsyncMode=!0,console.warn("The ReactIs.isAsyncMode() alias has been deprecated, and will be removed in React 18+.")),!1}function isConcurrentMode(object){return hasWarnedAboutDeprecatedIsConcurrentMode||(hasWarnedAboutDeprecatedIsConcurrentMode=!0,console.warn("The ReactIs.isConcurrentMode() alias has been deprecated, and will be removed in React 18+.")),!1}function isContextConsumer2(object){return typeOf(object)===REACT_CONTEXT_TYPE}function isContextProvider2(object){return typeOf(object)===REACT_PROVIDER_TYPE}function isElement(object){return typeof object=="object"&&object!==null&&object.$$typeof===REACT_ELEMENT_TYPE}function isForwardRef3(object){return typeOf(object)===REACT_FORWARD_REF_TYPE}function isFragment(object){return typeOf(object)===REACT_FRAGMENT_TYPE}function isLazy2(object){return typeOf(object)===REACT_LAZY_TYPE}function isMemo3(object){return typeOf(object)===REACT_MEMO_TYPE}function isPortal(object){return typeOf(object)===REACT_PORTAL_TYPE}function isProfiler2(object){return typeOf(object)===REACT_PROFILER_TYPE}function isStrictMode2(object){return typeOf(object)===REACT_STRICT_MODE_TYPE}function isSuspense2(object){return typeOf(object)===REACT_SUSPENSE_TYPE}function isSuspenseList(object){return typeOf(object)===REACT_SUSPENSE_LIST_TYPE}exports2.ContextConsumer=ContextConsumer,exports2.ContextProvider=ContextProvider,exports2.Element=Element,exports2.ForwardRef=ForwardRef2,exports2.Fragment=Fragment3,exports2.Lazy=Lazy,exports2.Memo=Memo2,exports2.Portal=Portal,exports2.Profiler=Profiler,exports2.StrictMode=StrictMode2,exports2.Suspense=Suspense2,exports2.SuspenseList=SuspenseList,exports2.isAsyncMode=isAsyncMode,exports2.isConcurrentMode=isConcurrentMode,exports2.isContextConsumer=isContextConsumer2,exports2.isContextProvider=isContextProvider2,exports2.isElement=isElement,exports2.isForwardRef=isForwardRef3,exports2.isFragment=isFragment,exports2.isLazy=isLazy2,exports2.isMemo=isMemo3,exports2.isPortal=isPortal,exports2.isProfiler=isProfiler2,exports2.isStrictMode=isStrictMode2,exports2.isSuspense=isSuspense2,exports2.isSuspenseList=isSuspenseList,exports2.isValidElementType=isValidElementType,exports2.typeOf=typeOf}()}});var require_react_is2=__commonJS({"../../node_modules/react-element-to-jsx-string/node_modules/react-is/index.js"(exports2,module2){"use strict";process.env.NODE_ENV==="production"?module2.exports=require_react_is_production_min2():module2.exports=require_react_is_development2()}});var index_exports={};__export(index_exports,{INTERNAL_DEFAULT_PROJECT_ANNOTATIONS:()=>INTERNAL_DEFAULT_PROJECT_ANNOTATIONS,__definePreview:()=>__definePreview,composeStories:()=>composeStories,composeStory:()=>composeStory,setProjectAnnotations:()=>setProjectAnnotations});module.exports=__toCommonJS(index_exports);var import_global=require("@storybook/global"),{window:globalWindow}=import_global.global;globalWindow&&(globalWindow.STORYBOOK_ENV="react");var React5=__toESM(require("react")),import_preview_api=require("storybook/internal/preview-api");var entry_preview_exports={};__export(entry_preview_exports,{beforeAll:()=>beforeAll,decorators:()=>decorators,mount:()=>mount,parameters:()=>parameters,render:()=>render,renderToCanvas:()=>renderToCanvas});var React4=__toESM(require("react")),import_semver=__toESM(require_semver2());var React=__toESM(require("react")),clonedReact={...React};function setReactActEnvironment(isReactActEnvironment){globalThis.IS_REACT_ACT_ENVIRONMENT=isReactActEnvironment}function getReactActEnvironment(){return globalThis.IS_REACT_ACT_ENVIRONMENT}function withGlobalActEnvironment(actImplementation){return callback=>{let previousActEnvironment=getReactActEnvironment();setReactActEnvironment(!0);try{let callbackNeedsToBeAwaited=!1,actResult=actImplementation(()=>{let result=callback();return result!==null&&typeof result=="object"&&typeof result.then=="function"&&(callbackNeedsToBeAwaited=!0),result});if(callbackNeedsToBeAwaited){let thenable=actResult;return{then:(resolve,reject)=>{thenable.then(returnValue=>{setReactActEnvironment(previousActEnvironment),resolve(returnValue)},error=>{setReactActEnvironment(previousActEnvironment),reject(error)})}}}else return setReactActEnvironment(previousActEnvironment),actResult}catch(error){throw setReactActEnvironment(previousActEnvironment),error}}}var getAct=async({ disableAct = false } = {})=>{if(disableAct){return cb => cb();}let reactAct;if(typeof clonedReact.act=="function")reactAct=clonedReact.act;else{let deprecatedTestUtils=await import("react-dom/test-utils");reactAct=deprecatedTestUtils?.default?.act??deprecatedTestUtils.act}return process.env.NODE_ENV==="production"?cb=>cb():withGlobalActEnvironment(reactAct)};var import_react=__toESM(require("react")),render=(args,context)=>{let{id,component:Component}=context;if(!Component)throw new Error(`Unable to render story ${id} as the component annotation is missing from the default export`);return import_react.default.createElement(Component,{...args})};var import_react2=__toESM(require("react")),import_global2=require("@storybook/global");var{FRAMEWORK_OPTIONS}=import_global2.global,ErrorBoundary=class extends import_react2.Component{constructor(){super(...arguments);this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidMount(){let{hasError}=this.state,{showMain}=this.props;hasError||showMain()}componentDidCatch(err){let{showException}=this.props;showException(err)}render(){let{hasError}=this.state,{children}=this.props;return hasError?null:children}},Wrapper=FRAMEWORK_OPTIONS?.strictMode?import_react2.StrictMode:import_react2.Fragment,actQueue=[],isActing=!1,processActQueue=async()=>{if(isActing||actQueue.length===0)return;isActing=!0;let actTask=actQueue.shift();actTask&&await actTask(),isActing=!1,processActQueue()};async function renderToCanvas({storyContext,unboundStoryFn,showMain,showException,forceRemount},canvasElement){let{renderElement,unmountElement}=await import("@storybook/react-dom-shim"),Story=unboundStoryFn,content=storyContext.parameters.__isPortableStory?import_react2.default.createElement(Story,{...storyContext}):import_react2.default.createElement(ErrorBoundary,{showMain,showException},import_react2.default.createElement(Story,{...storyContext})),element=Wrapper?import_react2.default.createElement(Wrapper,null,content):content;forceRemount&&unmountElement(canvasElement);let act=await getAct({ disableAct: storyContext.viewMode === 'docs' });return await new Promise(async(resolve,reject)=>{actQueue.push(async()=>{try{await act(async()=>{await renderElement(element,canvasElement,storyContext?.parameters?.react?.rootOptions)}),resolve()}catch(e){reject(e)}}),processActQueue()}),async()=>{await act(()=>{unmountElement(canvasElement)})}}var mount=context=>async ui=>(ui!=null&&(context.originalStoryFn=()=>ui),await context.renderToCanvas(),context.canvas);var parameters={renderer:"react"},decorators=[(story,context)=>{if(!context.parameters?.react?.rsc)return story();let major=import_semver.default.major(React4.version),minor=import_semver.default.minor(React4.version);if(major<18||major===18&&minor<3)throw new Error("React Server Components require React >= 18.3");return React4.createElement(React4.Suspense,null,story())}],beforeAll=async()=>{try{let{configure}=await import("@storybook/test"),act=await getAct();configure({unstable_advanceTimersWrapper:cb=>act(cb),asyncWrapper:async cb=>{let previousActEnvironment=getReactActEnvironment();setReactActEnvironment(!1);try{let result=await cb();return await new Promise(resolve=>{setTimeout(()=>{resolve()},0),jestFakeTimersAreEnabled()&&jest.advanceTimersByTime(0)}),result}finally{setReactActEnvironment(previousActEnvironment)}},eventWrapper:cb=>{let result;return act(()=>(result=cb(),result)),result}})}catch{}};function jestFakeTimersAreEnabled(){return typeof jest<"u"&&jest!==null?setTimeout._isMockFunction===!0||Object.prototype.hasOwnProperty.call(setTimeout,"clock"):!1}function setProjectAnnotations(projectAnnotations){return(0,import_preview_api.setDefaultProjectAnnotations)(INTERNAL_DEFAULT_PROJECT_ANNOTATIONS),(0,import_preview_api.setProjectAnnotations)(projectAnnotations)}var INTERNAL_DEFAULT_PROJECT_ANNOTATIONS={...entry_preview_exports,renderToCanvas:async(renderContext,canvasElement)=>{if(renderContext.storyContext.testingLibraryRender==null)return renderToCanvas(renderContext,canvasElement);let{storyContext:{context,unboundStoryFn:Story,testingLibraryRender:render2}}=renderContext,{unmount}=render2(React5.createElement(Story,{...context}),{container:context.canvasElement});return unmount}};function composeStory(story,componentAnnotations,projectAnnotations,exportsName){return(0,import_preview_api.composeStory)(story,componentAnnotations,projectAnnotations,globalThis.globalProjectAnnotations??INTERNAL_DEFAULT_PROJECT_ANNOTATIONS,exportsName)}function composeStories(csfExports,projectAnnotations){return(0,import_preview_api.composeStories)(csfExports,projectAnnotations,composeStory)}var import_csf=require("storybook/internal/csf");var entry_preview_docs_exports={};__export(entry_preview_docs_exports,{applyDecorators:()=>applyDecorators,argTypesEnhancers:()=>argTypesEnhancers,decorators:()=>decorators2,parameters:()=>parameters2});var import_docs_tools9=require("storybook/internal/docs-tools");var import_docs_tools7=require("storybook/internal/docs-tools"),import_prop_types=__toESM(require_prop_types());var CUSTOM_CAPTION="custom",OBJECT_CAPTION="object",ARRAY_CAPTION="array",CLASS_CAPTION="class",FUNCTION_CAPTION="func",ELEMENT_CAPTION="element";var import_html_tags=__toESM(require_html_tags2());function isHtmlTag(tagName){return import_html_tags.default.includes(tagName.toLowerCase())}var import_escodegen=__toESM(require_escodegen());function dedent(templ){for(var values=[],_i=1;_i<arguments.length;_i++)values[_i-1]=arguments[_i];var strings=Array.from(typeof templ=="string"?[templ]:templ);strings[strings.length-1]=strings[strings.length-1].replace(/\r?\n([\t ]*)$/,"");var indentLengths=strings.reduce(function(arr,str){var matches=str.match(/\n([\t ]+|(?!\s).)/g);return matches?arr.concat(matches.map(function(match){var _a,_b;return(_b=(_a=match.match(/[\t ]/g))===null||_a===void 0?void 0:_a.length)!==null&&_b!==void 0?_b:0})):arr},[]);if(indentLengths.length){var pattern_1=new RegExp(`
    + [	 ]{`+Math.min.apply(Math,indentLengths)+"}","g");strings=strings.map(function(str){return str.replace(pattern_1,`
    + `)})}strings[0]=strings[0].replace(/^\r?\n/,"");var string=strings[0];return values.forEach(function(value,i){var endentations=string.match(/(?:^|\n)( *)$/),endentation=endentations?endentations[1]:"",indentedValue=value;typeof value=="string"&&value.includes(`
    + `)&&(indentedValue=String(value).split(`
    +diff --git a/dist/preview.js b/dist/preview.js
    +index a0b76119b58cc42ce668943d08510c54ce20d3f0..584a6dac6e5901eb96b016b0e955719df612096f 100644
    +--- a/dist/preview.js
    ++++ b/dist/preview.js
    +@@ -26,7 +26,7 @@ Valid keys: `+JSON.stringify(Object.keys(shapeTypes),null,"  "));var error=check
    + `,newLineOrSpace:`
    + `,pad,indent:pad+combinedOptions.indent}:tokens={newLine:"@@__PRETTY_PRINT_NEW_LINE__@@",newLineOrSpace:"@@__PRETTY_PRINT_NEW_LINE_OR_SPACE__@@",pad:"@@__PRETTY_PRINT_PAD__@@",indent:"@@__PRETTY_PRINT_INDENT__@@"};var expandWhiteSpace=function(string){if(combinedOptions.inlineCharacterLimit===void 0)return string;var oneLined=string.replace(new RegExp(tokens.newLine,"g"),"").replace(new RegExp(tokens.newLineOrSpace,"g")," ").replace(new RegExp(tokens.pad+"|"+tokens.indent,"g"),"");return oneLined.length<=combinedOptions.inlineCharacterLimit?oneLined:string.replace(new RegExp(tokens.newLine+"|"+tokens.newLineOrSpace,"g"),`
    + `).replace(new RegExp(tokens.pad,"g"),pad).replace(new RegExp(tokens.indent,"g"),pad+combinedOptions.indent)};if(seen.indexOf(input)!==-1)return'"[Circular]"';if(input==null||typeof input=="number"||typeof input=="boolean"||typeof input=="function"||typeof input=="symbol"||isRegexp(input))return String(input);if(input instanceof Date)return"new Date('"+input.toISOString()+"')";if(Array.isArray(input)){if(input.length===0)return"[]";seen.push(input);var ret="["+tokens.newLine+input.map(function(el,i){var eol=input.length-1===i?tokens.newLine:","+tokens.newLineOrSpace,value=prettyPrint2(el,combinedOptions,pad+combinedOptions.indent);return combinedOptions.transform&&(value=combinedOptions.transform(input,i,value)),tokens.indent+value+eol}).join("")+tokens.pad+"]";return seen.pop(),expandWhiteSpace(ret)}if(isObj(input)){var objKeys_1=__spreadArrays(Object.keys(input),getOwnEnumPropSymbols(input));if(combinedOptions.filter&&(objKeys_1=objKeys_1.filter(function(el){return combinedOptions.filter&&combinedOptions.filter(input,el)})),objKeys_1.length===0)return"{}";seen.push(input);var ret="{"+tokens.newLine+objKeys_1.map(function(el,i){var eol=objKeys_1.length-1===i?tokens.newLine:","+tokens.newLineOrSpace,isSymbol=typeof el=="symbol",isClassic=!isSymbol&&/^[a-z$_][a-z$_0-9]*$/i.test(el.toString()),key=isSymbol||isClassic?el:prettyPrint2(el,combinedOptions),value=prettyPrint2(input[el],combinedOptions,pad+combinedOptions.indent);return combinedOptions.transform&&(value=combinedOptions.transform(input,el,value)),tokens.indent+String(key)+": "+value+eol}).join("")+tokens.pad+"}";return seen.pop(),expandWhiteSpace(ret)}return input=String(input).replace(/[\r\n]/g,function(x){return x===`
    +-`?"\\n":"\\r"}),combinedOptions.singleQuotes?(input=input.replace(/\\?'/g,"\\'"),"'"+input+"'"):(input=input.replace(/"/g,'\\"'),'"'+input+'"')}exports2.prettyPrint=prettyPrint2}});var require_react_is_production_min2=__commonJS({"../../node_modules/react-element-to-jsx-string/node_modules/react-is/cjs/react-is.production.min.js"(exports2){"use strict";var b=Symbol.for("react.element"),c=Symbol.for("react.portal"),d=Symbol.for("react.fragment"),e=Symbol.for("react.strict_mode"),f=Symbol.for("react.profiler"),g=Symbol.for("react.provider"),h=Symbol.for("react.context"),k=Symbol.for("react.server_context"),l=Symbol.for("react.forward_ref"),m=Symbol.for("react.suspense"),n=Symbol.for("react.suspense_list"),p=Symbol.for("react.memo"),q=Symbol.for("react.lazy"),t=Symbol.for("react.offscreen"),u;u=Symbol.for("react.module.reference");function v(a){if(typeof a=="object"&&a!==null){var r=a.$$typeof;switch(r){case b:switch(a=a.type,a){case d:case f:case e:case m:case n:return a;default:switch(a=a&&a.$$typeof,a){case k:case h:case l:case q:case p:case g:return a;default:return r}}case c:return r}}}exports2.ContextConsumer=h;exports2.ContextProvider=g;exports2.Element=b;exports2.ForwardRef=l;exports2.Fragment=d;exports2.Lazy=q;exports2.Memo=p;exports2.Portal=c;exports2.Profiler=f;exports2.StrictMode=e;exports2.Suspense=m;exports2.SuspenseList=n;exports2.isAsyncMode=function(){return!1};exports2.isConcurrentMode=function(){return!1};exports2.isContextConsumer=function(a){return v(a)===h};exports2.isContextProvider=function(a){return v(a)===g};exports2.isElement=function(a){return typeof a=="object"&&a!==null&&a.$$typeof===b};exports2.isForwardRef=function(a){return v(a)===l};exports2.isFragment=function(a){return v(a)===d};exports2.isLazy=function(a){return v(a)===q};exports2.isMemo=function(a){return v(a)===p};exports2.isPortal=function(a){return v(a)===c};exports2.isProfiler=function(a){return v(a)===f};exports2.isStrictMode=function(a){return v(a)===e};exports2.isSuspense=function(a){return v(a)===m};exports2.isSuspenseList=function(a){return v(a)===n};exports2.isValidElementType=function(a){return typeof a=="string"||typeof a=="function"||a===d||a===f||a===e||a===m||a===n||a===t||typeof a=="object"&&a!==null&&(a.$$typeof===q||a.$$typeof===p||a.$$typeof===g||a.$$typeof===h||a.$$typeof===l||a.$$typeof===u||a.getModuleId!==void 0)};exports2.typeOf=v}});var require_react_is_development2=__commonJS({"../../node_modules/react-element-to-jsx-string/node_modules/react-is/cjs/react-is.development.js"(exports2){"use strict";process.env.NODE_ENV!=="production"&&function(){"use strict";var enableScopeAPI=!1,enableCacheElement=!1,enableTransitionTracing=!1,enableLegacyHidden=!1,enableDebugTracing=!1,REACT_ELEMENT_TYPE=Symbol.for("react.element"),REACT_PORTAL_TYPE=Symbol.for("react.portal"),REACT_FRAGMENT_TYPE=Symbol.for("react.fragment"),REACT_STRICT_MODE_TYPE=Symbol.for("react.strict_mode"),REACT_PROFILER_TYPE=Symbol.for("react.profiler"),REACT_PROVIDER_TYPE=Symbol.for("react.provider"),REACT_CONTEXT_TYPE=Symbol.for("react.context"),REACT_SERVER_CONTEXT_TYPE=Symbol.for("react.server_context"),REACT_FORWARD_REF_TYPE=Symbol.for("react.forward_ref"),REACT_SUSPENSE_TYPE=Symbol.for("react.suspense"),REACT_SUSPENSE_LIST_TYPE=Symbol.for("react.suspense_list"),REACT_MEMO_TYPE=Symbol.for("react.memo"),REACT_LAZY_TYPE=Symbol.for("react.lazy"),REACT_OFFSCREEN_TYPE=Symbol.for("react.offscreen"),REACT_MODULE_REFERENCE;REACT_MODULE_REFERENCE=Symbol.for("react.module.reference");function isValidElementType(type){return!!(typeof type=="string"||typeof type=="function"||type===REACT_FRAGMENT_TYPE||type===REACT_PROFILER_TYPE||enableDebugTracing||type===REACT_STRICT_MODE_TYPE||type===REACT_SUSPENSE_TYPE||type===REACT_SUSPENSE_LIST_TYPE||enableLegacyHidden||type===REACT_OFFSCREEN_TYPE||enableScopeAPI||enableCacheElement||enableTransitionTracing||typeof type=="object"&&type!==null&&(type.$$typeof===REACT_LAZY_TYPE||type.$$typeof===REACT_MEMO_TYPE||type.$$typeof===REACT_PROVIDER_TYPE||type.$$typeof===REACT_CONTEXT_TYPE||type.$$typeof===REACT_FORWARD_REF_TYPE||type.$$typeof===REACT_MODULE_REFERENCE||type.getModuleId!==void 0))}function typeOf(object){if(typeof object=="object"&&object!==null){var $$typeof=object.$$typeof;switch($$typeof){case REACT_ELEMENT_TYPE:var type=object.type;switch(type){case REACT_FRAGMENT_TYPE:case REACT_PROFILER_TYPE:case REACT_STRICT_MODE_TYPE:case REACT_SUSPENSE_TYPE:case REACT_SUSPENSE_LIST_TYPE:return type;default:var $$typeofType=type&&type.$$typeof;switch($$typeofType){case REACT_SERVER_CONTEXT_TYPE:case REACT_CONTEXT_TYPE:case REACT_FORWARD_REF_TYPE:case REACT_LAZY_TYPE:case REACT_MEMO_TYPE:case REACT_PROVIDER_TYPE:return $$typeofType;default:return $$typeof}}case REACT_PORTAL_TYPE:return $$typeof}}}var ContextConsumer=REACT_CONTEXT_TYPE,ContextProvider=REACT_PROVIDER_TYPE,Element=REACT_ELEMENT_TYPE,ForwardRef2=REACT_FORWARD_REF_TYPE,Fragment3=REACT_FRAGMENT_TYPE,Lazy=REACT_LAZY_TYPE,Memo2=REACT_MEMO_TYPE,Portal=REACT_PORTAL_TYPE,Profiler=REACT_PROFILER_TYPE,StrictMode2=REACT_STRICT_MODE_TYPE,Suspense2=REACT_SUSPENSE_TYPE,SuspenseList=REACT_SUSPENSE_LIST_TYPE,hasWarnedAboutDeprecatedIsAsyncMode=!1,hasWarnedAboutDeprecatedIsConcurrentMode=!1;function isAsyncMode(object){return hasWarnedAboutDeprecatedIsAsyncMode||(hasWarnedAboutDeprecatedIsAsyncMode=!0,console.warn("The ReactIs.isAsyncMode() alias has been deprecated, and will be removed in React 18+.")),!1}function isConcurrentMode(object){return hasWarnedAboutDeprecatedIsConcurrentMode||(hasWarnedAboutDeprecatedIsConcurrentMode=!0,console.warn("The ReactIs.isConcurrentMode() alias has been deprecated, and will be removed in React 18+.")),!1}function isContextConsumer2(object){return typeOf(object)===REACT_CONTEXT_TYPE}function isContextProvider2(object){return typeOf(object)===REACT_PROVIDER_TYPE}function isElement(object){return typeof object=="object"&&object!==null&&object.$$typeof===REACT_ELEMENT_TYPE}function isForwardRef3(object){return typeOf(object)===REACT_FORWARD_REF_TYPE}function isFragment(object){return typeOf(object)===REACT_FRAGMENT_TYPE}function isLazy2(object){return typeOf(object)===REACT_LAZY_TYPE}function isMemo3(object){return typeOf(object)===REACT_MEMO_TYPE}function isPortal(object){return typeOf(object)===REACT_PORTAL_TYPE}function isProfiler2(object){return typeOf(object)===REACT_PROFILER_TYPE}function isStrictMode2(object){return typeOf(object)===REACT_STRICT_MODE_TYPE}function isSuspense2(object){return typeOf(object)===REACT_SUSPENSE_TYPE}function isSuspenseList(object){return typeOf(object)===REACT_SUSPENSE_LIST_TYPE}exports2.ContextConsumer=ContextConsumer,exports2.ContextProvider=ContextProvider,exports2.Element=Element,exports2.ForwardRef=ForwardRef2,exports2.Fragment=Fragment3,exports2.Lazy=Lazy,exports2.Memo=Memo2,exports2.Portal=Portal,exports2.Profiler=Profiler,exports2.StrictMode=StrictMode2,exports2.Suspense=Suspense2,exports2.SuspenseList=SuspenseList,exports2.isAsyncMode=isAsyncMode,exports2.isConcurrentMode=isConcurrentMode,exports2.isContextConsumer=isContextConsumer2,exports2.isContextProvider=isContextProvider2,exports2.isElement=isElement,exports2.isForwardRef=isForwardRef3,exports2.isFragment=isFragment,exports2.isLazy=isLazy2,exports2.isMemo=isMemo3,exports2.isPortal=isPortal,exports2.isProfiler=isProfiler2,exports2.isStrictMode=isStrictMode2,exports2.isSuspense=isSuspense2,exports2.isSuspenseList=isSuspenseList,exports2.isValidElementType=isValidElementType,exports2.typeOf=typeOf}()}});var require_react_is2=__commonJS({"../../node_modules/react-element-to-jsx-string/node_modules/react-is/index.js"(exports2,module2){"use strict";process.env.NODE_ENV==="production"?module2.exports=require_react_is_production_min2():module2.exports=require_react_is_development2()}});var preview_exports={};__export(preview_exports,{__definePreview:()=>__definePreview});module.exports=__toCommonJS(preview_exports);var import_csf=require("storybook/internal/csf");var entry_preview_exports={};__export(entry_preview_exports,{beforeAll:()=>beforeAll,decorators:()=>decorators,mount:()=>mount,parameters:()=>parameters,render:()=>render,renderToCanvas:()=>renderToCanvas});var React4=__toESM(require("react")),import_semver=__toESM(require_semver2());var React=__toESM(require("react")),clonedReact={...React};function setReactActEnvironment(isReactActEnvironment){globalThis.IS_REACT_ACT_ENVIRONMENT=isReactActEnvironment}function getReactActEnvironment(){return globalThis.IS_REACT_ACT_ENVIRONMENT}function withGlobalActEnvironment(actImplementation){return callback=>{let previousActEnvironment=getReactActEnvironment();setReactActEnvironment(!0);try{let callbackNeedsToBeAwaited=!1,actResult=actImplementation(()=>{let result=callback();return result!==null&&typeof result=="object"&&typeof result.then=="function"&&(callbackNeedsToBeAwaited=!0),result});if(callbackNeedsToBeAwaited){let thenable=actResult;return{then:(resolve,reject)=>{thenable.then(returnValue=>{setReactActEnvironment(previousActEnvironment),resolve(returnValue)},error=>{setReactActEnvironment(previousActEnvironment),reject(error)})}}}else return setReactActEnvironment(previousActEnvironment),actResult}catch(error){throw setReactActEnvironment(previousActEnvironment),error}}}var getAct=async()=>{let reactAct;if(typeof clonedReact.act=="function")reactAct=clonedReact.act;else{let deprecatedTestUtils=await import("react-dom/test-utils");reactAct=deprecatedTestUtils?.default?.act??deprecatedTestUtils.act}return process.env.NODE_ENV==="production"?cb=>cb():withGlobalActEnvironment(reactAct)};var import_react=__toESM(require("react")),render=(args,context)=>{let{id,component:Component}=context;if(!Component)throw new Error(`Unable to render story ${id} as the component annotation is missing from the default export`);return import_react.default.createElement(Component,{...args})};var import_react2=__toESM(require("react")),import_global=require("@storybook/global");var{FRAMEWORK_OPTIONS}=import_global.global,ErrorBoundary=class extends import_react2.Component{constructor(){super(...arguments);this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidMount(){let{hasError}=this.state,{showMain}=this.props;hasError||showMain()}componentDidCatch(err){let{showException}=this.props;showException(err)}render(){let{hasError}=this.state,{children}=this.props;return hasError?null:children}},Wrapper=FRAMEWORK_OPTIONS?.strictMode?import_react2.StrictMode:import_react2.Fragment,actQueue=[],isActing=!1,processActQueue=async()=>{if(isActing||actQueue.length===0)return;isActing=!0;let actTask=actQueue.shift();actTask&&await actTask(),isActing=!1,processActQueue()};async function renderToCanvas({storyContext,unboundStoryFn,showMain,showException,forceRemount},canvasElement){let{renderElement,unmountElement}=await import("@storybook/react-dom-shim"),Story=unboundStoryFn,content=storyContext.parameters.__isPortableStory?import_react2.default.createElement(Story,{...storyContext}):import_react2.default.createElement(ErrorBoundary,{showMain,showException},import_react2.default.createElement(Story,{...storyContext})),element=Wrapper?import_react2.default.createElement(Wrapper,null,content):content;forceRemount&&unmountElement(canvasElement);let act=await getAct();return await new Promise(async(resolve,reject)=>{actQueue.push(async()=>{try{await act(async()=>{await renderElement(element,canvasElement,storyContext?.parameters?.react?.rootOptions)}),resolve()}catch(e){reject(e)}}),processActQueue()}),async()=>{await act(()=>{unmountElement(canvasElement)})}}var mount=context=>async ui=>(ui!=null&&(context.originalStoryFn=()=>ui),await context.renderToCanvas(),context.canvas);var parameters={renderer:"react"},decorators=[(story,context)=>{if(!context.parameters?.react?.rsc)return story();let major=import_semver.default.major(React4.version),minor=import_semver.default.minor(React4.version);if(major<18||major===18&&minor<3)throw new Error("React Server Components require React >= 18.3");return React4.createElement(React4.Suspense,null,story())}],beforeAll=async()=>{try{let{configure}=await import("@storybook/test"),act=await getAct();configure({unstable_advanceTimersWrapper:cb=>act(cb),asyncWrapper:async cb=>{let previousActEnvironment=getReactActEnvironment();setReactActEnvironment(!1);try{let result=await cb();return await new Promise(resolve=>{setTimeout(()=>{resolve()},0),jestFakeTimersAreEnabled()&&jest.advanceTimersByTime(0)}),result}finally{setReactActEnvironment(previousActEnvironment)}},eventWrapper:cb=>{let result;return act(()=>(result=cb(),result)),result}})}catch{}};function jestFakeTimersAreEnabled(){return typeof jest<"u"&&jest!==null?setTimeout._isMockFunction===!0||Object.prototype.hasOwnProperty.call(setTimeout,"clock"):!1}var entry_preview_docs_exports={};__export(entry_preview_docs_exports,{applyDecorators:()=>applyDecorators,argTypesEnhancers:()=>argTypesEnhancers,decorators:()=>decorators2,parameters:()=>parameters2});var import_docs_tools9=require("storybook/internal/docs-tools");var import_docs_tools7=require("storybook/internal/docs-tools"),import_prop_types=__toESM(require_prop_types());var CUSTOM_CAPTION="custom",OBJECT_CAPTION="object",ARRAY_CAPTION="array",CLASS_CAPTION="class",FUNCTION_CAPTION="func",ELEMENT_CAPTION="element";var import_html_tags=__toESM(require_html_tags2());function isHtmlTag(tagName){return import_html_tags.default.includes(tagName.toLowerCase())}var import_escodegen=__toESM(require_escodegen());function dedent(templ){for(var values=[],_i=1;_i<arguments.length;_i++)values[_i-1]=arguments[_i];var strings=Array.from(typeof templ=="string"?[templ]:templ);strings[strings.length-1]=strings[strings.length-1].replace(/\r?\n([\t ]*)$/,"");var indentLengths=strings.reduce(function(arr,str){var matches=str.match(/\n([\t ]+|(?!\s).)/g);return matches?arr.concat(matches.map(function(match){var _a,_b;return(_b=(_a=match.match(/[\t ]/g))===null||_a===void 0?void 0:_a.length)!==null&&_b!==void 0?_b:0})):arr},[]);if(indentLengths.length){var pattern_1=new RegExp(`
    ++`?"\\n":"\\r"}),combinedOptions.singleQuotes?(input=input.replace(/\\?'/g,"\\'"),"'"+input+"'"):(input=input.replace(/"/g,'\\"'),'"'+input+'"')}exports2.prettyPrint=prettyPrint2}});var require_react_is_production_min2=__commonJS({"../../node_modules/react-element-to-jsx-string/node_modules/react-is/cjs/react-is.production.min.js"(exports2){"use strict";var b=Symbol.for("react.element"),c=Symbol.for("react.portal"),d=Symbol.for("react.fragment"),e=Symbol.for("react.strict_mode"),f=Symbol.for("react.profiler"),g=Symbol.for("react.provider"),h=Symbol.for("react.context"),k=Symbol.for("react.server_context"),l=Symbol.for("react.forward_ref"),m=Symbol.for("react.suspense"),n=Symbol.for("react.suspense_list"),p=Symbol.for("react.memo"),q=Symbol.for("react.lazy"),t=Symbol.for("react.offscreen"),u;u=Symbol.for("react.module.reference");function v(a){if(typeof a=="object"&&a!==null){var r=a.$$typeof;switch(r){case b:switch(a=a.type,a){case d:case f:case e:case m:case n:return a;default:switch(a=a&&a.$$typeof,a){case k:case h:case l:case q:case p:case g:return a;default:return r}}case c:return r}}}exports2.ContextConsumer=h;exports2.ContextProvider=g;exports2.Element=b;exports2.ForwardRef=l;exports2.Fragment=d;exports2.Lazy=q;exports2.Memo=p;exports2.Portal=c;exports2.Profiler=f;exports2.StrictMode=e;exports2.Suspense=m;exports2.SuspenseList=n;exports2.isAsyncMode=function(){return!1};exports2.isConcurrentMode=function(){return!1};exports2.isContextConsumer=function(a){return v(a)===h};exports2.isContextProvider=function(a){return v(a)===g};exports2.isElement=function(a){return typeof a=="object"&&a!==null&&a.$$typeof===b};exports2.isForwardRef=function(a){return v(a)===l};exports2.isFragment=function(a){return v(a)===d};exports2.isLazy=function(a){return v(a)===q};exports2.isMemo=function(a){return v(a)===p};exports2.isPortal=function(a){return v(a)===c};exports2.isProfiler=function(a){return v(a)===f};exports2.isStrictMode=function(a){return v(a)===e};exports2.isSuspense=function(a){return v(a)===m};exports2.isSuspenseList=function(a){return v(a)===n};exports2.isValidElementType=function(a){return typeof a=="string"||typeof a=="function"||a===d||a===f||a===e||a===m||a===n||a===t||typeof a=="object"&&a!==null&&(a.$$typeof===q||a.$$typeof===p||a.$$typeof===g||a.$$typeof===h||a.$$typeof===l||a.$$typeof===u||a.getModuleId!==void 0)};exports2.typeOf=v}});var require_react_is_development2=__commonJS({"../../node_modules/react-element-to-jsx-string/node_modules/react-is/cjs/react-is.development.js"(exports2){"use strict";process.env.NODE_ENV!=="production"&&function(){"use strict";var enableScopeAPI=!1,enableCacheElement=!1,enableTransitionTracing=!1,enableLegacyHidden=!1,enableDebugTracing=!1,REACT_ELEMENT_TYPE=Symbol.for("react.element"),REACT_PORTAL_TYPE=Symbol.for("react.portal"),REACT_FRAGMENT_TYPE=Symbol.for("react.fragment"),REACT_STRICT_MODE_TYPE=Symbol.for("react.strict_mode"),REACT_PROFILER_TYPE=Symbol.for("react.profiler"),REACT_PROVIDER_TYPE=Symbol.for("react.provider"),REACT_CONTEXT_TYPE=Symbol.for("react.context"),REACT_SERVER_CONTEXT_TYPE=Symbol.for("react.server_context"),REACT_FORWARD_REF_TYPE=Symbol.for("react.forward_ref"),REACT_SUSPENSE_TYPE=Symbol.for("react.suspense"),REACT_SUSPENSE_LIST_TYPE=Symbol.for("react.suspense_list"),REACT_MEMO_TYPE=Symbol.for("react.memo"),REACT_LAZY_TYPE=Symbol.for("react.lazy"),REACT_OFFSCREEN_TYPE=Symbol.for("react.offscreen"),REACT_MODULE_REFERENCE;REACT_MODULE_REFERENCE=Symbol.for("react.module.reference");function isValidElementType(type){return!!(typeof type=="string"||typeof type=="function"||type===REACT_FRAGMENT_TYPE||type===REACT_PROFILER_TYPE||enableDebugTracing||type===REACT_STRICT_MODE_TYPE||type===REACT_SUSPENSE_TYPE||type===REACT_SUSPENSE_LIST_TYPE||enableLegacyHidden||type===REACT_OFFSCREEN_TYPE||enableScopeAPI||enableCacheElement||enableTransitionTracing||typeof type=="object"&&type!==null&&(type.$$typeof===REACT_LAZY_TYPE||type.$$typeof===REACT_MEMO_TYPE||type.$$typeof===REACT_PROVIDER_TYPE||type.$$typeof===REACT_CONTEXT_TYPE||type.$$typeof===REACT_FORWARD_REF_TYPE||type.$$typeof===REACT_MODULE_REFERENCE||type.getModuleId!==void 0))}function typeOf(object){if(typeof object=="object"&&object!==null){var $$typeof=object.$$typeof;switch($$typeof){case REACT_ELEMENT_TYPE:var type=object.type;switch(type){case REACT_FRAGMENT_TYPE:case REACT_PROFILER_TYPE:case REACT_STRICT_MODE_TYPE:case REACT_SUSPENSE_TYPE:case REACT_SUSPENSE_LIST_TYPE:return type;default:var $$typeofType=type&&type.$$typeof;switch($$typeofType){case REACT_SERVER_CONTEXT_TYPE:case REACT_CONTEXT_TYPE:case REACT_FORWARD_REF_TYPE:case REACT_LAZY_TYPE:case REACT_MEMO_TYPE:case REACT_PROVIDER_TYPE:return $$typeofType;default:return $$typeof}}case REACT_PORTAL_TYPE:return $$typeof}}}var ContextConsumer=REACT_CONTEXT_TYPE,ContextProvider=REACT_PROVIDER_TYPE,Element=REACT_ELEMENT_TYPE,ForwardRef2=REACT_FORWARD_REF_TYPE,Fragment3=REACT_FRAGMENT_TYPE,Lazy=REACT_LAZY_TYPE,Memo2=REACT_MEMO_TYPE,Portal=REACT_PORTAL_TYPE,Profiler=REACT_PROFILER_TYPE,StrictMode2=REACT_STRICT_MODE_TYPE,Suspense2=REACT_SUSPENSE_TYPE,SuspenseList=REACT_SUSPENSE_LIST_TYPE,hasWarnedAboutDeprecatedIsAsyncMode=!1,hasWarnedAboutDeprecatedIsConcurrentMode=!1;function isAsyncMode(object){return hasWarnedAboutDeprecatedIsAsyncMode||(hasWarnedAboutDeprecatedIsAsyncMode=!0,console.warn("The ReactIs.isAsyncMode() alias has been deprecated, and will be removed in React 18+.")),!1}function isConcurrentMode(object){return hasWarnedAboutDeprecatedIsConcurrentMode||(hasWarnedAboutDeprecatedIsConcurrentMode=!0,console.warn("The ReactIs.isConcurrentMode() alias has been deprecated, and will be removed in React 18+.")),!1}function isContextConsumer2(object){return typeOf(object)===REACT_CONTEXT_TYPE}function isContextProvider2(object){return typeOf(object)===REACT_PROVIDER_TYPE}function isElement(object){return typeof object=="object"&&object!==null&&object.$$typeof===REACT_ELEMENT_TYPE}function isForwardRef3(object){return typeOf(object)===REACT_FORWARD_REF_TYPE}function isFragment(object){return typeOf(object)===REACT_FRAGMENT_TYPE}function isLazy2(object){return typeOf(object)===REACT_LAZY_TYPE}function isMemo3(object){return typeOf(object)===REACT_MEMO_TYPE}function isPortal(object){return typeOf(object)===REACT_PORTAL_TYPE}function isProfiler2(object){return typeOf(object)===REACT_PROFILER_TYPE}function isStrictMode2(object){return typeOf(object)===REACT_STRICT_MODE_TYPE}function isSuspense2(object){return typeOf(object)===REACT_SUSPENSE_TYPE}function isSuspenseList(object){return typeOf(object)===REACT_SUSPENSE_LIST_TYPE}exports2.ContextConsumer=ContextConsumer,exports2.ContextProvider=ContextProvider,exports2.Element=Element,exports2.ForwardRef=ForwardRef2,exports2.Fragment=Fragment3,exports2.Lazy=Lazy,exports2.Memo=Memo2,exports2.Portal=Portal,exports2.Profiler=Profiler,exports2.StrictMode=StrictMode2,exports2.Suspense=Suspense2,exports2.SuspenseList=SuspenseList,exports2.isAsyncMode=isAsyncMode,exports2.isConcurrentMode=isConcurrentMode,exports2.isContextConsumer=isContextConsumer2,exports2.isContextProvider=isContextProvider2,exports2.isElement=isElement,exports2.isForwardRef=isForwardRef3,exports2.isFragment=isFragment,exports2.isLazy=isLazy2,exports2.isMemo=isMemo3,exports2.isPortal=isPortal,exports2.isProfiler=isProfiler2,exports2.isStrictMode=isStrictMode2,exports2.isSuspense=isSuspense2,exports2.isSuspenseList=isSuspenseList,exports2.isValidElementType=isValidElementType,exports2.typeOf=typeOf}()}});var require_react_is2=__commonJS({"../../node_modules/react-element-to-jsx-string/node_modules/react-is/index.js"(exports2,module2){"use strict";process.env.NODE_ENV==="production"?module2.exports=require_react_is_production_min2():module2.exports=require_react_is_development2()}});var preview_exports={};__export(preview_exports,{__definePreview:()=>__definePreview});module.exports=__toCommonJS(preview_exports);var import_csf=require("storybook/internal/csf");var entry_preview_exports={};__export(entry_preview_exports,{beforeAll:()=>beforeAll,decorators:()=>decorators,mount:()=>mount,parameters:()=>parameters,render:()=>render,renderToCanvas:()=>renderToCanvas});var React4=__toESM(require("react")),import_semver=__toESM(require_semver2());var React=__toESM(require("react")),clonedReact={...React};function setReactActEnvironment(isReactActEnvironment){globalThis.IS_REACT_ACT_ENVIRONMENT=isReactActEnvironment}function getReactActEnvironment(){return globalThis.IS_REACT_ACT_ENVIRONMENT}function withGlobalActEnvironment(actImplementation){return callback=>{let previousActEnvironment=getReactActEnvironment();setReactActEnvironment(!0);try{let callbackNeedsToBeAwaited=!1,actResult=actImplementation(()=>{let result=callback();return result!==null&&typeof result=="object"&&typeof result.then=="function"&&(callbackNeedsToBeAwaited=!0),result});if(callbackNeedsToBeAwaited){let thenable=actResult;return{then:(resolve,reject)=>{thenable.then(returnValue=>{setReactActEnvironment(previousActEnvironment),resolve(returnValue)},error=>{setReactActEnvironment(previousActEnvironment),reject(error)})}}}else return setReactActEnvironment(previousActEnvironment),actResult}catch(error){throw setReactActEnvironment(previousActEnvironment),error}}}var getAct=async({disableAct=false}={})=>{if(process.env.NODE_ENV==='production' || disableAct){return cb => cb();}let reactAct;if(typeof clonedReact.act=="function")reactAct=clonedReact.act;else{let deprecatedTestUtils=await import("react-dom/test-utils");reactAct=deprecatedTestUtils?.default?.act??deprecatedTestUtils.act}return process.env.NODE_ENV==="production"?cb=>cb():withGlobalActEnvironment(reactAct)};var import_react=__toESM(require("react")),render=(args,context)=>{let{id,component:Component}=context;if(!Component)throw new Error(`Unable to render story ${id} as the component annotation is missing from the default export`);return import_react.default.createElement(Component,{...args})};var import_react2=__toESM(require("react")),import_global=require("@storybook/global");var{FRAMEWORK_OPTIONS}=import_global.global,ErrorBoundary=class extends import_react2.Component{constructor(){super(...arguments);this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidMount(){let{hasError}=this.state,{showMain}=this.props;hasError||showMain()}componentDidCatch(err){let{showException}=this.props;showException(err)}render(){let{hasError}=this.state,{children}=this.props;return hasError?null:children}},Wrapper=FRAMEWORK_OPTIONS?.strictMode?import_react2.StrictMode:import_react2.Fragment,actQueue=[],isActing=!1,processActQueue=async()=>{if(isActing||actQueue.length===0)return;isActing=!0;let actTask=actQueue.shift();actTask&&await actTask(),isActing=!1,processActQueue()};async function renderToCanvas({storyContext,unboundStoryFn,showMain,showException,forceRemount},canvasElement){let{renderElement,unmountElement}=await import("@storybook/react-dom-shim"),Story=unboundStoryFn,content=storyContext.parameters.__isPortableStory?import_react2.default.createElement(Story,{...storyContext}):import_react2.default.createElement(ErrorBoundary,{showMain,showException},import_react2.default.createElement(Story,{...storyContext})),element=Wrapper?import_react2.default.createElement(Wrapper,null,content):content;forceRemount&&unmountElement(canvasElement);let act=await getAct({ disableAct: storyContext.viewMode === 'docs' });return await new Promise(async(resolve,reject)=>{actQueue.push(async()=>{try{await act(async()=>{await renderElement(element,canvasElement,storyContext?.parameters?.react?.rootOptions)}),resolve()}catch(e){reject(e)}}),processActQueue()}),async()=>{await act(()=>{unmountElement(canvasElement)})}}var mount=context=>async ui=>(ui!=null&&(context.originalStoryFn=()=>ui),await context.renderToCanvas(),context.canvas);var parameters={renderer:"react"},decorators=[(story,context)=>{if(!context.parameters?.react?.rsc)return story();let major=import_semver.default.major(React4.version),minor=import_semver.default.minor(React4.version);if(major<18||major===18&&minor<3)throw new Error("React Server Components require React >= 18.3");return React4.createElement(React4.Suspense,null,story())}],beforeAll=async()=>{try{let{configure}=await import("@storybook/test"),act=await getAct();configure({unstable_advanceTimersWrapper:cb=>act(cb),asyncWrapper:async cb=>{let previousActEnvironment=getReactActEnvironment();setReactActEnvironment(!1);try{let result=await cb();return await new Promise(resolve=>{setTimeout(()=>{resolve()},0),jestFakeTimersAreEnabled()&&jest.advanceTimersByTime(0)}),result}finally{setReactActEnvironment(previousActEnvironment)}},eventWrapper:cb=>{let result;return act(()=>(result=cb(),result)),result}})}catch{}};function jestFakeTimersAreEnabled(){return typeof jest<"u"&&jest!==null?setTimeout._isMockFunction===!0||Object.prototype.hasOwnProperty.call(setTimeout,"clock"):!1}var entry_preview_docs_exports={};__export(entry_preview_docs_exports,{applyDecorators:()=>applyDecorators,argTypesEnhancers:()=>argTypesEnhancers,decorators:()=>decorators2,parameters:()=>parameters2});var import_docs_tools9=require("storybook/internal/docs-tools");var import_docs_tools7=require("storybook/internal/docs-tools"),import_prop_types=__toESM(require_prop_types());var CUSTOM_CAPTION="custom",OBJECT_CAPTION="object",ARRAY_CAPTION="array",CLASS_CAPTION="class",FUNCTION_CAPTION="func",ELEMENT_CAPTION="element";var import_html_tags=__toESM(require_html_tags2());function isHtmlTag(tagName){return import_html_tags.default.includes(tagName.toLowerCase())}var import_escodegen=__toESM(require_escodegen());function dedent(templ){for(var values=[],_i=1;_i<arguments.length;_i++)values[_i-1]=arguments[_i];var strings=Array.from(typeof templ=="string"?[templ]:templ);strings[strings.length-1]=strings[strings.length-1].replace(/\r?\n([\t ]*)$/,"");var indentLengths=strings.reduce(function(arr,str){var matches=str.match(/\n([\t ]+|(?!\s).)/g);return matches?arr.concat(matches.map(function(match){var _a,_b;return(_b=(_a=match.match(/[\t ]/g))===null||_a===void 0?void 0:_a.length)!==null&&_b!==void 0?_b:0})):arr},[]);if(indentLengths.length){var pattern_1=new RegExp(`
    + [	 ]{`+Math.min.apply(Math,indentLengths)+"}","g");strings=strings.map(function(str){return str.replace(pattern_1,`
    + `)})}strings[0]=strings[0].replace(/^\r?\n/,"");var string=strings[0];return values.forEach(function(value,i){var endentations=string.match(/(?:^|\n)( *)$/),endentation=endentations?endentations[1]:"",indentedValue=value;typeof value=="string"&&value.includes(`
    + `)&&(indentedValue=String(value).split(`
    diff --git a/.yarn/patches/@testing-library-user-event-npm-14.6.1-5da7e1d4e2.patch b/.yarn/patches/@testing-library-user-event-npm-14.6.1-5da7e1d4e2.patch
    new file mode 100644
    index 00000000000..a602426af6f
    --- /dev/null
    +++ b/.yarn/patches/@testing-library-user-event-npm-14.6.1-5da7e1d4e2.patch
    @@ -0,0 +1,26 @@
    +diff --git a/dist/cjs/document/prepareDocument.js b/dist/cjs/document/prepareDocument.js
    +index 39a24b8f2ccdc52739d130480ab18975073616cb..0c3f5199401c15b90230c25a02de364eeef3e297 100644
    +--- a/dist/cjs/document/prepareDocument.js
    ++++ b/dist/cjs/document/prepareDocument.js
    +@@ -30,7 +30,7 @@ function prepareDocument(document) {
    +         const initialValue = UI.getInitialValue(el);
    +         if (initialValue !== undefined) {
    +             if (el.value !== initialValue) {
    +-                dispatchEvent.dispatchDOMEvent(el, 'change');
    ++                el.dispatchEvent(new Event('change'));
    +             }
    +             UI.clearInitialValue(el);
    +         }
    +diff --git a/dist/cjs/utils/focus/getActiveElement.js b/dist/cjs/utils/focus/getActiveElement.js
    +index d25f3a8ef67e856e43614559f73012899c0b53d7..4ed9ee45565ed438ee9284d8d3043c0bd50463eb 100644
    +--- a/dist/cjs/utils/focus/getActiveElement.js
    ++++ b/dist/cjs/utils/focus/getActiveElement.js
    +@@ -6,6 +6,8 @@ function getActiveElement(document) {
    +     const activeElement = document.activeElement;
    +     if (activeElement === null || activeElement === undefined ? undefined : activeElement.shadowRoot) {
    +         return getActiveElement(activeElement.shadowRoot);
    ++    } else if (activeElement && activeElement.tagName === 'IFRAME') {
    ++        return getActiveElement(activeElement.contentWindow.document);
    +     } else {
    +         // Browser does not yield disabled elements as document.activeElement - jsdom does
    +         if (isDisabled.isDisabled(activeElement)) {
    diff --git a/.yarn/patches/micromark-extension-mdxjs-npm-1.0.0-d2b6b69e4a.patch b/.yarn/patches/micromark-extension-mdxjs-npm-1.0.0-d2b6b69e4a.patch
    new file mode 100644
    index 00000000000..aed9a389b4c
    --- /dev/null
    +++ b/.yarn/patches/micromark-extension-mdxjs-npm-1.0.0-d2b6b69e4a.patch
    @@ -0,0 +1,13 @@
    +diff --git a/index.d.ts b/index.d.ts
    +index ba9855b0a36d5fbd70f92da611f3e1e96f203ee3..167de6defae46d391a45cc63dd11403722fb1619 100644
    +--- a/index.d.ts
    ++++ b/index.d.ts
    +@@ -4,7 +4,7 @@
    +  */
    + export function mdxjs(
    +   options?:
    +-    | import('micromark-extension-mdx-expression/dev/lib/syntax').Options
    ++    | Options
    +     | undefined
    + ): Extension
    + export type Extension = import('micromark-util-types').Extension
    diff --git a/.yarn/patches/remark-mdx-npm-2.0.0-rc.2-7a71234e1f.patch b/.yarn/patches/remark-mdx-npm-2.0.0-rc.2-7a71234e1f.patch
    new file mode 100644
    index 00000000000..b138a5ee33c
    --- /dev/null
    +++ b/.yarn/patches/remark-mdx-npm-2.0.0-rc.2-7a71234e1f.patch
    @@ -0,0 +1,13 @@
    +diff --git a/index.d.ts b/index.d.ts
    +index c5da87629f94c457947bc712439c94b028cd5d81..3bec2ed83b30a40f84f51665eebf7a67d1a628c1 100644
    +--- a/index.d.ts
    ++++ b/index.d.ts
    +@@ -4,7 +4,7 @@
    +  *
    +  * @type {import('unified').Plugin<[Options?]|Array<void>, Root>}
    +  */
    +-export default function remarkMdx(options?: void | import("micromark-extension-mdx-expression/dev/lib/syntax").Options | undefined): void | import("unified").Transformer<import("mdast").Root, import("mdast").Root>;
    ++export default function remarkMdx(options?: void | import("micromark-extension-mdx-expression").Options | undefined): void | import("unified").Transformer<import("mdast").Root, import("mdast").Root>;
    + export type Root = import('mdast').Root;
    + export type Options = import('micromark-extension-mdxjs').Options;
    + export type DoNotTouchAsThisImportItIncludesMdxInTree = typeof import("mdast-util-mdx");
    diff --git a/.yarn/patches/remark-parse-npm-10.0.1-e654d7df78.patch b/.yarn/patches/remark-parse-npm-10.0.1-e654d7df78.patch
    new file mode 100644
    index 00000000000..23f24014422
    --- /dev/null
    +++ b/.yarn/patches/remark-parse-npm-10.0.1-e654d7df78.patch
    @@ -0,0 +1,12 @@
    +diff --git a/lib/index.d.ts b/lib/index.d.ts
    +index 0e8563eb2fe2aad42400d3aad666f36df0dbc16a..d20f18817ab64c586de59eb411fd739ece028a95 100644
    +--- a/lib/index.d.ts
    ++++ b/lib/index.d.ts
    +@@ -1,6 +1,6 @@
    + /** @type {import('unified').Plugin<[Options?] | void[], string, Root>} */
    + export default function remarkParse(
    +-  options: void | import('mdast-util-from-markdown/lib').Options | undefined
    ++  options: void | import('mdast-util-from-markdown').Options | undefined
    + ): void
    + export type Root = import('mdast').Root
    + export type Options = import('mdast-util-from-markdown').Options
    diff --git a/.yarn/patches/tailwind-variants-npm-0.3.1-48888516de.patch b/.yarn/patches/tailwind-variants-npm-0.3.1-48888516de.patch
    new file mode 100644
    index 00000000000..63ede244385
    --- /dev/null
    +++ b/.yarn/patches/tailwind-variants-npm-0.3.1-48888516de.patch
    @@ -0,0 +1,19 @@
    +diff --git a/dist/transformer.d.ts b/dist/transformer.d.ts
    +index 508be4d8176486bfbbccd0b8cf297465c8efd15a..afbd775c60f09c8a9c35e30c79f286fddc7c7018 100644
    +--- a/dist/transformer.d.ts
    ++++ b/dist/transformer.d.ts
    +@@ -1,10 +1,10 @@
    +-import type {Config} from "tailwindcss/types/config";
    +-import type {DefaultTheme} from "tailwindcss/types/generated/default-theme";
    ++// import type {Config} from "tailwindcss/types/config";
    ++// import type {DefaultTheme} from "tailwindcss/types/generated/default-theme";
    + 
    +-export type DefaultScreens = keyof DefaultTheme["screens"];
    ++export type DefaultScreens = any;
    + 
    + export type WithTV = {
    +-  <C extends Config>(tvConfig: C, config?: TVTransformerConfig): C;
    ++  <C>(tvConfig: C, config?: TVTransformerConfig): C;
    + };
    + 
    + export declare const withTV: WithTV;
    diff --git a/.yarn/plugins/plugin-nightly-prep.js b/.yarn/plugins/plugin-nightly-prep.js
    new file mode 100644
    index 00000000000..508b60acd98
    --- /dev/null
    +++ b/.yarn/plugins/plugin-nightly-prep.js
    @@ -0,0 +1,301 @@
    +// From https://github.com/yarnpkg/berry/blob/master/packages/plugin-version/sources/commands/version/apply.ts in accordance with the BSD license, see Notice.txt
    +
    +const Decision = {
    +  UNDECIDED: 'undecided',
    +  DECLINE: 'decline',
    +  MAJOR: 'major',
    +  MINOR: 'minor',
    +  PATCH: 'patch',
    +  PRERELEASE: 'prerelease'
    +};
    +
    +module.exports = {
    +  name: `plugin-nightly-prep`,
    +  factory: require => {
    +    const {PortablePath, npath, ppath, xfs} = require('@yarnpkg/fslib');
    +    const {BaseCommand} = require(`@yarnpkg/cli`);
    +    const {Project, Configuration, Cache, StreamReport, structUtils, Manifest, miscUtils, MessageName, WorkspaceResolver} = require(`@yarnpkg/core`);
    +    const {Command, Option} = require(`clipanion`);
    +    const {parseSyml, stringifySyml} = require(`@yarnpkg/parsers`);
    +
    +    class NightlyPrepCommand extends BaseCommand {
    +      static paths = [[`apply-nightly`]];
    +
    +      // Show descriptive usage for a --help argument passed to this command
    +      static usage = Command.Usage({
    +        description: `apply nightly version bumps`,
    +        details: `
    +          This command will update all references in every workspace package json to point to the exact nightly version, no range.
    +        `,
    +        examples: [[
    +          `yarn apply-nightly`,
    +        ]],
    +      });
    +
    +      all = Option.Boolean(`--all`, false, {
    +        description: `Apply the deferred version changes on all workspaces`,
    +      });
    +
    +      async execute() {
    +        const configuration = await Configuration.find(this.context.cwd, this.context.plugins);
    +        const {project, workspace} = await Project.find(configuration, this.context.cwd);
    +        const cache = await Cache.find(configuration);
    +
    +        const applyReport = await StreamReport.start({
    +          configuration,
    +          json: this.json,
    +          stdout: this.context.stdout,
    +        }, async report => {
    +          const prerelease = this.prerelease
    +            ? typeof this.prerelease !== `boolean` ? this.prerelease : `rc.%n`
    +            : null;
    +
    +          const allReleases = await resolveVersionFiles(project, xfs, ppath, parseSyml, structUtils, {prerelease});
    +          let filteredReleases = new Map();
    +
    +          if (this.all) {
    +            filteredReleases = allReleases;
    +          } else {
    +            const relevantWorkspaces = this.recursive
    +              ? workspace.getRecursiveWorkspaceDependencies()
    +              : [workspace];
    +
    +            for (const child of relevantWorkspaces) {
    +              const release = allReleases.get(child);
    +              if (typeof release !== `undefined`) {
    +                filteredReleases.set(child, release);
    +              }
    +            }
    +          }
    +
    +          if (filteredReleases.size === 0) {
    +            const protip = allReleases.size > 0
    +              ? ` Did you want to add --all?`
    +              : ``;
    +
    +            report.reportWarning(MessageName.UNNAMED, `The current workspace doesn't seem to require a version bump.${protip}`);
    +            return;
    +          }
    +
    +          applyReleases(project, filteredReleases, Manifest, miscUtils, structUtils, MessageName, npath, WorkspaceResolver, {report});
    +
    +          if (!this.dryRun) {
    +            if (!prerelease) {
    +              if (this.all) {
    +                await clearVersionFiles(project, xfs);
    +              } else {
    +                await updateVersionFiles(project, [...filteredReleases.keys()], xfs, parseSyml, stringifySyml, structUtils);
    +              }
    +            }
    +
    +            report.reportSeparator();
    +          }
    +        });
    +
    +        if (this.dryRun || applyReport.hasErrors())
    +          return applyReport.exitCode();
    +
    +        return await project.installWithNewReport({
    +          json: this.json,
    +          stdout: this.context.stdout,
    +        }, {
    +          cache,
    +        });
    +      }
    +    }
    +
    +    return {
    +      commands: [
    +        NightlyPrepCommand,
    +      ],
    +    };
    +  }
    +};
    +
    +async function resolveVersionFiles(project, xfs, ppath, parseSyml, structUtils, miscUtils, {prerelease = null} = {}) {
    +  let candidateReleases = new Map();
    +
    +  const deferredVersionFolder = project.configuration.get(`deferredVersionFolder`);
    +  if (!xfs.existsSync(deferredVersionFolder))
    +    return candidateReleases;
    +
    +  const deferredVersionFiles = await xfs.readdirPromise(deferredVersionFolder);
    +
    +  for (const entry of deferredVersionFiles) {
    +    if (!entry.endsWith(`.yml`))
    +      continue;
    +
    +    const versionPath = ppath.join(deferredVersionFolder, entry);
    +    const versionContent = await xfs.readFilePromise(versionPath, `utf8`);
    +    const versionData = parseSyml(versionContent);
    +
    +
    +    for (const [identStr, decision] of Object.entries(versionData.releases || {})) {
    +      if (decision === Decision.DECLINE)
    +        continue;
    +
    +      const ident = structUtils.parseIdent(identStr);
    +
    +      const workspace = project.tryWorkspaceByIdent(ident);
    +      if (workspace === null)
    +        throw new Error(`Assertion failed: Expected a release definition file to only reference existing workspaces (${ppath.basename(versionPath)} references ${identStr})`);
    +
    +      if (workspace.manifest.version === null)
    +        throw new Error(`Assertion failed: Expected the workspace to have a version (${structUtils.prettyLocator(project.configuration, workspace.anchoredLocator)})`);
    +
    +      // If there's a `stableVersion` field, then we assume that `version`
    +      // contains a prerelease version and that we need to base the version
    +      // bump relative to the latest stable instead.
    +      const baseVersion = workspace.manifest.raw.stableVersion ?? workspace.manifest.version;
    +      const suggestedRelease = applyStrategy(baseVersion, validateReleaseDecision(decision, miscUtils), miscUtils);
    +
    +      if (suggestedRelease === null)
    +        throw new Error(`Assertion failed: Expected ${baseVersion} to support being bumped via strategy ${decision}`);
    +
    +      const bestRelease = suggestedRelease;
    +
    +      candidateReleases.set(workspace, bestRelease);
    +    }
    +  }
    +
    +  if (prerelease) {
    +    candidateReleases = new Map([...candidateReleases].map(([workspace, release]) => {
    +      return [workspace, applyPrerelease(release, {current: workspace.manifest.version, prerelease})];
    +    }));
    +  }
    +
    +  return candidateReleases;
    +}
    +
    +function applyReleases(project, newVersions, Manifest, miscUtils, structUtils, MessageName, npath, WorkspaceResolver, {report}) {
    +  const allDependents = new Map();
    +
    +  // First we compute the reverse map to figure out which workspace is
    +  // depended upon by which other.
    +  //
    +  // Note that we need to do this before applying the new versions,
    +  // otherwise the `findWorkspacesByDescriptor` calls won't be able to
    +  // resolve the workspaces anymore (because the workspace versions will
    +  // have changed and won't match the outdated dependencies).
    +
    +  for (const dependent of project.workspaces) {
    +    for (const set of Manifest.allDependencies) {
    +      for (const descriptor of dependent.manifest[set].values()) {
    +        const workspace = project.tryWorkspaceByDescriptor(descriptor);
    +        if (workspace === null)
    +          continue;
    +
    +        // We only care about workspaces that depend on a workspace that will
    +        // receive a fresh update
    +        if (!newVersions.has(workspace))
    +          continue;
    +
    +        const dependents = miscUtils.getArrayWithDefault(allDependents, workspace);
    +        dependents.push([dependent, set, descriptor.identHash]);
    +      }
    +    }
    +  }
    +
    +  // Now that we know which workspaces depend on which others, we can
    +  // proceed to update everything at once using our accumulated knowledge.
    +
    +  for (const [workspace, newVersion] of newVersions) {
    +    const oldVersion = workspace.manifest.version;
    +    workspace.manifest.version = newVersion;
    +
    +    const identString = workspace.manifest.name !== null
    +      ? structUtils.stringifyIdent(workspace.manifest.name)
    +      : null;
    +
    +    report.reportInfo(MessageName.UNNAMED, `${structUtils.prettyLocator(project.configuration, workspace.anchoredLocator)}: Bumped to ${newVersion}`);
    +    report.reportJson({cwd: npath.fromPortablePath(workspace.cwd), ident: identString, oldVersion, newVersion});
    +
    +    const dependents = allDependents.get(workspace);
    +    if (typeof dependents === `undefined`)
    +      continue;
    +
    +    for (const [dependent, set, identHash] of dependents) {
    +      const descriptor = dependent.manifest[set].get(identHash);
    +      if (typeof descriptor === `undefined`)
    +        throw new Error(`Assertion failed: The dependency should have existed`);
    +
    +      let range = descriptor.range;
    +      let useWorkspaceProtocol = false;
    +
    +      if (range.startsWith(WorkspaceResolver.protocol)) {
    +        range = range.slice(WorkspaceResolver.protocol.length);
    +        useWorkspaceProtocol = true;
    +
    +        // Workspaces referenced through their path never get upgraded ("workspace:packages/yarnpkg-core")
    +        if (range === workspace.relativeCwd) {
    +          continue;
    +        }
    +      }
    +
    +      let newRange = `${newVersion}`;
    +      if (useWorkspaceProtocol)
    +        newRange = `${WorkspaceResolver.protocol}${newRange}`;
    +
    +      const newDescriptor = structUtils.makeDescriptor(descriptor, newRange);
    +      dependent.manifest[set].set(identHash, newDescriptor);
    +    }
    +  }
    +}
    +
    +async function clearVersionFiles(project, xfs) {
    +  const deferredVersionFolder = project.configuration.get(`deferredVersionFolder`);
    +  if (!xfs.existsSync(deferredVersionFolder))
    +    return;
    +
    +  await xfs.removePromise(deferredVersionFolder);
    +}
    +
    +async function updateVersionFiles(project, workspaces, xfs, parseSyml, stringifySyml, structUtils) {
    +  const workspaceSet = new Set(workspaces);
    +
    +  const deferredVersionFolder = project.configuration.get(`deferredVersionFolder`);
    +  if (!xfs.existsSync(deferredVersionFolder))
    +    return;
    +
    +  const deferredVersionFiles = await xfs.readdirPromise(deferredVersionFolder);
    +
    +  for (const entry of deferredVersionFiles) {
    +    if (!entry.endsWith(`.yml`))
    +      continue;
    +
    +    const versionPath = ppath.join(deferredVersionFolder, entry);
    +    const versionContent = await xfs.readFilePromise(versionPath, `utf8`);
    +    const versionData = parseSyml(versionContent);
    +
    +    const releases = versionData?.releases;
    +    if (!releases)
    +      continue;
    +
    +    for (const locatorStr of Object.keys(releases)) {
    +      const ident = structUtils.parseIdent(locatorStr);
    +      const workspace = project.tryWorkspaceByIdent(ident);
    +
    +      if (workspace === null || workspaceSet.has(workspace)) {
    +        delete versionData.releases[locatorStr];
    +      }
    +    }
    +
    +    if (Object.keys(versionData.releases).length > 0) {
    +      await xfs.changeFilePromise(versionPath, stringifySyml(
    +        new stringifySyml.PreserveOrdering(
    +          versionData,
    +        ),
    +      ));
    +    } else {
    +      await xfs.unlinkPromise(versionPath);
    +    }
    +  }
    +}
    +
    +function applyStrategy(version, strategy) {
    +  return strategy;
    +}
    +
    +function validateReleaseDecision(decision, miscUtils) {
    +  return decision;
    +}
    diff --git a/.yarnrc.yml b/.yarnrc.yml
    index f9bf82ee247..c5a3cc182bb 100644
    --- a/.yarnrc.yml
    +++ b/.yarnrc.yml
    @@ -9,3 +9,11 @@ unsafeHttpWhitelist:
       - localhost
     
     yarnPath: .yarn/releases/yarn-4.2.2.cjs
    +
    +plugins:
    +  - .yarn/plugins/plugin-nightly-prep.js
    +
    +changesetIgnorePatterns:
    +  - "**/*.test.*"
    +  - "**/*.md"
    +  - "**/test/**"
    diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
    index cdb381f5426..a8e3ed401e4 100644
    --- a/CODE_OF_CONDUCT.md
    +++ b/CODE_OF_CONDUCT.md
    @@ -2,73 +2,78 @@
     
     ## Our Pledge
     
    -In the interest of fostering an open and welcoming environment, we as
    -contributors and maintainers pledge to making participation in our project and
    -our community a harassment-free experience for everyone, regardless of age, body
    -size, disability, ethnicity, gender identity and expression, level of experience,
    -nationality, personal appearance, race, religion, or sexual identity and
    -orientation.
    +We as members, contributors, and leaders pledge to make participation in our project and community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation.
    +
    +We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.
     
     ## Our Standards
     
    -Examples of behavior that contributes to creating a positive environment
    -include:
    +Examples of behavior that contribute to a positive environment for our project and community include:
     
    -* Using welcoming and inclusive language.
    -* Being respectful of differing viewpoints and experiences.
    -* Gracefully accepting constructive criticism.
    -* Focusing on what is best for the community.
    -* Showing empathy towards other community members.
    +* Demonstrating empathy and kindness toward other people
    +* Being respectful of differing opinions, viewpoints, and experiences
    +* Giving and gracefully accepting constructive feedback
    +* Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience
    +* Focusing on what is best, not just for us as individuals but for the overall community
     
    -Examples of unacceptable behavior by participants include:
    +Examples of unacceptable behavior include:
     
    -* The use of sexualized language or imagery and unwelcome sexual attention or
    -advances.
    -* Trolling, insulting/derogatory comments, and personal or political attacks.
    -* Public or private harassment.
    -* Publishing others' private information, such as a physical or electronic
    -  address, without explicit permission.
    -* Other conduct which could reasonably be considered inappropriate in a
    -  professional setting.
    +* The use of sexualized language or imagery, and sexual attention or advances of any kind
    +* Trolling, insulting or derogatory comments, and personal or political attacks
    +* Public or private harassment
    +* Publishing others’ private information, such as a physical or email address, without their explicit permission
    +* Other conduct which could reasonably be considered inappropriate in a professional setting
     
     ## Our Responsibilities
     
    -Project maintainers are responsible for clarifying the standards of acceptable
    -behavior and are expected to take appropriate and fair corrective action in
    -response to any instances of unacceptable behavior.
    +Project maintainers are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any instances of unacceptable behavior.
     
    -Project maintainers have the right and responsibility to remove, edit, or
    -reject comments, commits, code, wiki edits, issues, and other contributions
    -that are not aligned to this Code of Conduct, or to ban temporarily or
    -permanently any contributor for other behaviors that they deem inappropriate,
    -threatening, offensive, or harmful.
    +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for behaviors that they deem inappropriate, threatening, offensive, or harmful.
     
     ## Scope
     
    -This Code of Conduct applies both within project spaces and in public spaces
    -when an individual is representing the project or its community. Examples of
    -representing a project or community include using an official project e-mail
    -address, posting via an official social media account, or acting as an appointed
    -representative at an online or offline event. Representation of a project may be
    -further defined and clarified by project maintainers.
    +This Code of Conduct applies when an individual is representing the project or its community both within project spaces and in public spaces. Examples of representing a project or community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
     
     ## Enforcement
     
    -Instances of abusive, harassing, or otherwise unacceptable behavior may be
    -reported by contacting the project team at Grp-opensourceoffice@adobe.com. All
    -complaints will be reviewed and investigated and will result in a response that
    -is deemed necessary and appropriate to the circumstances. The project team is
    -obligated to maintain confidentiality with regard to the reporter of an incident.
    -Further details of specific enforcement policies may be posted separately.
    +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by first contacting the project team. Oversight of Adobe projects is handled by the Adobe Open Source Office, which has final say in any violations and enforcement of this Code of Conduct and can be reached at Grp-opensourceoffice@adobe.com. All complaints will be reviewed and investigated promptly and fairly.
    +
    +The project team must respect the privacy and security of the reporter of any incident.
    +
    +Project maintainers who do not follow or enforce the Code of Conduct may face temporary or permanent repercussions as determined by other members of the project's leadership or the Adobe Open Source Office.
    +
    +## Enforcement Guidelines
    +
    +Project maintainers will follow these Community Impact Guidelines in determining the consequences for any action they deem to be in violation of this Code of Conduct:
    +
    +**1. Correction**
    +
    +Community Impact: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.
    +
    +Consequence: A private, written warning from project maintainers describing the violation and why the behavior was unacceptable. A public apology may be requested from the violator before any further involvement in the project by violator.
    +
    +**2. Warning**
    +
    +Community Impact: A relatively minor violation through a single incident or series of actions.
    +
    +Consequence: A written warning from project maintainers that includes stated consequences for continued unacceptable behavior. Violator must refrain from interacting with the people involved for a specified period of time as determined by the project maintainers, including, but not limited to, unsolicited interaction with those enforcing the Code of Conduct through channels such as community spaces and social media. Continued violations may lead to a temporary or permanent ban.
    +
    +**3. Temporary Ban**
    +
    +Community Impact: A more serious violation of community standards, including sustained unacceptable behavior.
    +
    +Consequence: A temporary ban from any interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Failure to comply with the temporary ban may lead to a permanent ban.
    +
    +**4. Permanent Ban**
    +
    +Community Impact: Demonstrating a consistent pattern of violation of community standards or an egregious violation of community standards, including, but not limited to, sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.
     
    -Project maintainers who do not follow or enforce the Code of Conduct in good
    -faith may face temporary or permanent repercussions as determined by other
    -members of the project's leadership.
    +Consequence: A permanent ban from any interaction with the community.
     
     ## Attribution
     
    -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
    -available at [https://contributor-covenant.org/version/1/4][version].
    +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.1,
    +available at [https://contributor-covenant.org/version/2/1][version]
     
     [homepage]: https://contributor-covenant.org
    -[version]: https://contributor-covenant.org/version/1/4/
    +[version]: https://contributor-covenant.org/version/2/1
    diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
    index aebf86c0817..ba8fa9452bf 100644
    --- a/CONTRIBUTING.md
    +++ b/CONTRIBUTING.md
    @@ -216,6 +216,10 @@ You may have run `yarn build` before. Please run `make clean_all && yarn` to cle
     
     It may also just be a stale cache, you can try deleting the `.parcel-cache`
     
    -## Contributor to committer
    +## From Contributor To Committer
     
    -We love contributions from our community! If you'd like to go a step beyond contributor and become a committer with full write access and a say in the project, you must be invited. The existing committers employ an internal nomination process that must reach lazy consensus (silence is approval) before invitations are issued. If you feel you are qualified and want to get more deeply involved, feel free to reach out to existing committers to have a conversation.
    +We love contributions from our community! At this time, we are not accepting new committers. We thank you for your understanding.
    +
    +## Security Issues
    +
    +Security issues shouldn't be reported on this issue tracker. Instead, [file an issue to our security experts](https://helpx.adobe.com/security/alertus.html).
    diff --git a/Makefile b/Makefile
    index 5d807472d98..1213c817b71 100644
    --- a/Makefile
    +++ b/Makefile
    @@ -81,15 +81,6 @@ icons: packages/@spectrum-icons/workflow/src packages/@spectrum-icons/color/src
     storybook:
     	NODE_ENV=production yarn build:storybook
     
    -storybook-16:
    -	yarn build:storybook-16
    -
    -storybook-17:
    -	yarn build:storybook-17
    -
    -storybook-19:
    -	yarn build:storybook-19
    -
     # for now doesn't have deploy since v3 doesn't have a place for docs and stuff yet
     ci:
     	$(MAKE) publish
    @@ -119,14 +110,13 @@ website-production:
     	cp packages/dev/docs/pages/robots.txt dist/production/docs/robots.txt
     	$(MAKE) starter-zip
     	$(MAKE) tailwind-starter
    -	$(MAKE) s2-docs
    +	$(MAKE) s2-storybook-docs
     
     check-examples:
     	node scripts/extractExamples.mjs
     	yarn tsc --project dist/docs-examples/tsconfig.json
     
     starter:
    -	node scripts/extractStarter.mjs
     	cd starters/docs && yarn --no-immutable && yarn tsc
     
     starter-zip: starter
    @@ -144,9 +134,19 @@ tailwind-starter:
     	cd starters/tailwind && yarn build-storybook
     	mv starters/tailwind/storybook-static dist/production/docs/react-aria-tailwind-starter
     
    -s2-docs:
    -	yarn build:s2-docs -o dist/production/docs/s2
    +s2-storybook-docs:
    +	yarn build:s2-storybook-docs -o dist/production/docs/s2
     
     s2-api-diff:
     	node scripts/buildBranchAPI.js
     	node scripts/api-diff.js --skip-same --skip-style-props
    +
    +s2-docs:
    +	node scripts/extractStarter.mjs
    +	REGISTRY_URL=https://reactspectrum.blob.core.windows.net/reactspectrum/$$(git rev-parse HEAD)/s2-docs/registry node scripts/buildRegistry.mjs
    +	REGISTRY_URL=https://reactspectrum.blob.core.windows.net/reactspectrum/$$(git rev-parse HEAD)/s2-docs/registry yarn build:s2-docs --public-url /reactspectrum/$$(git rev-parse HEAD)/s2-docs/
    +	mkdir -p dist/$$(git rev-parse HEAD)
    +	mv packages/dev/s2-docs/dist dist/$$(git rev-parse HEAD)/s2-docs
    +	mkdir -p dist/$$(git rev-parse HEAD)/s2-docs/registry
    +	mv starters/docs/registry dist/$$(git rev-parse HEAD)/s2-docs/registry/vanilla
    +	mv starters/tailwind/registry dist/$$(git rev-parse HEAD)/s2-docs/registry/tailwind
    diff --git a/NOTICE.txt b/NOTICE.txt
    index 0b583660da1..07a501089b6 100644
    --- a/NOTICE.txt
    +++ b/NOTICE.txt
    @@ -192,3 +192,51 @@ This codebase contains a modified portion of code from the TC39 Temporal proposa
         LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
         OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
         SUCH DAMAGE.
    +
    +
    +-------------------------------------------------------------------------------
    +This codebase contains a modified portion of code from Yarn berry which can be obtained at:
    +  * SOURCE:
    +    * https://github.com/yarnpkg/berry
    +
    +  * LICENSE:
    +    BSD 2-Clause License
    +
    +    Copyright (c) 2016-present, Yarn Contributors. All rights reserved.
    +
    +    Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
    +
    +    Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
    +
    +    Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
    +
    +    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    +
    +
    +-------------------------------------------------------------------------------
    +This codebase contains a modified portion of code from Microsoft which can be obtained at:
    +  * SOURCE:
    +    * https://github.com/microsoft/tabster
    +
    +  * LICENSE:
    +    MIT License
    +
    +    Copyright (c) Microsoft Corporation.
    +
    +    Permission is hereby granted, free of charge, to any person obtaining a copy
    +    of this software and associated documentation files (the "Software"), to deal
    +    in the Software without restriction, including without limitation the rights
    +    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    +    copies of the Software, and to permit persons to whom the Software is
    +    furnished to do so, subject to the following conditions:
    +
    +    The above copyright notice and this permission notice shall be included in all
    +    copies or substantial portions of the Software.
    +
    +    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    +    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    +    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    +    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    +    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    +    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    +    SOFTWARE
    diff --git a/bin/imports.js b/bin/imports.js
    index 05c8e628631..3d3707257ee 100644
    --- a/bin/imports.js
    +++ b/bin/imports.js
    @@ -56,6 +56,10 @@ module.exports = {
             return;
           }
     
    +      if (pkgName === 'vanilla-starter' || pkgName === 'tailwind-starter') {
    +        return;
    +      }
    +
           if (!exists(pkg.dependencies, pkgName) && !exists(pkg.peerDependencies, pkgName) && pkgName !== pkg.name) {
             context.report({
               node,
    diff --git a/bin/pure-render.js b/bin/pure-render.js
    index 098dae91899..566255178eb 100644
    --- a/bin/pure-render.js
    +++ b/bin/pure-render.js
    @@ -52,7 +52,8 @@ module.exports = {
                 node.type === 'IfStatement' &&
                 node.test.type === 'BinaryExpression' &&
                 (node.test.operator === '==' || node.test.operator === '===') &&
    -            isMemberExpressionEqual(node.test.left, member)
    +            (isMemberExpressionEqual(node.test.left, member) ||
    +            isMemberExpressionEqual(node.test.right, member))
               ) {
                 conditional = node.test;
               }
    @@ -98,7 +99,7 @@ module.exports = {
                   type: 'Identifier',
                   name: 'undefined'
                 };
    -            if (isLiteralEqual(conditional.operator, init, conditional.right)) {
    +            if (isLiteralEqual(conditional.operator, init, conditional.right) || isLiteralEqual(conditional.operator, init, conditional.left)) {
                   return;
                 }
               }
    diff --git a/eslint.config.mjs b/eslint.config.mjs
    index e67a6f13118..8caaa872e68 100644
    --- a/eslint.config.mjs
    +++ b/eslint.config.mjs
    @@ -52,8 +52,15 @@ export default [{
             "packages/dev/optimize-locales-plugin/LocalesPlugin.d.ts",
             "examples/**/*",
             "starters/**/*",
    +        "scripts/icon-builder-fixture/**/*",
             "packages/@react-spectrum/s2/icon.d.ts",
    -        "packages/@react-spectrum/s2/spectrum-illustrations"
    +        "packages/@react-spectrum/s2/spectrum-illustrations",
    +        "packages/dev/parcel-config-storybook/*",
    +        "packages/dev/parcel-resolver-storybook/*",
    +        "packages/dev/parcel-transformer-storybook/*",
    +        "packages/dev/storybook-builder-parcel/*",
    +        "packages/dev/storybook-react-parcel/*",
    +        "packages/dev/s2-docs/pages/**"
         ],
     }, ...compat.extends("eslint:recommended"), {
         plugins: {
    @@ -312,6 +319,7 @@ export default [{
                     "@spectrum-icons/ui",
                     "@spectrum-icons/workflow",
                     "@spectrum-icons/illustrations",
    +                "@react-spectrum/s2/icons"
                 ],
             }],
     
    @@ -398,7 +406,7 @@ export default [{
             "rsp-rules/no-getByRole-toThrow": ERROR,
             "rulesdir/imports": OFF,
             "monorepo/no-internal-import": OFF,
    -        "jsdoc/require-jsdoc": OFF,
    +        "jsdoc/require-jsdoc": OFF
         },
     
         languageOptions: {
    @@ -437,6 +445,29 @@ export default [{
             "jsdoc/require-jsdoc": OFF,
             "jsdoc/require-description": OFF,
         },
    +}, {
    +    files: [
    +        "packages/**/*.ts",
    +        "packages/**/*.tsx"
    +    ],
    +
    +    rules: {
    +        "@typescript-eslint/explicit-module-boundary-types": ERROR,
    +    },
    +}, {
    +    files: [
    +        "**/dev/**",
    +        "**/test/**",
    +        "**/stories/**",
    +        "**/docs/**",
    +        "**/chromatic/**",
    +        "**/chromatic-fc/**",
    +        "**/__tests__/**"
    +    ],
    +
    +    rules: {
    +        "@typescript-eslint/explicit-module-boundary-types": OFF,
    +    },
     }, {
         files: [
             "packages/@react-aria/focus/src/**/*.ts",
    @@ -468,7 +499,7 @@ export default [{
             }],
         },
     }, {
    -    files: ["packages/@react-spectrum/s2/**"],
    +    files: ["packages/@react-spectrum/s2/**", "packages/dev/s2-docs/**"],
     
         rules: {
             "react/react-in-jsx-scope": OFF,
    diff --git a/examples/rac-spectrum-tailwind/.postcssrc b/examples/rac-spectrum-tailwind/.postcssrc
    index 0985cb2aab0..e092dc7c1ef 100644
    --- a/examples/rac-spectrum-tailwind/.postcssrc
    +++ b/examples/rac-spectrum-tailwind/.postcssrc
    @@ -1,5 +1,5 @@
     {
       "plugins": {
    -    "tailwindcss": {}
    +    "@tailwindcss/postcss": {}
       }
     }
    diff --git a/examples/rac-spectrum-tailwind/package.json b/examples/rac-spectrum-tailwind/package.json
    index 744d53bf0fa..afb53f681ae 100644
    --- a/examples/rac-spectrum-tailwind/package.json
    +++ b/examples/rac-spectrum-tailwind/package.json
    @@ -4,7 +4,7 @@
       "packageManager": "yarn@4.2.2",
       "scripts": {
         "start": "parcel src/index.html",
    -    "build": "parcel build src/index.html",
    +    "build": "PARCEL_WORKER_BACKEND=process parcel build src/index.html",
         "install-17": "yarn add -W react@^17 react-dom@^17"
       },
       "dependencies": {
    @@ -12,13 +12,14 @@
         "@react-spectrum/provider": "^3.9.7",
         "@spectrum-icons/illustrations": "^3.6.3",
         "@spectrum-icons/workflow": "^4.2.12",
    +    "@tailwindcss/postcss": "^4.0.0",
         "parcel": "^2.13.0",
         "postcss": "^8.2.1",
         "react": "^18.2.0",
    -    "react-aria-components": "^1.0.0-alpha.4",
    +    "react-aria-components": "^1.6.0",
         "react-dom": "^18.2.0",
         "react-stately": "^3.23.0",
    -    "tailwindcss": "^3.3.0",
    +    "tailwindcss": "^4.0.0",
         "tailwindcss-animate": "^1.0.5"
       },
       "devDependencies": {
    diff --git a/examples/rac-spectrum-tailwind/src/components/GenInputField.tsx b/examples/rac-spectrum-tailwind/src/components/GenInputField.tsx
    index 82f2510d583..717d00334c4 100644
    --- a/examples/rac-spectrum-tailwind/src/components/GenInputField.tsx
    +++ b/examples/rac-spectrum-tailwind/src/components/GenInputField.tsx
    @@ -16,13 +16,13 @@ export function GenInputField() {
             value={value}
             onChange={setValue}
             aria-label="Prompt"
    -        className="flex-grow h-full p-150"
    +        className="grow h-full p-150"
           >
    -        <Input className="w-full h-full text-xl font-semibold text-black dark:bg-black dark:text-white p-50 focus:outline-none" />
    +        <Input className="w-full h-full text-xl font-semibold text-black dark:bg-black dark:text-white p-50 focus:outline-hidden" />
           </TextField>
           <Button
             isDisabled={value === ""}
    -        className="self-end my-auto font-semibold text-white rounded-full disabled:bg-gray-300 disabled:text-gray-500 mx-200 bg-accent-800 p-150 focus-visible:ring focus:outline-none"
    +        className="self-end my-auto font-semibold text-white rounded-full disabled:bg-gray-300 disabled:text-gray-500 mx-200 bg-accent-800 p-150 focus-visible:ring focus:outline-hidden"
           >
             Generate
           </Button>
    diff --git a/examples/rac-spectrum-tailwind/src/components/NavigationBox.tsx b/examples/rac-spectrum-tailwind/src/components/NavigationBox.tsx
    index a0ffe3ee7b3..0d1482ebead 100644
    --- a/examples/rac-spectrum-tailwind/src/components/NavigationBox.tsx
    +++ b/examples/rac-spectrum-tailwind/src/components/NavigationBox.tsx
    @@ -9,7 +9,7 @@ export function NavigationBox({ children, src, ...other }: NavigationBoxProps) {
       return (
         <Link
           style={{ backgroundImage: `url("${src}")` }}
    -      className="flex text-center text-white bg-cover m-175 rounded-medium h-2000 w-2000 p-60 focus-visible:ring focus:outline-none"
    +      className="flex text-center text-white bg-cover m-175 rounded-medium h-2000 w-2000 p-60 focus-visible:ring focus:outline-hidden"
           {...other}
         >
           <div
    diff --git a/examples/rac-spectrum-tailwind/src/components/SelectBoxGroup.tsx b/examples/rac-spectrum-tailwind/src/components/SelectBoxGroup.tsx
    index 3d73eb12679..31e2367f55a 100644
    --- a/examples/rac-spectrum-tailwind/src/components/SelectBoxGroup.tsx
    +++ b/examples/rac-spectrum-tailwind/src/components/SelectBoxGroup.tsx
    @@ -29,7 +29,7 @@ export function SelectBox({ name, icon, description }: SelectBoxProps) {
       return (
         <Radio
           value={name}
    -      className="flex justify-center bg-white border rounded dark:bg-black p-160 m-160 h-2000 w-2000 focus:outline-none focus-visible:ring-half focus-visible:ring-offset-0 selected:bg-accent-100 selected:border-accent-700"
    +      className="flex justify-center bg-white border rounded dark:bg-black p-160 m-160 h-2000 w-2000 focus:outline-hidden focus-visible:ring-half focus-visible:ring-offset-0 selected:bg-accent-100 selected:border-accent-700"
         >
           {({ isSelected }) => (
             <div className="relative flex flex-col items-center justify-center w-full h-full gap-150">
    diff --git a/examples/rac-spectrum-tailwind/src/components/SentimentRatingGroup.tsx b/examples/rac-spectrum-tailwind/src/components/SentimentRatingGroup.tsx
    index d4d451b8ad4..47da1fd8a54 100644
    --- a/examples/rac-spectrum-tailwind/src/components/SentimentRatingGroup.tsx
    +++ b/examples/rac-spectrum-tailwind/src/components/SentimentRatingGroup.tsx
    @@ -40,7 +40,7 @@ export function SentimentRating({ rating }: { rating: string }) {
       return (
         <Radio
           value={rating}
    -      className="flex items-center justify-center bg-white border rounded-full disabled:bg-gray-200 disabled:text-gray-400 p-160 m-75 h-200 w-200 focus:outline-none focus-visible:ring dark:bg-black selected:bg-accent-800 dark:selected:bg-accent-800 selected:border-accent-800 selected:text-white pressed:bg-gray-200 dark:pressed:bg-gray-200 hover:border-gray-300"
    +      className="flex items-center justify-center bg-white border rounded-full disabled:bg-gray-200 disabled:text-gray-400 p-160 m-75 h-200 w-200 focus:outline-hidden focus-visible:ring dark:bg-black selected:bg-accent-800 dark:selected:bg-accent-800 selected:border-accent-800 selected:text-white pressed:bg-gray-200 dark:pressed:bg-gray-200 hover:border-gray-300"
         >
           {rating}
         </Radio>
    diff --git a/examples/rac-spectrum-tailwind/src/style.css b/examples/rac-spectrum-tailwind/src/style.css
    index 00488ea27fa..a6d617bf484 100644
    --- a/examples/rac-spectrum-tailwind/src/style.css
    +++ b/examples/rac-spectrum-tailwind/src/style.css
    @@ -1,6 +1,6 @@
    -@tailwind base;
    -@tailwind components;
    -@tailwind utilities;
    +@import 'tailwindcss' source("./");
    +
    +@config '../tailwind.config.js';
     
     * {
       -webkit-tap-highlight-color: transparent;
    diff --git a/examples/rac-tailwind/.postcssrc b/examples/rac-tailwind/.postcssrc
    index 0985cb2aab0..e092dc7c1ef 100644
    --- a/examples/rac-tailwind/.postcssrc
    +++ b/examples/rac-tailwind/.postcssrc
    @@ -1,5 +1,5 @@
     {
       "plugins": {
    -    "tailwindcss": {}
    +    "@tailwindcss/postcss": {}
       }
     }
    diff --git a/examples/rac-tailwind/package.json b/examples/rac-tailwind/package.json
    index 722cf5ea8cb..e963681d038 100644
    --- a/examples/rac-tailwind/package.json
    +++ b/examples/rac-tailwind/package.json
    @@ -4,20 +4,21 @@
       "packageManager": "yarn@4.2.2",
       "scripts": {
         "start": "parcel src/index.html",
    -    "build": "parcel build src/index.html",
    +    "build": "PARCEL_WORKER_BACKEND=process parcel build src/index.html",
         "install-17": "yarn add -W react@^17 react-dom@^17"
       },
       "dependencies": {
         "@heroicons/react": "^2.0.16",
         "@react-aria/parcel-resolver-optimize-locales": "^1.0.0",
    +    "@tailwindcss/postcss": "^4.0.0",
         "framer-motion": "^10.12.16",
         "parcel": "^2.13.0",
         "postcss": "^8.4.21",
         "react": "^18.2.0",
    -    "react-aria-components": "^1.0.0-alpha.4",
    +    "react-aria-components": "^1.6.0",
         "react-dom": "^18.2.0",
         "react-stately": "^3.23.0",
    -    "tailwindcss": "^3.3.0",
    +    "tailwindcss": "^4.0.0",
         "tailwindcss-animate": "^1.0.5"
       },
       "devDependencies": {
    diff --git a/examples/rac-tailwind/src/AnimatedCalendar.tsx b/examples/rac-tailwind/src/AnimatedCalendar.tsx
    index d6389c374cd..0438a31b480 100644
    --- a/examples/rac-tailwind/src/AnimatedCalendar.tsx
    +++ b/examples/rac-tailwind/src/AnimatedCalendar.tsx
    @@ -34,7 +34,7 @@ export function AnimatedCalendar() {
                     state.focusPreviousPage();
                     setPageOffset(pageOffset - 1);
                   }}
    -              className="w-12 h-12 sm:w-9 sm:h-9 ml-4 outline-none cursor-default rounded-full flex items-center justify-center data-[hovered]:bg-gray-100 data-[pressed]:bg-gray-200 data-[focus-visible]:ring data-[focus-visible]:ring-black data-[focus-visible]:ring-offset-2">
    +              className="w-12 h-12 sm:w-9 sm:h-9 ml-4 outline-hidden cursor-default rounded-full flex items-center justify-center data-hovered:bg-gray-100 data-pressed:bg-gray-200 data-focus-visible:ring-3 data-focus-visible:ring-black data-focus-visible:ring-offset-2">
                   <ChevronLeftIcon className="h-6 w-6" />
                 </Button>
                 <Button
    @@ -43,7 +43,7 @@ export function AnimatedCalendar() {
                     state.focusNextPage();
                     setPageOffset(pageOffset + 1);
                   }}
    -              className="w-12 h-12 sm:w-9 sm:h-9 outline-none cursor-default rounded-full flex items-center justify-center data-[hovered]:bg-gray-100 data-[pressed]:bg-gray-200 data-[focus-visible]:ring data-[focus-visible]:ring-black data-[focus-visible]:ring-offset-2">
    +              className="w-12 h-12 sm:w-9 sm:h-9 outline-hidden cursor-default rounded-full flex items-center justify-center data-hovered:bg-gray-100 data-pressed:bg-gray-200 data-focus-visible:ring-3 data-focus-visible:ring-black data-focus-visible:ring-offset-2">
                   <ChevronRightIcon className="h-6 w-6" />
                 </Button>
               </header>
    @@ -81,7 +81,7 @@ function Month({offset}: { offset: number }) {
             {(date) => (
               <CalendarCell
                 date={date}
    -            className="w-12 h-12 sm:w-9 sm:h-9 outline-none cursor-default rounded-full text-md sm:text-sm flex items-center justify-center data-[outside-month]:text-gray-300 data-[hovered]:bg-gray-100 data-[pressed]:bg-gray-200 data-[selected]:data-[hovered]:bg-black data-[selected]:bg-black data-[selected]:text-white data-[focus-visible]:ring data-[focus-visible]:ring-black data-[focus-visible]:ring-offset-2" />
    +            className="w-12 h-12 sm:w-9 sm:h-9 outline-hidden cursor-default rounded-full text-md sm:text-sm flex items-center justify-center data-outside-month:text-gray-300 data-hovered:bg-gray-100 data-pressed:bg-gray-200 data-selected:data-hovered:bg-black data-selected:bg-black data-selected:text-white data-focus-visible:ring-3 data-focus-visible:ring-black data-focus-visible:ring-offset-2" />
             )}
           </CalendarGridBody>
         </CalendarGrid>
    diff --git a/examples/rac-tailwind/src/App.js b/examples/rac-tailwind/src/App.js
    index c49256b7bd7..8e012b419b0 100644
    --- a/examples/rac-tailwind/src/App.js
    +++ b/examples/rac-tailwind/src/App.js
    @@ -1,7 +1,59 @@
    -import { ArrowUpIcon, BellIcon, CheckCircleIcon, CheckIcon, ChevronUpDownIcon } from '@heroicons/react/20/solid';
    +import { ArrowUpIcon, BellIcon, CheckCircleIcon, CheckIcon, ChevronUpDownIcon, ChevronRightIcon } from '@heroicons/react/20/solid';
     import { ChatBubbleOvalLeftEllipsisIcon, ExclamationTriangleIcon } from '@heroicons/react/24/outline';
     import { useMemo, useState } from 'react';
    -import { Button, Cell, Collection, Column, ComboBox, DateInput, DatePicker, DateSegment, Dialog, DialogTrigger, Group, Header, Heading, Input, Label, ListBox, ListBoxItem, Menu, MenuItem, MenuTrigger, Modal, ModalOverlay, OverlayArrow, Popover, ProgressBar, Radio, RadioGroup, Row, Section, Select, SelectValue, Separator, Slider, SliderOutput, SliderThumb, SliderTrack, Switch, Tab, Table, TableBody, TableHeader, TabList, TabPanel, Tabs, Text } from 'react-aria-components';
    +import {
    +  Tree as AriaTree,
    +  TreeItem as AriaTreeItem,
    +  TreeItemContent as AriaTreeItemContent,
    +  Autocomplete,
    +  Button,
    +  Cell,
    +  Collection,
    +  Column,
    +  ComboBox,
    +  DateInput,
    +  DatePicker,
    +  DateSegment,
    +  Dialog,
    +  DialogTrigger,
    +  Group,
    +  Header,
    +  Heading,
    +  Input,
    +  Label,
    +  ListBox,
    +  ListBoxItem,
    +  Menu,
    +  MenuItem,
    +  MenuTrigger,
    +  Modal,
    +  ModalOverlay,
    +  OverlayArrow,
    +  Popover,
    +  ProgressBar,
    +  Radio,
    +  RadioGroup,
    +  Row,
    +  SearchField,
    +  Section,
    +  Select,
    +  SelectValue,
    +  Separator,
    +  Slider,
    +  SliderOutput,
    +  SliderThumb,
    +  SliderTrack,
    +  Switch,
    +  Tab,
    +  Table,
    +  TableBody,
    +  TableHeader,
    +  TabList,
    +  TabPanel,
    +  Tabs,
    +  Text,
    +  useFilter
    +} from 'react-aria-components';
     import { useAsyncList } from 'react-stately';
     import { people } from './people.js';
     import stocks from './stocks.json';
    @@ -10,9 +62,9 @@ import {AnimatedCalendar} from './AnimatedCalendar';
     export function App() {
       return (
         <>
    -      <h1 className="text-center text-4xl font-serif font-semibold mb-3">React Aria Components 🤝 Tailwind CSS</h1>
    -      <p className="text-center font-serif mb-8">
    -        <a className="hover:text-blue-100 transition underline" target="_blank" href="https://github.com/adobe/react-spectrum/blob/main/examples/rac-tailwind/src/App.js">Example code</a> • <a className="hover:text-blue-100 transition underline" target="_blank" href="https://react-spectrum.adobe.com/react-aria/react-aria-components.html">Docs</a>
    +      <h1 className="mb-3 font-serif text-4xl font-semibold text-center">React Aria Components 🤝 Tailwind CSS</h1>
    +      <p className="mb-8 font-serif text-center">
    +        <a className="underline transition hover:text-blue-100" target="_blank" href="https://github.com/adobe/react-spectrum/blob/main/examples/rac-tailwind/src/App.js">Example code</a> • <a className="underline transition hover:text-blue-100" target="_blank" href="https://react-spectrum.adobe.com/react-aria/react-aria-components.html">Docs</a>
           </p>
           <div className="grid gap-4 grid-cols-1 md:grid-cols-[repeat(auto-fit,theme(width.96))] auto-rows-fr justify-center">
             <MenuExample />
    @@ -29,6 +81,8 @@ export function App() {
             <ImageGridExample />
             <ComboBoxExample />
             <ProgressBarExample />
    +        <AutocompleteExample />
    +        <TreeExample />
           </div>
         </>
       );
    @@ -36,17 +90,17 @@ export function App() {
     
     function MenuExample() {
       return (
    -    <div className="bg-gradient-to-r to-blue-500 from-violet-500 p-8 rounded-lg">
    +    <div className="p-8 rounded-lg bg-linear-to-r to-blue-500 from-violet-500">
           <MenuTrigger>
             <OverlayButton aria-label="Menu">☰</OverlayButton>
    -        <Popover className="p-1 w-56 overflow-auto rounded-md bg-white shadow-lg ring-1 ring-black ring-opacity-5 data-[entering]:animate-in data-[entering]:fade-in data-[entering]:zoom-in-95 data-[exiting]:animate-out data-[exiting]:fade-out data-[exiting]:zoom-out-95 fill-mode-forwards origin-top-left">
    -          <Menu className="outline-none">
    +        <Popover className="w-56 p-1 overflow-auto origin-top-left bg-white rounded-md shadow-lg ring-1 ring-black/5 data-entering:animate-in data-entering:fade-in data-entering:zoom-in-95 data-exiting:animate-out data-exiting:fade-out data-exiting:zoom-out-95 fill-mode-forwards">
    +          <Menu className="outline-hidden">
                 <MyMenuItem id="new">New…</MyMenuItem>
                 <MyMenuItem id="open">Open…</MyMenuItem>
    -            <Separator className="border-b border-b-gray-300 mx-3 my-1" />
    +            <Separator className="mx-3 my-1 border-b border-b-gray-300" />
                 <MyMenuItem id="save">Save</MyMenuItem>
                 <MyMenuItem id="save-as">Save as…</MyMenuItem>
    -            <Separator className="border-b border-b-gray-300 mx-3 my-1" />
    +            <Separator className="mx-3 my-1 border-b border-b-gray-300" />
                 <MyMenuItem id="print">Print…</MyMenuItem>
               </Menu>
             </Popover>
    @@ -57,28 +111,28 @@ function MenuExample() {
     
     function MyMenuItem(props) {
       return <MenuItem {...props} className={({ isFocused }) => `
    -    group flex w-full items-center rounded-md px-3 py-2 sm:text-sm outline-none cursor-default
    +    group flex w-full items-center rounded-md px-3 py-2 sm:text-sm outline-hidden cursor-default
         ${isFocused ? 'bg-violet-500 text-white' : 'text-gray-900'}
       `} />;
     }
     
     function OverlayButton(props) {
    -  return <Button {...props} className="inline-flex items-center justify-center rounded-md bg-black bg-opacity-20 bg-clip-padding border border-white/20 px-3.5 py-2 sm:text-sm font-medium text-white data-[hovered]:bg-opacity-30 data-[pressed]:bg-opacity-40 transition-colors cursor-default outline-none data-[focus-visible]:ring-2 data-[focus-visible]:ring-white/75" />;
    +  return <Button {...props} className="inline-flex items-center justify-center rounded-md bg-black/20 bg-clip-padding border border-white/20 px-3.5 py-2 sm:text-sm font-medium text-white data-hovered:bg-black/30 data-pressed:bg-black/40 transition-colors cursor-default outline-hidden data-focus-visible:ring-2 data-focus-visible:ring-white/75" />;
     }
     
     function SelectExample() {
       return (
    -    <div className="bg-gradient-to-r from-amber-500 to-rose-500 p-8 rounded-lg flex justify-center">
    -      <Select className="flex flex-col gap-1 w-5/6">
    +    <div className="flex justify-center p-8 rounded-lg bg-linear-to-r from-amber-500 to-rose-500">
    +      <Select className="flex flex-col w-5/6 gap-1">
             <Label className="text-sm">Favorite Animal</Label>
    -        <Button className="flex relative w-full cursor-default rounded-lg bg-white bg-white bg-opacity-90 data-[pressed]:bg-opacity-100 transition py-2 pl-3 pr-2 text-left shadow-md text-gray-700 focus:outline-none data-[focus-visible]:border-indigo-500 data-[focus-visible]:ring-2 data-[focus-visible]:ring-black sm:text-sm">
    -          <SelectValue className="flex-1 truncate data-[placeholder]:italic" />
    +        <Button className="relative flex w-full py-2 pl-3 pr-2 text-left text-gray-700 transition bg-white rounded-lg shadow-md cursor-default bg-white/90 data-pressed:bg-white focus:outline-hidden data-focus-visible:border-indigo-500 data-focus-visible:ring-2 data-focus-visible:ring-black sm:text-sm">
    +          <SelectValue className="flex-1 truncate data-placeholder:italic" />
               <ChevronUpDownIcon
    -            className="h-5 w-5 text-gray-500"
    +            className="w-5 h-5 text-gray-500"
                 aria-hidden="true" />
             </Button>
    -        <Popover className="max-h-60 w-[--trigger-width] overflow-auto rounded-md bg-white text-base shadow-lg ring-1 ring-black ring-opacity-5 sm:text-sm data-[entering]:animate-in data-[entering]:fade-in data-[exiting]:animate-out data-[exiting]:fade-out fill-mode-forwards">
    -          <ListBox className="outline-none p-1 [--focus-bg:theme(colors.rose.600)]">
    +        <Popover className="max-h-60 w-(--trigger-width) overflow-auto rounded-md bg-white text-base shadow-lg ring-1 ring-black/5 sm:text-sm data-entering:animate-in data-entering:fade-in data-exiting:animate-out data-exiting:fade-out fill-mode-forwards">
    +          <ListBox className="outline-hidden p-1 [--focus-bg:var(--color-rose-600)]">
                 <MyListBoxItem>Aardvark</MyListBoxItem>
                 <MyListBoxItem>Cat</MyListBoxItem>
                 <MyListBoxItem>Dog</MyListBoxItem>
    @@ -97,15 +151,15 @@ function MyListBoxItem(props) {
           {...props}
           textValue={props.children}
           className={({isFocused}) => `
    -        relative group cursor-default select-none py-2 pl-10 pr-4 outline-none rounded
    -        ${isFocused ? 'bg-[--focus-bg] text-white' : 'text-gray-900'}
    +        relative group cursor-default select-none py-2 pl-10 pr-4 outline-hidden rounded
    +        ${isFocused ? 'bg-(--focus-bg) text-white' : 'text-gray-900'}
           `}>
           {({ isSelected }) => (
             <>
               <span className={`block truncate ${isSelected ? 'font-medium' : 'font-normal'}`}>{props.children}</span>
               {isSelected &&
    -            <span className="absolute inset-y-0 left-0 flex items-center pl-3 text-[--focus-bg] group-data-[focused]:text-white">
    -              <CheckIcon className="h-5 w-5" aria-hidden="true" />
    +            <span className="absolute inset-y-0 left-0 flex items-center pl-3 text-(--focus-bg) group-data-focused:text-white">
    +              <CheckIcon className="w-5 h-5" aria-hidden="true" />
                 </span>
               }
             </>
    @@ -116,19 +170,19 @@ function MyListBoxItem(props) {
     
     function ComboBoxExample() {
       return (
    -    <div className="bg-gradient-to-r from-sky-400 to-cyan-400 p-8 rounded-lg flex justify-center">
    -      <ComboBox className="flex flex-col gap-1 w-5/6">
    +    <div className="flex justify-center p-8 rounded-lg bg-linear-to-r from-sky-400 to-cyan-400">
    +      <ComboBox className="flex flex-col w-5/6 gap-1">
             <Label className="text-sm text-black">Favorite Animal</Label>
    -        <div className="relative w-full cursor-default overflow-hidden rounded-lg bg-white bg-opacity-90 focus-within:bg-opacity-100 transition text-left shadow-md [&:has([data-focus-visible])]:ring-2 [&:has([data-focus-visible])]:ring-black sm:text-sm">
    -          <Input className="w-full border-none py-2 pl-3 pr-10 sm:text-sm leading-5 text-gray-900 bg-transparent outline-none" />
    -          <Button className="absolute inset-y-0 right-0 flex items-center px-2 cursor-default transition border-l border-l-sky-200 data-[pressed]:bg-sky-100">
    +        <div className="relative w-full cursor-default overflow-hidden rounded-lg bg-white/90 focus-within:bg-white transition text-left shadow-md [&:has([data-focus-visible])]:ring-2 [&:has([data-focus-visible])]:ring-black sm:text-sm">
    +          <Input className="w-full py-2 pl-3 pr-10 leading-5 text-gray-900 bg-transparent border-none sm:text-sm outline-hidden" />
    +          <Button className="absolute inset-y-0 right-0 flex items-center px-2 transition border-l cursor-default border-l-sky-200 data-pressed:bg-sky-100">
                 <ChevronUpDownIcon
    -              className="h-5 w-5 text-gray-500"
    +              className="w-5 h-5 text-gray-500"
                   aria-hidden="true" />
               </Button>
             </div>
    -        <Popover className="max-h-60 w-[--trigger-width] overflow-auto rounded-md bg-white text-base shadow-lg ring-1 ring-black ring-opacity-5 sm:text-sm data-[exiting]:animate-out data-[exiting]:fade-out fill-mode-forwards duration-100 ease-in">
    -          <ListBox className="outline-none p-1 [--focus-bg:theme(colors.sky.600)]">
    +        <Popover className="max-h-60 w-(--trigger-width) overflow-auto rounded-md bg-white text-base shadow-lg ring-1 ring-black/5 sm:text-sm data-exiting:animate-out data-exiting:fade-out fill-mode-forwards duration-100 ease-in">
    +          <ListBox className="outline-hidden p-1 [--focus-bg:var(--color-sky-600)]">
                 <MyListBoxItem>Aardvark</MyListBoxItem>
                 <MyListBoxItem>Cat</MyListBoxItem>
                 <MyListBoxItem>Dog</MyListBoxItem>
    @@ -143,9 +197,9 @@ function ComboBoxExample() {
     
     function TabsExample() {
       return (
    -    <div className="bg-gradient-to-r from-lime-500 to-emerald-500 p-8 rounded-lg">
    +    <div className="p-8 rounded-lg bg-linear-to-r from-lime-500 to-emerald-500">
           <Tabs>
    -        <TabList aria-label="Feeds" className="flex space-x-1 rounded-full bg-green-900/40 bg-clip-padding p-1 border border-white/30">
    +        <TabList aria-label="Feeds" className="flex p-1 space-x-1 border rounded-full bg-green-900/40 bg-clip-padding border-white/30">
               <MyTab id="blog">Blog</MyTab>
               <MyTab id="releases">Releases</MyTab>
               <MyTab id="docs">Docs</MyTab>
    @@ -181,31 +235,31 @@ function MyTab(props) {
         <Tab
           {...props}
           className={({isSelected, isFocusVisible}) => `
    -        w-full rounded-full py-2.5 sm:text-sm font-medium leading-5 text-center cursor-default ring-black outline-none transition-colors
    +        w-full rounded-full py-2.5 sm:text-sm font-medium leading-5 text-center cursor-default ring-black outline-hidden transition-colors
             ${isFocusVisible ? 'ring-2' : ''}
    -        ${isSelected ? 'text-emerald-700 bg-white shadow' : 'text-lime-50 data-[hovered]:bg-white/[0.12] data-[hovered]:text-white data-[pressed]:bg-white/[0.12] data-[pressed]:text-white'}
    +        ${isSelected ? 'text-emerald-700 bg-white shadow-sm' : 'text-lime-50 data-hovered:bg-white/[0.12] data-hovered:text-white data-pressed:bg-white/[0.12] data-pressed:text-white'}
           `} />
       );
     }
     
     function MyTabPanel(props) {
    -  return <TabPanel {...props} className="mt-2 text-gray-700 font-serif rounded-2xl bg-white p-2 shadow ring-black focus:outline-none data-[focus-visible]:ring-2" />;
    +  return <TabPanel {...props} className="p-2 mt-2 font-serif text-gray-700 bg-white shadow-sm rounded-2xl ring-black focus:outline-hidden data-focus-visible:ring-2" />;
     }
     
     function Article({title, summary}) {
       return (
         <a href="#" className="p-2 rounded-lg hover:bg-gray-100 h-[69px]">
           <h3 className="text-sm mb-0.5 font-semibold overflow-hidden text-ellipsis whitespace-nowrap">{title}</h3>
    -      <p className="text-xs overflow-hidden text-ellipsis line-clamp-2">{summary}</p>
    +      <p className="overflow-hidden text-xs text-ellipsis line-clamp-2">{summary}</p>
         </a>
       );
     }
     
     function RadioGroupExample() {
       return (
    -    <div className="bg-gradient-to-r from-blue-300 to-indigo-300 p-8 rounded-lg">
    +    <div className="p-8 rounded-lg bg-linear-to-r from-blue-300 to-indigo-300">
           <RadioGroup className="space-y-2" defaultValue="Standard">
    -        <Label className="text-xl text-slate-900 font-semibold font-serif">Shipping</Label>
    +        <Label className="font-serif text-xl font-semibold text-slate-900">Shipping</Label>
             <MyRadio name="Standard" time="4-10 business days" price="$4.99" />
             <MyRadio name="Express" time="2-5 business days" price="$15.99" />
             <MyRadio name="Lightning" time="1 business day" price="$24.99" />
    @@ -217,18 +271,18 @@ function RadioGroupExample() {
     function MyRadio({name, time, price}) {
       return (
         <Radio value={name} className={({isFocusVisible, isSelected, isPressed}) => `
    -      relative flex cursor-default rounded-lg px-4 py-3 shadow-lg focus:outline-none bg-clip-padding border border-transparent
    +      relative flex cursor-default rounded-lg px-4 py-3 shadow-lg focus:outline-hidden bg-clip-padding border border-transparent
           ${isFocusVisible ? 'ring-2 ring-blue-600 ring-offset-1 ring-offset-white/80' : ''}
           ${isSelected ? 'bg-blue-600 border-white/30 text-white' : ''}
           ${isPressed && !isSelected ? 'bg-blue-50' : ''}
           ${!isSelected && !isPressed ? 'bg-white' : ''}
         `}>
           {({isSelected}) => (
    -        <div className="flex w-full items-center justify-between gap-3">
    +        <div className="flex items-center justify-between w-full gap-3">
               <div className="shrink-0">
                 <CheckCircleIcon className={`h-6 w-6 ${isSelected ? 'text-white' : 'text-blue-100'}`} />
               </div>
    -          <div className="flex flex-1 flex-col">
    +          <div className="flex flex-col flex-1">
                 <div className={`font-serif font-semibold ${isSelected ? 'text-white' : 'text-gray-900'}`}>{name}</div>
                 <div className={`text-sm inline ${isSelected ? 'text-sky-100' : 'text-gray-500'}`}>
                   {time}
    @@ -243,11 +297,11 @@ function MyRadio({name, time, price}) {
     
     function ModalExample() {
       return (
    -    <div className="bg-gradient-to-r from-sky-400 to-indigo-500 p-8 rounded-lg flex items-center justify-center">
    +    <div className="flex items-center justify-center p-8 rounded-lg bg-linear-to-r from-sky-400 to-indigo-500">
           <DialogTrigger>
             <OverlayButton>Open dialog</OverlayButton>
             <ModalOverlay className={({isEntering, isExiting}) => `
    -          fixed inset-0 z-10 overflow-y-auto bg-black bg-opacity-25 flex min-h-full items-center justify-center p-4 text-center backdrop-blur
    +          fixed inset-0 z-10 overflow-y-auto bg-black/25 flex min-h-full items-center justify-center p-4 text-center backdrop-blur
               ${isEntering ? 'animate-in fade-in duration-300 ease-out fill-mode-forwards' : ''}
               ${isExiting ? 'animate-out fade-out duration-200 ease-in fill-mode-forwards' : ''}
             `}>
    @@ -256,22 +310,22 @@ function ModalExample() {
                 ${isEntering ? 'animate-in fade-in zoom-in-95 ease-out duration-300 fill-mode-forwards' : ''}
                 ${isExiting ? 'animate-out fade-out zoom-out-95 ease-in duration-200 fill-mode-forwards' : ''}
               `}>
    -            <Dialog role="alertdialog" className="outline-none relative">
    +            <Dialog role="alertdialog" className="relative outline-hidden">
                   {({ close }) => (<>
                     <Heading className="text-xl font-semibold leading-6 text-slate-700">Delete folder</Heading>
    -                <ExclamationTriangleIcon className="w-6 h-6 text-red-500 absolute right-0 top-0 stroke-2" />
    +                <ExclamationTriangleIcon className="absolute top-0 right-0 w-6 h-6 text-red-500 stroke-2" />
                     <p className="mt-3 text-sm text-slate-500">
                       Are you sure you want to delete "Documents"? All contents will be permanently destroyed.
                     </p>
    -                <div className="mt-6 flex justify-end gap-2">
    +                <div className="flex justify-end gap-2 mt-6">
                       <DialogButton
    -                    className="bg-slate-200 text-slate-800 data-[hovered]:border-slate-300 data-[pressed]:bg-slate-300"
    +                    className="bg-slate-200 text-slate-800 data-hovered:border-slate-300 data-pressed:bg-slate-300"
                         onPress={close}
                       >
                         Cancel
                       </DialogButton>
                       <DialogButton
    -                    className="bg-red-500 text-white data-[hovered]:border-red-600 data-[pressed]:bg-red-600"
    +                    className="text-white bg-red-500 data-hovered:border-red-600 data-pressed:bg-red-600"
                         onPress={close}
                       >
                         Delete
    @@ -287,12 +341,12 @@ function ModalExample() {
     }
     
     function DialogButton({className, ...props}) {
    -  return <Button {...props} className={`inline-flex justify-center rounded-md border border-transparent px-5 py-2 text-sm font-medium transition-colors cursor-default outline-none data-[focus-visible]:ring-2 data-[focus-visible]:ring-blue-500 data-[focus-visible]:ring-offset-2 ${className}`} />;
    +  return <Button {...props} className={`inline-flex justify-center rounded-md border border-transparent px-5 py-2 text-sm font-medium transition-colors cursor-default outline-hidden data-focus-visible:ring-2 data-focus-visible:ring-blue-500 data-focus-visible:ring-offset-2 ${className}`} />;
     }
     
     function PopoverExample() {
       return (
    -    <div className="bg-gradient-to-r from-orange-400 to-pink-600 p-8 rounded-lg flex items-start justify-center">
    +    <div className="flex items-start justify-center p-8 rounded-lg bg-linear-to-r from-orange-400 to-pink-600">
           <DialogTrigger>
             <OverlayButton aria-label="Notifications">
               <BellIcon className="w-5 h-5 text-white" aria-hidden="true" />
    @@ -303,7 +357,7 @@ function PopoverExample() {
                   <path d="M0 0,L6 6,L12 0" />
                 </svg>
               </OverlayArrow>
    -          <Dialog className="p-2 outline-none text-gray-700">
    +          <Dialog className="p-2 text-gray-700 outline-hidden">
                 <div className="flex flex-col">
                   <Notification avatar={people[4].avatar} name={people[4].name} time="2h" text="This looks great! Let's ship it." />
                   <Notification avatar={people[1].avatar} name={people[1].name} time="4h" text="Can you add a bit more pizzazz?" />
    @@ -331,21 +385,21 @@ function MyPopover(props) {
     function Notification({avatar, name, time, text}) {
       return (
         <a href="#" className="p-2 rounded-lg hover:bg-gray-100 grid grid-cols-[theme(width.5)_1fr_theme(width.4)] gap-x-2">
    -      <img src={avatar} className="rounded-full w-5 h-5 row-span-3" />
    -      <div className="text-sm text-gray-800 font-semibold">{name}</div>
    +      <img src={avatar} className="w-5 h-5 row-span-3 rounded-full" />
    +      <div className="text-sm font-semibold text-gray-800">{name}</div>
           <ChatBubbleOvalLeftEllipsisIcon className="w-4 h-4 text-gray-400 stroke-2" />
    -      <div className="text-xs text-gray-500 col-span-2">Commented {time} ago</div>
    -      <p className="text-xs overflow-hidden text-ellipsis line-clamp-2 mt-1 col-span-2">{text}</p>
    +      <div className="col-span-2 text-xs text-gray-500">Commented {time} ago</div>
    +      <p className="col-span-2 mt-1 overflow-hidden text-xs text-ellipsis line-clamp-2">{text}</p>
         </a>
       );
     }
     
     function SwitchExample() {
       return (
    -    <div className="bg-gradient-to-r from-yellow-300 to-orange-300 p-8 rounded-lg flex items-center justify-center">
    -      <Switch className="group flex gap-2 items-center text-black font-semibold text-sm">
    -        <div className="inline-flex h-[26px] w-[44px] shrink-0 cursor-default rounded-full shadow-inner bg-clip-padding border border-white/30 p-[3px] transition-colors duration-200 ease-in-out bg-yellow-600 group-data-[pressed]:bg-yellow-700 group-data-[selected]:bg-amber-800 group-data-[selected]:group-data-[pressed]:bg-amber-900 focus:outline-none group-data-[focus-visible]:ring-2 group-data-[focus-visible]:ring-black">
    -          <span className="h-[18px] w-[18px] transform rounded-full bg-white shadow ring-0 transition duration-200 ease-in-out translate-x-0 group-data-[selected]:translate-x-[100%]" />
    +    <div className="flex items-center justify-center p-8 rounded-lg bg-linear-to-r from-yellow-300 to-orange-300">
    +      <Switch className="flex items-center gap-2 text-sm font-semibold text-black group">
    +        <div className="inline-flex h-[26px] w-[44px] shrink-0 cursor-default rounded-full shadow-inner bg-clip-padding border border-white/30 p-[3px] transition-colors duration-200 ease-in-out bg-yellow-600 group-data-pressed:bg-yellow-700 group-data-selected:bg-amber-800 group-data-pressed:group-data-selected:bg-amber-900 focus:outline-hidden group-data-focus-visible:ring-2 group-data-focus-visible:ring-black">
    +          <span className="h-[18px] w-[18px] transform rounded-full bg-white shadow-sm ring-0 transition duration-200 ease-in-out translate-x-0 group-data-selected:translate-x-[100%]" />
             </div>
             Wi-Fi
           </Switch>
    @@ -355,7 +409,7 @@ function SwitchExample() {
     
     function SliderExample() {
       return (
    -    <div className="bg-gradient-to-r from-purple-500 to-pink-500 p-8 rounded-lg flex items-center justify-center">
    +    <div className="flex items-center justify-center p-8 rounded-lg bg-linear-to-r from-purple-500 to-pink-500">
           <Slider defaultValue={30} className="w-5/6">
             <div className="flex sm:text-sm">
               <Label className="flex-1">Opacity</Label>
    @@ -363,9 +417,9 @@ function SliderExample() {
             </div>
             <SliderTrack className="relative w-full h-7">
               {({state}) => <>
    -            <div className="absolute h-2 top-[50%] transform translate-y-[-50%] w-full rounded-full bg-white bg-opacity-40" />
    +            <div className="absolute h-2 top-[50%] transform translate-y-[-50%] w-full rounded-full bg-white/40" />
                 <div className="absolute h-2 top-[50%] transform translate-y-[-50%] rounded-full bg-white" style={{width: state.getThumbPercent(0) * 100 + '%'}} />
    -            <SliderThumb className="h-7 w-7 top-[50%] rounded-full border border-purple-800/75 bg-white transition-colors data-[dragging]:bg-purple-100 outline-none data-[focus-visible]:ring-2 data-[focus-visible]:ring-black" />
    +            <SliderThumb className="h-7 w-7 top-[50%] rounded-full border border-purple-800/75 bg-white transition-colors data-dragging:bg-purple-100 outline-hidden data-focus-visible:ring-2 data-focus-visible:ring-black" />
               </>}
             </SliderTrack>
           </Slider>
    @@ -375,14 +429,14 @@ function SliderExample() {
     
     function ProgressBarExample() {
       return (
    -    <div className="bg-gradient-to-r from-blue-500 to-purple-500 p-8 rounded-lg flex items-center justify-center">
    -      <ProgressBar value={30} className="flex flex-col gap-3 w-56 text-sm">
    +    <div className="flex items-center justify-center p-8 rounded-lg bg-linear-to-r from-blue-500 to-purple-500">
    +      <ProgressBar value={30} className="flex flex-col w-56 gap-3 text-sm">
             {({percentage, valueText}) => <>
               <div className="flex">
                 <Label className="flex-1">Loading…</Label>
                 <span>{valueText}</span>
               </div>
    -          <div className="h-2 top-[50%] transform translate-y-[-50%] w-full rounded-full bg-white bg-opacity-40">
    +          <div className="h-2 top-[50%] transform translate-y-[-50%] w-full rounded-full bg-white/40">
                 <div className="absolute h-2 top-[50%] transform translate-y-[-50%] rounded-full bg-white" style={{width: percentage + '%'}} />
               </div>
             </>}
    @@ -393,16 +447,16 @@ function ProgressBarExample() {
     
     function DatePickerExample() {
       return (
    -    <div className="bg-gradient-to-r from-violet-500 to-fuchsia-600 p-8 rounded-lg flex items-start justify-center">
    -      <DatePicker className="flex flex-col gap-1 w-5/6">
    +    <div className="flex items-start justify-center p-8 rounded-lg bg-linear-to-r from-violet-500 to-fuchsia-600">
    +      <DatePicker className="flex flex-col w-5/6 gap-1">
             <Label className="text-sm">Date</Label>
    -        <Group className="flex rounded-lg bg-white/90 focus-within:bg-white [&:has([data-pressed])]:bg-white transition pl-3 text-left shadow-md text-gray-700 focus:outline-none data-[focus-visible]:[&:not(:has(button[data-focus-visible]))]:ring-2 data-[focus-visible]:ring-black">
    +        <Group className="flex rounded-lg bg-white/90 focus-within:bg-white [&:has([data-pressed])]:bg-white transition pl-3 text-left shadow-md text-gray-700 focus:outline-hidden data-focus-visible:[&:not(:has(button[data-focus-visible]))]:ring-2 data-focus-visible:ring-black">
               <DateInput className="flex flex-1 py-2 sm:text-sm input">
    -            {(segment) => <DateSegment segment={segment} className="px-0.5 box-content tabular-nums text-right outline-none rounded-sm focus:bg-violet-700 focus:text-white group caret-transparent data-[placeholder]:italic" />}
    +            {(segment) => <DateSegment segment={segment} className="px-0.5 box-content tabular-nums text-right outline-hidden rounded-xs focus:bg-violet-700 focus:text-white group caret-transparent data-placeholder:italic" />}
               </DateInput>
    -          <Button className="cursor-default outline-none px-2 transition border-l border-l-purple-200 rounded-r-lg data-[pressed]:bg-purple-100 data-[focus-visible]:ring-2 data-[focus-visible]:ring-black">
    +          <Button className="px-2 transition border-l rounded-r-lg cursor-default outline-hidden border-l-purple-200 data-pressed:bg-purple-100 data-focus-visible:ring-2 data-focus-visible:ring-black">
                 <ChevronUpDownIcon
    -              className="h-5 w-5 text-gray-500"
    +              className="w-5 h-5 text-gray-500"
                   aria-hidden="true" />
               </Button>
             </Group>
    @@ -418,8 +472,8 @@ function DatePickerExample() {
     
     function ContactListExample() {
       return (
    -    <div className="bg-gradient-to-r from-blue-500 to-sky-500 p-8 rounded-lg flex justify-center">
    -      <ListBox aria-label="Contacts" selectionMode="multiple" selectionBehavior="replace" className="w-72 max-h-[290px] overflow-auto outline-none bg-white text-gray-700 p-2 flex flex-col gap-2 rounded-lg shadow scroll-pb-2 scroll-pt-7">
    +    <div className="flex justify-center p-8 rounded-lg bg-linear-to-r from-blue-500 to-sky-500">
    +      <ListBox aria-label="Contacts" selectionMode="multiple" selectionBehavior="replace" className="w-72 max-h-[290px] overflow-auto outline-hidden bg-white text-gray-700 p-2 flex flex-col gap-2 rounded-lg shadow-sm scroll-pb-2 scroll-pt-7">
             <ContactSection title="Favorites">
               <Contact id="wade" name="Tony Baldwin" handle="@tony" avatar="https://images.unsplash.com/photo-1633332755192-727a05c4013d?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=2&w=256&h=256&q=80" />
               <Contact id="arelene" name="Julienne Langstrath" handle="@jlangstrath" avatar="https://images.unsplash.com/photo-1580489944761-15a19d654956?ixlib=rb-1.2.1&auto=format&fit=facearea&facepad=2&w=256&h=256&q=80" />
    @@ -436,7 +490,7 @@ function ContactListExample() {
     function ContactSection({title, children, items}) {
       return (
         <Section>
    -      <Header className="sticky -top-2 bg-white z-10 text-sm font-bold font-serif px-2 mb-1 text-slate-700">{title}</Header>
    +      <Header className="sticky z-10 px-2 mb-1 font-serif text-sm font-bold bg-white -top-2 text-slate-700">{title}</Header>
           <Collection items={items}>
             {children}
           </Collection>
    @@ -446,11 +500,11 @@ function ContactSection({title, children, items}) {
     
     function Contact({id, avatar, name, handle}) {
       return (
    -    <ListBoxItem id={id} textValue={name} className="group peer relative py-1 px-2 text-sm outline-none cursor-default grid grid-rows-2 grid-flow-col auto-cols-max gap-x-3 rounded aria-selected:bg-blue-500 text-slate-700 aria-selected:text-white aria-selected:[&:has(+[aria-selected=true])]:rounded-b-none aria-selected:peer-aria-selected:rounded-t-none data-[focus-visible]:ring-2 ring-offset-2 ring-blue-500 [&[aria-selected=false]:has(+[aria-selected=false])_.divider]:block [&[aria-selected=true]:has(+[aria-selected=true])_.divider]:block">
    -      <img src={avatar} alt="" className="row-span-2 place-self-center h-8 w-8 rounded-full" />
    +    <ListBoxItem id={id} textValue={name} className="group peer relative py-1 px-2 text-sm outline-hidden cursor-default grid grid-rows-2 grid-flow-col auto-cols-max gap-x-3 rounded-sm aria-selected:bg-blue-500 text-slate-700 aria-selected:text-white [&:has(+[aria-selected=true])]:aria-selected:rounded-b-none peer-aria-selected:aria-selected:rounded-t-none data-focus-visible:ring-2 ring-offset-2 ring-blue-500 [&[aria-selected=false]:has(+[aria-selected=false])_.divider]:block [&[aria-selected=true]:has(+[aria-selected=true])_.divider]:block">
    +      <img src={avatar} alt="" className="w-8 h-8 row-span-2 rounded-full place-self-center" />
           <Text slot="label" className="font-medium truncate">{name}</Text>
    -      <Text slot="description" className="truncate text-xs text-slate-600 group-aria-selected:text-white">{handle}</Text>
    -      <div className="divider hidden absolute left-12 right-2 bottom-0 h-px bg-gray-200 group-aria-selected:bg-blue-400" />
    +      <Text slot="description" className="text-xs truncate text-slate-600 group-aria-selected:text-white">{handle}</Text>
    +      <div className="absolute bottom-0 hidden h-px bg-gray-200 divider left-12 right-2 group-aria-selected:bg-blue-400" />
         </ListBoxItem>
       );
     }
    @@ -470,11 +524,11 @@ function ImageGridExample() {
       });
     
       return (
    -    <div className="bg-gradient-to-r from-sky-500 to-teal-500 p-8 rounded-lg flex justify-center">
    -      <ListBox aria-label="Images" items={list.items} selectionMode="single" selectionBehavior="replace" className="max-h-[280px] overflow-auto outline-none bg-white rounded-lg shadow p-2 grid grid-cols-3 gap-2">
    +    <div className="flex justify-center p-8 rounded-lg bg-linear-to-r from-sky-500 to-teal-500">
    +      <ListBox aria-label="Images" items={list.items} selectionMode="single" selectionBehavior="replace" className="max-h-[280px] overflow-auto outline-hidden bg-white rounded-lg shadow-sm p-2 grid grid-cols-3 gap-2">
             {item => (
    -          <ListBoxItem textValue={item.user.name} className="rounded outline-none group cursor-default">
    -            <img src={item.urls.regular} alt={item.alt_description} className="w-full h-[80px] object-cover rounded group-aria-selected:ring group-aria-selected:ring-2 group-aria-selected:ring-offset-2 group-aria-selected:ring-sky-600" />
    +          <ListBoxItem textValue={item.user.name} className="rounded-sm cursor-default outline-hidden group">
    +            <img src={item.urls.regular} alt={item.alt_description} className="w-full h-[80px] object-cover rounded-sm group-aria-selected:ring-3 group-aria-selected:ring-2 group-aria-selected:ring-offset-2 group-aria-selected:ring-sky-600" />
                 <Text slot="label" className="text-[11px] text-gray-700 font-semibold overflow-hidden text-ellipsis whitespace-nowrap max-w-full block mt-1">{item.user.name}</Text>
               </ListBoxItem>
             )}
    @@ -498,8 +552,8 @@ function TableExample() {
       }, [sortDescriptor]);
     
       return (
    -    <div className="bg-gradient-to-r from-indigo-500 to-violet-500 p-8 rounded-lg flex items-center justify-center md:col-span-2">
    -      <div className="max-h-[280px] overflow-auto scroll-pt-[2.321rem] relative bg-white rounded-lg shadow text-gray-600">
    +    <div className="flex items-center justify-center p-8 rounded-lg bg-linear-to-r from-indigo-500 to-violet-500 md:col-span-2">
    +      <div className="max-h-[280px] overflow-auto scroll-pt-[2.321rem] relative bg-white rounded-lg shadow-sm text-gray-600">
             <Table aria-label="Stocks" selectionMode="single" selectionBehavior="replace" sortDescriptor={sortDescriptor} onSortChange={setSortDescriptor} className="border-separate border-spacing-0">
               <TableHeader>
                 <StockColumn id="symbol" allowsSorting>Symbol</StockColumn>
    @@ -511,7 +565,7 @@ function TableExample() {
               <TableBody items={sortedItems}>
                 {item => (
                   <StockRow>
    -                <StockCell><span className="font-mono bg-slate-100 border border-slate-200 rounded px-1 group-aria-selected:bg-slate-700 group-aria-selected:border-slate-800">${item.symbol}</span></StockCell>
    +                <StockCell><span className="px-1 font-mono border rounded-sm bg-slate-100 border-slate-200 group-aria-selected:bg-slate-700 group-aria-selected:border-slate-800">${item.symbol}</span></StockCell>
                     <StockCell className="font-semibold">{item.name}</StockCell>
                     <StockCell>{item.marketCap}</StockCell>
                     <StockCell>{item.sector}</StockCell>
    @@ -527,12 +581,12 @@ function TableExample() {
     
     function StockColumn(props) {
       return (
    -    <Column {...props} className="sticky top-0 border-b border-slate-300 bg-slate-200 px-4 py-2 font-bold text-sm text-left cursor-default first:rounded-tl-lg last:rounded-tr-lg whitespace-nowrap outline-none data-[focus-visible]:outline data-[focus-visible]:outline-2 data-[focus-visible]:outline-slate-600 data-[focus-visible]:-outline-offset-4">
    +    <Column {...props} className="sticky top-0 px-4 py-2 text-sm font-bold text-left border-b cursor-default border-slate-300 bg-slate-200 first:rounded-tl-lg last:rounded-tr-lg whitespace-nowrap outline-hidden data-focus-visible:outline data-focus-visible:outline-2 data-focus-visible:outline-slate-600 data-focus-visible:-outline-offset-4">
           {({allowsSorting, sortDirection}) => (
             <span className="flex items-center">
               {props.children}
               {allowsSorting && (
    -            <span aria-hidden="true" className="ml-1 w-4 h-4">
    +            <span aria-hidden="true" className="w-4 h-4 ml-1">
                   {sortDirection && <ArrowUpIcon className={`w-4 h-4 transition ${sortDirection === 'descending' ? 'rotate-180' : ''}`} />}
                 </span>
               )}
    @@ -543,9 +597,106 @@ function StockColumn(props) {
     }
     
     function StockRow(props) {
    -  return <Row {...props} className="even:bg-slate-100 aria-selected:bg-slate-600 aria-selected:text-white cursor-default group outline-none data-[focus-visible]:outline data-[focus-visible]:outline-2 data-[focus-visible]:outline-slate-600 data-[focus-visible]:-outline-offset-4 aria-selected:data-[focus-visible]:outline-white" />;
    +  return <Row {...props} className="cursor-default even:bg-slate-100 aria-selected:bg-slate-600 aria-selected:text-white group outline-hidden data-focus-visible:outline data-focus-visible:outline-2 data-focus-visible:outline-slate-600 data-focus-visible:-outline-offset-4 aria-selected:data-focus-visible:outline-white" />;
     }
     
     function StockCell(props) {
    -  return <Cell {...props} className={`px-4 py-2 text-sm ${props.className} data-[focus-visible]:outline data-[focus-visible]:outline-2 data-[focus-visible]:outline-slate-600 data-[focus-visible]:-outline-offset-4 group-aria-selected:data-[focus-visible]:outline-white`} />;
    +  return <Cell {...props} className={`px-4 py-2 text-sm ${props.className} data-focus-visible:outline data-focus-visible:outline-2 data-focus-visible:outline-slate-600 data-focus-visible:-outline-offset-4 data-focus-visible:group-aria-selected:outline-white`} />;
     }
    +
    +function AutocompleteExample() {
    +  let {contains} = useFilter({sensitivity: 'base'});
    +  return (
    +    <div className="flex flex-col justify-center p-8 rounded-lg bg-linear-to-r from-sky-400 to-cyan-400">
    +      <Autocomplete filter={contains} className="flex flex-col w-5/6 gap-1">
    +        <SearchField>
    +          <Label className="text-sm text-black">Contacts</Label>
    +          <div className="relative w-full cursor-default overflow-hidden rounded-lg bg-white/90 focus-within:bg-white transition text-left shadow-md [&:has([data-focus-visible])]:ring-2 [&:has([data-focus-visible])]:ring-black sm:text-sm">
    +            <Input className="w-full py-2 pl-3 pr-2 leading-5 text-gray-900 bg-transparent border-none sm:text-sm outline-hidden" />
    +          </div>
    +        </SearchField>
    +        <div className="h-[300px] py-2 rounded-lg flex justify-center">
    +          <ListBox aria-label="Contacts" selectionMode="multiple" selectionBehavior="replace" className="w-72 max-h-[290px] overflow-auto outline-hidden bg-white text-gray-700 p-2 flex flex-col gap-2 rounded-lg shadow-sm scroll-pb-2 scroll-pt-7">
    +            <ContactSection title="Favorites">
    +              <Contact id="wade" name="Tony Baldwin" handle="@tony" avatar="https://images.unsplash.com/photo-1633332755192-727a05c4013d?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=2&w=256&h=256&q=80" />
    +              <Contact id="arelene" name="Julienne Langstrath" handle="@jlangstrath" avatar="https://images.unsplash.com/photo-1580489944761-15a19d654956?ixlib=rb-1.2.1&auto=format&fit=facearea&facepad=2&w=256&h=256&q=80" />
    +              <Contact id="tom" name="Roberto Gonzalez" handle="@rgonzalez" avatar="https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=2&w=256&h=256&q=80" />
    +            </ContactSection>
    +            <ContactSection title="All Contacts" items={people}>
    +              {item => <Contact name={item.name} handle={item.username} avatar={item.avatar} />}
    +            </ContactSection>
    +          </ListBox>
    +        </div>
    +      </Autocomplete>
    +    </div>
    +  );
    +}
    +
    +function TreeExample (
    +  { children, ...props }
    +) {
    +  return (
    +    <div className="flex flex-col justify-center p-8 rounded-lg bg-linear-to-r from-amber-500 to-rose-500">
    +      <AriaTree {...props} className={'w-72 h-[290px] overflow-auto outline-hidden bg-white text-gray-700 p-2 flex flex-col gap-2 rounded-lg shadow-sm scroll-pb-2 scroll-pt-7'}>
    +        <TreeItem id="documents" textValue="Documents">
    +          <TreeItemContent>
    +            Documents
    +          </TreeItemContent>
    +          <TreeItem id="project" textValue="Project">
    +            <TreeItemContent>
    +              Project
    +            </TreeItemContent>
    +            <TreeItem id="report" textValue="Weekly Report">
    +              <TreeItemContent>
    +                Weekly Report
    +              </TreeItemContent>
    +            </TreeItem>
    +          </TreeItem>
    +        </TreeItem>
    +        <TreeItem id="photos" textValue="Photos">
    +          <TreeItemContent>
    +            Photos
    +          </TreeItemContent>
    +          <TreeItem id="one" textValue="Image 1">
    +            <TreeItemContent>
    +              Image 1
    +            </TreeItemContent>
    +          </TreeItem>
    +          <TreeItem id="two" textValue="Image 2">
    +            <TreeItemContent>
    +              Image 2
    +            </TreeItemContent>
    +          </TreeItem>
    +        </TreeItem>
    +      </AriaTree>
    +    </div>
    +  );
    +}
    +
    +export function TreeItem(props) {
    +  return (
    +    <AriaTreeItem {...props} className="group peer relative py-1 px-2 text-sm outline-hidden cursor-default flex gap-x-3 rounded-sm aria-selected:bg-blue-500 text-slate-700 aria-selected:text-white [&:has(+[aria-selected=true])]:aria-selected:rounded-b-none peer-aria-selected:aria-selected:rounded-t-none data-focus-visible:ring-2 ring-offset-2 ring-blue-500 [&[aria-selected=false]:has(+[aria-selected=false])_.divider]:block [&[aria-selected=true]:has(+[aria-selected=true])_.divider]:block" />
    +  )
    +}
    +
    +export function TreeItemContent({ children, ...props }) {
    +  return (
    +    <AriaTreeItemContent {...props}>
    +      {({ selectionMode, selectionBehavior, hasChildItems }) => (
    +        <div className={`flex items-center`}>
    +          {selectionMode === 'multiple' && selectionBehavior === 'toggle' && (
    +            <Checkbox slot="selection" />
    +          )}
    +          <div className='shrink-0 w-[calc(calc(var(--tree-item-level)_-_1)_*_calc(var(--spacing)_*_3))]' />
    +          {hasChildItems ? (
    +            <Button slot="chevron" className="flex items-center justify-center w-8 h-8 rounded-lg cursor-default shrink-0 text-start">
    +              <ChevronRightIcon aria-hidden className="w-5 h-5 text-gray-500 dark:text-gray-400 transition-transform duration-200 ease-in-out group-data-[expanded=true]:rotate-90" />
    +            </Button>
    +          ) : <div className='w-8 h-8 shrink-0' />}
    +          {children}
    +        </div>
    +      )}
    +    </AriaTreeItemContent>
    +  );
    +}
    +
    diff --git a/examples/rac-tailwind/src/style.css b/examples/rac-tailwind/src/style.css
    index 00488ea27fa..d4a0d73eba2 100644
    --- a/examples/rac-tailwind/src/style.css
    +++ b/examples/rac-tailwind/src/style.css
    @@ -1,6 +1,5 @@
    -@tailwind base;
    -@tailwind components;
    -@tailwind utilities;
    +@import 'tailwindcss' source("./");
    +@plugin 'tailwindcss-animate';
     
     * {
       -webkit-tap-highlight-color: transparent;
    diff --git a/examples/rac-tailwind/tailwind.config.js b/examples/rac-tailwind/tailwind.config.js
    deleted file mode 100644
    index 70e8497ccf0..00000000000
    --- a/examples/rac-tailwind/tailwind.config.js
    +++ /dev/null
    @@ -1,12 +0,0 @@
    -/** @type {import('tailwindcss').Config} */
    -module.exports = {
    -  content: [
    -     "./src/**/*.{html,js,ts,jsx,tsx}",
    -   ],
    -  theme: {
    -    extend: {},
    -  },
    -  plugins: [
    -    require("tailwindcss-animate")
    -  ],
    -}
    diff --git a/examples/remix/app/root.tsx b/examples/remix/app/root.tsx
    index 700916766a7..860c52a5250 100644
    --- a/examples/remix/app/root.tsx
    +++ b/examples/remix/app/root.tsx
    @@ -28,7 +28,7 @@ export default function App() {
             <Links />
           </head>
           <body>
    -        <Provider 
    +        <Provider
               theme={defaultTheme}
               locale="en"
               router={{
    @@ -38,6 +38,12 @@ export default function App() {
               <Outlet />
             </Provider>
             <ScrollRestoration />
    +        {/* https://remix.run/docs/en/main/guides/envvars */}
    +        <script
    +          dangerouslySetInnerHTML={{
    +            __html: `window.process = {}; window.process.env = {};`,
    +          }}
    +        />
             <Scripts />
             <LiveReload />
           </body>
    diff --git a/examples/remix/package.json b/examples/remix/package.json
    index 7d6e39a4d22..98cc2a107ce 100644
    --- a/examples/remix/package.json
    +++ b/examples/remix/package.json
    @@ -19,6 +19,7 @@
         "react-dom": "^18.2.0"
       },
       "devDependencies": {
    +    "@react-aria/optimize-locales-plugin": "^1.1.4",
         "@remix-run/dev": "^2.3.1",
         "@remix-run/eslint-config": "^2.3.1",
         "@types/react": "^18",
    @@ -29,7 +30,7 @@
         "vite-tsconfig-paths": "^4.2.1"
       },
       "engines": {
    -    "node": ">=18.0.0"
    +    "node": ">=22.0.0"
       },
       "workspaces": [
         "../../packages/react-aria-components",
    diff --git a/examples/remix/vite.config.ts b/examples/remix/vite.config.ts
    index 17286fa3b70..eac068341ec 100644
    --- a/examples/remix/vite.config.ts
    +++ b/examples/remix/vite.config.ts
    @@ -1,4 +1,4 @@
    -import { unstable_vitePlugin as remix } from "@remix-run/dev";
    +import { vitePlugin as remix } from "@remix-run/dev";
     import { defineConfig } from "vite";
     import tsconfigPaths from "vite-tsconfig-paths";
     import optimizeLocales from '@react-aria/optimize-locales-plugin';
    diff --git a/examples/rsp-cra-18/package.json b/examples/rsp-cra-18/package.json
    index bac37f332ce..8dbb6f7cdb4 100644
    --- a/examples/rsp-cra-18/package.json
    +++ b/examples/rsp-cra-18/package.json
    @@ -21,9 +21,10 @@
         "@types/react": "^18",
         "@types/react-dom": "^18",
         "react": "^18.1.0",
    +    "react-aria-components": "latest",
         "react-dom": "^18.1.0",
         "react-scripts": "5.0.1",
    -    "typescript": "5.0.4",
    +    "typescript": "5.8.2",
         "web-vitals": "^2.1.4"
       },
       "scripts": {
    diff --git a/examples/rsp-cra-18/src/App.tsx b/examples/rsp-cra-18/src/App.tsx
    index e2038b32dc2..0abebf7ad5d 100644
    --- a/examples/rsp-cra-18/src/App.tsx
    +++ b/examples/rsp-cra-18/src/App.tsx
    @@ -15,6 +15,7 @@ import StatusExamples from './sections/StatusExamples';
     import ContentExamples from './sections/ContentExamples';
     import PickerExamples from './sections/PickerExamples';
     import DragAndDropExamples from './sections/DragAndDropExamples';
    +import {AutocompleteExample} from './AutocompleteExample';
     
     let columns = [
       {name: 'Foo', key: 'foo'},
    @@ -61,6 +62,7 @@ function App() {
                 }
               </TableBody>
             </TableView>
    +        <AutocompleteExample />
             <ButtonExamples />
             <CollectionExamples />
             <ColorExamples />
    diff --git a/examples/rsp-cra-18/src/AutocompleteExample.tsx b/examples/rsp-cra-18/src/AutocompleteExample.tsx
    new file mode 100644
    index 00000000000..e92c4d8d763
    --- /dev/null
    +++ b/examples/rsp-cra-18/src/AutocompleteExample.tsx
    @@ -0,0 +1,39 @@
    +import {Autocomplete, Input, Label, Menu, MenuItem, SearchField, Text, useFilter} from 'react-aria-components'
    +import {classNames} from '@react-spectrum/utils';
    +import styles from './autocomplete.css';
    +
    +interface AutocompleteItem {
    +  id: string,
    +  name: string
    +}
    +
    +let items: AutocompleteItem[] = [{id: '1', name: 'Foo'}, {id: '2', name: 'Bar'}, {id: '3', name: 'Baz'}];
    +
    +export function AutocompleteExample() {
    +  let {contains} = useFilter({sensitivity: 'base'});
    +
    +  return (
    +    <Autocomplete filter={contains}>
    +      <div>
    +        <SearchField autoFocus>
    +          <Label style={{display: 'block'}}>Test</Label>
    +          <Input />
    +          <Text style={{display: 'block'}} slot="description">Please select an option below.</Text>
    +        </SearchField>
    +        <Menu items={items} selectionMode="single">
    +          {item => (
    +            <MenuItem
    +              id={item.id}
    +              className={({isFocused, isSelected, isOpen}) => classNames(styles, 'item', {
    +                focused: isFocused,
    +                selected: isSelected,
    +                open: isOpen
    +              })}>
    +              {item.name}
    +            </MenuItem>
    +          )}
    +        </Menu>
    +      </div>
    +    </Autocomplete>
    +  );
    +}
    diff --git a/examples/rsp-cra-18/src/autocomplete.css b/examples/rsp-cra-18/src/autocomplete.css
    new file mode 100644
    index 00000000000..642e45af9c8
    --- /dev/null
    +++ b/examples/rsp-cra-18/src/autocomplete.css
    @@ -0,0 +1,44 @@
    +.react-aria-Menu {
    +  display: block;
    +  min-width: 150px;
    +  width: fit-content;
    +  margin: 4px 0 0 0;
    +  border: 1px solid gray;
    +  background: lightgray;
    +  padding: 0;
    +  list-style: none;
    +  overflow-y: auto;
    +  height: 100px;
    +}
    +
    +.item {
    +  padding: 2px 5px;
    +  outline: none;
    +  cursor: default;
    +  color: black;
    +  background: transparent;
    +}
    +
    +.item[data-disabled] {
    +  opacity: 0.4;
    +}
    +
    +.item.focused {
    +  background: gray;
    +  color: white;
    +}
    +
    +.item.open:not(.focused) {
    +  background: lightslategray;
    +  color: white;
    +}
    +
    +.item.item.hovered {
    +  background: lightsalmon;
    +  color: white;
    +}
    +
    +.item.selected {
    +  background: purple;
    +  color: white;
    +}
    diff --git a/examples/rsp-cra-18/src/sections/CollectionExamples.tsx b/examples/rsp-cra-18/src/sections/CollectionExamples.tsx
    index b44012749fe..7182618d435 100644
    --- a/examples/rsp-cra-18/src/sections/CollectionExamples.tsx
    +++ b/examples/rsp-cra-18/src/sections/CollectionExamples.tsx
    @@ -1,4 +1,29 @@
    -import {ActionMenu, Flex, Divider, Item, ListBox, ListView, MenuTrigger, Menu, SubmenuTrigger, ActionButton, TableBody, TableView, Row, Cell, TableHeader, Column, TagGroup} from '@adobe/react-spectrum';
    +import {
    +  ActionMenu,
    +  Flex,
    +  Divider,
    +  Item,
    +  ListBox,
    +  ListView,
    +  MenuTrigger,
    +  Menu,
    +  SubmenuTrigger,
    +  ActionButton,
    +  TableBody,
    +  TableView,
    +  Row,
    +  Cell,
    +  TableHeader,
    +  Column,
    +  TagGroup,
    +  Text,
    +  TreeView,
    +  TreeViewItem,
    +  TreeViewItemContent
    +} from '@adobe/react-spectrum';
    +
    +import FileTxt from '@spectrum-icons/workflow/FileTxt';
    +import Folder from '@spectrum-icons/workflow/Folder';
     
     export default function CollectionExamples(){
         return (
    @@ -92,6 +117,46 @@ export default function CollectionExamples(){
                 <Item>Gaming</Item>
                 <Item>Shopping</Item>
               </TagGroup>
    +          <div style={{width: '300px', height: '150px', overflow: 'auto'}}>
    +            <TreeView disabledKeys={['projects-1']} aria-label="test static tree">
    +              <TreeViewItem id="Photos" textValue="Photos">
    +                <TreeViewItemContent>
    +                  <Text>Photos</Text>
    +                  <Folder />
    +                </TreeViewItemContent>
    +              </TreeViewItem>
    +              <TreeViewItem id="projects" textValue="Projects">
    +                <TreeViewItemContent>
    +                  <Text>Projects</Text>
    +                  <Folder />
    +                </TreeViewItemContent>
    +                <TreeViewItem id="projects-1" textValue="Projects-1">
    +                  <TreeViewItemContent>
    +                    <Text>Projects-1</Text>
    +                    <Folder />
    +                  </TreeViewItemContent>
    +                  <TreeViewItem id="projects-1A" textValue="Projects-1A">
    +                    <TreeViewItemContent>
    +                      <Text>Projects-1A</Text>
    +                      <FileTxt />
    +                    </TreeViewItemContent>
    +                  </TreeViewItem>
    +                </TreeViewItem>
    +                <TreeViewItem id="projects-2" textValue="Projects-2">
    +                  <TreeViewItemContent>
    +                    <Text>Projects-2</Text>
    +                    <FileTxt />
    +                  </TreeViewItemContent>
    +                </TreeViewItem>
    +                <TreeViewItem id="projects-3" textValue="Projects-3">
    +                  <TreeViewItemContent>
    +                    <Text>Projects-3</Text>
    +                    <FileTxt />
    +                  </TreeViewItemContent>
    +                </TreeViewItem>
    +              </TreeViewItem>
    +            </TreeView>
    +          </div>
             </Flex>
           </>
         )
    diff --git a/examples/rsp-cra-18/tsconfig.json b/examples/rsp-cra-18/tsconfig.json
    index a273b0cfc0e..d2befe045b8 100644
    --- a/examples/rsp-cra-18/tsconfig.json
    +++ b/examples/rsp-cra-18/tsconfig.json
    @@ -21,6 +21,7 @@
         "jsx": "react-jsx"
       },
       "include": [
    -    "src"
    +    "src",
    +    "typings.d.ts"
       ]
     }
    diff --git a/examples/rsp-cra-18/typings.d.ts b/examples/rsp-cra-18/typings.d.ts
    new file mode 100644
    index 00000000000..cbe652dbe00
    --- /dev/null
    +++ b/examples/rsp-cra-18/typings.d.ts
    @@ -0,0 +1 @@
    +declare module "*.css";
    diff --git a/examples/rsp-next-ts-17/pages/index.tsx b/examples/rsp-next-ts-17/pages/index.tsx
    index e9531f2fc9f..09f8d7da63f 100644
    --- a/examples/rsp-next-ts-17/pages/index.tsx
    +++ b/examples/rsp-next-ts-17/pages/index.tsx
    @@ -81,7 +81,10 @@ import {
       Accordion,
       Disclosure,
       DisclosureTitle,
    -  DisclosurePanel
    +  DisclosurePanel,
    +  TreeView,
    +  TreeViewItem,
    +  TreeViewItemContent
     } from "@adobe/react-spectrum";
     import Edit from "@spectrum-icons/workflow/Edit";
     import NotFound from "@spectrum-icons/illustrations/NotFound";
    @@ -90,6 +93,9 @@ import ReorderableListView from "../components/ReorderableListView";
     import {ToastQueue} from '@react-spectrum/toast';
     import {SubmenuTrigger} from "@react-spectrum/menu";
     
    +import FileTxt from '@spectrum-icons/workflow/FileTxt';
    +import Folder from '@spectrum-icons/workflow/Folder';
    +
     let nestedItems = [
       {foo: 'Lvl 1 Foo 1', bar: 'Lvl 1 Bar 1', baz: 'Lvl 1 Baz 1', childRows: [
         {foo: 'Lvl 2 Foo 1', bar: 'Lvl 2 Bar 1', baz: 'Lvl 2 Baz 1', childRows: [
    @@ -238,6 +244,46 @@ export default function Home() {
                     }
                   </TableBody>
                 </TableView>
    +            <div style={{width: '300px', height: '150px', overflow: 'auto'}}>
    +              <TreeView disabledKeys={['projects-1']} aria-label="test static tree">
    +                <TreeViewItem id="Photos" textValue="Photos">
    +                  <TreeViewItemContent>
    +                    <Text>Photos</Text>
    +                    <Folder />
    +                  </TreeViewItemContent>
    +                </TreeViewItem>
    +                <TreeViewItem id="projects" textValue="Projects">
    +                  <TreeViewItemContent>
    +                    <Text>Projects</Text>
    +                    <Folder />
    +                  </TreeViewItemContent>
    +                  <TreeViewItem id="projects-1" textValue="Projects-1">
    +                    <TreeViewItemContent>
    +                      <Text>Projects-1</Text>
    +                      <Folder />
    +                    </TreeViewItemContent>
    +                    <TreeViewItem id="projects-1A" textValue="Projects-1A">
    +                      <TreeViewItemContent>
    +                        <Text>Projects-1A</Text>
    +                        <FileTxt />
    +                      </TreeViewItemContent>
    +                    </TreeViewItem>
    +                  </TreeViewItem>
    +                  <TreeViewItem id="projects-2" textValue="Projects-2">
    +                    <TreeViewItemContent>
    +                      <Text>Projects-2</Text>
    +                      <FileTxt />
    +                    </TreeViewItemContent>
    +                  </TreeViewItem>
    +                  <TreeViewItem id="projects-3" textValue="Projects-3">
    +                    <TreeViewItemContent>
    +                      <Text>Projects-3</Text>
    +                      <FileTxt />
    +                    </TreeViewItemContent>
    +                  </TreeViewItem>
    +                </TreeViewItem>
    +              </TreeView>
    +            </div>
               </Section>
     
               <Section title="Color">
    diff --git a/examples/rsp-next-ts/.yarn/install-state.gz b/examples/rsp-next-ts/.yarn/install-state.gz
    new file mode 100644
    index 00000000000..6ab4b8cdc9c
    Binary files /dev/null and b/examples/rsp-next-ts/.yarn/install-state.gz differ
    diff --git a/examples/rsp-next-ts/components/AutocompleteExample.tsx b/examples/rsp-next-ts/components/AutocompleteExample.tsx
    new file mode 100644
    index 00000000000..7228c5688f8
    --- /dev/null
    +++ b/examples/rsp-next-ts/components/AutocompleteExample.tsx
    @@ -0,0 +1,40 @@
    +import {Autocomplete, Input, Label, Menu, MenuItem, SearchField, Text, useFilter} from 'react-aria-components'
    +import {classNames} from '@react-spectrum/utils';
    +import React from 'react';
    +import styles from './autocomplete.module.css';
    +
    +interface AutocompleteItem {
    +  id: string,
    +  name: string
    +}
    +
    +let items: AutocompleteItem[] = [{id: '1', name: 'Foo'}, {id: '2', name: 'Bar'}, {id: '3', name: 'Baz'}];
    +
    +export function AutocompleteExample() {
    +  let {contains} = useFilter({sensitivity: 'base'});
    +
    +  return (
    +    <Autocomplete filter={contains}>
    +      <div>
    +        <SearchField autoFocus>
    +          <Label style={{display: 'block'}}>Test</Label>
    +          <Input />
    +          <Text style={{display: 'block'}} slot="description">Please select an option below.</Text>
    +        </SearchField>
    +        <Menu items={items} className={styles.menu} selectionMode="single">
    +          {item => (
    +            <MenuItem
    +              id={item.id}
    +              className={({isFocused, isSelected, isOpen}) => classNames(styles, 'item', {
    +                focused: isFocused,
    +                selected: isSelected,
    +                open: isOpen
    +              })}>
    +              {item.name}
    +            </MenuItem>
    +          )}
    +        </Menu>
    +      </div>
    +    </Autocomplete>
    +  );
    +}
    diff --git a/examples/rsp-next-ts/components/autocomplete.module.css b/examples/rsp-next-ts/components/autocomplete.module.css
    new file mode 100644
    index 00000000000..a1060fc4476
    --- /dev/null
    +++ b/examples/rsp-next-ts/components/autocomplete.module.css
    @@ -0,0 +1,44 @@
    +.menu {
    +  display: block;
    +  min-width: 150px;
    +  width: fit-content;
    +  margin: 4px 0 0 0;
    +  border: 1px solid gray;
    +  background: lightgray;
    +  padding: 0;
    +  list-style: none;
    +  overflow-y: auto;
    +  height: 100px;
    +}
    +
    +.item {
    +  padding: 2px 5px;
    +  outline: none;
    +  cursor: default;
    +  color: black;
    +  background: transparent;
    +}
    +
    +.item[data-disabled] {
    +  opacity: 0.4;
    +}
    +
    +.item.focused {
    +  background: gray;
    +  color: white;
    +}
    +
    +.item.open:not(.focused) {
    +  background: lightslategray;
    +  color: white;
    +}
    +
    +.item.item.hovered {
    +  background: lightsalmon;
    +  color: white;
    +}
    +
    +.item.selected {
    +  background: purple;
    +  color: white;
    +}
    diff --git a/examples/rsp-next-ts/package.json b/examples/rsp-next-ts/package.json
    index 657e756b035..a9b9552f17b 100644
    --- a/examples/rsp-next-ts/package.json
    +++ b/examples/rsp-next-ts/package.json
    @@ -22,6 +22,7 @@
         "glob": "^10.3.12",
         "next": "^13.4.1",
         "react": "^18.2.0",
    +    "react-aria-components": "latest",
         "react-dom": "^18.2.0"
       },
       "devDependencies": {
    diff --git a/examples/rsp-next-ts/pages/index.tsx b/examples/rsp-next-ts/pages/index.tsx
    index d3cb776f1fd..4b94a2f0447 100644
    --- a/examples/rsp-next-ts/pages/index.tsx
    +++ b/examples/rsp-next-ts/pages/index.tsx
    @@ -81,8 +81,12 @@ import {
       Accordion,
       Disclosure,
       DisclosureTitle,
    -  DisclosurePanel
    +  DisclosurePanel,
    +  TreeView,
    +  TreeViewItem,
    +  TreeViewItemContent
     } from "@adobe/react-spectrum";
    +import {AutocompleteExample} from "../components/AutocompleteExample";
     import Edit from "@spectrum-icons/workflow/Edit";
     import NotFound from "@spectrum-icons/illustrations/NotFound";
     import Section from "../components/Section";
    @@ -90,6 +94,9 @@ import ReorderableListView from "../components/ReorderableListView";
     import {ToastQueue} from '@react-spectrum/toast';
     import {SubmenuTrigger} from "@react-spectrum/menu";
     
    +import FileTxt from '@spectrum-icons/workflow/FileTxt';
    +import Folder from '@spectrum-icons/workflow/Folder';
    +
     let nestedItems = [
       {foo: 'Lvl 1 Foo 1', bar: 'Lvl 1 Bar 1', baz: 'Lvl 1 Baz 1', childRows: [
         {foo: 'Lvl 2 Foo 1', bar: 'Lvl 2 Bar 1', baz: 'Lvl 2 Baz 1', childRows: [
    @@ -240,6 +247,48 @@ export default function Home() {
                     }
                   </TableBody>
                 </TableView>
    +            <AutocompleteExample />
    +
    +            <div style={{width: '300px', height: '150px', overflow: 'auto'}}>
    +              <TreeView disabledKeys={['projects-1']} aria-label="test static tree">
    +                <TreeViewItem id="Photos" textValue="Photos">
    +                  <TreeViewItemContent>
    +                    <Text>Photos</Text>
    +                    <Folder />
    +                  </TreeViewItemContent>
    +                </TreeViewItem>
    +                <TreeViewItem id="projects" textValue="Projects">
    +                  <TreeViewItemContent>
    +                    <Text>Projects</Text>
    +                    <Folder />
    +                  </TreeViewItemContent>
    +                  <TreeViewItem id="projects-1" textValue="Projects-1">
    +                    <TreeViewItemContent>
    +                      <Text>Projects-1</Text>
    +                      <Folder />
    +                    </TreeViewItemContent>
    +                    <TreeViewItem id="projects-1A" textValue="Projects-1A">
    +                      <TreeViewItemContent>
    +                        <Text>Projects-1A</Text>
    +                        <FileTxt />
    +                      </TreeViewItemContent>
    +                    </TreeViewItem>
    +                  </TreeViewItem>
    +                  <TreeViewItem id="projects-2" textValue="Projects-2">
    +                    <TreeViewItemContent>
    +                      <Text>Projects-2</Text>
    +                      <FileTxt />
    +                    </TreeViewItemContent>
    +                  </TreeViewItem>
    +                  <TreeViewItem id="projects-3" textValue="Projects-3">
    +                    <TreeViewItemContent>
    +                      <Text>Projects-3</Text>
    +                      <FileTxt />
    +                    </TreeViewItemContent>
    +                  </TreeViewItem>
    +                </TreeViewItem>
    +              </TreeView>
    +            </div>
               </Section>
     
               <Section title="Color">
    diff --git a/examples/rsp-next-ts/tsconfig.json b/examples/rsp-next-ts/tsconfig.json
    index 73e4afb1513..dc358701300 100644
    --- a/examples/rsp-next-ts/tsconfig.json
    +++ b/examples/rsp-next-ts/tsconfig.json
    @@ -16,6 +16,6 @@
         "incremental": true,
         "downlevelIteration": true
       },
    -  "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
    +  "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", "typing.d.ts"],
       "exclude": ["node_modules"]
     }
    diff --git a/examples/rsp-next-ts/typings.d.ts b/examples/rsp-next-ts/typings.d.ts
    new file mode 100644
    index 00000000000..1ee54e47133
    --- /dev/null
    +++ b/examples/rsp-next-ts/typings.d.ts
    @@ -0,0 +1 @@
    +declare module "*.modules.css";
    diff --git a/examples/rsp-webpack-4/package.json b/examples/rsp-webpack-4/package.json
    index b3442dc0762..64009df4ee7 100644
    --- a/examples/rsp-webpack-4/package.json
    +++ b/examples/rsp-webpack-4/package.json
    @@ -19,24 +19,23 @@
       "dependencies": {
         "@adobe/react-spectrum": "^3.24.1",
         "@react-spectrum/provider": "^3.9.7",
    -    "@react-spectrum/tag": "^3.0.0-rc.0",
         "@spectrum-icons/workflow": "^4.2.12",
         "react": "^18.2.0",
         "react-dom": "^18.2.0"
       },
       "devDependencies": {
    -    "@babel/core": "^7.24.3",
         "@babel/cli": "^7.24.3",
    +    "@babel/core": "^7.24.3",
         "@babel/preset-env": "^7.24.3",
         "@babel/preset-react": "^7.24.1",
    -    "webpack": "4.46.0",
    -    "webpack-cli": "3.1.1",
    -    "webpack-dev-server": "3.1.8",
    +    "babel-loader": "^8.0.2",
    +    "css-loader": "^1.0.0",
    +    "jest": "^29",
    +    "patch-package": "^8.0.0",
         "style-loader": "0.23.0",
    -    "css-loader": "1.0.0",
    -    "babel-loader": "8.0.2",
    -    "jest": "^26",
    -    "patch-package": "^8.0.0"
    +    "webpack": "^4.46.0",
    +    "webpack-cli": "^3.1.1",
    +    "webpack-dev-server": "^3.1.8"
       },
       "resolutions": {
         "terser-webpack-plugin": "4.2.3"
    diff --git a/examples/rsp-webpack-4/patches/terser-webpack-plugin+4.2.3.patch b/examples/rsp-webpack-4/patches/terser-webpack-plugin+4.2.3.patch
    deleted file mode 100644
    index be2a537cc42..00000000000
    --- a/examples/rsp-webpack-4/patches/terser-webpack-plugin+4.2.3.patch
    +++ /dev/null
    @@ -1,13 +0,0 @@
    -diff --git a/node_modules/terser-webpack-plugin/dist/index.js b/node_modules/terser-webpack-plugin/dist/index.js
    -index 3acffa7..cbbbb6f 100644
    ---- a/node_modules/terser-webpack-plugin/dist/index.js
    -+++ b/node_modules/terser-webpack-plugin/dist/index.js
    -@@ -259,7 +259,7 @@ class TerserPlugin {
    -               }
    -             } = compilation;
    - 
    --            const hash = _webpack.util.createHash(hashFunction);
    -+            const hash = _webpack.util.createHash('sha512');
    - 
    -             if (hashSalt) {
    -               hash.update(hashSalt);
    diff --git a/examples/rsp-webpack-4/patches/webpack+4.46.0.patch b/examples/rsp-webpack-4/patches/webpack+4.46.0.patch
    deleted file mode 100644
    index 53ccb7c440c..00000000000
    --- a/examples/rsp-webpack-4/patches/webpack+4.46.0.patch
    +++ /dev/null
    @@ -1,144 +0,0 @@
    -diff --git a/node_modules/webpack/lib/Compilation.js b/node_modules/webpack/lib/Compilation.js
    -index 6329174..196c4bb 100644
    ---- a/node_modules/webpack/lib/Compilation.js
    -+++ b/node_modules/webpack/lib/Compilation.js
    -@@ -1915,7 +1915,7 @@ class Compilation extends Tapable {
    - 		const hashFunction = outputOptions.hashFunction;
    - 		const hashDigest = outputOptions.hashDigest;
    - 		const hashDigestLength = outputOptions.hashDigestLength;
    --		const hash = createHash(hashFunction);
    -+		const hash = createHash('sha512');
    - 		if (outputOptions.hashSalt) {
    - 			hash.update(outputOptions.hashSalt);
    - 		}
    -@@ -1936,7 +1936,7 @@ class Compilation extends Tapable {
    - 		const modules = this.modules;
    - 		for (let i = 0; i < modules.length; i++) {
    - 			const module = modules[i];
    --			const moduleHash = createHash(hashFunction);
    -+			const moduleHash = createHash('sha512');
    - 			module.updateHash(moduleHash);
    - 			module.hash = /** @type {string} */ (moduleHash.digest(hashDigest));
    - 			module.renderedHash = module.hash.substr(0, hashDigestLength);
    -@@ -1957,7 +1957,7 @@ class Compilation extends Tapable {
    - 		});
    - 		for (let i = 0; i < chunks.length; i++) {
    - 			const chunk = chunks[i];
    --			const chunkHash = createHash(hashFunction);
    -+			const chunkHash = createHash('sha512');
    - 			try {
    - 				if (outputOptions.hashSalt) {
    - 					chunkHash.update(outputOptions.hashSalt);
    -@@ -1994,7 +1994,7 @@ class Compilation extends Tapable {
    - 		const hashFunction = outputOptions.hashFunction;
    - 		const hashDigest = outputOptions.hashDigest;
    - 		const hashDigestLength = outputOptions.hashDigestLength;
    --		const hash = createHash(hashFunction);
    -+		const hash = createHash('sha512');
    - 		hash.update(this.fullHash);
    - 		hash.update(update);
    - 		this.fullHash = /** @type {string} */ (hash.digest(hashDigest));
    -diff --git a/node_modules/webpack/lib/HashedModuleIdsPlugin.js b/node_modules/webpack/lib/HashedModuleIdsPlugin.js
    -index 7a860f7..2e0d9c6 100644
    ---- a/node_modules/webpack/lib/HashedModuleIdsPlugin.js
    -+++ b/node_modules/webpack/lib/HashedModuleIdsPlugin.js
    -@@ -43,7 +43,7 @@ class HashedModuleIdsPlugin {
    - 							const id = module.libIdent({
    - 								context: this.options.context || compiler.options.context
    - 							});
    --							const hash = createHash(options.hashFunction);
    -+							const hash = createHash('sha512');
    - 							hash.update(id);
    - 							const hashId = /** @type {string} */ (hash.digest(
    - 								options.hashDigest
    -diff --git a/node_modules/webpack/lib/JavascriptModulesPlugin.js b/node_modules/webpack/lib/JavascriptModulesPlugin.js
    -index 2c1bbe4..61fe7bd 100644
    ---- a/node_modules/webpack/lib/JavascriptModulesPlugin.js
    -+++ b/node_modules/webpack/lib/JavascriptModulesPlugin.js
    -@@ -130,7 +130,7 @@ class JavascriptModulesPlugin {
    - 						hashDigestLength,
    - 						hashFunction
    - 					} = outputOptions;
    --					const hash = createHash(hashFunction);
    -+					const hash = createHash('sha512');
    - 					if (hashSalt) hash.update(hashSalt);
    - 					const template = chunk.hasRuntime()
    - 						? compilation.mainTemplate
    -diff --git a/node_modules/webpack/lib/ModuleFilenameHelpers.js b/node_modules/webpack/lib/ModuleFilenameHelpers.js
    -index bd0742b..9ad4687 100644
    ---- a/node_modules/webpack/lib/ModuleFilenameHelpers.js
    -+++ b/node_modules/webpack/lib/ModuleFilenameHelpers.js
    -@@ -42,7 +42,7 @@ const getBefore = (str, token) => {
    - };
    - 
    - const getHash = str => {
    --	const hash = createHash("md4");
    -+	const hash = createHash("sha512");
    - 	hash.update(str);
    - 	const digest = /** @type {string} */ (hash.digest("hex"));
    - 	return digest.substr(0, 4);
    -diff --git a/node_modules/webpack/lib/NamedModulesPlugin.js b/node_modules/webpack/lib/NamedModulesPlugin.js
    -index 2d84aaf..102b244 100644
    ---- a/node_modules/webpack/lib/NamedModulesPlugin.js
    -+++ b/node_modules/webpack/lib/NamedModulesPlugin.js
    -@@ -8,7 +8,7 @@ const createHash = require("./util/createHash");
    - const RequestShortener = require("./RequestShortener");
    - 
    - const getHash = str => {
    --	const hash = createHash("md4");
    -+	const hash = createHash("sha512");
    - 	hash.update(str);
    - 	const digest = /** @type {string} */ (hash.digest("hex"));
    - 	return digest.substr(0, 4);
    -diff --git a/node_modules/webpack/lib/NormalModule.js b/node_modules/webpack/lib/NormalModule.js
    -index 76aa1bd..a952cc2 100644
    ---- a/node_modules/webpack/lib/NormalModule.js
    -+++ b/node_modules/webpack/lib/NormalModule.js
    -@@ -414,7 +414,7 @@ class NormalModule extends Module {
    - 	}
    - 
    - 	_initBuildHash(compilation) {
    --		const hash = createHash(compilation.outputOptions.hashFunction);
    -+		const hash = createHash('sha512');
    - 		if (this._source) {
    - 			hash.update("source");
    - 			this._source.updateHash(hash);
    -diff --git a/node_modules/webpack/lib/SourceMapDevToolPlugin.js b/node_modules/webpack/lib/SourceMapDevToolPlugin.js
    -index 3018eb2..cb714bd 100644
    ---- a/node_modules/webpack/lib/SourceMapDevToolPlugin.js
    -+++ b/node_modules/webpack/lib/SourceMapDevToolPlugin.js
    -@@ -346,7 +346,7 @@ class SourceMapDevToolPlugin {
    - 									: filename,
    - 								query,
    - 								basename: basename(filename),
    --								contentHash: createHash("md4")
    -+								contentHash: createHash("sha512")
    - 									.update(sourceMapString)
    - 									.digest("hex")
    - 							};
    -diff --git a/node_modules/webpack/lib/optimize/ConcatenatedModule.js b/node_modules/webpack/lib/optimize/ConcatenatedModule.js
    -index df4d216..ea8cecb 100644
    ---- a/node_modules/webpack/lib/optimize/ConcatenatedModule.js
    -+++ b/node_modules/webpack/lib/optimize/ConcatenatedModule.js
    -@@ -560,7 +560,7 @@ class ConcatenatedModule extends Module {
    - 				orderedConcatenationListIdentifiers += " ";
    - 			}
    - 		}
    --		const hash = createHash("md4");
    -+		const hash = createHash("sha512");
    - 		hash.update(orderedConcatenationListIdentifiers);
    - 		return this.rootModule.identifier() + " " + hash.digest("hex");
    - 	}
    -diff --git a/node_modules/webpack/lib/optimize/SplitChunksPlugin.js b/node_modules/webpack/lib/optimize/SplitChunksPlugin.js
    -index e7d560b..8243e8c 100644
    ---- a/node_modules/webpack/lib/optimize/SplitChunksPlugin.js
    -+++ b/node_modules/webpack/lib/optimize/SplitChunksPlugin.js
    -@@ -22,7 +22,7 @@ const deterministicGroupingForModules = /** @type {function(DeterministicGroupin
    - 
    - const hashFilename = name => {
    - 	return crypto
    --		.createHash("md4")
    -+		.createHash("sha512")
    - 		.update(name)
    - 		.digest("hex")
    - 		.slice(0, 8);
    diff --git a/examples/s2-parcel-example/src/App.js b/examples/s2-parcel-example/src/App.js
    index 26200afa8a1..282fe786ca1 100644
    --- a/examples/s2-parcel-example/src/App.js
    +++ b/examples/s2-parcel-example/src/App.js
    @@ -35,9 +35,14 @@ import {
       TableView,
       Text,
       ToggleButton,
    -  ToggleButtonGroup
    +  ToggleButtonGroup,
    +  TreeView,
    +  TreeViewItem,
    +  TreeViewItemContent
     } from "@react-spectrum/s2";
     import Edit from "@react-spectrum/s2/icons/Edit";
    +import FileTxt from "@react-spectrum/s2/icons/FileText";
    +import Folder from "@react-spectrum/s2/icons/Folder";
     import Section from "./components/Section";
     import { style } from "@react-spectrum/s2/style" with { type: "macro" };
     import { CardViewExample } from "./components/CardViewExample";
    @@ -87,7 +92,7 @@ function App() {
             })}
           >
             <Section title="Buttons">
    -          <ButtonGroup>
    +          <ButtonGroup align="center" styles={style({maxWidth: '[100vw]'})}>
                 <Button variant="primary">Primary</Button>
                 <Button variant="secondary">Secondary</Button>
                 <ActionButton>
    @@ -205,6 +210,44 @@ function App() {
                   </Row>
                 </TableBody>
               </TableView>
    +          <TreeView disabledKeys={['projects-1']} aria-label="test static tree">
    +            <TreeViewItem id="Photos" textValue="Photos">
    +              <TreeViewItemContent>
    +                <Text>Photos</Text>
    +                <Folder />
    +              </TreeViewItemContent>
    +            </TreeViewItem>
    +            <TreeViewItem id="projects" textValue="Projects">
    +              <TreeViewItemContent>
    +                <Text>Projects</Text>
    +                <Folder />
    +              </TreeViewItemContent>
    +              <TreeViewItem id="projects-1" textValue="Projects-1">
    +                <TreeViewItemContent>
    +                  <Text>Projects-1</Text>
    +                  <Folder />
    +                </TreeViewItemContent>
    +                <TreeViewItem id="projects-1A" textValue="Projects-1A">
    +                  <TreeViewItemContent>
    +                    <Text>Projects-1A</Text>
    +                    <FileTxt />
    +                  </TreeViewItemContent>
    +                </TreeViewItem>
    +              </TreeViewItem>
    +              <TreeViewItem id="projects-2" textValue="Projects-2">
    +                <TreeViewItemContent>
    +                  <Text>Projects-2</Text>
    +                  <FileTxt />
    +                </TreeViewItemContent>
    +              </TreeViewItem>
    +              <TreeViewItem id="projects-3" textValue="Projects-3">
    +                <TreeViewItemContent>
    +                  <Text>Projects-3</Text>
    +                  <FileTxt />
    +                </TreeViewItemContent>
    +              </TreeViewItem>
    +            </TreeViewItem>
    +          </TreeView>
             </Section>
     
             {!isLazyLoaded && <ActionButton onPress={() => setLazyLoaded(true)}>Load more</ActionButton>}
    diff --git a/examples/s2-parcel-example/src/Lazy.js b/examples/s2-parcel-example/src/Lazy.js
    index 1004a7eaa0a..d43f33f8cc1 100644
    --- a/examples/s2-parcel-example/src/Lazy.js
    +++ b/examples/s2-parcel-example/src/Lazy.js
    @@ -13,6 +13,7 @@ import {
       ButtonGroup,
       Checkbox,
       CheckboxGroup,
    +  CloseButton,
       ColorArea,
       ColorField,
       ColorSlider,
    @@ -23,6 +24,7 @@ import {
       ComboBoxItem,
       Content,
       ContextualHelp,
    +  CustomDialog,
       Dialog,
       DialogContainer,
       DialogTrigger,
    @@ -44,6 +46,7 @@ import {
       NumberField,
       Picker,
       PickerItem,
    +  Popover,
       ProgressBar,
       ProgressCircle,
       Radio,
    @@ -67,6 +70,7 @@ import {
       Tooltip,
       TooltipTrigger,
     } from "@react-spectrum/s2";
    +import Checkmark from '@react-spectrum/s2/illustrations/gradient/generic1/Checkmark';
     import Cloud from "@react-spectrum/s2/illustrations/linear/Cloud";
     import DropToUpload from "@react-spectrum/s2/illustrations/linear/DropToUpload";
     import Edit from "@react-spectrum/s2/icons/Edit";
    @@ -247,15 +251,27 @@ export default function Lazy() {
               </Dialog>
             </DialogTrigger>
     
    -        <DialogTrigger type="popover">
    +        <DialogTrigger>
    +          <ActionButton>Illustration</ActionButton>
    +          <CustomDialog size="M">
    +            <div className={style({display: 'flex', flexDirection: 'column', rowGap: 8, alignItems: 'center'})}>
    +              <Checkmark />
    +              <Heading slot="title" styles={style({font: 'heading-lg', textAlign: 'center', marginY: 0})}>Thank you!</Heading>
    +              <p className={style({font: 'body', textAlign: 'center', marginY: 0})}>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
    +              <CloseButton styles={style({position: 'absolute', top: 12, insetEnd: 12})} />
    +            </div>
    +          </CustomDialog>
    +        </DialogTrigger>
    +
    +        <DialogTrigger>
               <ActionButton>Disk Status</ActionButton>
    -          <Dialog>
    -            <Heading>C://</Heading>
    +          <Popover>
    +            <Heading styles={style({font: 'heading', marginTop: 0, marginBottom: 20})}>C://</Heading>
     
    -            <Content>
    +            <Content styles={style({font: 'ui'})}>
                   <Text>50% disk space remaining.</Text>
                 </Content>
    -          </Dialog>
    +          </Popover>
             </DialogTrigger>
     
             <TooltipTrigger>
    diff --git a/examples/s2-parcel-example/src/index.html b/examples/s2-parcel-example/src/index.html
    index f7dc96d4b4e..aeff7d6897a 100644
    --- a/examples/s2-parcel-example/src/index.html
    +++ b/examples/s2-parcel-example/src/index.html
    @@ -2,6 +2,7 @@
     <html lang="en">
         <head>
             <meta charset="utf-8" />
    +        <meta name="viewport" content="width=device-width, initial-scale=1" />
             <title>Spectrum 2 + Parcel
         
         
    diff --git a/examples/s2-vite-project/src/App.tsx b/examples/s2-vite-project/src/App.tsx
    index 8ea3e636222..a804ab39d6f 100644
    --- a/examples/s2-vite-project/src/App.tsx
    +++ b/examples/s2-vite-project/src/App.tsx
    @@ -35,9 +35,14 @@ import {
       TableView,
       Text,
       ToggleButton,
    -  ToggleButtonGroup
    +  ToggleButtonGroup,
    +  TreeView,
    +  TreeViewItem,
    +  TreeViewItemContent
     } from "@react-spectrum/s2";
     import Edit from "@react-spectrum/s2/icons/Edit";
    +import FileTxt from "@react-spectrum/s2/icons/FileText";
    +import Folder from "@react-spectrum/s2/icons/Folder";
     import Section from "./components/Section";
     import { style } from "@react-spectrum/s2/style" with { type: "macro" };
     import { CardViewExample } from "./components/CardViewExample";
    @@ -87,7 +92,7 @@ function App() {
             })}
           >
             
    - + @@ -205,6 +210,44 @@ function App() { + + + + Photos + + + + + + Projects + + + + + Projects-1 + + + + + Projects-1A + + + + + + + Projects-2 + + + + + + Projects-3 + + + + +
    {!isLazyLoaded && setLazyLoaded(true)}>Load more} diff --git a/examples/s2-vite-project/src/Lazy.tsx b/examples/s2-vite-project/src/Lazy.tsx index 4055e0260c7..f15e242ee45 100644 --- a/examples/s2-vite-project/src/Lazy.tsx +++ b/examples/s2-vite-project/src/Lazy.tsx @@ -13,6 +13,7 @@ import { ButtonGroup, Checkbox, CheckboxGroup, + CloseButton, ColorArea, ColorField, ColorSlider, @@ -23,6 +24,7 @@ import { ComboBoxItem, Content, ContextualHelp, + CustomDialog, Dialog, DialogContainer, DialogTrigger, @@ -44,6 +46,7 @@ import { NumberField, Picker, PickerItem, + Popover, ProgressBar, ProgressCircle, Radio, @@ -67,6 +70,7 @@ import { Tooltip, TooltipTrigger, } from "@react-spectrum/s2"; +import Checkmark from '@react-spectrum/s2/illustrations/gradient/generic1/Checkmark'; import Cloud from "@react-spectrum/s2/illustrations/linear/Cloud"; import DropToUpload from "@react-spectrum/s2/illustrations/linear/DropToUpload"; import Edit from "@react-spectrum/s2/icons/Edit"; @@ -247,15 +251,27 @@ export default function Lazy() { - + + Illustration + +
    + + Thank you! +

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

    + +
    +
    +
    + + Disk Status - - C:// + + C:// - + 50% disk space remaining. - + diff --git a/examples/s2-webpack-5-example/src/App.js b/examples/s2-webpack-5-example/src/App.js index d2cc185657c..6aeb3b8201a 100644 --- a/examples/s2-webpack-5-example/src/App.js +++ b/examples/s2-webpack-5-example/src/App.js @@ -35,9 +35,14 @@ import { TableView, Text, ToggleButton, - ToggleButtonGroup + ToggleButtonGroup, + TreeView, + TreeViewItem, + TreeViewItemContent } from "@react-spectrum/s2"; import Edit from "@react-spectrum/s2/icons/Edit"; +import FileTxt from "@react-spectrum/s2/icons/FileText"; +import Folder from "@react-spectrum/s2/icons/Folder"; import Section from "./components/Section"; import { style } from "@react-spectrum/s2/style" with { type: "macro" }; import { CardViewExample } from "./components/CardViewExample"; @@ -87,7 +92,7 @@ function App() { })} >
    - + @@ -205,6 +210,44 @@ function App() { + + + + Photos + + + + + + Projects + + + + + Projects-1 + + + + + Projects-1A + + + + + + + Projects-2 + + + + + + Projects-3 + + + + +
    {!isLazyLoaded && setLazyLoaded(true)}>Load more} diff --git a/examples/s2-webpack-5-example/src/Lazy.js b/examples/s2-webpack-5-example/src/Lazy.js index 1004a7eaa0a..d43f33f8cc1 100644 --- a/examples/s2-webpack-5-example/src/Lazy.js +++ b/examples/s2-webpack-5-example/src/Lazy.js @@ -13,6 +13,7 @@ import { ButtonGroup, Checkbox, CheckboxGroup, + CloseButton, ColorArea, ColorField, ColorSlider, @@ -23,6 +24,7 @@ import { ComboBoxItem, Content, ContextualHelp, + CustomDialog, Dialog, DialogContainer, DialogTrigger, @@ -44,6 +46,7 @@ import { NumberField, Picker, PickerItem, + Popover, ProgressBar, ProgressCircle, Radio, @@ -67,6 +70,7 @@ import { Tooltip, TooltipTrigger, } from "@react-spectrum/s2"; +import Checkmark from '@react-spectrum/s2/illustrations/gradient/generic1/Checkmark'; import Cloud from "@react-spectrum/s2/illustrations/linear/Cloud"; import DropToUpload from "@react-spectrum/s2/illustrations/linear/DropToUpload"; import Edit from "@react-spectrum/s2/icons/Edit"; @@ -247,15 +251,27 @@ export default function Lazy() {
    - + + Illustration + +
    + + Thank you! +

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

    + +
    +
    +
    + + Disk Status - - C:// + + C:// - + 50% disk space remaining. - + diff --git a/packages/@react-spectrum/searchwithin/src/index.ts b/lib/css.d.ts similarity index 73% rename from packages/@react-spectrum/searchwithin/src/index.ts rename to lib/css.d.ts index ff120f618d5..21aa02635ee 100644 --- a/packages/@react-spectrum/searchwithin/src/index.ts +++ b/lib/css.d.ts @@ -1,5 +1,5 @@ /* - * Copyright 2020 Adobe. All rights reserved. + * Copyright 2025 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 @@ -10,7 +10,11 @@ * governing permissions and limitations under the License. */ -/// +declare module 'react' { + interface CSSProperties { + viewTransitionName?: string, + viewTransitionClass?: string + } +} -export {SearchWithin} from './SearchWithin'; -export type {SpectrumSearchWithinProps} from '@react-types/searchwithin'; +export {}; diff --git a/lib/jestResolver.js b/lib/jestResolver.js index 13f6e72265e..9f5f9a85170 100644 --- a/lib/jestResolver.js +++ b/lib/jestResolver.js @@ -32,7 +32,7 @@ module.exports = (request, options) => { let files = glob.sync(request, {cwd: options.basedir}); let source = ''; for (let file of files) { - source += `exports['${path.basename(file, '.json')}'] = require('${path.join(options.basedir, file)}');\n`; + source += `exports['${path.basename(file, '.json')}'] = require('${path.join(options.basedir, file).replace(/\\/g, '\\\\')}');\n`; } let hash = crypto.createHash('md5'); hash.update(source); @@ -44,12 +44,14 @@ module.exports = (request, options) => { ...options, // https://github.com/microsoft/accessibility-insights-web/pull/5421#issuecomment-1109168149 packageFilter: pkg => { - delete pkg['exports']; - delete pkg['module']; + if (!pkg.name?.startsWith('@tailwind') && pkg.name !== 'tailwindcss' && !pkg.name?.startsWith('storybook') && !pkg.name?.startsWith('@storybook')) { + delete pkg['exports']; + delete pkg['module']; + } return pkg; } }); - if (/packages\/.*\/.*\/intl\/.*\.json$/.test(resolved)) { + if (/packages[\/\\].*[\/\\].*[\/\\]intl[\/\\].*\.json$/.test(resolved)) { let sourceText = fs.readFileSync(resolved, 'utf8'); let json = JSON.parse(sourceText); let res = compileStrings(json); diff --git a/lib/viewTransitions.d.ts b/lib/viewTransitions.d.ts new file mode 100644 index 00000000000..b23422f436f --- /dev/null +++ b/lib/viewTransitions.d.ts @@ -0,0 +1,15 @@ +/* + * Copyright 2025 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. + */ + +interface Document { + startViewTransition(update: (() => void) | {update: () => void, types: string[]}): ViewTransition; +} diff --git a/package.json b/package.json index 83e16a7eee5..d17631adfa0 100644 --- a/package.json +++ b/package.json @@ -12,31 +12,31 @@ "check-types": "tsc", "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-19": "node scripts/react-19-install-prep.mjs && yarn add react@next react-dom@next", + "install-18": "node scripts/react-18-install-prep.mjs && yarn add react@^18 react-dom@^18", + "install-canary": "node scripts/react-canary-install-prep.mjs && yarn add react@canary react-dom@canary", "start": "cross-env NODE_ENV=storybook storybook dev -p 9003 --ci -c '.storybook'", "build:storybook": "storybook build -c .storybook -o dist/$(git rev-parse HEAD)/storybook", - "build:storybook-16": "storybook build -c .storybook -o dist/$(git rev-parse HEAD)/storybook-16", - "build:storybook-17": "storybook build -c .storybook -o dist/$(git rev-parse HEAD)/storybook-17", - "build:storybook-19": "storybook build -c .storybook -o dist/$(git rev-parse HEAD)/storybook-19", "start:chromatic": "CHROMATIC=1 NODE_ENV=storybook storybook dev -p 9004 --ci -c '.chromatic'", "build:chromatic": "CHROMATIC=1 storybook build -c .chromatic -o dist/$(git rev-parse HEAD)/chromatic", "start:chromatic-fc": "CHROMATIC=1 NODE_ENV=storybook storybook dev -p 9005 --ci -c '.chromatic-fc'", "build:chromatic-fc": "CHROMATIC=1 storybook build -c .chromatic-fc -o dist/$(git rev-parse HEAD)/chromatic-fc", "start:s2": "NODE_ENV=storybook storybook dev -p 6006 --ci -c '.storybook-s2'", "build:storybook-s2": "NODE_ENV=storybook storybook build -c .storybook-s2 -o dist/$(git rev-parse HEAD)/storybook-s2", - "build:s2-docs": "NODE_ENV=storybook storybook build -c .storybook-s2 --docs", + "build:s2-storybook-docs": "NODE_ENV=storybook storybook build -c .storybook-s2 --docs", "start:docs": "DOCS_ENV=dev parcel 'packages/@react-{spectrum,aria,stately}/*/docs/*.mdx' 'packages/react-aria-components/docs/**/*.mdx' 'packages/@internationalized/*/docs/*.mdx' 'packages/dev/docs/pages/**/*.mdx'", "build:docs": "DOCS_ENV=staging parcel build 'packages/@react-{spectrum,aria,stately}/*/docs/*.mdx' 'packages/react-aria-components/docs/**/*.mdx' 'packages/@internationalized/*/docs/*.mdx' 'packages/dev/docs/pages/**/*.mdx'", - "test": "cross-env STRICT_MODE=1 yarn jest", + "start:s2-docs": "yarn workspace @react-spectrum/s2-docs start", + "build:s2-docs": "yarn workspace @react-spectrum/s2-docs build", + "test": "cross-env STRICT_MODE=1 VIRT_ON=1 yarn jest", "test:lint": "node packages/**/*.test-lint.js", "test-loose": "cross-env VIRT_ON=1 yarn jest", "test-storybook": "test-storybook --url http://localhost:9003 --browsers chromium --no-cache", "test:docs": "yarn playwright install && node scripts/testDocs.js", "build": "make build", - "test:ssr": "cross-env STRICT_MODE=1 yarn jest --config jest.ssr.config.js", + "test:ssr": "cross-env STRICT_MODE=1 yarn jest --runInBand --config jest.ssr.config.js", "ci-test": "cross-env STRICT_MODE=1 yarn jest --maxWorkers=2 && cross-env STRICT_MODE=1 yarn test:ssr --runInBand", "lint": "concurrently \"yarn check-types\" \"eslint packages\" \"node scripts/lint-packages.js\" \"yarn constraints\"", - "jest": "node scripts/jest.js", + "jest": "jest", "copyrights": "babel-node --presets @babel/env ./scripts/addHeaders.js", "build:icons": "babel-node --presets @babel/env ./scripts/buildIcons.js", "clean:icons": "babel-node --presets @babel/env ./scripts/cleanIcons.js", @@ -46,7 +46,7 @@ "chromatic:forced-colors": "NODE_ENV=production CHROMATIC=1 chromatic --project-token $CHROMATIC_FC_PROJECT_TOKEN --build-script-name 'build:chromatic-fc'", "merge:css": "babel-node --presets @babel/env ./scripts/merge-spectrum-css.js", "release": "lerna publish from-package --yes", - "version:nightly": "yarn workspaces foreach --all --no-private -t version -d 3.0.0-nightly-$(git rev-parse --short HEAD)-$(date +'%y%m%d') && yarn version apply --all", + "version:nightly": "yarn workspaces foreach --all --no-private -t version -d 3.0.0-nightly-$(git rev-parse --short HEAD)-$(date +'%y%m%d') && yarn apply-nightly --all", "publish:nightly": "yarn workspaces foreach --all --no-private -t npm publish --tag nightly --access public", "build:api-published": "node scripts/buildPublishedAPI.js", "build:api-branch": "node scripts/buildBranchAPI.js", @@ -56,7 +56,8 @@ "bumpVersions": "node scripts/bumpVersions.js", "test:parcel": "jest --testMatch '**/*.parceltest.{ts,tsx}'", "blc:local": "npx git+ssh://git@github.com:ktabors/rsp-blc.git -u http://localhost:1234/", - "blc:prod": "npx git+ssh://git@github.com:ktabors/rsp-blc.git -u https://react-spectrum.adobe.com/" + "blc:prod": "npx git+ssh://git@github.com:ktabors/rsp-blc.git -u https://react-spectrum.adobe.com/", + "createRssFeed": "node scripts/createFeed.mjs" }, "workspaces": [ "packages/react-stately", @@ -70,7 +71,7 @@ "@actions/github": "^1.1.0", "@babel/cli": "^7.24.1", "@babel/core": "^7.24.3", - "@babel/eslint-parser": "^7.24.1", + "@babel/eslint-parser": "^7.27.1", "@babel/node": "^7.23.9", "@babel/plugin-proposal-decorators": "^7.24.1", "@babel/plugin-syntax-decorators": "7.24.1", @@ -86,48 +87,50 @@ "@faker-js/faker": "^8.4.1", "@jdb8/eslint-plugin-monorepo": "^1.0.1", "@octokit/rest": "*", - "@parcel/bundler-library": "^2.12.1", - "@parcel/config-default": "^2.13.1", - "@parcel/config-storybook": "^0.0.2", - "@parcel/core": "^2.13.1", - "@parcel/optimizer-data-url": "^2.13.1", - "@parcel/optimizer-terser": "^2.13.1", - "@parcel/packager-ts": "^2.13.1", - "@parcel/reporter-cli": "^2.13.1", - "@parcel/resolver-glob": "^2.13.1", - "@parcel/transformer-inline": "^2.13.1", - "@parcel/transformer-inline-string": "^2.13.1", - "@parcel/transformer-svg-react": "^2.13.1", - "@parcel/transformer-typescript-types": "^2.13.1", - "@react-spectrum/s2-icon-builder": "^0.2.0", - "@spectrum-css/component-builder": "1.0.1", + "@parcel/bundler-library": "^2.15.4", + "@parcel/config-default": "^2.15.4", + "@parcel/config-storybook": ">=0.0.2", + "@parcel/core": "^2.15.4", + "@parcel/optimizer-data-url": "^2.15.4", + "@parcel/optimizer-terser": "^2.15.4", + "@parcel/packager-react-static": "^2.15.4", + "@parcel/packager-ts": "^2.15.4", + "@parcel/reporter-cli": "^2.15.4", + "@parcel/resolver-glob": "^2.15.4", + "@parcel/transformer-inline": "^2.15.4", + "@parcel/transformer-inline-string": "^2.15.4", + "@parcel/transformer-react-static": "^2.15.4", + "@parcel/transformer-svg-react": "^2.15.4", + "@parcel/transformer-typescript-types": "^2.15.4", + "@react-spectrum/parcel-namer-s2": "^0.3.0", + "@react-spectrum/s2-icon-builder": "^0.3.0", + "@spectrum-css/component-builder": "workspace:^", "@spectrum-css/vars": "^2.3.0", - "@storybook/addon-a11y": "patch:@storybook/addon-a11y@npm%3A^7.6.19#~/.yarn/patches/@storybook-addon-a11y-npm-7.6.19-04b470eae0.patch", - "@storybook/addon-actions": "^7.6.19", - "@storybook/addon-controls": "^7.6.19", - "@storybook/addon-essentials": "^7.6.19", - "@storybook/addon-interactions": "^7.6.19", - "@storybook/addon-links": "^7.6.19", - "@storybook/addon-onboarding": "1.0.8", - "@storybook/addon-themes": "^7.6.19", - "@storybook/api": "^7.6.19", - "@storybook/components": "^7.6.19", - "@storybook/manager-api": "^7.6.19", - "@storybook/preview": "^7.6.19", - "@storybook/preview-api": "^7.6.19", - "@storybook/react": "^7.6.19", - "@storybook/test-runner": "^0.16.0", - "@storybook/testing-library": "^0.2.2", + "@storybook/addon-a11y": "patch:@storybook/addon-a11y@npm%3A8.6.14#~/.yarn/patches/@storybook-addon-a11y-npm-8.6.14-2119c57a0f.patch", + "@storybook/addon-actions": "^8.6.14", + "@storybook/addon-controls": "^8.6.14", + "@storybook/addon-essentials": "^8.6.14", + "@storybook/addon-interactions": "^8.6.14", + "@storybook/addon-jest": "^8.6.14", + "@storybook/addon-links": "^8.6.14", + "@storybook/addon-onboarding": "^8.6.14", + "@storybook/addon-themes": "^8.6.14", + "@storybook/components": "^8.6.14", + "@storybook/manager-api": "^8.6.14", + "@storybook/preview": "^8.6.14", + "@storybook/preview-api": "^8.6.14", + "@storybook/react": "^8.6.14", + "@storybook/test-runner": "^0.22.0", "@stylistic/eslint-plugin-ts": "^2.9.0", "@swc/core": "^1.3.36", "@swc/jest": "^0.2.36", + "@tailwindcss/postcss": "^4.0.17", "@testing-library/dom": "^10.1.0", "@testing-library/jest-dom": "^5.16.5", - "@testing-library/react": "^15.0.7", - "@testing-library/user-event": "^14.5.2", - "@types/react": "npm:types-react@19.0.0-rc.0", - "@types/react-dom": "npm:types-react-dom@19.0.0-rc.0", - "@types/storybook__react": "^4.0.2", + "@testing-library/react": "^16.0.0", + "@testing-library/user-event": "patch:@testing-library/user-event@npm%3A14.6.1#~/.yarn/patches/@testing-library-user-event-npm-14.6.1-5da7e1d4e2.patch", + "@types/react": "^19.0.0", + "@types/react-dom": "^19.0.0", "@yarnpkg/types": "^4.0.0", "autoprefixer": "^9.6.0", "axe-core": "^4.6.3", @@ -138,7 +141,7 @@ "babel-plugin-transform-glob-import": "^1.0.1", "babelify": "^10.0.0", "chalk": "^4.1.2", - "chromatic": "^11.3.0", + "chromatic": "^11.25.2", "clsx": "^2.0.0", "color-space": "^1.16.0", "concurrently": "^6.0.2", @@ -158,8 +161,7 @@ "fast-check": "^2.19.0", "fast-glob": "^3.1.0", "framer-motion": "^11.3.0-alpha.0", - "fs-extra": "^10.0.0", - "full-icu": "^1.3.0", + "fs-extra": "^11.0.0", "glob": "^8.0.3", "glob-promise": "^6.0.5", "globals": "^15.11.0", @@ -177,7 +179,7 @@ "npm-cli-login": "^1.0.0", "nyc": "^10.2.0", "p-queue": "^6.2.1", - "parcel": "^2.13.1", + "parcel": "^2.15.4", "parcel-optimizer-strict-mode": "workspace:^", "patch-package": "^6.2.0", "playwright": "^1.45.3", @@ -185,11 +187,12 @@ "postcss": "^8.4.24", "postcss-custom-properties": "^13.2.0", "postcss-import": "^15.1.0", + "prettier": "^3.3.3", "prop-types": "^15.6.0", "raf": "^3.4.0", - "react": "^18.2.0", + "react": "^19.1.0", "react-axe": "^3.0.2", - "react-dom": "^18.2.0", + "react-dom": "^19.1.0", "react-frame-component": "^5.0.0", "react-test-renderer": "^18.3.1", "recast": "^0.23", @@ -198,18 +201,19 @@ "rimraf": "^2.6.3", "sharp": "^0.33.5", "sinon": "^7.3.1", - "storybook": "^7.6.19", - "storybook-dark-mode": "^3.0.3", - "storybook-react-parcel": "^0.0.1", - "tailwind-variants": "^0.1.18", - "tailwindcss": "^3.4.0", + "storybook": "^8.6.14", + "storybook-dark-mode": "^4.0.2", + "storybook-react-parcel": "workspace:^", + "tailwind-variants": "patch:tailwind-variants@npm%3A0.3.1#~/.yarn/patches/tailwind-variants-npm-0.3.1-48888516de.patch", + "tailwindcss": "^4.0.0", "tailwindcss-animate": "^1.0.7", "tempy": "^0.5.0", - "typescript": "^5.5.0", + "typescript": "^5.8.2", "typescript-eslint": "^8.9.0", - "verdaccio": "^5.13.0", + "verdaccio": "^6.0.0", "walk-object": "^4.0.0", "wsrun": "^5.0.0", + "xml": "^1.0.1", "yargs": "^17.2.1" }, "resolutions": { @@ -220,18 +224,28 @@ "@babel/preset-env": "7.24.4", "@babel/traverse": "7.24.1", "@babel/types": "7.24.0", + "@mdx-js/react": "2.0.0-rc.2", "postcss": "8.4.24", "postcss-custom-properties": "13.2.0", "postcss-import": "15.1.0", "react-refresh": "0.9.0", - "remark-parse": "10.0.1", "browserslist": "4.24.0", "caniuse-lite": "1.0.30001563", - "@types/react": "npm:types-react@19.0.0-rc.0", - "@types/react-dom": "npm:types-react-dom@19.0.0-rc.0", + "@types/react": "19.1.8", + "@types/react-dom": "19.1.6", "recast": "0.23.6", "ast-types": "0.16.1", - "svgo": "^3" + "svgo": "^3", + "@testing-library/user-event": "patch:@testing-library/user-event@npm%3A14.6.1#~/.yarn/patches/@testing-library-user-event-npm-14.6.1-5da7e1d4e2.patch", + "@types/node@npm:*": "^22", + "@types/node@npm:^18.0.0": "^22", + "@types/node@npm:>= 8": "^22", + "@storybook/addon-docs@npm:8.6.14": "patch:@storybook/addon-docs@npm%3A8.6.14#~/.yarn/patches/@storybook-addon-docs-npm-8.6.14-12ab3f55f8.patch", + "@storybook/react": "patch:@storybook/react@npm%3A8.6.14#~/.yarn/patches/@storybook-react-npm-8.6.14-bc3fc2208a.patch", + "micromark-extension-mdxjs": "patch:micromark-extension-mdxjs@npm%3A1.0.0#~/.yarn/patches/micromark-extension-mdxjs-npm-1.0.0-d2b6b69e4a.patch", + "remark-mdx": "patch:remark-mdx@npm%3A2.0.0-rc.2#~/.yarn/patches/remark-mdx-npm-2.0.0-rc.2-7a71234e1f.patch", + "remark-parse": "patch:remark-parse@npm%3A10.0.1#~/.yarn/patches/remark-parse-npm-10.0.1-e654d7df78.patch", + "lightningcss": "1.30.1" }, "@parcel/transformer-css": { "cssModules": { @@ -243,8 +257,11 @@ "packages/@react-spectrum/style-macro-s1/**", "packages/@react-spectrum/tree/**", "packages/@react-spectrum/color/src/*.tsx", - "packages/@react-spectrum/s2/**", - ".storybook-s2/**" + "packages/@react-spectrum/s2/**/*.{js,ts,tsx}", + "packages/@react-spectrum/s2/stories/**", + ".storybook-s2/**", + "packages/dev/s2-docs/**", + "starters/**" ] }, "drafts": { @@ -255,8 +272,8 @@ "hover": "is-hovered" } }, - "alias": { - "@storybook/react-dom-shim": "@storybook/react-dom-shim/dist/react-18" + "@parcel/resolver-default": { + "packageExports": true }, "@parcel/bundler-default": { "manualSharedBundles": [ diff --git a/packages/@adobe/react-spectrum/package.json b/packages/@adobe/react-spectrum/package.json index f8b07c79f9e..ee9079acdd8 100644 --- a/packages/@adobe/react-spectrum/package.json +++ b/packages/@adobe/react-spectrum/package.json @@ -1,13 +1,16 @@ { "name": "@adobe/react-spectrum", - "version": "3.38.0", + "version": "3.42.2", "description": "Spectrum UI components in React", "license": "Apache-2.0", "main": "dist/main.js", "module": "dist/module.js", "exports": { ".": { - "types": "./dist/types.d.ts", + "types": [ + "./dist/types.d.ts", + "./src/index.ts" + ], "import": "./dist/import.mjs", "require": "./dist/main.js" }, @@ -37,66 +40,69 @@ "url": "https://github.com/adobe/react-spectrum" }, "dependencies": { - "@internationalized/string": "^3.2.5", - "@react-aria/i18n": "^3.12.4", - "@react-aria/ssr": "^3.9.7", - "@react-aria/utils": "^3.26.0", - "@react-aria/visually-hidden": "^3.8.18", - "@react-spectrum/accordion": "^3.0.0", - "@react-spectrum/actionbar": "^3.6.2", - "@react-spectrum/actiongroup": "^3.10.10", - "@react-spectrum/avatar": "^3.0.17", - "@react-spectrum/badge": "^3.1.18", - "@react-spectrum/breadcrumbs": "^3.9.12", - "@react-spectrum/button": "^3.16.9", - "@react-spectrum/buttongroup": "^3.6.17", - "@react-spectrum/calendar": "^3.5.0", - "@react-spectrum/checkbox": "^3.9.11", - "@react-spectrum/color": "^3.0.2", - "@react-spectrum/combobox": "^3.14.0", - "@react-spectrum/contextualhelp": "^3.6.16", - "@react-spectrum/datepicker": "^3.11.0", - "@react-spectrum/dialog": "^3.8.16", - "@react-spectrum/divider": "^3.5.18", - "@react-spectrum/dnd": "^3.5.0", - "@react-spectrum/dropzone": "^3.0.6", - "@react-spectrum/filetrigger": "^3.0.6", - "@react-spectrum/form": "^3.7.10", - "@react-spectrum/icon": "^3.8.0", - "@react-spectrum/illustratedmessage": "^3.5.5", - "@react-spectrum/image": "^3.5.6", - "@react-spectrum/inlinealert": "^3.2.10", - "@react-spectrum/labeledvalue": "^3.1.18", - "@react-spectrum/layout": "^3.6.10", - "@react-spectrum/link": "^3.6.12", - "@react-spectrum/list": "^3.9.0", - "@react-spectrum/listbox": "^3.14.0", - "@react-spectrum/menu": "^3.21.0", - "@react-spectrum/meter": "^3.5.5", - "@react-spectrum/numberfield": "^3.9.8", - "@react-spectrum/overlays": "^5.7.0", - "@react-spectrum/picker": "^3.15.4", - "@react-spectrum/progress": "^3.7.11", - "@react-spectrum/provider": "^3.10.0", - "@react-spectrum/radio": "^3.7.11", - "@react-spectrum/searchfield": "^3.8.11", - "@react-spectrum/slider": "^3.7.0", - "@react-spectrum/statuslight": "^3.5.17", - "@react-spectrum/switch": "^3.5.10", - "@react-spectrum/table": "^3.15.0", - "@react-spectrum/tabs": "^3.8.15", - "@react-spectrum/tag": "^3.2.11", - "@react-spectrum/text": "^3.5.10", - "@react-spectrum/textfield": "^3.12.7", - "@react-spectrum/theme-dark": "^3.5.14", - "@react-spectrum/theme-default": "^3.5.14", - "@react-spectrum/theme-light": "^3.4.14", - "@react-spectrum/tooltip": "^3.7.0", - "@react-spectrum/view": "^3.6.14", - "@react-spectrum/well": "^3.4.18", - "@react-stately/collections": "^3.12.0", - "@react-stately/data": "^3.12.0", - "@react-types/shared": "^3.26.0", + "@internationalized/string": "^3.2.7", + "@react-aria/collections": "3.0.0-rc.3", + "@react-aria/i18n": "^3.12.10", + "@react-aria/ssr": "^3.9.9", + "@react-aria/utils": "^3.29.1", + "@react-aria/visually-hidden": "^3.8.25", + "@react-spectrum/accordion": "^3.0.8", + "@react-spectrum/actionbar": "^3.6.9", + "@react-spectrum/actiongroup": "^3.10.17", + "@react-spectrum/avatar": "^3.0.23", + "@react-spectrum/badge": "^3.1.25", + "@react-spectrum/breadcrumbs": "^3.9.19", + "@react-spectrum/button": "^3.16.16", + "@react-spectrum/buttongroup": "^3.6.23", + "@react-spectrum/calendar": "^3.7.3", + "@react-spectrum/checkbox": "^3.9.18", + "@react-spectrum/color": "^3.0.9", + "@react-spectrum/combobox": "^3.15.5", + "@react-spectrum/contextualhelp": "^3.6.23", + "@react-spectrum/datepicker": "^3.14.3", + "@react-spectrum/dialog": "^3.8.23", + "@react-spectrum/divider": "^3.5.24", + "@react-spectrum/dnd": "^3.5.7", + "@react-spectrum/dropzone": "^3.0.13", + "@react-spectrum/filetrigger": "^3.0.13", + "@react-spectrum/form": "^3.7.16", + "@react-spectrum/icon": "^3.8.6", + "@react-spectrum/illustratedmessage": "^3.5.11", + "@react-spectrum/image": "^3.5.12", + "@react-spectrum/inlinealert": "^3.2.17", + "@react-spectrum/labeledvalue": "^3.2.4", + "@react-spectrum/layout": "^3.6.16", + "@react-spectrum/link": "^3.6.19", + "@react-spectrum/list": "^3.10.3", + "@react-spectrum/listbox": "^3.15.3", + "@react-spectrum/menu": "^3.22.3", + "@react-spectrum/meter": "^3.5.11", + "@react-spectrum/numberfield": "^3.9.15", + "@react-spectrum/overlays": "^5.7.7", + "@react-spectrum/picker": "^3.15.11", + "@react-spectrum/progress": "^3.7.17", + "@react-spectrum/provider": "^3.10.7", + "@react-spectrum/radio": "^3.7.18", + "@react-spectrum/searchfield": "^3.8.18", + "@react-spectrum/slider": "^3.7.7", + "@react-spectrum/statuslight": "^3.5.23", + "@react-spectrum/switch": "^3.6.3", + "@react-spectrum/table": "^3.17.3", + "@react-spectrum/tabs": "^3.8.22", + "@react-spectrum/tag": "^3.3.2", + "@react-spectrum/text": "^3.5.17", + "@react-spectrum/textfield": "^3.13.5", + "@react-spectrum/theme-dark": "^3.5.19", + "@react-spectrum/theme-default": "^3.5.19", + "@react-spectrum/theme-light": "^3.4.19", + "@react-spectrum/toast": "^3.0.5", + "@react-spectrum/tooltip": "^3.7.7", + "@react-spectrum/tree": "^3.1.3", + "@react-spectrum/view": "^3.6.20", + "@react-spectrum/well": "^3.4.24", + "@react-stately/collections": "^3.12.5", + "@react-stately/data": "^3.13.1", + "@react-types/shared": "^3.30.0", "client-only": "^0.0.1" }, "publishConfig": { diff --git a/packages/@adobe/react-spectrum/src/index.ts b/packages/@adobe/react-spectrum/src/index.ts index c09259db8f2..c9085766e5d 100644 --- a/packages/@adobe/react-spectrum/src/index.ts +++ b/packages/@adobe/react-spectrum/src/index.ts @@ -61,7 +61,9 @@ export {TextArea, TextField} from '@react-spectrum/textfield'; export {theme as darkTheme} from '@react-spectrum/theme-dark'; export {theme as defaultTheme} from '@react-spectrum/theme-default'; export {theme as lightTheme} from '@react-spectrum/theme-light'; +export {ToastContainer, ToastQueue} from '@react-spectrum/toast'; export {Tooltip, TooltipTrigger} from '@react-spectrum/tooltip'; +export {TreeView, TreeViewItem, TreeViewItemContent} from '@react-spectrum/tree'; export {Content, Footer, Header, View} from '@react-spectrum/view'; export {Well} from '@react-spectrum/well'; export {Item, Section} from '@react-stately/collections'; @@ -70,6 +72,7 @@ export {VisuallyHidden} from '@react-aria/visually-hidden'; export {useCollator, useDateFormatter, useFilter, useLocale, useLocalizedStringFormatter, useMessageFormatter, useNumberFormatter} from '@react-aria/i18n'; export {SSRProvider} from '@react-aria/ssr'; export {useDragAndDrop, DIRECTORY_DRAG_TYPE} from '@react-spectrum/dnd'; +export {Collection} from '@react-aria/collections'; export type {SpectrumActionBarContainerProps, SpectrumActionBarProps} from '@react-spectrum/actionbar'; export type {SpectrumActionGroupProps} from '@react-spectrum/actiongroup'; @@ -114,7 +117,9 @@ export type {SpectrumTableProps, SpectrumColumnProps, TableHeaderProps, TableBod export type {SpectrumTabListProps, SpectrumTabPanelsProps, SpectrumTabsProps} from '@react-spectrum/tabs'; export type {SpectrumTagGroupProps} from '@react-spectrum/tag'; export type {SpectrumTextFieldProps, SpectrumTextAreaProps} from '@react-spectrum/textfield'; +export type {SpectrumToastContainerProps, SpectrumToastOptions} from '@react-spectrum/toast'; export type {SpectrumTooltipProps, SpectrumTooltipTriggerProps} from '@react-spectrum/tooltip'; +export type {SpectrumTreeViewProps, SpectrumTreeViewItemProps, SpectrumTreeViewItemContentProps} from '@react-spectrum/tree'; export type {ContentProps, FooterProps, HeaderProps, ViewProps} from '@react-spectrum/view'; export type {SpectrumWellProps} from '@react-spectrum/well'; export type {AsyncListData, AsyncListOptions, ListData, ListOptions, TreeData, TreeOptions} from '@react-stately/data'; diff --git a/packages/@adobe/spectrum-css-builder-temp/css/lib/varUtils.js b/packages/@adobe/spectrum-css-builder-temp/css/lib/varUtils.js new file mode 100644 index 00000000000..95ee3f4a9d6 --- /dev/null +++ b/packages/@adobe/spectrum-css-builder-temp/css/lib/varUtils.js @@ -0,0 +1,149 @@ +/* +Copyright 2019 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. +*/ + +const gulp = require('gulp'); +const postcss = require('postcss'); +const concat = require('gulp-concat'); +const through = require('through2'); +const fsp = require('fs').promises; +const logger = require('gulplog'); +const path = require('path'); + +function getVarsFromCSS(css) { + let variableList = []; + let root = postcss.parse(css); + + root.walkRules((rule, ruleIndex) => { + rule.walkDecls((decl) => { + let matches = decl.value.match(/var\(.*?\)/g); + if (matches) { + matches.forEach(function (match) { + let varName = match.replace(/var\((--[\w-]+),?.*?\)/, '$1').trim(); + if (variableList.indexOf(varName) === -1) { + variableList.push(varName); + } + }); + } + }); + }); + return variableList; +} + +function getVarValues(css) { + let root = postcss.parse(css); + let variables = {}; + + root.walkRules((rule, ruleIndex) => { + rule.walkDecls((decl) => { + variables[decl.prop] = decl.value; + }); + }); + + return variables; +} + +function getClassNames(contents, pkgName) { + let classNames = []; + + if (classNames.length === 0) { + logger.error(`Could not find classNames for ${pkgName}, assuming no classNames`); + classNames.push(''); + } + + logger.debug(`Found classNames ${classNames.join(', ')} for ${pkgName}`); + + return classNames; +} + +function resolveValue(value, vars) { + if (value) { + let match = value.match(/var\((.+),?.*?\)/); + if (match) { + return match[1]; + } + return value; + } +} + +const varDir = path.join(path.dirname(require.resolve('@spectrum-css/vars')), '..'); + +async function readDNAVariables(file) { + let css = await fsp.readFile(path.join(varDir, 'css', file)); + let vars = getVarValues(css); + return vars; +} + +function getVariableDeclarations(classNames, vars) { + let varNames = Object.keys(vars); + if (varNames.length) { + return ` +${classNames.map((className) => `${className}`).join(',\n')} { +${varNames.map((varName) => ` ${varName}: ${vars[varName]};`).join('\n')} +} +`; + } + + return ''; +} + +function getAllVars() { + return new Promise((resolve, reject) => { + let variableList; + + gulp.src([ + `${varDir}/css/themes/*.css`, + `${varDir}/css/scales/*.css`, + `${varDir}/css/components/*.css`, + `${varDir}/css/globals/*.css` + ]) + .pipe(concat('everything.css')) + .pipe(through.obj(function getAllVars(file, enc, cb) { + variableList = getVarValues(file.contents.toString()); + + cb(null, file); + })) + .on('finish', () => { + resolve(variableList); + }) + .on('error', reject); + }); +} + +function getAllComponentVars() { + return new Promise((resolve, reject) => { + let variableList; + + gulp.src([ + `${varDir}/css/components/*.css`, + `${varDir}/css/globals/*.css` + ]) + .pipe(concat('everything.css')) + .pipe(through.obj(function getAllVars(file, enc, cb) { + variableList = getVarValues(file.contents.toString()); + + cb(null, file); + })) + .on('finish', () => { + resolve(variableList); + }) + .on('error', reject); + }); +} + +exports.getAllComponentVars = getAllComponentVars; +exports.getAllVars = getAllVars; +exports.getVarsFromCSS = getVarsFromCSS; +exports.getVarValues = getVarValues; +exports.getClassNames = getClassNames; +exports.resolveValue = resolveValue; +exports.readDNAVariables = readDNAVariables; +exports.getVariableDeclarations = getVariableDeclarations; diff --git a/packages/@adobe/spectrum-css-builder-temp/css/plugins/postcss-custom-properties-mapping.js b/packages/@adobe/spectrum-css-builder-temp/css/plugins/postcss-custom-properties-mapping.js new file mode 100644 index 00000000000..e0db25489a7 --- /dev/null +++ b/packages/@adobe/spectrum-css-builder-temp/css/plugins/postcss-custom-properties-mapping.js @@ -0,0 +1,75 @@ +/* +Copyright 2019 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. +*/ +var valueParser = require('postcss-value-parser'); +let varUtils = require('../lib/varUtils.js'); + +// match custom property inclusions +const customPropertiesRegExp = /(^|[^\w-])var\([\W\w]+\)/; + +let staticVars; +let allVars; +async function fetchVars() { + if (staticVars && allVars) { + return true; + } + + // Read in all static vars + staticVars = Object.assign( + {}, + await varUtils.readDNAVariables('globals/spectrum-staticAliases.css'), + await varUtils.readDNAVariables('globals/spectrum-fontGlobals.css'), + await varUtils.readDNAVariables('globals/spectrum-fontGlobals.css'), + await varUtils.readDNAVariables('globals/spectrum-dimensionGlobals.css'), + await varUtils.readDNAVariables('globals/spectrum-colorGlobals.css'), + await varUtils.readDNAVariables('globals/spectrum-animationGlobals.css') + ); + + // Read in all variables so we have the value they resolve to + allVars = await varUtils.getAllComponentVars(); + + return true; +} + +let fetchVarsPromise; +module.exports = function () { + return { + postcssPlugin: 'postcss-custom-properties-mapping', + OnceExit: async function (root, result) { + fetchVarsPromise ??= fetchVars(); + await fetchVarsPromise; + + root.walkRules((rule, ruleIndex) => { + rule.walkDecls((decl) => { + if (customPropertiesRegExp.test(decl.value)) { + let value = valueParser(decl.value); + + value.walk((node, index, nodes) => { + if (node.type === 'function' && node.value === 'var') { + let v = node.nodes[0].value; + + // If the value is static, replace the variable with the value. + // Otherwise, change the variable name to the mapped name. + if (staticVars[v]) { + nodes.splice(index, 1, ...valueParser(`var(${v}, ${staticVars[v]})`).nodes); + } else if (allVars[v]) { + nodes.splice(index, 1, ...valueParser(`var(${v}, ${allVars[v]})`).nodes); + } + } + }); + + decl.value = value.toString(); + } + }); + }); + } + }; +}; diff --git a/packages/@adobe/spectrum-css-builder-temp/css/plugins/postcss-custom-properties-passthrough.js b/packages/@adobe/spectrum-css-builder-temp/css/plugins/postcss-custom-properties-passthrough.js new file mode 100644 index 00000000000..5287299a575 --- /dev/null +++ b/packages/@adobe/spectrum-css-builder-temp/css/plugins/postcss-custom-properties-passthrough.js @@ -0,0 +1,28 @@ +/* +Copyright 2019 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. +*/ + +module.exports = function (opts) { + opts = opts || {}; + + return function (root, result) { + root.walkRules((rule, ruleIndex) => { + rule.walkDecls((decl) => { + if (decl.value.match('xvar(.*?)')) { + decl.value = decl.value.substr(1); + } + if (decl.prop.substr(0, 3) === 'x--') { + decl.prop = decl.prop.substr(1); + } + }); + }); + }; +}; diff --git a/packages/@adobe/spectrum-css-builder-temp/css/processors.js b/packages/@adobe/spectrum-css-builder-temp/css/processors.js new file mode 100644 index 00000000000..2a6eb43c03e --- /dev/null +++ b/packages/@adobe/spectrum-css-builder-temp/css/processors.js @@ -0,0 +1,132 @@ +/* +Copyright 2019 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. +*/ + +function getProcessors(keepVars = false, notNested = true, secondNotNested = true) { + return [ + require('postcss-import'), + // require('postcss-mixins')({ + // mixins: { + // typography: function(mixin, name, tokenName, textTransformIgnore) { + // if(!tokenName) { + // tokenName = name.replace(/\.?([A-Z]|[0-9])/g, function (x,y) { return '-' + y.toLowerCase(); }).replace(/^-/, ''); + // tokenName = tokenName.replace('.spectrum--', ''); + // } + // var output = ''; + // var propMap = { + // 'font-size': 'text-size', + // 'font-weight': 'text-font-weight', + // 'line-height': 'text-line-height', + // 'font-style': 'text-font-style', + // 'letter-spacing': 'text-letter-spacing', + // 'text-transform': 'text-transform', + // }; + // function buildProperties (tokeString) { + // var ruleString = ''; + // Object.keys(propMap).forEach((key) => { + // if(!textTransformIgnore || key != 'text-transform') { + // ruleString += ` ${key}: var(--spectrum-${tokeString}-${propMap[key]});\n`; + // } + // }); + // ruleString += ' margin-top: 0;\n margin-bottom: 0;\n'; + // return ruleString; + // } + // output = `${name} { + // ${buildProperties(tokenName)} + // em { + // ${buildProperties(`${tokenName}-emphasis`)} + // } + // strong { + // ${buildProperties(`${tokenName}-strong`)} + // } + // }`; + // var nodes = postcssReal.parse(output); + // nodes.nodes[0].append(mixin.nodes); + // mixin.replaceWith(nodes); + // }, + // typographyColor: function(mixin, name, tokenName) { + // if(!tokenName) { + // tokenName = name.replace(/\.?([A-Z]|[0-9])/g, function (x,y) { return '-' + y.toLowerCase(); }).replace(/^-/, ''); + // tokenName = tokenName.replace('.spectrum--', ''); + // } + // var output = `${name} { + // color: var(--spectrum-${tokenName}-text-color); + // }`; + // var nodes = postcssReal.parse(output); + // nodes.nodes[0].append(mixin.nodes); + // mixin.replaceWith(nodes); + // }, + // typographyMargins: function(mixin, name, tokenName) { + // if(!tokenName) { + // tokenName = name.replace(/\.?([A-Z]|[0-9])/g, function (x,y) { return '-' + y.toLowerCase(); }).replace(/^-/, ''); + // tokenName = tokenName.replace('.spectrum--', ''); + // } + // var output = `${name} { + // margin-top: var(--spectrum-${tokenName}-margin-top); + // margin-bottom: var(--spectrum-${tokenName}-margin-bottom); + // }`; + // var nodes = postcssReal.parse(output); + // nodes.nodes[0].append(mixin.nodes); + // mixin.replaceWith(nodes); + // }, + // } + // }), + // require('postcss-nested'), + // require('postcss-inherit'), + require('postcss-custom-properties')({ + noValueNotifications: 'error', + warnings: !keepVars, + preserve: false + }), + require('./plugins/postcss-custom-properties-passthrough')(), + // require('postcss-calc'), + keepVars ? require('./plugins/postcss-custom-properties-mapping')() : null, + { + postcssPlugin: 'postcss-remove-root', + OnceExit(root) { + root.walkRules(rule => { + if (rule.selector === ':root') { + rule.remove(); + } + }); + } + } + // notNested ? require('./plugins/postcss-notnested')({ replace: '.spectrum' }) : null, + // require('postcss-svg'), + // require('postcss-functions')({ + // functions: { + // noscale: function(value) { + // return value.toString().toUpperCase(); + // }, + // percent: function(value) { + // return parseInt(value, 10) / 100; + // } + // } + // }), + // require('./plugins/postcss-strip-comments')({ preserveTopdoc: false }), + // require('postcss-focus-ring'), + // secondNotNested ? require('./plugins/postcss-notnested')() : null, // Second one to catch all stray & + // require('postcss-discard-empty'), + // require('autoprefixer')({ + // 'browsers': [ + // 'IE >= 10', + // 'last 2 Chrome versions', + // 'last 2 Firefox versions', + // 'last 2 Safari versions', + // 'last 2 iOS versions' + // ] + // }) + ].filter(Boolean); +} + +exports.getProcessors = getProcessors; +exports.processors = getProcessors(true); +exports.legacyProcessors = getProcessors(); diff --git a/packages/@adobe/spectrum-css-builder-temp/package.json b/packages/@adobe/spectrum-css-builder-temp/package.json new file mode 100644 index 00000000000..2b70736000a --- /dev/null +++ b/packages/@adobe/spectrum-css-builder-temp/package.json @@ -0,0 +1,29 @@ +{ + "name": "@spectrum-css/component-builder", + "private": true, + "version": "1.0.1", + "description": "The Spectrum CSS component builder", + "repository": { + "type": "git", + "url": "https://github.com/adobe/react-spectrum" + }, + "bugs": { + "url": "https://github.com/adobe/spectrum-css/issues" + }, + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0", + "gulp": "^5.0.0", + "gulp-concat": "^2.6.1", + "gulplog": "^1.0.0", + "postcss": "^5.2.18", + "postcss-custom-properties": "^6.0.1", + "postcss-import": "^10.0.0", + "postcss-value-parser": "3.3.1", + "through2": "^3.0.1" + }, + "rsp": { + "type": "cli" + }, + "gitHead": "9b1c059b9e3c769334f8c6880e4a6a041fde1227" +} diff --git a/packages/@adobe/spectrum-css-temp/components/accordion/index.css b/packages/@adobe/spectrum-css-temp/components/accordion/index.css index 32998c7b2c2..0cb9391fa72 100644 --- a/packages/@adobe/spectrum-css-temp/components/accordion/index.css +++ b/packages/@adobe/spectrum-css-temp/components/accordion/index.css @@ -33,11 +33,13 @@ governing permissions and limitations under the License. .spectrum-Accordion-itemIndicator { display: block; + flex-shrink: 0; padding-inline-start: var(--spectrum-accordion-icon-gap); padding-inline-end: var(--spectrum-accordion-icon-gap); transition: transform ease var(--spectrum-global-animation-duration-100); + box-sizing: content-box; } .spectrum-Accordion-item { @@ -122,8 +124,6 @@ governing permissions and limitations under the License. > .spectrum-Accordion-itemHeading { > .spectrum-Accordion-itemHeader { > .spectrum-Accordion-itemIndicator { - box-sizing: content-box; - [dir='ltr'] & { transform: rotate(90deg); } diff --git a/packages/@adobe/spectrum-css-temp/components/actiongroup/index.css b/packages/@adobe/spectrum-css-temp/components/actiongroup/index.css index 77bb67e1fae..2e9a3e81f13 100644 --- a/packages/@adobe/spectrum-css-temp/components/actiongroup/index.css +++ b/packages/@adobe/spectrum-css-temp/components/actiongroup/index.css @@ -49,10 +49,10 @@ governing permissions and limitations under the License. .spectrum-ActionGroup-item { flex-shrink: 0; + } - &.spectrum-ActionGroup-item--iconOnly { - padding-inline-end: var(--spectrum-actionbutton-icon-padding-x); - } + .spectrum-ActionGroup-item--iconOnly { + padding-inline-end: var(--spectrum-actionbutton-icon-padding-x); } &:focus { diff --git a/packages/@adobe/spectrum-css-temp/components/button/index.css b/packages/@adobe/spectrum-css-temp/components/button/index.css index 806ead8e29d..f37fcb3db20 100644 --- a/packages/@adobe/spectrum-css-temp/components/button/index.css +++ b/packages/@adobe/spectrum-css-temp/components/button/index.css @@ -372,6 +372,28 @@ a.spectrum-ActionButton { margin-block: 0; margin-inline: auto; } + + &.spectrum-ClearButton--inset.spectrum-ClearButton--inset { + transition: unset; + box-sizing: border-box; + &:after { + transition: unset; + height: calc(100% - 2px); + aspect-ratio: 1; + top: 50%; + left: 50%; + right: unset; + bottom: unset; + margin: 0; + transform: translate(-50%, -50%); + } + + &:focus-visible { + &:after { + box-shadow: inset 0 0 0 var(--spectrum-focus-ring-size) var(--spectrum-focus-ring-color); + } + } + } } @media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { diff --git a/packages/@adobe/spectrum-css-temp/components/checkbox/index.css b/packages/@adobe/spectrum-css-temp/components/checkbox/index.css index 02c42cf2d51..6ddb49f5dbc 100644 --- a/packages/@adobe/spectrum-css-temp/components/checkbox/index.css +++ b/packages/@adobe/spectrum-css-temp/components/checkbox/index.css @@ -67,6 +67,8 @@ governing permissions and limitations under the License. opacity: .0001; z-index: 1; + /* prevent double click event due to browser waiting to fire double tap */ + touch-action: manipulation; cursor: default; &:disabled { diff --git a/packages/@adobe/spectrum-css-temp/components/inputgroup/skin.css b/packages/@adobe/spectrum-css-temp/components/inputgroup/skin.css index 615e6c43b90..a70b351677e 100644 --- a/packages/@adobe/spectrum-css-temp/components/inputgroup/skin.css +++ b/packages/@adobe/spectrum-css-temp/components/inputgroup/skin.css @@ -20,6 +20,10 @@ governing permissions and limitations under the License. } } + .spectrum-InputGroup-input:focus { + border-color: var(--spectrum-textfield-border-color); + } + &.is-focused { &:not(.spectrum-InputGroup--invalid):not(.is-disabled) { .spectrum-InputGroup-input { @@ -48,7 +52,8 @@ governing permissions and limitations under the License. &.spectrum-InputGroup--invalid { .spectrum-FieldButton:before, - .spectrum-InputGroup-input { + .spectrum-InputGroup-input, + .spectrum-InputGroup-input:focus { border-color: var(--spectrum-textfield-border-color-error); } diff --git a/packages/@adobe/spectrum-css-temp/components/menu/index.css b/packages/@adobe/spectrum-css-temp/components/menu/index.css index d15fbdbb353..728b5d0908a 100644 --- a/packages/@adobe/spectrum-css-temp/components/menu/index.css +++ b/packages/@adobe/spectrum-css-temp/components/menu/index.css @@ -222,6 +222,7 @@ governing permissions and limitations under the License. justify-self: end; align-self: flex-start; padding-inline-start: var(--spectrum-global-dimension-size-250); + box-sizing: content-box; } .spectrum-Menu-icon { grid-area: icon; @@ -248,6 +249,7 @@ governing permissions and limitations under the License. /* keyboard shortcuts are always ASCII, so use base font */ font-family: var(--spectrum-font-family-base); unicode-bidi: plaintext; + text-align: end; } .spectrum-Menu-chevron { diff --git a/packages/@adobe/spectrum-css-temp/components/tabs/index.css b/packages/@adobe/spectrum-css-temp/components/tabs/index.css index 82a2bbf243a..ca3fbe2772f 100644 --- a/packages/@adobe/spectrum-css-temp/components/tabs/index.css +++ b/packages/@adobe/spectrum-css-temp/components/tabs/index.css @@ -91,12 +91,11 @@ governing permissions and limitations under the License. &::before { content: ''; position: absolute; - top: 50%; + top: 0; + bottom: 0; box-sizing: border-box; - block-size: var(--spectrum-tabs-focus-ring-height); - margin-block-start: calc(calc(var(--spectrum-tabs-focus-ring-height) / -2) + calc(var(--spectrum-tabs-rule-height) / 2)); inset-inline-start: calc(var(--spectrum-tabs-focus-ring-padding-x) * -1); inset-inline-end: calc(var(--spectrum-tabs-focus-ring-padding-x) * -1); border: var(--spectrum-tabs-focus-ring-size) solid transparent; @@ -163,6 +162,13 @@ governing permissions and limitations under the License. & + *:not(.spectrum-Tabs-selectionIndicator) { margin-inline-start: var(--spectrum-tabs-item-gap); } + + &::before { + top: 50%; + bottom: unset; + block-size: var(--spectrum-tabs-focus-ring-height); + margin-block-start: calc(calc(var(--spectrum-tabs-focus-ring-height) / -2) + calc(var(--spectrum-tabs-rule-height) / 2)); + } } .spectrum-Tabs-selectionIndicator { @@ -234,10 +240,22 @@ governing permissions and limitations under the License. /* padding is included in click area of tab items, so only need to offset by the size of the focus ring's border */ inset-inline-start: calc(var(--spectrum-tabs-focus-ring-size) * -1); inset-inline-end: calc(var(--spectrum-tabs-focus-ring-size) * -1); - margin-block-start: calc(calc(var(--spectrum-tabs-focus-ring-height) / -2)); } } + /* + Allow tab labels to wrap when TabList component has minWidth set. + */ + &.spectrum-Tabs--verticalWrap:not(.spectrum-Tabs--compact) .spectrum-Tabs-item { + display: flex; + align-items: center; + white-space: normal; + line-height: normal; + word-break: break-word; + block-size: auto; + min-height: var(--spectrum-tabs-vertical-item-height); + } + &.spectrum-Tabs--compact { .spectrum-Tabs-item { block-size: var(--spectrum-tabs-compact-vertical-item-height); diff --git a/packages/@adobe/spectrum-css-temp/components/tags/index.css b/packages/@adobe/spectrum-css-temp/components/tags/index.css index 53a3b4e7cbf..119df457163 100644 --- a/packages/@adobe/spectrum-css-temp/components/tags/index.css +++ b/packages/@adobe/spectrum-css-temp/components/tags/index.css @@ -46,6 +46,7 @@ governing permissions and limitations under the License. display: inline-grid; align-items: center; + vertical-align: middle; box-sizing: border-box; position: relative; cursor: default; diff --git a/packages/@adobe/spectrum-css-temp/components/toggle/index.css b/packages/@adobe/spectrum-css-temp/components/toggle/index.css index 8fadf85ab5c..56df130e29b 100644 --- a/packages/@adobe/spectrum-css-temp/components/toggle/index.css +++ b/packages/@adobe/spectrum-css-temp/components/toggle/index.css @@ -56,6 +56,8 @@ governing permissions and limitations under the License. opacity: .0001; z-index: 1; + /* prevent double click event due to browser waiting to fire double tap */ + touch-action: manipulation; cursor: default; &:checked + .spectrum-ToggleSwitch-switch { diff --git a/packages/@internationalized/date/docs/Calendar.mdx b/packages/@internationalized/date/docs/Calendar.mdx index 6e213c3575a..3344ba9d710 100644 --- a/packages/@internationalized/date/docs/Calendar.mdx +++ b/packages/@internationalized/date/docs/Calendar.mdx @@ -226,3 +226,69 @@ function createCalendar(identifier) { ## Interface + +## Custom calendars + +You can create your own custom calendar system by implementing the `Calendar` interface shown above. This enables calendars that follow custom business rules. An example would be a fiscal year calendar that follows a [4-5-4 format](https://nrf.com/resources/4-5-4-calendar), where month ranges don't follow the usual Gregorian calendar. + +To implement a calendar, either extend an existing implementation (e.g. `GregorianCalendar`) or implement the `Calendar` interface from scratch. The most important methods are `fromJulianDay` and `toJulianDay`, which convert between the calendar's year/month/day numbering system and a [Julian Day Number](https://en.wikipedia.org/wiki/Julian_day). This allows converting dates between calendar systems. Other methods such as `getDaysInMonth` and `getMonthsInYear` can be implemented to define how dates are organized in your calendar system. + +The following code is an example of how you might implement a custom 4-5-4 calendar (though implementing a true 4-5-4 calendar would be more nuanced than this). + +```tsx +import type {AnyCalendarDate, Calendar} from '@internationalized/date'; +import {CalendarDate, GregorianCalendar, startOfWeek} from '@internationalized/date'; + +const weekPattern = [4, 5, 4, 4, 5, 4, 4, 5, 4, 4, 5, 4]; + +class Custom454 extends GregorianCalendar { + // Months always have either 4 or 5 full weeks. + getDaysInMonth(date) { + return weekPattern[date.month - 1] * 7; + } + + // Enable conversion between calendar systems. + fromJulianDay(jd: number): CalendarDate { + let gregorian = super.fromJulianDay(jd); + + // Start from the beginning of the first week of the gregorian year + // and add weeks until we find the month. + let monthStart = startOfWeek(new CalendarDate(gregorian.year, 1, 1), 'en'); + for (let months = 0; months < weekPattern.length; months++) { + let weeksInMonth = weekPattern[months]; + let monthEnd = monthStart.add({weeks: weeksInMonth}); + if (monthEnd.compare(gregorian) > 0) { + let days = gregorian.compare(monthStart); + return new CalendarDate(this, monthStart.year, months + 1, days + 1); + } + monthStart = monthEnd; + } + + throw Error('Date is not in any month somehow!'); + } + + toJulianDay(date: AnyCalendarDate): number { + let monthStart = startOfWeek(new CalendarDate(date.year, 1, 1), 'en'); + for (let month = 1; month < date.month; month++) { + monthStart = monthStart.add({weeks: weekPattern[month - 1]}); + } + + let gregorian = monthStart.add({days: date.day - 1}); + return super.toJulianDay(gregorian); + } + + isEqual(other: Calendar) { + return other instanceof Custom454; + } +} +``` + +This enables dates to be converted between calendar systems. + +```tsx +import {GregorianCalendar, toCalendar} from '@internationalized/date'; + +let date = new CalendarDate(new Custom454(), 2024, 2, 1); +let gregorianDate = toCalendar(date, new GregorianCalendar()); +// => new CalendarDate(new GregorianCalendar(), 2024, 1, 29); +``` diff --git a/packages/@internationalized/date/docs/CalendarDate.mdx b/packages/@internationalized/date/docs/CalendarDate.mdx index dea35217c58..a14440ba735 100644 --- a/packages/@internationalized/date/docs/CalendarDate.mdx +++ b/packages/@internationalized/date/docs/CalendarDate.mdx @@ -72,7 +72,7 @@ date.toString(); // '2022-02-03' By default, `CalendarDate` uses the Gregorian calendar system, but many other calendar systems that are used around the world are supported, such as Hebrew, Indian, Islamic, Buddhist, Ethiopic, and more. A instance can be passed to the `CalendarDate` constructor to represent dates in that calendar system. -This example creates a date in the Buddhist calendar system, which is equivalent to April 4th, 2020 in the Gregorian calendar. +This example creates a date in the Buddhist calendar system, which is equivalent to April 30th, 2020 in the Gregorian calendar. ```tsx import {BuddhistCalendar} from '@internationalized/date'; @@ -86,7 +86,7 @@ See the [Calendar](Calendar.html#implementations) docs for details about the sup Many calendar systems have only one era, or a modern era and a pre-modern era (e.g. AD and BC in the Gregorian calendar). However, other calendar systems may have many eras. For example, the Japanese calendar has eras for the reign of each Emperor. `CalendarDate` represents eras using string identifiers, which can be passed as an additional parameter to the constructor before the year. When eras are present, years are numbered starting from 1 within the era. -This example creates a date in the Japanese calendar system, which is equivalent to April 4th, 2020 in the Gregorian calendar. +This example creates a date in the Japanese calendar system, which is equivalent to April 30th, 2019 in the Gregorian calendar. ```tsx import {JapaneseCalendar} from '@internationalized/date'; @@ -315,6 +315,12 @@ startOfWeek(date, 'en-US'); // 2022-01-30 startOfWeek(date, 'fr-FR'); // 2022-01-31 ``` +You can also provide an optional `firstDayOfWeek` argument to override the default first day of the week determined by the locale. It accepts a week day abbreviation, e.g. `sun`, `mon`, `tue`, etc. + +```tsx +startOfWeek(date, 'en-US', 'mon'); // 2022-01-31 +``` + ### Day of week The function returns the day of the week for the given date and locale. Days are numbered from zero to six, where zero is the first day of the week in the given locale. For example, in the United States, the first day of the week is Sunday, but in France it is Monday. @@ -328,6 +334,12 @@ getDayOfWeek(date, 'en-US'); // 0 getDayOfWeek(date, 'fr-FR'); // 6 ``` +You can also provide an optional `firstDayOfWeek` argument to override the default first day of the week determined by the locale. It accepts a week day abbreviation, e.g. `sun`, `mon`, `tue`, etc. + +```tsx +getDayOfWeek(date, 'en-US', 'mon'); // 6 +``` + ### Weekdays and weekends The and functions can be used to determine if a date is weekday or weekend respectively. This depends on the locale. For example, in the United States, weekends are Saturday and Sunday, but in Israel they are Friday and Saturday. @@ -356,3 +368,9 @@ let date = new CalendarDate(2021, 1, 1); getWeeksInMonth(date, 'en-US'); // 6 getWeeksInMonth(date, 'fr-FR'); // 5 ``` + +You can also provide an optional `firstDayOfWeek` argument to override the default first day of the week determined by the locale. It accepts a week day abbreviation, e.g. `sun`, `mon`, `tue`, etc. + +```tsx +getWeeksInMonth(date, 'en-US', 'mon'); // 5 +``` diff --git a/packages/@internationalized/date/docs/CalendarDateTime.mdx b/packages/@internationalized/date/docs/CalendarDateTime.mdx index 946e126cef6..3796777ed49 100644 --- a/packages/@internationalized/date/docs/CalendarDateTime.mdx +++ b/packages/@internationalized/date/docs/CalendarDateTime.mdx @@ -367,6 +367,12 @@ startOfWeek(date, 'en-US'); // 2022-01-30T09:45 startOfWeek(date, 'fr-FR'); // 2022-01-31T09:45 ``` +You can also provide an optional `firstDayOfWeek` argument to override the default first day of the week determined by the locale. It accepts a week day abbreviation, e.g. `sun`, `mon`, `tue`, etc. + +```tsx +startOfWeek(date, 'en-US', 'mon'); // 2022-01-31T09:45 +``` + ### Day of week The function returns the day of the week for the given date and locale. Days are numbered from zero to six, where zero is the first day of the week in the given locale. For example, in the United States, the first day of the week is Sunday, but in France it is Monday. @@ -380,6 +386,12 @@ getDayOfWeek(date, 'en-US'); // 0 getDayOfWeek(date, 'fr-FR'); // 6 ``` +You can also provide an optional `firstDayOfWeek` argument to override the default first day of the week determined by the locale. It accepts a week day abbreviation, e.g. `sun`, `mon`, `tue`, etc. + +```tsx +getDayOfWeek(date, 'en-US', 'mon'); // 6 +``` + ### Weekdays and weekends The and functions can be used to determine if a date is weekday or weekend respectively. This depends on the locale. For example, in the United States, weekends are Saturday and Sunday, but in Israel they are Friday and Saturday. @@ -408,3 +420,9 @@ let date = new CalendarDateTime(2021, 1, 1, 8, 30); getWeeksInMonth(date, 'en-US'); // 6 getWeeksInMonth(date, 'fr-FR'); // 5 ``` + +You can also provide an optional `firstDayOfWeek` argument to override the default first day of the week determined by the locale. It accepts a week day abbreviation, e.g. `sun`, `mon`, `tue`, etc. + +```tsx +getWeeksInMonth(date, 'en-US', 'mon'); // 5 +``` diff --git a/packages/@internationalized/date/docs/ZonedDateTime.mdx b/packages/@internationalized/date/docs/ZonedDateTime.mdx index 1bb2c0ef398..543f89db6dd 100644 --- a/packages/@internationalized/date/docs/ZonedDateTime.mdx +++ b/packages/@internationalized/date/docs/ZonedDateTime.mdx @@ -475,6 +475,12 @@ startOfWeek(date, 'en-US'); // 2022-01-30T09:45[America/Los_Angeles] startOfWeek(date, 'fr-FR'); // 2022-01-31T09:45[America/Los_Angeles] ``` +You can also provide an optional `firstDayOfWeek` argument to override the default first day of the week determined by the locale. It accepts a week day abbreviation, e.g. `sun`, `mon`, `tue`, etc. + +```tsx +startOfWeek(date, 'en-US', 'mon'); // 2022-01-31T09:45[America/Los_Angeles] +``` + ### Day of week The function returns the day of the week for the given date and locale. Days are numbered from zero to six, where zero is the first day of the week in the given locale. For example, in the United States, the first day of the week is Sunday, but in France it is Monday. @@ -488,6 +494,12 @@ getDayOfWeek(date, 'en-US'); // 0 getDayOfWeek(locale, 'fr-FR'); // 6 ``` +You can also provide an optional `firstDayOfWeek` argument to override the default first day of the week determined by the locale. It accepts a week day abbreviation, e.g. `sun`, `mon`, `tue`, etc. + +```tsx +getDayOfWeek(date, 'en-US', 'mon'); // 6 +``` + ### Weekdays and weekends The and functions can be used to determine if a date is weekday or weekend respectively. This depends on the locale. For example, in the United States, weekends are Saturday and Sunday, but in Israel they are Friday and Saturday. @@ -516,3 +528,9 @@ let date = parseZonedDateTime('2023-01-01T08:30[America/Los_Angeles]'); getWeeksInMonth(date, 'en-US'); // 5 getWeeksInMonth(date, 'fr-FR'); // 6 ``` + +You can also provide an optional `firstDayOfWeek` argument to override the default first day of the week determined by the locale. It accepts a week day abbreviation, e.g. `sun`, `mon`, `tue`, etc. + +```tsx +getWeeksInMonth(date, 'en-US', 'mon'); // 6 +``` diff --git a/packages/@internationalized/date/package.json b/packages/@internationalized/date/package.json index d6e2d68acfa..e1a4346954c 100644 --- a/packages/@internationalized/date/package.json +++ b/packages/@internationalized/date/package.json @@ -1,12 +1,16 @@ { "name": "@internationalized/date", - "version": "3.6.0", + "version": "3.8.2", "description": "Internationalized calendar, date, and time manipulation utilities", "license": "Apache-2.0", "main": "dist/main.js", "module": "dist/module.js", "exports": { - "types": "./dist/types.d.ts", + "source": "./src/index.ts", + "types": [ + "./dist/types.d.ts", + "./src/index.ts" + ], "import": "./dist/import.mjs", "require": "./dist/main.js" }, diff --git a/packages/@internationalized/date/src/CalendarDate.ts b/packages/@internationalized/date/src/CalendarDate.ts index 10b7ebe4e90..6eff9f68ee1 100644 --- a/packages/@internationalized/date/src/CalendarDate.ts +++ b/packages/@internationalized/date/src/CalendarDate.ts @@ -155,17 +155,17 @@ export class Time { } /** Returns a new `Time` with the given duration added to it. */ - add(duration: TimeDuration) { + add(duration: TimeDuration): Time { return addTime(this, duration); } /** Returns a new `Time` with the given duration subtracted from it. */ - subtract(duration: TimeDuration) { + subtract(duration: TimeDuration): Time { return subtractTime(this, duration); } /** Returns a new `Time` with the given fields set to the provided values. Other fields will be constrained accordingly. */ - set(fields: TimeFields) { + set(fields: TimeFields): Time { return setTime(this, fields); } @@ -173,17 +173,17 @@ export class Time { * Returns a new `Time` with the given field adjusted by a specified amount. * When the resulting value reaches the limits of the field, it wraps around. */ - cycle(field: TimeField, amount: number, options?: CycleTimeOptions) { + cycle(field: TimeField, amount: number, options?: CycleTimeOptions): Time { return cycleTime(this, field, amount, options); } /** Converts the time to an ISO 8601 formatted string. */ - toString() { + toString(): string { return timeToString(this); } /** Compares this time with another. A negative result indicates that this time is before the given one, and a positive time indicates that it is after. */ - compare(b: AnyTime) { + compare(b: AnyTime): number { return compareTime(this, b); } } @@ -361,17 +361,17 @@ export class ZonedDateTime { } /** Returns a new `ZonedDateTime` with the given duration added to it. */ - add(duration: DateTimeDuration) { + add(duration: DateTimeDuration): ZonedDateTime { return addZoned(this, duration); } /** Returns a new `ZonedDateTime` with the given duration subtracted from it. */ - subtract(duration: DateTimeDuration) { + subtract(duration: DateTimeDuration): ZonedDateTime { return subtractZoned(this, duration); } /** Returns a new `ZonedDateTime` with the given fields set to the provided values. Other fields will be constrained accordingly. */ - set(fields: DateFields & TimeFields, disambiguation?: Disambiguation) { + set(fields: DateFields & TimeFields, disambiguation?: Disambiguation): ZonedDateTime { return setZoned(this, fields, disambiguation); } @@ -379,27 +379,27 @@ export class ZonedDateTime { * Returns a new `ZonedDateTime` with the given field adjusted by a specified amount. * When the resulting value reaches the limits of the field, it wraps around. */ - cycle(field: DateField | TimeField, amount: number, options?: CycleTimeOptions) { + cycle(field: DateField | TimeField, amount: number, options?: CycleTimeOptions): ZonedDateTime { return cycleZoned(this, field, amount, options); } /** Converts the date to a native JavaScript Date object. */ - toDate() { + toDate(): Date { return zonedToDate(this); } /** Converts the date to an ISO 8601 formatted string, including the UTC offset and time zone identifier. */ - toString() { + toString(): string { return zonedDateTimeToString(this); } /** Converts the date to an ISO 8601 formatted string in UTC. */ - toAbsoluteString() { + toAbsoluteString(): string { return this.toDate().toISOString(); } /** Compares this date with another. A negative result indicates that this date is before the given one, and a positive date indicates that it is after. */ - compare(b: CalendarDate | CalendarDateTime | ZonedDateTime) { + compare(b: CalendarDate | CalendarDateTime | ZonedDateTime): number { // TODO: Is this a bad idea?? return this.toDate().getTime() - toZoned(b, this.timeZone).toDate().getTime(); } diff --git a/packages/@internationalized/date/src/calendars/BuddhistCalendar.ts b/packages/@internationalized/date/src/calendars/BuddhistCalendar.ts index b48bda29cc7..f60c8bf1b3d 100644 --- a/packages/@internationalized/date/src/calendars/BuddhistCalendar.ts +++ b/packages/@internationalized/date/src/calendars/BuddhistCalendar.ts @@ -13,7 +13,7 @@ // Portions of the code in this file are based on code from ICU. // Original licensing can be found in the NOTICE file in the root directory of this source tree. -import {AnyCalendarDate} from '../types'; +import {AnyCalendarDate, CalendarIdentifier} from '../types'; import {CalendarDate} from '../CalendarDate'; import {fromExtendedYear, getExtendedYear, GregorianCalendar} from './GregorianCalendar'; @@ -25,7 +25,7 @@ const BUDDHIST_ERA_START = -543; * era, identified as 'BE'. */ export class BuddhistCalendar extends GregorianCalendar { - identifier = 'buddhist'; + identifier: CalendarIdentifier = 'buddhist'; fromJulianDay(jd: number): CalendarDate { let gregorianDate = super.fromJulianDay(jd); @@ -38,11 +38,11 @@ export class BuddhistCalendar extends GregorianCalendar { ); } - toJulianDay(date: AnyCalendarDate) { + toJulianDay(date: AnyCalendarDate): number { return super.toJulianDay(toGregorian(date)); } - getEras() { + getEras(): string[] { return ['BE']; } @@ -50,7 +50,7 @@ export class BuddhistCalendar extends GregorianCalendar { return super.getDaysInMonth(toGregorian(date)); } - balanceDate() {} + balanceDate(): void {} } function toGregorian(date: AnyCalendarDate) { diff --git a/packages/@internationalized/date/src/calendars/EthiopicCalendar.ts b/packages/@internationalized/date/src/calendars/EthiopicCalendar.ts index 36bb17f9347..c96be3fb827 100644 --- a/packages/@internationalized/date/src/calendars/EthiopicCalendar.ts +++ b/packages/@internationalized/date/src/calendars/EthiopicCalendar.ts @@ -13,7 +13,7 @@ // Portions of the code in this file are based on code from ICU. // Original licensing can be found in the NOTICE file in the root directory of this source tree. -import {AnyCalendarDate, Calendar} from '../types'; +import {AnyCalendarDate, Calendar, CalendarIdentifier} from '../types'; import {CalendarDate} from '../CalendarDate'; import {Mutable} from '../utils'; @@ -66,7 +66,7 @@ function getDaysInMonth(year: number, month: number) { * on whether it is a leap year. Two eras are supported: 'AA' and 'AM'. */ export class EthiopicCalendar implements Calendar { - identifier = 'ethiopic'; + identifier: CalendarIdentifier = 'ethiopic'; fromJulianDay(jd: number): CalendarDate { let [year, month, day] = julianDayToCE(ETHIOPIC_EPOCH, jd); @@ -79,7 +79,7 @@ export class EthiopicCalendar implements Calendar { return new CalendarDate(this, era, year, month, day); } - toJulianDay(date: AnyCalendarDate) { + toJulianDay(date: AnyCalendarDate): number { let year = date.year; if (date.era === 'AA') { year -= AMETE_MIHRET_DELTA; @@ -107,7 +107,7 @@ export class EthiopicCalendar implements Calendar { return date.era === 'AA' ? 9999 : 9991; } - getEras() { + getEras(): string[] { return ['AA', 'AM']; } } @@ -117,7 +117,7 @@ export class EthiopicCalendar implements Calendar { * except years were measured from a different epoch. Only one era is supported: 'AA'. */ export class EthiopicAmeteAlemCalendar extends EthiopicCalendar { - identifier = 'ethioaa'; // also known as 'ethiopic-amete-alem' in ICU + identifier: CalendarIdentifier = 'ethioaa'; // also known as 'ethiopic-amete-alem' in ICU fromJulianDay(jd: number): CalendarDate { let [year, month, day] = julianDayToCE(ETHIOPIC_EPOCH, jd); @@ -125,7 +125,7 @@ export class EthiopicAmeteAlemCalendar extends EthiopicCalendar { return new CalendarDate(this, 'AA', year, month, day); } - getEras() { + getEras(): string[] { return ['AA']; } @@ -141,7 +141,7 @@ export class EthiopicAmeteAlemCalendar extends EthiopicCalendar { * on whether it is a leap year. Two eras are supported: 'BCE' and 'CE'. */ export class CopticCalendar extends EthiopicCalendar { - identifier = 'coptic'; + identifier: CalendarIdentifier = 'coptic'; fromJulianDay(jd: number): CalendarDate { let [year, month, day] = julianDayToCE(COPTIC_EPOCH, jd); @@ -154,7 +154,7 @@ export class CopticCalendar extends EthiopicCalendar { return new CalendarDate(this, era, year, month, day); } - toJulianDay(date: AnyCalendarDate) { + toJulianDay(date: AnyCalendarDate): number { let year = date.year; if (date.era === 'BCE') { year = 1 - year; @@ -176,14 +176,14 @@ export class CopticCalendar extends EthiopicCalendar { return date.era === 'BCE'; } - balanceDate(date: Mutable) { + balanceDate(date: Mutable): void { if (date.year <= 0) { date.era = date.era === 'BCE' ? 'CE' : 'BCE'; date.year = 1 - date.year; } } - getEras() { + getEras(): string[] { return ['BCE', 'CE']; } diff --git a/packages/@internationalized/date/src/calendars/GregorianCalendar.ts b/packages/@internationalized/date/src/calendars/GregorianCalendar.ts index 4bc5442e608..31106c379fe 100644 --- a/packages/@internationalized/date/src/calendars/GregorianCalendar.ts +++ b/packages/@internationalized/date/src/calendars/GregorianCalendar.ts @@ -13,7 +13,7 @@ // Portions of the code in this file are based on code from ICU. // Original licensing can be found in the NOTICE file in the root directory of this source tree. -import {AnyCalendarDate, Calendar} from '../types'; +import {AnyCalendarDate, Calendar, CalendarIdentifier} from '../types'; import {CalendarDate} from '../CalendarDate'; import {mod, Mutable} from '../utils'; @@ -68,7 +68,7 @@ const daysInMonth = { * Years always contain 12 months, and 365 or 366 days depending on whether it is a leap year. */ export class GregorianCalendar implements Calendar { - identifier = 'gregory'; + identifier: CalendarIdentifier = 'gregory'; fromJulianDay(jd: number): CalendarDate { let jd0 = jd; @@ -118,7 +118,7 @@ export class GregorianCalendar implements Calendar { return 9999; } - getEras() { + getEras(): string[] { return ['BC', 'AD']; } @@ -126,7 +126,7 @@ export class GregorianCalendar implements Calendar { return date.era === 'BC'; } - balanceDate(date: Mutable) { + balanceDate(date: Mutable): void { if (date.year <= 0) { date.era = date.era === 'BC' ? 'AD' : 'BC'; date.year = 1 - date.year; diff --git a/packages/@internationalized/date/src/calendars/HebrewCalendar.ts b/packages/@internationalized/date/src/calendars/HebrewCalendar.ts index 1d09d49a7cf..52d3f43bc2f 100644 --- a/packages/@internationalized/date/src/calendars/HebrewCalendar.ts +++ b/packages/@internationalized/date/src/calendars/HebrewCalendar.ts @@ -13,7 +13,7 @@ // Portions of the code in this file are based on code from ICU. // Original licensing can be found in the NOTICE file in the root directory of this source tree. -import {AnyCalendarDate, Calendar} from '../types'; +import {AnyCalendarDate, Calendar, CalendarIdentifier} from '../types'; import {CalendarDate} from '../CalendarDate'; import {mod, Mutable} from '../utils'; @@ -128,7 +128,7 @@ function getDaysInMonth(year: number, month: number): number { * In leap years, an extra month is inserted at month 6. */ export class HebrewCalendar implements Calendar { - identifier = 'hebrew'; + identifier: CalendarIdentifier = 'hebrew'; fromJulianDay(jd: number): CalendarDate { let d = jd - HEBREW_EPOCH; @@ -159,7 +159,7 @@ export class HebrewCalendar implements Calendar { return new CalendarDate(this, year, month, day); } - toJulianDay(date: AnyCalendarDate) { + toJulianDay(date: AnyCalendarDate): number { let jd = startOfYear(date.year); for (let month = 1; month < date.month; month++) { jd += getDaysInMonth(date.year, month); @@ -185,11 +185,11 @@ export class HebrewCalendar implements Calendar { return 9999; } - getEras() { + getEras(): string[] { return ['AM']; } - balanceYearMonth(date: Mutable, previousDate: AnyCalendarDate) { + balanceYearMonth(date: Mutable, previousDate: AnyCalendarDate): void { // Keep date in the same month when switching between leap years and non leap years if (previousDate.year !== date.year) { if (isLeapYear(previousDate.year) && !isLeapYear(date.year) && previousDate.month > 6) { diff --git a/packages/@internationalized/date/src/calendars/IndianCalendar.ts b/packages/@internationalized/date/src/calendars/IndianCalendar.ts index a598ca224d0..1fcde23f8a7 100644 --- a/packages/@internationalized/date/src/calendars/IndianCalendar.ts +++ b/packages/@internationalized/date/src/calendars/IndianCalendar.ts @@ -13,7 +13,7 @@ // Portions of the code in this file are based on code from ICU. // Original licensing can be found in the NOTICE file in the root directory of this source tree. -import {AnyCalendarDate} from '../types'; +import {AnyCalendarDate, CalendarIdentifier} from '../types'; import {CalendarDate} from '../CalendarDate'; import {fromExtendedYear, GregorianCalendar, gregorianToJulianDay, isLeapYear} from './GregorianCalendar'; @@ -29,7 +29,7 @@ const INDIAN_YEAR_START = 80; * in each year, with either 30 or 31 days. Only one era identifier is supported: 'saka'. */ export class IndianCalendar extends GregorianCalendar { - identifier = 'indian'; + identifier: CalendarIdentifier = 'indian'; fromJulianDay(jd: number): CalendarDate { // Gregorian date for Julian day @@ -75,7 +75,7 @@ export class IndianCalendar extends GregorianCalendar { return new CalendarDate(this, indianYear, indianMonth, indianDay); } - toJulianDay(date: AnyCalendarDate) { + toJulianDay(date: AnyCalendarDate): number { let extendedYear = date.year + INDIAN_ERA_START; let [era, year] = fromExtendedYear(extendedYear); @@ -121,9 +121,9 @@ export class IndianCalendar extends GregorianCalendar { return 9919; } - getEras() { + getEras(): string[] { return ['saka']; } - balanceDate() {} + balanceDate(): void {} } diff --git a/packages/@internationalized/date/src/calendars/IslamicCalendar.ts b/packages/@internationalized/date/src/calendars/IslamicCalendar.ts index 22ae9604d02..7696e852224 100644 --- a/packages/@internationalized/date/src/calendars/IslamicCalendar.ts +++ b/packages/@internationalized/date/src/calendars/IslamicCalendar.ts @@ -13,7 +13,7 @@ // Portions of the code in this file are based on code from ICU. // Original licensing can be found in the NOTICE file in the root directory of this source tree. -import {AnyCalendarDate, Calendar} from '../types'; +import {AnyCalendarDate, Calendar, CalendarIdentifier} from '../types'; import {CalendarDate} from '../CalendarDate'; const CIVIL_EPOC = 1948440; // CE 622 July 16 Friday (Julian calendar) / CE 622 July 19 (Gregorian calendar) @@ -50,13 +50,13 @@ function isLeapYear(year: number): boolean { * Learn more about the available Islamic calendars [here](https://cldr.unicode.org/development/development-process/design-proposals/islamic-calendar-types). */ export class IslamicCivilCalendar implements Calendar { - identifier = 'islamic-civil'; + identifier: CalendarIdentifier = 'islamic-civil'; fromJulianDay(jd: number): CalendarDate { return julianDayToIslamic(this, CIVIL_EPOC, jd); } - toJulianDay(date: AnyCalendarDate) { + toJulianDay(date: AnyCalendarDate): number { return islamicToJulianDay(CIVIL_EPOC, date.year, date.month, date.day); } @@ -82,7 +82,7 @@ export class IslamicCivilCalendar implements Calendar { return 9665; } - getEras() { + getEras(): string[] { return ['AH']; } } @@ -95,13 +95,13 @@ export class IslamicCivilCalendar implements Calendar { * Learn more about the available Islamic calendars [here](https://cldr.unicode.org/development/development-process/design-proposals/islamic-calendar-types). */ export class IslamicTabularCalendar extends IslamicCivilCalendar { - identifier = 'islamic-tbla'; + identifier: CalendarIdentifier = 'islamic-tbla'; fromJulianDay(jd: number): CalendarDate { return julianDayToIslamic(this, ASTRONOMICAL_EPOC, jd); } - toJulianDay(date: AnyCalendarDate) { + toJulianDay(date: AnyCalendarDate): number { return islamicToJulianDay(ASTRONOMICAL_EPOC, date.year, date.month, date.day); } } @@ -145,7 +145,7 @@ function umalquraYearLength(year: number): number { * Learn more about the available Islamic calendars [here](https://cldr.unicode.org/development/development-process/design-proposals/islamic-calendar-types). */ export class IslamicUmalquraCalendar extends IslamicCivilCalendar { - identifier = 'islamic-umalqura'; + identifier: CalendarIdentifier = 'islamic-umalqura'; constructor() { super(); diff --git a/packages/@internationalized/date/src/calendars/JapaneseCalendar.ts b/packages/@internationalized/date/src/calendars/JapaneseCalendar.ts index da0d6abedad..ce83110bc7d 100644 --- a/packages/@internationalized/date/src/calendars/JapaneseCalendar.ts +++ b/packages/@internationalized/date/src/calendars/JapaneseCalendar.ts @@ -13,7 +13,7 @@ // Portions of the code in this file are based on code from the TC39 Temporal proposal. // Original licensing can be found in the NOTICE file in the root directory of this source tree. -import {AnyCalendarDate} from '../types'; +import {AnyCalendarDate, CalendarIdentifier} from '../types'; import {CalendarDate} from '../CalendarDate'; import {GregorianCalendar} from './GregorianCalendar'; import {Mutable} from '../utils'; @@ -70,7 +70,7 @@ function toGregorian(date: AnyCalendarDate) { * Note that eras before 1868 (Gregorian) are not currently supported by this implementation. */ export class JapaneseCalendar extends GregorianCalendar { - identifier = 'japanese'; + identifier: CalendarIdentifier = 'japanese'; fromJulianDay(jd: number): CalendarDate { let date = super.fromJulianDay(jd); @@ -85,11 +85,11 @@ export class JapaneseCalendar extends GregorianCalendar { ); } - toJulianDay(date: AnyCalendarDate) { + toJulianDay(date: AnyCalendarDate): number { return super.toJulianDay(toGregorian(date)); } - balanceDate(date: Mutable) { + balanceDate(date: Mutable): void { let gregorianDate = toGregorian(date); let era = findEraFromGregorianDate(gregorianDate); @@ -102,7 +102,7 @@ export class JapaneseCalendar extends GregorianCalendar { this.constrainDate(date); } - constrainDate(date: Mutable) { + constrainDate(date: Mutable): void { let idx = ERA_NAMES.indexOf(date.era); let end = ERA_END_DATES[idx]; if (end != null) { @@ -131,7 +131,7 @@ export class JapaneseCalendar extends GregorianCalendar { } } - getEras() { + getEras(): string[] { return ERA_NAMES; } diff --git a/packages/@internationalized/date/src/calendars/PersianCalendar.ts b/packages/@internationalized/date/src/calendars/PersianCalendar.ts index c8eb15665ab..0ff6c86cec5 100644 --- a/packages/@internationalized/date/src/calendars/PersianCalendar.ts +++ b/packages/@internationalized/date/src/calendars/PersianCalendar.ts @@ -13,7 +13,7 @@ // Portions of the code in this file are based on code from ICU. // Original licensing can be found in the NOTICE file in the root directory of this source tree. -import {AnyCalendarDate, Calendar} from '../types'; +import {AnyCalendarDate, Calendar, CalendarIdentifier} from '../types'; import {CalendarDate} from '../CalendarDate'; import {mod} from '../utils'; @@ -42,7 +42,7 @@ const MONTH_START = [ * around the March equinox. */ export class PersianCalendar implements Calendar { - identifier = 'persian'; + identifier: CalendarIdentifier = 'persian'; fromJulianDay(jd: number): CalendarDate { let daysSinceEpoch = jd - PERSIAN_EPOCH; @@ -80,7 +80,7 @@ export class PersianCalendar implements Calendar { return isLeapYear ? 30 : 29; } - getEras() { + getEras(): string[] { return ['AP']; } diff --git a/packages/@internationalized/date/src/calendars/TaiwanCalendar.ts b/packages/@internationalized/date/src/calendars/TaiwanCalendar.ts index 1858cd44a62..9376e55dcf5 100644 --- a/packages/@internationalized/date/src/calendars/TaiwanCalendar.ts +++ b/packages/@internationalized/date/src/calendars/TaiwanCalendar.ts @@ -13,7 +13,7 @@ // Portions of the code in this file are based on code from ICU. // Original licensing can be found in the NOTICE file in the root directory of this source tree. -import {AnyCalendarDate} from '../types'; +import {AnyCalendarDate, CalendarIdentifier} from '../types'; import {CalendarDate} from '../CalendarDate'; import {fromExtendedYear, getExtendedYear, GregorianCalendar} from './GregorianCalendar'; import {Mutable} from '../utils'; @@ -41,7 +41,7 @@ function gregorianToTaiwan(year: number): [string, number] { * 'before_minguo' and 'minguo'. */ export class TaiwanCalendar extends GregorianCalendar { - identifier = 'roc'; // Republic of China + identifier: CalendarIdentifier = 'roc'; // Republic of China fromJulianDay(jd: number): CalendarDate { let date = super.fromJulianDay(jd); @@ -50,15 +50,15 @@ export class TaiwanCalendar extends GregorianCalendar { return new CalendarDate(this, era, year, date.month, date.day); } - toJulianDay(date: AnyCalendarDate) { + toJulianDay(date: AnyCalendarDate): number { return super.toJulianDay(toGregorian(date)); } - getEras() { + getEras(): string[] { return ['before_minguo', 'minguo']; } - balanceDate(date: Mutable) { + balanceDate(date: Mutable): void { let [era, year] = gregorianToTaiwan(gregorianYear(date)); date.era = era; date.year = year; diff --git a/packages/@internationalized/date/src/conversion.ts b/packages/@internationalized/date/src/conversion.ts index 508d0e2b336..7b1ae398d1b 100644 --- a/packages/@internationalized/date/src/conversion.ts +++ b/packages/@internationalized/date/src/conversion.ts @@ -17,16 +17,16 @@ import {AnyCalendarDate, AnyDateTime, AnyTime, Calendar, DateFields, Disambiguat import {CalendarDate, CalendarDateTime, Time, ZonedDateTime} from './CalendarDate'; import {constrain} from './manipulation'; import {getExtendedYear, GregorianCalendar} from './calendars/GregorianCalendar'; -import {getLocalTimeZone} from './queries'; +import {getLocalTimeZone, isEqualCalendar} from './queries'; import {Mutable} from './utils'; -export function epochFromDate(date: AnyDateTime) { +export function epochFromDate(date: AnyDateTime): number { date = toCalendar(date, new GregorianCalendar()); let year = getExtendedYear(date.era, date.year); return epochFromParts(year, date.month, date.day, date.hour, date.minute, date.second, date.millisecond); } -function epochFromParts(year: number, month: number, day: number, hour: number, minute: number, second: number, millisecond: number) { +function epochFromParts(year: number, month: number, day: number, hour: number, minute: number, second: number, millisecond: number): number { // Note: Date.UTC() interprets one and two-digit years as being in the // 20th century, so don't use it let date = new Date(); @@ -35,7 +35,7 @@ function epochFromParts(year: number, month: number, day: number, hour: number, return date.getTime(); } -export function getTimeZoneOffset(ms: number, timeZone: string) { +export function getTimeZoneOffset(ms: number, timeZone: string): number { // Fast path for UTC. if (timeZone === 'UTC') { return 0; @@ -260,7 +260,7 @@ export function toTime(dateTime: CalendarDateTime | ZonedDateTime): Time { /** Converts a date from one calendar system to another. */ export function toCalendar(date: T, calendar: Calendar): T { - if (date.calendar.identifier === calendar.identifier) { + if (isEqualCalendar(date.calendar, calendar)) { return date; } @@ -292,7 +292,7 @@ export function toZoned(date: CalendarDate | CalendarDateTime | ZonedDateTime, t return fromAbsolute(ms, timeZone); } -export function zonedToDate(date: ZonedDateTime) { +export function zonedToDate(date: ZonedDateTime): Date { let ms = epochFromDate(date) - date.offset; return new Date(ms); } diff --git a/packages/@internationalized/date/src/createCalendar.ts b/packages/@internationalized/date/src/createCalendar.ts index 9afa20f7230..46f629b07ce 100644 --- a/packages/@internationalized/date/src/createCalendar.ts +++ b/packages/@internationalized/date/src/createCalendar.ts @@ -11,7 +11,7 @@ */ import {BuddhistCalendar} from './calendars/BuddhistCalendar'; -import {Calendar} from './types'; +import {Calendar, CalendarIdentifier} from './types'; import {CopticCalendar, EthiopicAmeteAlemCalendar, EthiopicCalendar} from './calendars/EthiopicCalendar'; import {GregorianCalendar} from './calendars/GregorianCalendar'; import {HebrewCalendar} from './calendars/HebrewCalendar'; @@ -22,7 +22,7 @@ import {PersianCalendar} from './calendars/PersianCalendar'; import {TaiwanCalendar} from './calendars/TaiwanCalendar'; /** Creates a `Calendar` instance from a Unicode calendar identifier string. */ -export function createCalendar(name: string): Calendar { +export function createCalendar(name: CalendarIdentifier): Calendar { switch (name) { case 'buddhist': return new BuddhistCalendar(); diff --git a/packages/@internationalized/date/src/index.ts b/packages/@internationalized/date/src/index.ts index 9fed618bc02..d55e305e8f9 100644 --- a/packages/@internationalized/date/src/index.ts +++ b/packages/@internationalized/date/src/index.ts @@ -15,6 +15,7 @@ export type { AnyTime, AnyDateTime, Calendar, + CalendarIdentifier, DateDuration, TimeDuration, DateTimeDuration, @@ -74,7 +75,8 @@ export { minDate, maxDate, isWeekend, - isWeekday + isWeekday, + isEqualCalendar } from './queries'; export { parseDate, diff --git a/packages/@internationalized/date/src/manipulation.ts b/packages/@internationalized/date/src/manipulation.ts index d6f66ca5709..87863dafaf6 100644 --- a/packages/@internationalized/date/src/manipulation.ts +++ b/packages/@internationalized/date/src/manipulation.ts @@ -21,7 +21,7 @@ const ONE_HOUR = 3600000; export function add(date: CalendarDateTime, duration: DateTimeDuration): CalendarDateTime; export function add(date: CalendarDate, duration: DateDuration): CalendarDate; export function add(date: CalendarDate | CalendarDateTime, duration: DateTimeDuration): CalendarDate | CalendarDateTime; -export function add(date: CalendarDate | CalendarDateTime, duration: DateTimeDuration) { +export function add(date: CalendarDate | CalendarDateTime, duration: DateTimeDuration): Mutable { let mutableDate: Mutable = date.copy(); let days = 'hour' in mutableDate ? addTimeFields(mutableDate, duration) : 0; @@ -118,7 +118,7 @@ function constrainMonthDay(date: Mutable) { date.day = Math.max(1, Math.min(date.calendar.getDaysInMonth(date), date.day)); } -export function constrain(date: Mutable) { +export function constrain(date: Mutable): void { if (date.calendar.constrainDate) { date.calendar.constrainDate(date); } @@ -146,7 +146,7 @@ export function subtract(date: CalendarDate | CalendarDateTime, duration: DateTi export function set(date: CalendarDateTime, fields: DateFields): CalendarDateTime; export function set(date: CalendarDate, fields: DateFields): CalendarDate; -export function set(date: CalendarDate | CalendarDateTime, fields: DateFields) { +export function set(date: CalendarDate | CalendarDateTime, fields: DateFields): Mutable { let mutableDate: Mutable = date.copy(); if (fields.era != null) { @@ -171,7 +171,7 @@ export function set(date: CalendarDate | CalendarDateTime, fields: DateFields) { export function setTime(value: CalendarDateTime, fields: TimeFields): CalendarDateTime; export function setTime(value: Time, fields: TimeFields): Time; -export function setTime(value: Time | CalendarDateTime, fields: TimeFields) { +export function setTime(value: Time | CalendarDateTime, fields: TimeFields): Mutable